diff --git a/.env.development b/.env.development index 986d0558..05c008e2 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1 @@ NEXT_TELEMETRY_DISABLED=1 -SCRYFALL_MOCKS=1 diff --git a/.env.production b/.env.production index c3eb3b22..05c008e2 100644 --- a/.env.production +++ b/.env.production @@ -1,2 +1 @@ NEXT_TELEMETRY_DISABLED=1 -SCRYFALL_MOCKS=0 diff --git a/markdown/articles/2020/03/21/the-mindkiller.md b/markdown/articles/2020/03/21/the-mindkiller.md index f090c036..7830f0ad 100644 --- a/markdown/articles/2020/03/21/the-mindkiller.md +++ b/markdown/articles/2020/03/21/the-mindkiller.md @@ -177,7 +177,7 @@ how they should play out. ### Hand 1 -:::row{variant=HAND} +:::row City of Brass Gemstone Mine LP @@ -196,7 +196,7 @@ Echo. ### Hand 2 -:::row{variant=HAND} +:::row LP LP LED @@ -216,7 +216,7 @@ have enough mana to still cast Echo afterwards. ### Hand 3 -:::row{variant=HAND} +:::row LP DR LED @@ -237,7 +237,7 @@ have a chance even against decks that could race the goblins. ### Hand 4 -:::row{variant=HAND} +:::row LP DR DD @@ -269,7 +269,7 @@ O R P H O S E. ### Hand 5 -:::row{variant=HAND} +:::row LP EoE DD @@ -285,7 +285,7 @@ on the haters. ### Hand 6 -:::row{variant=HAND} +:::row LP Gemstone Mine Rite of Flame @@ -303,7 +303,7 @@ guaranteed, and the deck mulligans pretty well. I'd throw this back. ### Hand 7 -:::row{variant=HAND} +:::row LP DR City of Brass diff --git a/markdown/articles/2020/06/22/fat-stacks.md b/markdown/articles/2020/06/22/fat-stacks.md index 87ee1425..c7130633 100644 --- a/markdown/articles/2020/06/22/fat-stacks.md +++ b/markdown/articles/2020/06/22/fat-stacks.md @@ -221,7 +221,7 @@ some real world game examples. > You already played a land. > Opponent has a single uncracked fetchland in play. 4 cards in hand. -:::row{variant=HAND} +:::row DR|MMQ DD FoW|EMA @@ -330,7 +330,7 @@ TO #### If we play Duress and it resolves we see the following hand -:::row{variant=HAND} +:::row Spell Snare Stifle Scalding Tarn @@ -364,7 +364,7 @@ find additional protection or free up our mana. > Opponent has 6 untapped lands, 4 that can make {U}. 5 cards in hand. We know > they have at least 1 Force of Will and blue card. -:::row{variant=HAND} +:::row DR|MMQ DD FoW|EMA @@ -480,7 +480,7 @@ turn, play a land and have the following hand / board state: My hand is thus: -:::row{variant=HAND} +:::row DD FoW Daze @@ -552,7 +552,7 @@ let's break it down from the other side too. First we should consider what AgyePA had in hand. On my Doomsday being placed on the stack it looked like this: -:::row{variant=HAND} +:::row DD FoW Daze diff --git a/markdown/articles/2020/10/05/gangsta-trippin.md b/markdown/articles/2020/10/05/gangsta-trippin.md index c8b6a7c5..0f66ffde 100644 --- a/markdown/articles/2020/10/05/gangsta-trippin.md +++ b/markdown/articles/2020/10/05/gangsta-trippin.md @@ -246,7 +246,7 @@ Brainstorm. We know that Brainstorm, in conjecture with an additional card in hand post-Doomsday resolving, can lead to a deterministic, same-turn win. Let's consider the following hand: -:::row{variant=HAND} +:::row DR Pnd FoW @@ -258,7 +258,7 @@ Pre In this scenario we have 2 lands in play, Underground Sea and a Polluted Delta. -:::row{variant=HAND} +:::row Underground Sea Polluted Delta ::: @@ -412,14 +412,14 @@ targeting our tapped Underground Sea. Our board is: -:::row{variant=HAND} +:::row Underground Sea Polluted Delta ::: Our hand is: -:::row{variant=HAND} +:::row DR EoA FoW @@ -454,14 +454,14 @@ state and hand: Our board is: -:::row{variant=HAND} +:::row Underground Sea Underground Sea ::: Our hand is: -:::row{variant=HAND} +:::row DR SW Pre @@ -496,13 +496,13 @@ turn 2. Our opponent has just cantripped turn 1 and passed. Our board is: -:::row{variant=HAND} +:::row Underground Sea ::: Our hand is: -:::row{variant=HAND} +:::row Daze Island Pre diff --git a/markdown/articles/2021/01/07/history-of-doomsday.md b/markdown/articles/2021/01/07/history-of-doomsday.md index 0c8ed460..cc567c50 100644 --- a/markdown/articles/2021/01/07/history-of-doomsday.md +++ b/markdown/articles/2021/01/07/history-of-doomsday.md @@ -1075,7 +1075,7 @@ Doomsday of the time made those otherwise _dead_ cards very live. The speed was also a key point. The Meandeck list, with a perfect draw, could achieve a turn 2 kill with the following cards in hand/drawn: -:::row{variant=HAND} +:::row DR|MMQ DD DR|MMQ @@ -1093,7 +1093,7 @@ draw and cast Probe into Unearth. Cast Unearth to reanimate Labman to then activate Top to draw for the win. An equivalent perfect draw from DDFT could result in a turn 1 win. -:::row{variant=HAND} +:::row DR|MMQ DD DR|MMQ diff --git a/markdown/articles/2021/03/21/everything-vintage-doomsday.md b/markdown/articles/2021/03/21/everything-vintage-doomsday.md index dac29952..f9cf706f 100644 --- a/markdown/articles/2021/03/21/everything-vintage-doomsday.md +++ b/markdown/articles/2021/03/21/everything-vintage-doomsday.md @@ -231,7 +231,7 @@ this turn and the rest of the game? Our hand is: -:::row{variant=HAND} +:::row DD SW Pre @@ -353,7 +353,7 @@ Rod], more Revokers, etc? Our hand is: -:::row{variant=HAND} +:::row Pre Daze FoW diff --git a/markdown/articles/2022/01/16/the-mindkiller-update.md b/markdown/articles/2022/01/16/the-mindkiller-update.md index 437c2cca..1d734528 100644 --- a/markdown/articles/2022/01/16/the-mindkiller-update.md +++ b/markdown/articles/2022/01/16/the-mindkiller-update.md @@ -187,7 +187,7 @@ slightly longer game, letting you field additional lands to help play through soft counters or make more colored mana. An interesting situation you will likely find yourself in is a hand like this: -:::row{variant=HAND} +:::row City of Brass Gemstone Mine DR @@ -212,7 +212,7 @@ perfectly with the macro-archetypes. #### Out -:::row{variant=HAND} +:::row Doomsday Doomsday Doomsday @@ -223,7 +223,7 @@ Manamorphose #### In -:::row{variant=HAND} +:::row Galvanic Relay Galvanic Relay Galvanic Relay @@ -241,7 +241,7 @@ spells to keep the deck threat-dense, and add a bit more protection. #### Out -:::row{variant=HAND} +:::row Thoughtseize Thoughtseize Thoughtseize @@ -249,7 +249,7 @@ Thoughtseize #### In -:::row{variant=HAND} +:::row Orim's Chant Orim's Chant Prismatic Ending @@ -265,7 +265,7 @@ based on play vs. draw. #### Out -:::row{variant=HAND} +:::row Empty the Warrens Empty the Warrens Empty the Warrens @@ -273,7 +273,7 @@ Empty the Warrens #### In -:::row{variant=HAND} +:::row Orim's Chant Orim's Chant Orim's Chant @@ -292,7 +292,7 @@ use this strategy if I trounce someone turn 1 and never see their deck. #### Out -:::row{variant=HAND} +:::row Doomsday Doomsday Doomsday @@ -302,7 +302,7 @@ Street Wraith #### In -:::row{variant=HAND} +:::row Prismatic Ending Prismatic Ending Orim's Chant diff --git a/markdown/articles/2022/02/10/axion-mega-report.md b/markdown/articles/2022/02/10/axion-mega-report.md index f9861fbf..0b1d315d 100644 --- a/markdown/articles/2022/02/10/axion-mega-report.md +++ b/markdown/articles/2022/02/10/axion-mega-report.md @@ -380,7 +380,7 @@ that my friend Matt always tells me I shouldn't go for. The sort of hand where I just can't help myself and too often get away with. This is my opening 7 (on the draw mind). -:::row{variant=HAND} +:::row DR | MMQ DD FoW diff --git a/markdown/articles/2022/04/15/axion-mega-brum.md b/markdown/articles/2022/04/15/axion-mega-brum.md index adbaa6ee..d5499295 100644 --- a/markdown/articles/2022/04/15/axion-mega-brum.md +++ b/markdown/articles/2022/04/15/axion-mega-brum.md @@ -58,7 +58,7 @@ my sideboard plan for 8-Cast, which will become very relevant later, as I realised I did something different every time and suspected the deck to be popular (spoiler, it was). -:::row{variant=HAND} +:::row Force of Negation Flusterstorm ::: @@ -120,7 +120,7 @@ something nasty like an :card[Em] under there then I am well and truly fucked. But, waiting means more time for them to do whatever they are doing or finding disruption. As a result I decided to risk jamming and seeing what happened. -:::row{variant=HAND} +:::row Shelldock Isle ::: @@ -255,7 +255,7 @@ off Cavern with a silly amount of interaction available. What would you have taken here? -:::row{variant=HAND} +:::row Lightning Bolt Narset, Parter of Veils Jace, the Mind Sculptor @@ -427,7 +427,7 @@ small chance to eke in to the top thanks to great breakers if I could smash this one out. My opponent snap keeps a 7 and I get a little scared as I have to go down to 5. But what a 5 it was! (And yes, of course I was on the play again). -:::row{variant=HAND} +:::row DR | MMQ DD FoW diff --git a/markdown/articles/2022/09/15/2022-review.md b/markdown/articles/2022/09/15/review.md similarity index 100% rename from markdown/articles/2022/09/15/2022-review.md rename to markdown/articles/2022/09/15/review.md diff --git a/markdown/chapters/appendices/faq.md b/markdown/chapters/appendices/faq.md index 18df0c48..29cd5dd5 100644 --- a/markdown/chapters/appendices/faq.md +++ b/markdown/chapters/appendices/faq.md @@ -77,24 +77,39 @@ considered _best_ at the time. Historically there was a spreadsheet that had an ever-growing list of pre-prescribed piles based on certain criterias but this was for the old DDFT -decks pre :card[Sensei's Divining Top] ban. A current one is not maintained for -a couple of reasons: the biggest being that trying to rote learn piles is -actually not effective training. It is better to learn the general rule sets or -toolboxes you have at your disposal and then try to build on the fly using your -knowledge, experience and general critical thinking than it is to try and -remember "If I have {B}{B}{B}+{U}{U}{U}+{1}+SW in hand then I can win through -:card[Thalia, Guardian of Thraben] in play". +decks from before the banning of :card[Sensei's Divining Top]. A current one is +not maintained for a couple of reasons: the biggest being that trying to rote +learn piles is actually not effective training. It is better to learn the +general rule sets or toolboxes you have at your disposal and then try to build +on the fly using your knowledge, experience and general critical thinking than +it is to try and remember "If I have {B}{B}{B}+{U}{U}{U}+{1}+SW in hand then I +can win through Thalia". + +However there's a recurring argument for having a repository of quick piles that +one might look up when facing X or Y scenario. While this would _feel_ very +useful to content creators that are playing the deck once and then moving on, +it's also the most efficient way of ignoring other open lines simply because of +the blinkers you've installed that say "If X do Y". + +You are obviously allowed (and encouraged) to write down common scenarios you +see yourself in and use that to your advantage. Just don't advertise it as +universal truth. This Wiki aims to try and provide the general concepts and basic level knowledge -needed to pilot the deck. Select your variant of choice and work through the -chapters under that variant which should provide the simplest pile examples to -give an idea of how to play. The majority of piles become variants of those -discussed but you will, over time, learn to build more situational ones as you -gain experience. +needed to pilot the deck. Work through the chapters and pause when a pile is +described as you make sure you follow the line. The majority of piles become +variants of those discussed but you will, over time, learn to build more +situational ones as you gain experience. ## What is the best matchup for the deck? -Cloudpost. +Post used to be the auto-win matchup where their only hope was either a timely +:card[Boseiju, who Endures] or Choke and it had to resolve. With Modern Horizons +3 (the Commander set to be exact), the deck has gained in popularity and the +matchup has changed drastically. :card[Vexing Bauble] will help their +:card[Disruptor Flute]s resolve, usually naming the Oracle or Doomsday itself. +This slows down the game giving them more time to present lethal, or screw your +pre-established pile entirely. In the current Legacy meta the best matchups to face are probably Miracles variants, non-blue decks and TES. These decks often do not provide much pressure @@ -102,17 +117,16 @@ and have limited interaction once Doomsday resolves. We also have a lot of interaction which means they tend to not have enough disruption to be able to stop us. -Death and Taxes, Maverick and Post are good examples of the easier matchups with -limited interaction. Still, they can display threats in the form of hatebears -for the 2 formers or larger, game-ending threats for the latter. But often they -are too slow or get answered easily by Daze. For the green matchups, -:card[Endurance] requires preparation and proper sequencing but is far from -being as back-breaking as it is often thought. More details about this in the -[interaction page](/meandeck/interaction#cheating-on-devotion). +Death and Taxes and Maverick are good examples of the easier matchups with +limited interaction. Still, they can display threats in the form of hatebears. +But often they are too slow or get answered easily by Daze. For the green +matchups, :card[Endurance] requires preparation and proper sequencing but is far +from being as back-breaking as it is often thought. More details about this in +the [interaction page](/meandeck/interaction#cheating-on-devotion). TES cannot beat the sheer amount of disruption the deck brings to the table nor interact with the fast combo kill besides :card[Silence] effects as the Doomsday -pilot unravel their pile. That weakness can be mitigated but often means that +pilots unravel their pile. That weakness can be mitigated but often means that while the TES pilot tries to disrupt our combo turn, they aren't progressing their own plan as much. @@ -124,10 +138,16 @@ based on community-obtained results found [here][data:matchups]). Delver. Delver. Definitely Delver. Also Death Shadow decks. Basically any aggressive tempo shell running cheap threats and mana efficient -disruption. UR Delver is the most played deck in Legacy and the deck has a hard -time with that matchup (between 30% and 35% depending on meta shifts and deck -popularity) however Grixis Delver is likely the worst to face as the addition of -Thoughtseize as another angle of disruption makes them very hard to face. +disruption. Red variants are probably the hardest matchups thanks to their reach +through :card[Lightning Bolt] however Grixis Delver is likely the worst to face +as the addition of :card[Thoughtseize] as another angle of disruption makes them +very hard to face. + +Stiflenough has recently resurfaced with the printings of :card[Dress Down] and +then :card[Doorkeeper Thrull]. Like Delver variants, the tempo element combined +with fast clock makes it a difficult matchup navigate, except their also sport a +full playset of :card[Stifle] in addition to maindeck copies of :card[Dress +Down]. ## What is a good meta to play Doomsday in? @@ -172,6 +192,11 @@ smartest type of Legacy player_. Everyone has different ways of thinking and one person's nightmare deck to pilot (mine would be Maverick) is another person's bread and butter. +:::accordion[Click to reveal] +![Chart on how to pile correctly](/media/assets/pile-bell-chart.png 'How to pile +correctly') +::: + ## How do I resolve Doomsday in paper? A large part of the confusion for the physical resolution of Doomsday stems from @@ -179,7 +204,7 @@ the wording on the original Weatherlight printing of :card[Doomsday]. See the card below along with the original rules text printed: :::row{variant=CENTERED} -Doomsday|WTH +Doomsday | WTH ::: > Pay half your life, rounded up: @@ -202,7 +227,7 @@ Before the next point let's take a look at the updated Oracle wording on the A25 Doomsday: :::row{variant=CENTERED} -Doomsday|A25 +Doomsday | A25 ::: > Search your library and graveyard for five cards and exile the rest. @@ -260,7 +285,7 @@ stuck, feel free to ask for help! The sense of community is very strong and you should be able to find someone to answer any queries across most time zones so please feel free to come and say hello in the [Doomsday Discord][discord]. -## What order should I make purchases to build Doomsday? +## In what order should I make purchases to build Doomsday? As with any Legacy deck the focus should always be on the reserved list staples. dual lands are the first port of call with Underground Seas being the key part. diff --git a/markdown/chapters/ddft/winning-without-dd.md b/markdown/chapters/ddft/winning-without-dd.md index c109ea94..42c1cd75 100644 --- a/markdown/chapters/ddft/winning-without-dd.md +++ b/markdown/chapters/ddft/winning-without-dd.md @@ -29,7 +29,7 @@ so as early as the first turn. Typically you'll want to do this early in the game before your opponent establishes a board presence, but it can still be effective later on depending on the matchup. Consider the following hand: -:::row{variant=HAND} +:::row DR VoS LED @@ -85,7 +85,7 @@ land drop you can use this to generate mana after Echo. Consider the following situation, where your opening 7 looks like this: -:::row{variant=HAND} +:::row LED LED Scalding Tarn @@ -187,7 +187,7 @@ One last thing to address: there will be times when you determine that you simply have to take a risk and go for a natural storm kill without a Wish in hand. Perhaps your hand looks like this: -:::row{variant=HAND} +:::row LED LED LP diff --git a/markdown/chapters/entombsday/gameplay.md b/markdown/chapters/entombsday/gameplay.md index 73d65b88..da215cf5 100644 --- a/markdown/chapters/entombsday/gameplay.md +++ b/markdown/chapters/entombsday/gameplay.md @@ -162,7 +162,7 @@ game 1 plan, a protection spell is also helpful. Below are a number of sample starting hands. Would you keep them or mulligan? -:::row{variant=HAND} +:::row Marsh Flats Lotus Petal LED @@ -180,7 +180,7 @@ chance to draw a blue card for Force to protect your combo, but we're not here to send back a turn 1 combo. ::: -:::row{variant=HAND} +:::row Underground Sea Lotus Petal Polluted Delta @@ -198,7 +198,7 @@ to enable your combo. You'll need to find both Entomb (or Griselbrand) and a reanimation spell. ::: -:::row{variant=HAND} +:::row Underground Sea Flooded Strand Marsh Flats @@ -216,7 +216,7 @@ multiple ways to dig for a reanimation spell. I would lead on the fetch lands and cast Lim-Dul's vault in my opponent's End Step. ::: -:::row{variant=HAND} +:::row Polluted Delta Entomb Cabal Therapy @@ -234,7 +234,7 @@ multiple pieces of protection, giving you time to find your second land or a Dark Ritual. ::: -:::row{variant=HAND} +:::row Flooded Strand Lotus Petal Polluted Delta @@ -252,7 +252,7 @@ outs between your 4 Entombs and 2 Griselbrands, but there is a chance you cast your cantrips and whiff. ::: -:::row{variant=HAND} +:::row Underground Sea Polluted Delta Cabal Therapy diff --git a/markdown/chapters/meandeck/basics.md b/markdown/chapters/meandeck/basics.md index 78730953..e7ed7c36 100644 --- a/markdown/chapters/meandeck/basics.md +++ b/markdown/chapters/meandeck/basics.md @@ -186,4 +186,3 @@ go at your own pace! (And hopefully have fun in the process) It is recommended you read the Wiki chapters in the order presented but feel free to read them how you wish. -. diff --git a/markdown/chapters/meandeck/interaction.md b/markdown/chapters/meandeck/interaction.md index 02d32f6f..aa6405d1 100644 --- a/markdown/chapters/meandeck/interaction.md +++ b/markdown/chapters/meandeck/interaction.md @@ -135,7 +135,7 @@ has resolved (from the Basics chapter): > Game 1 > On the play -:::row{variant=HAND} +:::row DR DD FoW @@ -210,7 +210,7 @@ The extra card drawn can allow a lot of flexibility in keeping up countermagic. Take the following hand: -:::row{variant=HAND} +:::row DR DD FoW diff --git a/markdown/chapters/meandeck/practice.md b/markdown/chapters/meandeck/practice.md index ccadb75f..21ab1c5c 100644 --- a/markdown/chapters/meandeck/practice.md +++ b/markdown/chapters/meandeck/practice.md @@ -156,30 +156,17 @@ very in depth and may be hard to follow along. ### Scenario 1: Turn 1 Doomsday vs Delver -> 6 cards opening hand -> Game 1 on the draw -> -> Opponent has a Dragon's Rage Channeler and a tapped Volcanic Island in play, -> Scalding Tarn and Mishra's Bauble in Graveyard -> Opponent has 5 cards in hand +Game 1 turn 1 on the draw with a 6 cards opening hand. -Opposing board: +Opponent has a :card[Dragon's Rage Channeler] and a tapped :card[Volcanic +Island] in play, :card[Scalding Tarn] and :card[Mishra's Bauble] in their +Graveyard. -:::row{variant=CENTERED} -Volcanic Island -Dragon's Rage Channeler -::: - -Opposing graveyard: - -:::row{variant=CENTERED} -Scalding Tarn -Mishra's Bauble -::: +Opponent has 5 cards in hand. Your hand: -:::row{variant=HAND} +:::row DD DR Misty Rainforest @@ -314,12 +301,11 @@ Wasteland ### Scenario 2: Turn 1 Doomsday vs Mono Red Stompy -> 5 cards opening hand -> Game 3 on the play +Game 3 turn 1 on the play with a 5 cards opening hand. Your hand: -:::row{variant=HAND} +:::row DD DR Misty Rainforest @@ -425,36 +411,18 @@ incorrect choice. ### Scenario 3: Turn 3 Doomsday vs Elves -> Game 2 -> Your turn 3 -> -> Opponent has an Allosaurus Shepherd, Dryad Arbor (tapped), Elvish Visionary -> and Forest (tapped) in Play -> Opponent has 6 cards in hand +Game 2 turn 3. -Opposing board: +Opponent has an :card[Allosaurus Shepherd], :card[Dryad Arbor] (tapped), +:card[Elvish Visionary] and a :card[Forest] (tapped) in play. -:::row{variant=CENTERED} -Forest -Dryad Arbor -Allosaurus Shepherd -Elvish Visionary -::: - -> You have 2 x Underground Sea in play -> 18 Life -> Land drop available +Opponent has 6 cards in hand. -Your board: - -:::row{variant=CENTERED} -Underground Sea -Underground Sea -::: +You have 2 Underground Sea in play, 18 Life and your land drop available to you. Your hand: -:::row{variant=HAND} +:::row DD LP SW diff --git a/markdown/chapters/meandeck/ptt.md b/markdown/chapters/meandeck/ptt.md index 85987a50..f48d9262 100644 --- a/markdown/chapters/meandeck/ptt.md +++ b/markdown/chapters/meandeck/ptt.md @@ -50,7 +50,7 @@ Take the following example: > Game 1 > On the play -:::row{variant=hand} +:::row DR DD FoW @@ -116,7 +116,7 @@ ways that your opponents can prevent you from executing the pile as desired. If we were to look at the pile presented and have cast DR, DD from Underground Sea we are left with the following cards in hand: -:::row{variant=hand} +:::row FoW FoW Island @@ -195,7 +195,7 @@ we had in hand from Ponder to Brainstorm. > Game 1 > On the play -:::row{variant=hand} +:::row DR DD FoW @@ -296,7 +296,7 @@ a land already in hand. Once again returning to our scenario for the chapter: > Game 1 > On the play -:::row{variant=hand} +:::row DR DD FoW diff --git a/markdown/partials/sandbox.md b/markdown/partials/sandbox.md index 58fb548d..ae398f9d 100644 --- a/markdown/partials/sandbox.md +++ b/markdown/partials/sandbox.md @@ -39,7 +39,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: ``` @@ -49,7 +49,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: ### Multiple @@ -65,7 +65,7 @@ libero elit rutrum orci, et congue `sapien` turpis quis purus. :::accordion[Click to expand] Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: ``` @@ -77,7 +77,7 @@ libero elit rutrum orci, et congue `sapien` turpis quis purus. :::accordion[Click to expand] Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: ### Nested Directives @@ -90,7 +90,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: :::row @@ -111,7 +111,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ::: :::row @@ -212,11 +212,15 @@ quotes) are mandatory for a proper accessibility of your images within the page. ![A small placeholder image](https://www.placehold.co/400x80 'Low resolution') ``` -![A large placeholder image](https://www.placehold.co/1600x320 'High resolution') +![A large placeholder image](https://www.placehold.co/1600x200 'High resolution') -![A medium placeholder image](https://www.placehold.co/800x160 'Medium resolution') +![A medium placeholder image](https://www.placehold.co/800x100 'Medium resolution') -![A small placeholder image](https://www.placehold.co/400x80 'Low resolution') +![A small placeholder image](https://www.placehold.co/400x50 'Low resolution') + +## Links + +Coming soon ™ ## Lists @@ -296,7 +300,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ``` Lorem ipsum _dolor_ sit amet, consectetur **adipiscing** elit. Ut sed @@ -304,7 +308,7 @@ tincidunter diam, sed tempor neque. Cras pulvinar, nisi at fermentum congue, libero elit rutrum orci, et congue `sapien` turpis quis purus. Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, -:spoiler[efficitur pharetra] quam. +:spoiler[efficitur] pharetra quam. ## Quotes @@ -452,7 +456,7 @@ Coming soon ™ ## Spoilers -Inline verbatim content is not supported within spoiler blocks. +Inline verbatim content and links are not supported within spoiler blocks. ```md :::spoiler @@ -476,6 +480,12 @@ Suspendisse :card[Underground Sea] ex ligula, elementum elementum arcu eu, ## Tables +The following items are not supported within tables: + +- Merged cells +- Headless tables +- Multiline text within rows + ### Default Alignement ```md diff --git a/package.json b/package.json index b8d92919..3b3aa528 100644 --- a/package.json +++ b/package.json @@ -11,80 +11,77 @@ "build:scryfall": "pnpm run scryfall", "dev": "concurrently 'pnpm:dev:*' --names --prefix-colors auto", "dev:next": "next dev", - "dev:scryfall": "SCRYFALL_DEBUG=1 pnpm run scryfall", + "dev:scryfall": "pnpm run scryfall:dev", "lint": "pnpm run '/^lint:\\w+$/'", "lint:code": "eslint", "lint:format": "pnpm run '/^lint:format:\\w+$/'", "lint:format:code": "prettier --check --log-level warn puzzles/ scryfall/ src/", "lint:format:wiki": "prettier --check --log-level warn markdown/", - "lint:prune": "knip --exclude enumMembers", + "lint:prune": "knip", "lint:typings": "tsc", "lint:wiki": "markdownlint --config markdownlint.config.js markdown/", "scryfall": "node ./scryfall/server.js", + "scryfall:dev": "DEBUG=1 pnpm run scryfall", "start": "next start", "test": "jest", "test:coverage": "pnpm run test --coverage", "test:watch": "pnpm run test --verbose --watchAll" }, "dependencies": { - "@emotion/react": "11.11.4", - "@emotion/styled": "11.11.5", + "@emotion/react": "11.13.0", + "@emotion/styled": "11.13.0", "@fontsource/libre-baskerville": "5.0.13", - "@korumite/kiwi": "2.9.1", + "@korumite/kiwi": "2.13.0", "@mdi/js": "7.4.47", "@mdi/react": "1.6.1", - "@mui/material": "5.15.18", - "@mui/system": "5.15.15", - "@mui/utils": "5.15.14", - "@vercel/analytics": "1.2.2", + "@mui/material": "5.16.6", + "@mui/system": "5.16.6", + "@mui/utils": "5.16.6", + "@vercel/analytics": "1.3.1", "async-sema": "3.1.1", "mana-font": "1.15.9", "mdast-util-find-and-replace": "3.0.1", - "next": "14.2.3", + "next": "14.2.5", "plaiceholder": "3.0.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-intersection-observer": "9.10.2", + "react-intersection-observer": "9.13.0", "react-markdown": "9.0.1", "react-syntax-highlighter": "15.5.0", - "reading-time": "1.5.0", "rehype-slug": "6.0.0", "remark-directive": "3.0.0", - "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.0", - "remark-parse": "11.0.0", - "remark-stringify": "11.0.0", "remark-toc": "9.0.0", - "simple-icons": "11.15.0", + "simple-icons": "13.3.0", "unified": "11.0.4", - "unist-util-remove": "4.0.0", "unist-util-select": "5.1.0", "unist-util-visit": "5.0.0", - "vfile-matter": "5.0.0" + "zod": "3.23.8" }, "devDependencies": { - "@eslint/js": "9.3.0", - "@ianvs/prettier-plugin-sort-imports": "4.2.1", - "@testing-library/jest-dom": "6.4.5", - "@testing-library/react": "15.0.7", + "@eslint/js": "9.8.0", + "@ianvs/prettier-plugin-sort-imports": "4.3.1", + "@korumite/ts": "1.1.0", + "@testing-library/jest-dom": "6.4.8", + "@testing-library/react": "16.0.0", "@types/jest": "29.5.12", "@types/mdast": "4.0.4", - "@types/node": "20.12.12", - "@types/react": "18.3.2", + "@types/node": "20.14.13", + "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "@types/react-syntax-highlighter": "15.5.13", "@types/unist": "3.0.2", "concurrently": "8.2.2", - "eslint": "9.3.0", + "eslint": "9.8.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", - "knip": "5.16.0", - "markdownlint-cli": "0.40.0", + "knip": "5.27.0", + "markdownlint-cli": "0.41.0", "mdast-util-directive": "3.0.0", - "prettier": "3.2.5", + "prettier": "3.3.3", "ts-node": "10.9.2", - "typescript": "5.4.5", - "typescript-eslint": "7.9.0" + "typescript": "5.5.4", + "typescript-eslint": "7.18.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 889f925f..5cdce4c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@emotion/react': - specifier: 11.11.4 - version: 11.11.4(@types/react@18.3.2)(react@18.3.1) + specifier: 11.13.0 + version: 11.13.0(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': - specifier: 11.11.5 - version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) + specifier: 11.13.0 + version: 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@fontsource/libre-baskerville': specifier: 5.0.13 version: 5.0.13 '@korumite/kiwi': - specifier: 2.9.1 - version: 2.9.1 + specifier: 2.13.0 + version: 2.13.0 '@mdi/js': specifier: 7.4.47 version: 7.4.47 @@ -27,17 +27,17 @@ importers: specifier: 1.6.1 version: 1.6.1 '@mui/material': - specifier: 5.15.18 - version: 5.15.18(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 5.16.6 + version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: 5.15.15 - version: 5.15.15(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) + specifier: 5.16.6 + version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': - specifier: 5.15.14 - version: 5.15.14(@types/react@18.3.2)(react@18.3.1) + specifier: 5.16.6 + version: 5.16.6(@types/react@18.3.3)(react@18.3.1) '@vercel/analytics': - specifier: 1.2.2 - version: 1.2.2(next@14.2.3(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: 1.3.1 + version: 1.3.1(next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) async-sema: specifier: 3.1.1 version: 3.1.1 @@ -48,8 +48,8 @@ importers: specifier: 3.0.1 version: 3.0.1 next: - specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.5 + version: 14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) plaiceholder: specifier: 3.0.0 version: 3.0.0(sharp@0.33.4) @@ -60,69 +60,57 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-intersection-observer: - specifier: 9.10.2 - version: 9.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 9.13.0 + version: 9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: 9.0.1 - version: 9.0.1(@types/react@18.3.2)(react@18.3.1) + version: 9.0.1(@types/react@18.3.3)(react@18.3.1) react-syntax-highlighter: specifier: 15.5.0 version: 15.5.0(react@18.3.1) - reading-time: - specifier: 1.5.0 - version: 1.5.0 rehype-slug: specifier: 6.0.0 version: 6.0.0 remark-directive: specifier: 3.0.0 version: 3.0.0 - remark-frontmatter: - specifier: 5.0.0 - version: 5.0.0 remark-gfm: specifier: 4.0.0 version: 4.0.0 - remark-parse: - specifier: 11.0.0 - version: 11.0.0 - remark-stringify: - specifier: 11.0.0 - version: 11.0.0 remark-toc: specifier: 9.0.0 version: 9.0.0 simple-icons: - specifier: 11.15.0 - version: 11.15.0 + specifier: 13.3.0 + version: 13.3.0 unified: specifier: 11.0.4 version: 11.0.4 - unist-util-remove: - specifier: 4.0.0 - version: 4.0.0 unist-util-select: specifier: 5.1.0 version: 5.1.0 unist-util-visit: specifier: 5.0.0 version: 5.0.0 - vfile-matter: - specifier: 5.0.0 - version: 5.0.0 + zod: + specifier: 3.23.8 + version: 3.23.8 devDependencies: '@eslint/js': - specifier: 9.3.0 - version: 9.3.0 + specifier: 9.8.0 + version: 9.8.0 '@ianvs/prettier-plugin-sort-imports': - specifier: 4.2.1 - version: 4.2.1(prettier@3.2.5) + specifier: 4.3.1 + version: 4.3.1(prettier@3.3.3) + '@korumite/ts': + specifier: 1.1.0 + version: 1.1.0 '@testing-library/jest-dom': - specifier: 6.4.5 - version: 6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))) + specifier: 6.4.8 + version: 6.4.8 '@testing-library/react': - specifier: 15.0.7 - version: 15.0.7(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 16.0.0 + version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/jest': specifier: 29.5.12 version: 29.5.12 @@ -130,11 +118,11 @@ importers: specifier: 4.0.4 version: 4.0.4 '@types/node': - specifier: 20.12.12 - version: 20.12.12 + specifier: 20.14.13 + version: 20.14.13 '@types/react': - specifier: 18.3.2 - version: 18.3.2 + specifier: 18.3.3 + version: 18.3.3 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 @@ -148,124 +136,183 @@ importers: specifier: 8.2.2 version: 8.2.2 eslint: - specifier: 9.3.0 - version: 9.3.0 + specifier: 9.8.0 + version: 9.8.0 eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 knip: - specifier: 5.16.0 - version: 5.16.0(@types/node@20.12.12)(typescript@5.4.5) + specifier: 5.27.0 + version: 5.27.0(@types/node@20.14.13)(typescript@5.5.4) markdownlint-cli: - specifier: 0.40.0 - version: 0.40.0 + specifier: 0.41.0 + version: 0.41.0 mdast-util-directive: specifier: 3.0.0 version: 3.0.0 prettier: - specifier: 3.2.5 - version: 3.2.5 + specifier: 3.3.3 + version: 3.3.3 ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) typescript: - specifier: 5.4.5 - version: 5.4.5 + specifier: 5.5.4 + version: 5.5.4 typescript-eslint: - specifier: 7.9.0 - version: 7.9.0(eslint@9.3.0)(typescript@5.4.5) + specifier: 7.18.0 + version: 7.18.0(eslint@9.8.0)(typescript@5.5.4) packages: - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.6': + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.0': + resolution: {integrity: sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/core@7.24.6': + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/core@7.24.9': + resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/generator@7.24.6': + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-compilation-targets@7.24.6': + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-compilation-targets@7.24.8': + resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-hoist-variables@7.24.6': + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-module-transforms@7.25.0': + resolution: {integrity: sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.6': + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.25.0': + resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} engines: {node: '>=6.0.0'} hasBin: true @@ -294,8 +341,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.6': + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -336,26 +383,42 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.1': - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.24.6': + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.6': + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/traverse@7.25.1': + resolution: {integrity: sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/types@7.25.0': + resolution: {integrity: sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -365,26 +428,26 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.1.1': - resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@emotion/babel-plugin@11.11.0': - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} - '@emotion/cache@11.11.0': - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} - '@emotion/hash@0.9.1': - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@emotion/is-prop-valid@1.2.2': - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + '@emotion/is-prop-valid@1.3.0': + resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} - '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.11.4': - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + '@emotion/react@11.13.0': + resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -392,14 +455,14 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.1.4': - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + '@emotion/serialize@1.3.0': + resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} - '@emotion/sheet@1.2.2': - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.11.5': - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + '@emotion/styled@11.13.0': + resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -408,23 +471,19 @@ packages: '@types/react': optional: true - '@emotion/unitless@0.8.1': - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + '@emotion/unitless@0.9.0': + resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} - '@emotion/use-insertion-effect-with-fallbacks@1.0.1': - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.2.1': - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + '@emotion/utils@1.4.0': + resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} - '@emotion/weak-memoize@0.3.1': - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - - '@ericcornelissen/bash-parser@0.5.2': - resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} - engines: {node: '>=4'} + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} @@ -432,53 +491,39 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.17.1': + resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.3.0': - resolution: {integrity: sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==} + '@eslint/js@9.8.0': + resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/react-dom@2.0.9': - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fontsource/libre-baskerville@5.0.13': resolution: {integrity: sha512-4RmjVL+W0Y0HbPz2jVXykFXpeu+NnE2xplGNcLEGSMkjSWM5fHH6tu3Vmzskfjp9j47/EQVfuQ0uIDEFmUd6iA==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - '@humanwhocodes/retry@0.3.0': resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} - '@ianvs/prettier-plugin-sort-imports@4.2.1': - resolution: {integrity: sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==} + '@ianvs/prettier-plugin-sort-imports@4.3.1': + resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} peerDependencies: '@vue/compiler-sfc': 2.7.x || 3.x prettier: 2 || 3 @@ -698,8 +743,11 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@korumite/kiwi@2.9.1': - resolution: {integrity: sha512-aihxpDZCS/d5RMSOhygrT2J7Y4Lrm/yqtZxbJByKaxreWgIOGBx/nzRstML6uV7hq7gZmeuNYP4MUUqNFnTpHQ==} + '@korumite/kiwi@2.13.0': + resolution: {integrity: sha512-uOLjZDR/N2t9RJh0HIJauJmgaJ3IfZyuSIJ9/2UQ18LKOhRhNmEllKPN/jNubXg1RJ8vrA6BF3e7HYeJc8cFuA==} + + '@korumite/ts@1.1.0': + resolution: {integrity: sha512-qLSpsUXfuo7rkmx0bYtdCkt4jG9XaCzMVjATPEE2l39mSN4p1ncWMlejWottaDS/+JQaigmHEed+MujbuxjZDw==} '@mdi/js@7.4.47': resolution: {integrity: sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==} @@ -707,22 +755,11 @@ packages: '@mdi/react@1.6.1': resolution: {integrity: sha512-4qZeDcluDFGFTWkHs86VOlHkm6gnKaMql13/gpIcUQ8kzxHgpj31NuCkD8abECVfbULJ3shc7Yt4HJ6Wu6SN4w==} - '@mui/base@5.0.0-beta.40': - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/core-downloads-tracker@5.15.18': - resolution: {integrity: sha512-/9pVk+Al8qxAjwFUADv4BRZgMpZM4m5E+2Q/20qhVPuIJWqKp4Ie4tGExac6zu93rgPTYVQGgu+1vjiT0E+cEw==} + '@mui/core-downloads-tracker@5.16.6': + resolution: {integrity: sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==} - '@mui/material@5.15.18': - resolution: {integrity: sha512-n+/dsiqux74fFfcRUJjok+ieNQ7+BEk6/OwX9cLcLvriZrZb+/7Y8+Fd2HlUUbn5N0CDurgAHm0VH1DqyJ9HAw==} + '@mui/material@5.16.6': + resolution: {integrity: sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -738,8 +775,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@5.15.14': - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + '@mui/private-theming@5.16.6': + resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -748,8 +785,8 @@ packages: '@types/react': optional: true - '@mui/styled-engine@5.15.14': - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + '@mui/styled-engine@5.16.6': + resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -761,8 +798,8 @@ packages: '@emotion/styled': optional: true - '@mui/system@5.15.15': - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + '@mui/system@5.16.6': + resolution: {integrity: sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -777,16 +814,16 @@ packages: '@types/react': optional: true - '@mui/types@7.2.14': - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + '@mui/types@7.2.15': + resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@5.15.14': - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + '@mui/utils@5.16.6': + resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -795,59 +832,59 @@ packages: '@types/react': optional: true - '@next/env@14.2.3': - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + '@next/env@14.2.5': + resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} - '@next/swc-darwin-arm64@14.2.3': - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + '@next/swc-darwin-arm64@14.2.5': + resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.3': - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + '@next/swc-darwin-x64@14.2.5': + resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.3': - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + '@next/swc-linux-arm64-gnu@14.2.5': + resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.3': - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + '@next/swc-linux-arm64-musl@14.2.5': + resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.3': - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + '@next/swc-linux-x64-gnu@14.2.5': + resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.3': - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + '@next/swc-linux-x64-musl@14.2.5': + resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.3': - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + '@next/swc-win32-arm64-msvc@14.2.5': + resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.3': - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + '@next/swc-win32-ia32-msvc@14.2.5': + resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.3': - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + '@next/swc-win32-x64-msvc@14.2.5': + resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -856,26 +893,14 @@ packages: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - '@nodelib/fs.scandir@3.0.0': - resolution: {integrity: sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==} - engines: {node: '>=16.14.0'} - '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - '@nodelib/fs.stat@3.0.0': - resolution: {integrity: sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==} - engines: {node: '>=16.14.0'} - '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nodelib/fs.walk@2.0.0': - resolution: {integrity: sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==} - engines: {node: '>=16.14.0'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -903,41 +928,28 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@testing-library/dom@10.1.0': - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.4.5': - resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} + '@testing-library/jest-dom@6.4.8': + resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - '@testing-library/react@15.0.7': - resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} + '@testing-library/react@16.0.0': + resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} engines: {node: '>=18'} peerDependencies: + '@testing-library/dom': ^10.0.0 '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 react: ^18.0.0 react-dom: ^18.0.0 peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -967,8 +979,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1006,17 +1018,14 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/node@20.14.13': + resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1033,8 +1042,8 @@ packages: '@types/react-transition-group@4.4.10': resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - '@types/react@18.3.2': - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1057,8 +1066,8 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@7.9.0': - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1068,8 +1077,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.9.0': - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1078,12 +1087,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.9.0': - resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.9.0': - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1092,12 +1101,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.9.0': - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.9.0': - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1105,21 +1114,21 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.9.0': - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.9.0': - resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vercel/analytics@1.2.2': - resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==} + '@vercel/analytics@1.3.1': + resolution: {integrity: sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==} peerDependencies: next: '>= 13' react: ^18 || ^19 @@ -1150,6 +1159,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1205,9 +1219,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arity-n@1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1216,10 +1227,6 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1279,10 +1286,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1298,8 +1301,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browserslist@4.23.0: @@ -1307,6 +1310,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -1333,8 +1341,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001620: - resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + caniuse-lite@1.0.30001621: + resolution: {integrity: sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==} + + caniuse-lite@1.0.30001643: + resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1439,17 +1450,14 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - compose-function@3.0.3: - resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1536,6 +1544,15 @@ packages: supports-color: optional: true + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -1554,9 +1571,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - deep-freeze@0.0.1: - resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1630,8 +1644,11 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - electron-to-chromium@1.4.774: - resolution: {integrity: sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==} + electron-to-chromium@1.4.783: + resolution: {integrity: sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==} + + electron-to-chromium@1.5.2: + resolution: {integrity: sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1736,8 +1753,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -1748,13 +1765,13 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.3.0: - resolution: {integrity: sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==} + eslint@9.8.0: + resolution: {integrity: sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -1762,8 +1779,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1793,10 +1810,6 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1829,17 +1842,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-iterator@0.0.1: - resolution: {integrity: sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==} - - filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -1861,8 +1867,8 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} form-data@4.0.0: @@ -1930,13 +1936,13 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.15: - resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -1963,10 +1969,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -1978,9 +1980,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-own-property@0.1.0: - resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -2050,9 +2049,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - identity-function@1.0.0: - resolution: {integrity: sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -2076,12 +2072,13 @@ packages: 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@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} inline-style-parser@0.2.3: @@ -2141,10 +2138,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2167,10 +2160,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-iterable@1.1.1: - resolution: {integrity: sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==} - engines: {node: '>= 4'} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -2179,10 +2168,6 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} - is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2255,13 +2240,8 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterable-lookahead@1.0.0: - resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} - engines: {node: '>=4'} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -2401,8 +2381,8 @@ packages: node-notifier: optional: true - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true js-tokens@4.0.0: @@ -2461,16 +2441,12 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - knip@5.16.0: - resolution: {integrity: sha512-kdHfTRZuOqsMnvYYNT+pwefyBUNUYTqgyeGM8k4hfw++GZ3TMRGSPZoSl8IxQTy56AkxEDWyj1/P/mYv1vu/Gw==} + knip@5.27.0: + resolution: {integrity: sha512-W8+jhO7i5pXRUqOzhJGm2DT5/d9aQjyrYTCSojqJxFOvi7ku/nHKzpBO3WNf4eflJo0t3zitmUkM69g53qoZQw==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: @@ -2499,9 +2475,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -2518,9 +2491,8 @@ packages: lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2529,9 +2501,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.16.0: - resolution: {integrity: sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2545,10 +2514,6 @@ packages: mana-font@1.15.9: resolution: {integrity: sha512-VH7X8PpbnjMc1QnQ4PPWEtOIMa9+G8N5PaslyZq7J2h0x+201IfVvEFfZ9+hg/ciHBrqrDToL4X/VBy6pfi3BQ==} - map-obj@2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -2556,8 +2521,8 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - markdownlint-cli@0.40.0: - resolution: {integrity: sha512-JXhI3dRQcaqwiFYpPz6VJ7aKYheD53GmTz9y4D/d0F1MbZDGOp9pqKlbOfUX/pHP/iAoeiE4wYRmk8/kjLakxA==} + markdownlint-cli@0.41.0: + resolution: {integrity: sha512-kp29tKrMKdn+xonfefjp3a/MsNzAd9c5ke0ydMEI9PR98bOjzglYN4nfMSaIs69msUf1DNkgevAIAPtK2SeX0Q==} engines: {node: '>=18'} hasBin: true @@ -2578,6 +2543,9 @@ packages: mdast-util-from-markdown@2.0.0: resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} @@ -2623,6 +2591,9 @@ packages: mdast-util-toc@7.0.1: resolution: {integrity: sha512-mBuhuKtP8F/5vVLNJKeC1fs1W5w2sZqB1uUvKwQK9qftSiBILVkQjKQ8aLVrhIEFPGwbMKCVCB3WAAW+BoVPxg==} + mdast-util-toc@7.1.0: + resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -2723,8 +2694,8 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -2746,15 +2717,15 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} ms@2.1.2: @@ -2771,8 +2742,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@14.2.3: - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + next@14.2.5: + resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -2795,6 +2766,9 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2820,13 +2794,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-pairs@0.1.0: - resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} - - object-values@1.0.0: - resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} - engines: {node: '>=0.10.0'} - object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -2878,6 +2845,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2922,9 +2892,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -2961,8 +2928,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true @@ -2974,8 +2941,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.0.0: - resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + pretty-ms@9.1.0: + resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} engines: {node: '>=18'} prismjs@1.27.0: @@ -3024,8 +2991,8 @@ packages: peerDependencies: react: ^18.3.1 - react-intersection-observer@9.10.2: - resolution: {integrity: sha512-j2hGADK2hCbAlfaq6L3tVLb4iqngoN7B1fT16MwJ4J16YW/vWLcmAIinLsw0lgpZeMi4UDUWtHC9QDde0/P1yQ==} + react-intersection-observer@9.13.0: + resolution: {integrity: sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw==} peerDependencies: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3138,9 +3105,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - reverse-arguments@1.0.0: - resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} - run-con@1.3.2: resolution: {integrity: sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==} hasBin: true @@ -3169,10 +3133,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3182,6 +3142,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -3205,9 +3170,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote-word@1.0.1: - resolution: {integrity: sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==} - shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} @@ -3222,8 +3184,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-icons@11.15.0: - resolution: {integrity: sha512-uDAdtIGc56YJiGpdzImENY4E+5qtHEorW11KoXiwDj4u4YSY74G+q/a9idlY8iEqrjghHGkZ/ras0jRT7JpDTQ==} + simple-icons@13.3.0: + resolution: {integrity: sha512-Ls7JP+S0Gg4ZDEb07R9URp7Sk3d5UWY/dZm06jrbIezqIl0H4M780Cy49T3QTxZlFEXv/T8MNDRW5b45EJw9Bg==} engines: {node: '>=0.12.18'} simple-swizzle@0.2.2: @@ -3236,9 +3198,13 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.1.4: - resolution: {integrity: sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q==} - engines: {node: '>= 18', pnpm: '>= 8'} + smol-toml@1.2.2: + resolution: {integrity: sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==} + engines: {node: '>= 18'} + + smol-toml@1.3.0: + resolution: {integrity: sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==} + engines: {node: '>= 18'} source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -3287,9 +3253,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -3312,10 +3275,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3395,22 +3354,10 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - to-no-case@1.0.2: - resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} - - to-pascal-case@1.0.0: - resolution: {integrity: sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-space-case@1.0.0: - resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -3455,6 +3402,9 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3483,8 +3433,8 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript-eslint@7.9.0: - resolution: {integrity: sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow==} + typescript-eslint@7.18.0: + resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -3493,8 +3443,8 @@ packages: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -3507,9 +3457,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unescape-js@1.1.4: - resolution: {integrity: sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==} - unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} @@ -3547,6 +3494,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3569,8 +3522,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - vlq@0.2.3: - resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + vfile@6.0.2: + resolution: {integrity: sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==} w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} @@ -3663,8 +3616,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} hasBin: true @@ -3698,32 +3651,39 @@ packages: snapshots: - '@adobe/css-tools@4.3.3': {} + '@adobe/css-tools@4.4.0': {} '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + + '@babel/code-frame@7.24.7': dependencies: - '@babel/highlight': 7.24.5 + '@babel/highlight': 7.24.7 picocolors: 1.0.1 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.24.6': {} + + '@babel/compat-data@7.25.0': {} - '@babel/core@7.24.5': + '@babel/core@7.24.6': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -3732,179 +3692,285 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/core@7.24.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-module-transforms': 7.25.0(@babel/core@7.24.9) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.1 + '@babel/types': 7.25.0 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/generator@7.25.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.24.6': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': + '@babel/helper-compilation-targets@7.24.8': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/compat-data': 7.25.0 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 + lru-cache: 5.1.1 + semver: 6.3.1 - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.5 + '@babel/helper-environment-visitor@7.24.6': {} - '@babel/helper-module-imports@7.24.3': + '@babel/helper-function-name@7.24.6': dependencies: - '@babel/types': 7.24.5 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/types': 7.24.6 - '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-module-imports@7.24.6': + dependencies: + '@babel/types': 7.24.6 - '@babel/helper-simple-access@7.24.5': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.1 + '@babel/types': 7.25.0 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.24.5': + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/types': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-module-transforms@7.25.0(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-plugin-utils@7.24.6': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-simple-access@7.24.6': + dependencies: + '@babel/types': 7.24.6 - '@babel/helpers@7.24.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.1 + '@babel/types': 7.25.0 transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.5': + '@babel/helper-split-export-declaration@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.6': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.0 + + '@babel/highlight@7.24.6': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.5': + '@babel/parser@7.24.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': + '@babel/parser@7.25.0': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/types': 7.25.0 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 - '@babel/runtime@7.24.5': + '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.0 + '@babel/types': 7.25.0 - '@babel/traverse@7.24.5': + '@babel/traverse@7.24.6': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': + '@babel/traverse@7.25.1': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.0 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@babel/types@7.25.0': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@bcoe/v8-coverage@0.2.3': {} @@ -3913,122 +3979,114 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.1.1': + '@emnapi/runtime@1.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 optional: true - '@emotion/babel-plugin@11.11.0': + '@emotion/babel-plugin@11.12.0': dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.5 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.4 + '@babel/helper-module-imports': 7.24.7 + '@babel/runtime': 7.25.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.0 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 + transitivePeerDependencies: + - supports-color - '@emotion/cache@11.11.0': + '@emotion/cache@11.13.1': dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 - '@emotion/hash@0.9.1': {} + '@emotion/hash@0.9.2': {} - '@emotion/is-prop-valid@1.2.2': + '@emotion/is-prop-valid@1.3.0': dependencies: - '@emotion/memoize': 0.8.1 + '@emotion/memoize': 0.9.0 - '@emotion/memoize@0.8.1': {} + '@emotion/memoize@0.9.0': {} - '@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1)': + '@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 + transitivePeerDependencies: + - supports-color - '@emotion/serialize@1.1.4': + '@emotion/serialize@1.3.0': dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.9.0 + '@emotion/utils': 1.4.0 csstype: 3.1.3 - '@emotion/sheet@1.2.2': {} + '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.3.2)(react@18.3.1) - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/is-prop-valid': 1.3.0 + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 + transitivePeerDependencies: + - supports-color - '@emotion/unitless@0.8.1': {} + '@emotion/unitless@0.9.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': dependencies: react: 18.3.1 - '@emotion/utils@1.2.1': {} - - '@emotion/weak-memoize@0.3.1': {} - - '@ericcornelissen/bash-parser@0.5.2': - dependencies: - array-last: 1.3.0 - babylon: 6.18.0 - compose-function: 3.0.3 - deep-freeze: 0.0.1 - filter-iterator: 0.0.1 - filter-obj: 1.1.0 - has-own-property: 0.1.0 - identity-function: 1.0.0 - is-iterable: 1.1.1 - iterable-lookahead: 1.0.0 - lodash.curry: 4.1.1 - magic-string: 0.16.0 - map-obj: 2.0.0 - object-pairs: 0.1.0 - object-values: 1.0.0 - reverse-arguments: 1.0.0 - shell-quote-word: 1.0.1 - to-pascal-case: 1.0.0 - unescape-js: 1.1.4 - - '@eslint-community/eslint-utils@4.4.0(eslint@9.3.0)': - dependencies: - eslint: 9.3.0 + '@emotion/utils@1.4.0': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@eslint-community/eslint-utils@4.4.0(eslint@9.8.0)': + dependencies: + eslint: 9.8.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.17.1': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.4 - espree: 10.0.1 + debug: 4.3.6 + espree: 10.1.0 globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 @@ -4038,50 +4096,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.3.0': {} - - '@floating-ui/core@1.6.2': - dependencies: - '@floating-ui/utils': 0.2.2 - - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/react-dom@2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@eslint/js@9.8.0': {} - '@floating-ui/utils@0.2.2': {} + '@eslint/object-schema@2.1.4': {} '@fontsource/libre-baskerville@5.0.13': {} - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.3.0': {} - '@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.2.5)': + '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - prettier: 3.2.5 - semver: 7.6.2 + '@babel/core': 7.24.9 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/traverse': 7.25.1 + '@babel/types': 7.25.0 + prettier: 3.3.3 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -4151,7 +4184,7 @@ snapshots: '@img/sharp-wasm32@0.33.4': dependencies: - '@emnapi/runtime': 1.1.1 + '@emnapi/runtime': 1.2.0 optional: true '@img/sharp-win32-ia32@0.33.4': @@ -4182,27 +4215,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4214,7 +4247,7 @@ snapshots: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -4227,7 +4260,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -4245,7 +4278,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4267,7 +4300,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -4314,7 +4347,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -4325,7 +4358,7 @@ snapshots: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -4337,7 +4370,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.12 + '@types/node': 20.14.13 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -4363,46 +4396,40 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@korumite/kiwi@2.9.1': + '@korumite/kiwi@2.13.0': dependencies: - '@types/mdast': 4.0.3 - gray-matter: 4.0.3 - mdast-util-toc: 7.0.1 + mdast-util-toc: 7.1.0 reading-time: 1.5.0 remark: 15.0.1 + remark-directive: 3.0.0 + remark-frontmatter: 5.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + vfile-matter: 5.0.0 transitivePeerDependencies: - supports-color + '@korumite/ts@1.1.0': {} + '@mdi/js@7.4.47': {} '@mdi/react@1.6.1': dependencies: prop-types: 15.8.1 - '@mui/base@5.0.0-beta.40(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.2) - '@mui/utils': 5.15.14(@types/react@18.3.2)(react@18.3.1) - '@popperjs/core': 2.11.8 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@mui/core-downloads-tracker@5.15.18': {} + '@mui/core-downloads-tracker@5.16.6': {} - '@mui/material@5.15.18(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/core-downloads-tracker': 5.15.18 - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.2) - '@mui/utils': 5.15.14(@types/react@18.3.2)(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/core-downloads-tracker': 5.16.6 + '@mui/system': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 @@ -4412,87 +4439,89 @@ snapshots: react-is: 18.3.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.2)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) - '@types/react': 18.3.2 + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 - '@mui/private-theming@5.15.14(@types/react@18.3.2)(react@18.3.1)': + '@mui/private-theming@5.16.6(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@mui/utils': 5.15.14(@types/react@18.3.2)(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/cache': 11.11.0 + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.2)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1)': + '@mui/system@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@mui/private-theming': 5.15.14(@types/react@18.3.2)(react@18.3.1) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.2) - '@mui/utils': 5.15.14(@types/react@18.3.2)(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/private-theming': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.15(@types/react@18.3.3) + '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.2)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1))(@types/react@18.3.2)(react@18.3.1) - '@types/react': 18.3.2 + '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 - '@mui/types@7.2.14(@types/react@18.3.2)': + '@mui/types@7.2.15(@types/react@18.3.3)': optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 - '@mui/utils@5.15.14(@types/react@18.3.2)(react@18.3.1)': + '@mui/utils@5.16.6(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 + '@mui/types': 7.2.15(@types/react@18.3.3) '@types/prop-types': 15.7.12 + clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 18.3.1 optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 - '@next/env@14.2.3': {} + '@next/env@14.2.5': {} - '@next/swc-darwin-arm64@14.2.3': + '@next/swc-darwin-arm64@14.2.5': optional: true - '@next/swc-darwin-x64@14.2.3': + '@next/swc-darwin-x64@14.2.5': optional: true - '@next/swc-linux-arm64-gnu@14.2.3': + '@next/swc-linux-arm64-gnu@14.2.5': optional: true - '@next/swc-linux-arm64-musl@14.2.3': + '@next/swc-linux-arm64-musl@14.2.5': optional: true - '@next/swc-linux-x64-gnu@14.2.3': + '@next/swc-linux-x64-gnu@14.2.5': optional: true - '@next/swc-linux-x64-musl@14.2.3': + '@next/swc-linux-x64-musl@14.2.5': optional: true - '@next/swc-win32-arm64-msvc@14.2.3': + '@next/swc-win32-arm64-msvc@14.2.5': optional: true - '@next/swc-win32-ia32-msvc@14.2.3': + '@next/swc-win32-ia32-msvc@14.2.5': optional: true - '@next/swc-win32-x64-msvc@14.2.3': + '@next/swc-win32-x64-msvc@14.2.5': optional: true '@nodelib/fs.scandir@2.1.5': @@ -4500,25 +4529,13 @@ snapshots: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.scandir@3.0.0': - dependencies: - '@nodelib/fs.stat': 3.0.0 - run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} - '@nodelib/fs.stat@3.0.0': {} - '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nodelib/fs.walk@2.0.0': - dependencies: - '@nodelib/fs.scandir': 3.0.0 - fastq: 1.17.1 - '@pkgjs/parseargs@0.11.0': optional: true @@ -4545,12 +4562,12 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.2 + tslib: 2.6.3 - '@testing-library/dom@10.1.0': + '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.25.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -4558,30 +4575,26 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)))': + '@testing-library/jest-dom@6.4.8': dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.25.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - optionalDependencies: - '@jest/globals': 29.7.0 - '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) - '@testing-library/react@15.0.7(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@testing-library/dom': 10.1.0 - '@types/react-dom': 18.3.0 + '@babel/runtime': 7.25.0 + '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 '@tootallnate/once@2.0.0': {} @@ -4597,24 +4610,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 '@types/debug@4.1.12': dependencies: @@ -4628,7 +4641,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.12.12 + '@types/node': 20.14.13 '@types/hast@2.3.10': dependencies: @@ -4655,23 +4668,19 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.12.12 + '@types/node': 20.14.13 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 '@types/json5@0.0.29': {} - '@types/mdast@4.0.3': - dependencies: - '@types/unist': 3.0.2 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 '@types/ms@0.7.34': {} - '@types/node@20.12.12': + '@types/node@20.14.13': dependencies: undici-types: 5.26.5 @@ -4681,17 +4690,17 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-transition-group@4.4.10': dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 - '@types/react@18.3.2': + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -4712,94 +4721,94 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 - eslint: 9.3.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.8.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.4 - eslint: 9.3.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + eslint: 9.8.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.9.0': + '@typescript-eslint/scope-manager@7.18.0': dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.9.0(eslint@9.3.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - debug: 4.3.4 - eslint: 9.3.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 9.8.0 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.9.0': {} + '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.4 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.9.0(eslint@9.3.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.18.0(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - eslint: 9.3.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.9.0': + '@typescript-eslint/visitor-keys@7.18.0': dependencies: - '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vercel/analytics@1.2.2(next@14.2.3(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/analytics@1.3.1(next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: server-only: 0.0.1 optionalDependencies: - next: 14.2.3(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 abab@2.0.6: {} @@ -4809,14 +4818,16 @@ snapshots: acorn: 8.11.3 acorn-walk: 8.3.2 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 acorn-walk@8.3.2: {} acorn@8.11.3: {} + acorn@8.12.1: {} + agent-base@6.0.2: dependencies: debug: 4.3.4 @@ -4872,8 +4883,6 @@ snapshots: dependencies: dequal: 2.0.3 - arity-n@1.0.4: {} - array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -4888,10 +4897,6 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 - array-last@1.3.0: - dependencies: - is-number: 4.0.0 - array-union@2.1.0: {} array.prototype.findlastindex@1.2.5: @@ -4936,13 +4941,13 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - babel-jest@29.7.0(@babel/core@7.24.5): + babel-jest@29.7.0(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.5) + babel-preset-jest: 29.6.3(@babel/core@7.24.6) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -4951,7 +4956,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -4961,40 +4966,38 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 cosmiconfig: 7.1.0 resolve: 1.22.8 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - - babel-preset-jest@29.6.3(@babel/core@7.24.5): - dependencies: - '@babel/core': 7.24.5 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6): + dependencies: + '@babel/core': 7.24.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) + + babel-preset-jest@29.6.3(@babel/core@7.24.6): + dependencies: + '@babel/core': 7.24.6 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) - - babylon@6.18.0: {} + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) bail@2.0.2: {} @@ -5011,17 +5014,24 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001620 - electron-to-chromium: 1.4.774 + caniuse-lite: 1.0.30001621 + electron-to-chromium: 1.4.783 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) + browserslist@4.23.2: + dependencies: + caniuse-lite: 1.0.30001643 + electron-to-chromium: 1.5.2 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -5046,7 +5056,9 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001620: {} + caniuse-lite@1.0.30001621: {} + + caniuse-lite@1.0.30001643: {} ccount@2.0.1: {} @@ -5135,14 +5147,10 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@12.0.0: {} + commander@12.1.0: {} commander@4.1.1: {} - compose-function@3.0.3: - dependencies: - arity-n: 1.0.4 - concat-map@0.0.1: {} concurrently@8.2.2: @@ -5169,13 +5177,13 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - create-jest@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): + create-jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5232,7 +5240,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 debug@3.2.7: dependencies: @@ -5242,6 +5250,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.6: + dependencies: + ms: 2.1.2 + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -5254,8 +5266,6 @@ snapshots: deep-extend@0.6.0: {} - deep-freeze@0.0.1: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -5307,7 +5317,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 csstype: 3.1.3 domexception@4.0.0: @@ -5322,7 +5332,9 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 - electron-to-chromium@1.4.774: {} + electron-to-chromium@1.4.783: {} + + electron-to-chromium@1.5.2: {} emittery@0.13.1: {} @@ -5437,17 +5449,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@9.3.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - eslint: 9.3.0 + '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + eslint: 9.8.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -5455,9 +5467,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.3.0 + eslint: 9.8.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@9.3.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -5468,13 +5480,13 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-scope@8.0.1: + eslint-scope@8.0.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -5483,25 +5495,25 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.3.0: + eslint@9.8.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.17.1 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.3.0 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/js': 9.8.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 + eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 - espree: 10.0.1 - esquery: 1.5.0 + espree: 10.1.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -5522,15 +5534,15 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.0.1: + espree@10.1.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -5566,10 +5578,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -5580,7 +5588,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} @@ -5606,14 +5614,10 @@ snapshots: dependencies: flat-cache: 4.0.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - filter-iterator@0.0.1: {} - - filter-obj@1.1.0: {} - find-root@1.1.0: {} find-up@4.1.0: @@ -5637,7 +5641,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -5700,12 +5704,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.15: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.1.1 + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 path-scurry: 1.11.1 glob@7.2.3: @@ -5743,21 +5748,12 @@ snapshots: graphemer@1.4.0: {} - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - has-bigints@1.0.2: {} has-flag@3.0.0: {} has-flag@4.0.0: {} - has-own-property@0.1.0: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 @@ -5851,8 +5847,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - identity-function@1.0.0: {} - ignore@5.3.1: {} import-fresh@3.3.0: @@ -5876,7 +5870,7 @@ snapshots: inherits@2.0.4: {} - ini@4.1.2: {} + ini@4.1.3: {} inline-style-parser@0.2.3: {} @@ -5936,8 +5930,6 @@ snapshots: is-decimal@2.0.1: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -5952,16 +5944,12 @@ snapshots: is-hexadecimal@2.0.1: {} - is-iterable@1.1.1: {} - is-negative-zero@2.0.3: {} is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - is-number@4.0.0: {} - is-number@7.0.0: {} is-path-inside@3.0.3: {} @@ -6005,8 +5993,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -6015,8 +6003,8 @@ snapshots: istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.2 @@ -6042,9 +6030,7 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterable-lookahead@1.0.0: {} - - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -6062,7 +6048,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3(babel-plugin-macros@3.1.0) @@ -6082,16 +6068,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): + jest-cli@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6101,12 +6087,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.5) + babel-jest: 29.7.0(@babel/core@7.24.6) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -6120,14 +6106,14 @@ snapshots: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.12.12 - ts-node: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) + '@types/node': 20.14.13 + ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6157,7 +6143,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -6171,7 +6157,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6181,14 +6167,14 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.12.12 + '@types/node': 20.14.13 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -6207,12 +6193,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -6220,7 +6206,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -6255,7 +6241,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6283,7 +6269,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 @@ -6303,15 +6289,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -6329,7 +6315,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6348,7 +6334,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.14.13 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6357,24 +6343,24 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.12.12 + '@types/node': 20.14.13 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): + jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jiti@1.21.0: {} + jiti@1.21.6: {} js-tokens@4.0.0: {} @@ -6444,30 +6430,26 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - kleur@3.0.3: {} - knip@5.16.0(@types/node@20.12.12)(typescript@5.4.5): + knip@5.27.0(@types/node@20.14.13)(typescript@5.5.4): dependencies: - '@ericcornelissen/bash-parser': 0.5.2 - '@nodelib/fs.walk': 2.0.0 + '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 20.12.12 + '@types/node': 20.14.13 easy-table: 1.2.0 fast-glob: 3.3.2 - file-entry-cache: 8.0.0 - jiti: 1.21.0 + jiti: 1.21.6 js-yaml: 4.1.0 minimist: 1.2.8 - picocolors: 1.0.0 + picocolors: 1.0.1 picomatch: 4.0.2 - pretty-ms: 9.0.0 + pretty-ms: 9.1.0 resolve: 1.22.8 - smol-toml: 1.1.4 + smol-toml: 1.3.0 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.4.5 + typescript: 5.5.4 zod: 3.23.8 zod-validation-error: 3.3.0(zod@3.23.8) @@ -6492,8 +6474,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.curry@4.1.1: {} - lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -6509,7 +6489,7 @@ snapshots: fault: 1.0.4 highlight.js: 10.7.3 - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: @@ -6517,10 +6497,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.16.0: - dependencies: - vlq: 0.2.3 - make-dir@4.0.0: dependencies: semver: 7.6.2 @@ -6533,8 +6509,6 @@ snapshots: mana-font@1.15.9: {} - map-obj@2.0.0: {} - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -6546,19 +6520,19 @@ snapshots: markdown-table@3.0.3: {} - markdownlint-cli@0.40.0: + markdownlint-cli@0.41.0: dependencies: - commander: 12.0.0 + commander: 12.1.0 get-stdin: 9.0.0 - glob: 10.3.15 + glob: 10.4.5 ignore: 5.3.1 js-yaml: 4.1.0 jsonc-parser: 3.2.1 jsonpointer: 5.0.1 markdownlint: 0.34.0 - minimatch: 9.0.4 + minimatch: 9.0.5 run-con: 1.3.2 - toml: 3.0.0 + smol-toml: 1.2.2 markdownlint-micromark@0.1.9: {} @@ -6604,12 +6578,29 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -6754,6 +6745,16 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit: 5.0.0 + mdast-util-toc@7.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/ungap__structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.0 + github-slugger: 2.0.0 + mdast-util-to-string: 4.0.0 + unist-util-is: 6.0.0 + unist-util-visit: 5.0.0 + mdurl@2.0.0: {} merge-stream@2.0.0: {} @@ -6968,9 +6969,9 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.7: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -6987,13 +6988,13 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@7.1.1: {} + minipass@7.1.2: {} ms@2.1.2: {} @@ -7003,27 +7004,27 @@ snapshots: natural-compare@1.4.0: {} - next@14.2.3(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.3 + '@next/env': 14.2.5 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001620 + caniuse-lite: 1.0.30001643 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.3 - '@next/swc-darwin-x64': 14.2.3 - '@next/swc-linux-arm64-gnu': 14.2.3 - '@next/swc-linux-arm64-musl': 14.2.3 - '@next/swc-linux-x64-gnu': 14.2.3 - '@next/swc-linux-x64-musl': 14.2.3 - '@next/swc-win32-arm64-msvc': 14.2.3 - '@next/swc-win32-ia32-msvc': 14.2.3 - '@next/swc-win32-x64-msvc': 14.2.3 + '@next/swc-darwin-arm64': 14.2.5 + '@next/swc-darwin-x64': 14.2.5 + '@next/swc-linux-arm64-gnu': 14.2.5 + '@next/swc-linux-arm64-musl': 14.2.5 + '@next/swc-linux-x64-gnu': 14.2.5 + '@next/swc-linux-x64-musl': 14.2.5 + '@next/swc-win32-arm64-msvc': 14.2.5 + '@next/swc-win32-ia32-msvc': 14.2.5 + '@next/swc-win32-x64-msvc': 14.2.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -7032,6 +7033,8 @@ snapshots: node-releases@2.0.14: {} + node-releases@2.0.18: {} + normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -7050,10 +7053,6 @@ snapshots: object-keys@1.1.1: {} - object-pairs@0.1.0: {} - - object-values@1.0.0: {} - object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -7119,6 +7118,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7145,7 +7146,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7166,13 +7167,11 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 - minipass: 7.1.1 + lru-cache: 10.4.3 + minipass: 7.1.2 path-type@4.0.0: {} - picocolors@1.0.0: {} - picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -7199,7 +7198,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.2.5: {} + prettier@3.3.3: {} pretty-format@27.5.1: dependencies: @@ -7213,7 +7212,7 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.0.0: + pretty-ms@9.1.0: dependencies: parse-ms: 4.0.0 @@ -7256,7 +7255,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-intersection-observer@9.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-intersection-observer@9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: @@ -7268,10 +7267,10 @@ snapshots: react-is@18.3.1: {} - react-markdown@9.0.1(@types/react@18.3.2)(react@18.3.1): + react-markdown@9.0.1(@types/react@18.3.3)(react@18.3.1): dependencies: '@types/hast': 3.0.4 - '@types/react': 18.3.2 + '@types/react': 18.3.3 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -7287,7 +7286,7 @@ snapshots: react-syntax-highlighter@15.5.0(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 @@ -7296,7 +7295,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -7425,12 +7424,10 @@ snapshots: reusify@1.0.4: {} - reverse-arguments@1.0.0: {} - run-con@1.3.2: dependencies: deep-extend: 0.6.0 - ini: 4.1.2 + ini: 4.1.3 minimist: 1.2.8 strip-json-comments: 3.1.1 @@ -7465,15 +7462,12 @@ snapshots: dependencies: loose-envify: 1.4.0 - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - semver@6.3.1: {} semver@7.6.2: {} + semver@7.6.3: {} + server-only@0.0.1: {} set-function-length@1.2.2: @@ -7496,7 +7490,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.2 + semver: 7.6.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.4 '@img/sharp-darwin-x64': 0.33.4 @@ -7524,8 +7518,6 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote-word@1.0.1: {} - shell-quote@1.8.1: {} side-channel@1.0.6: @@ -7539,7 +7531,7 @@ snapshots: signal-exit@4.1.0: {} - simple-icons@11.15.0: {} + simple-icons@13.3.0: {} simple-swizzle@0.2.2: dependencies: @@ -7549,7 +7541,9 @@ snapshots: slash@3.0.0: {} - smol-toml@1.1.4: {} + smol-toml@1.2.2: {} + + smol-toml@1.3.0: {} source-map-js@1.2.0: {} @@ -7593,8 +7587,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.fromcodepoint@0.2.1: {} - string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -7627,8 +7619,6 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -7647,12 +7637,12 @@ snapshots: dependencies: inline-style-parser: 0.2.3 - styled-jsx@5.1.1(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.24.6)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 babel-plugin-macros: 3.1.0 stylis@4.2.0: {} @@ -7687,22 +7677,10 @@ snapshots: to-fast-properties@2.0.0: {} - to-no-case@1.0.2: {} - - to-pascal-case@1.0.0: - dependencies: - to-space-case: 1.0.0 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - to-space-case@1.0.0: - dependencies: - to-no-case: 1.0.2 - - toml@3.0.0: {} - tough-cookie@4.1.4: dependencies: psl: 1.9.0 @@ -7720,25 +7698,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - typescript: 5.4.5 + typescript: 5.5.4 - ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.12 + '@types/node': 20.14.13 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -7751,6 +7729,8 @@ snapshots: tslib@2.6.2: {} + tslib@2.6.3: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -7791,18 +7771,18 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-eslint@7.9.0(eslint@9.3.0)(typescript@5.4.5): + typescript-eslint@7.18.0(eslint@9.8.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - eslint: 9.3.0 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.5.4) + eslint: 9.8.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - typescript@5.4.5: {} + typescript@5.5.4: {} uc.micro@2.1.0: {} @@ -7815,10 +7795,6 @@ snapshots: undici-types@5.26.5: {} - unescape-js@1.1.4: - dependencies: - string.fromcodepoint: 0.2.1 - unified@11.0.4: dependencies: '@types/unist': 3.0.2 @@ -7827,7 +7803,7 @@ snapshots: extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 + vfile: 6.0.2 unist-util-is@6.0.0: dependencies: @@ -7879,6 +7855,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.0(browserslist@4.23.2): + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -7898,8 +7880,8 @@ snapshots: vfile-matter@5.0.0: dependencies: - vfile: 6.0.1 - yaml: 2.4.2 + vfile: 6.0.2 + yaml: 2.5.0 vfile-message@4.0.2: dependencies: @@ -7912,7 +7894,11 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vlq@0.2.3: {} + vfile@6.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 w3c-xmlserializer@4.0.0: dependencies: @@ -7995,7 +7981,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.4.2: {} + yaml@2.5.0: {} yargs-parser@21.1.1: {} diff --git a/public/media/assets/pile-bell-chart.png b/public/media/assets/pile-bell-chart.png new file mode 100644 index 00000000..8bc94bc9 Binary files /dev/null and b/public/media/assets/pile-bell-chart.png differ diff --git a/scryfall/server.js b/scryfall/server.js index d0af6ede..9543d767 100644 --- a/scryfall/server.js +++ b/scryfall/server.js @@ -20,7 +20,7 @@ const handler = async (request, response) => { return it.text(); }); CACHE.set(request.url, promise); - if (process.env.SCRYFALL_DEBUG) { + if (process.env.DEBUG) { console.info(`Cached request for "${request.url}"`); } } @@ -31,10 +31,12 @@ const handler = async (request, response) => { } catch (error) { response.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' }); // TODO Retrieve error details from API response - response.write(`Error while reading "${request.url}" (${error})`); + const message = `Error in response for "${request.url}" (${error})`; + response.write(message); + console.error(message); } finally { response.end(); - if (process.env.SCRYFALL_DEBUG) { + if (process.env.DEBUG) { console.count(`GET ${request.url}`); } } diff --git a/src/components/ArticleCard/ArticleCard.test.tsx b/src/components/ArticleCard/ArticleCard.test.tsx index d8c27589..3dc6670e 100644 --- a/src/components/ArticleCard/ArticleCard.test.tsx +++ b/src/components/ArticleCard/ArticleCard.test.tsx @@ -2,7 +2,6 @@ import { render, screen } from '@testing-library/react'; import { type ComponentProps } from 'react'; import { ArticleCard } from '@/components/ArticleCard/ArticleCard'; -import { Kind } from '@/tools/markdown/constants/Kind'; jest.mock('@/components/ArticleChip/ArticleChip', () => ({ ArticleChip: 'div', @@ -24,7 +23,7 @@ describe(ArticleCard.name, () => { matter: { authors: 'Firstname Lastname', banner: 'banner', - kind: Kind.ARTICLE, + kind: 'ARTICLE', tags: [], title: 'Article Title', }, diff --git a/src/components/ArticleChip/ArticleChip.tsx b/src/components/ArticleChip/ArticleChip.tsx index 8c4bb5c4..6f6f25f5 100644 --- a/src/components/ArticleChip/ArticleChip.tsx +++ b/src/components/ArticleChip/ArticleChip.tsx @@ -2,16 +2,19 @@ import { Chip, type ChipProps } from '@mui/material'; import { alpha } from '@mui/material/styles'; import { type FunctionComponent } from 'react'; -import { Kind } from '@/tools/markdown/constants/Kind'; +import { type KINDS } from '@/tools/markdown/constants'; -const KINDS: Record = { - [Kind.ARTICLE]: 'Article', - [Kind.PRIMER]: 'Primer', - [Kind.REPORT]: 'Report', +const KIND_TO_LABEL: Record<(typeof KINDS)[number], string> = { + ARTICLE: 'Article', + PRIMER: 'Primer', + REPORT: 'Report', }; type Props = Omit & - ({ kind?: never; label: string } | { kind: Kind; label?: never }); + ( + | { kind?: never; label: string } + | { kind: (typeof KINDS)[number]; label?: never } + ); export const ArticleChip: FunctionComponent = ({ kind, @@ -20,16 +23,16 @@ export const ArticleChip: FunctionComponent = ({ ...rest }) => ( ({ - backgroundColor: alpha(palette.document[kind as Kind], 0.1), + backgroundColor: alpha(palette.document[kind], 0.1), borderColor: 'unset', - color: palette.document[kind as Kind], + color: palette.document[kind], })), ...(Array.isArray(sx) ? sx : [sx]), ]} diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx index b930311c..4a9d7a04 100644 --- a/src/components/Layout/Layout.tsx +++ b/src/components/Layout/Layout.tsx @@ -10,13 +10,16 @@ import { type FunctionComponent, type PropsWithChildren, } from 'react'; +import { z } from 'zod'; import { BackToTop } from '@/components/BackToTop/BackToTop'; import { Footer } from '@/components/Footer/Footer'; import { Header } from '@/components/Header/Header'; import { Sidebar } from '@/components/Sidebar/Sidebar'; import { Title } from '@/components/Title/Title'; +import { CATEGORIES } from '@/tools/markdown/constants'; import { type MenuEntry } from '@/tools/markdown/types'; +import { union } from '@/tools/z/union'; type Props = PropsWithChildren & { background?: string; @@ -40,6 +43,13 @@ export const Layout: FunctionComponent = ({ const isDesktop = useMediaQuery(theme.breakpoints.up('md')); const [isSidebarOpen, setIsSidebarOpen] = useState(false); const isClear = !!background; + // TODO Pretty sure this can fail client side until migration to `app` router + const category = z + .preprocess( + (value) => (typeof value === 'string' ? value.toUpperCase() : value), + union(CATEGORIES).optional(), + ) + .parse(router.query.category); const closeSidebar = useCallback(() => setIsSidebarOpen(false), []); @@ -81,7 +91,7 @@ export const Layout: FunctionComponent = ({ withProgress={withProgress} /> SystemStyleObject > = { CENTERED: ({ mixins }) => ({ @@ -45,10 +45,13 @@ export const Row: FunctionComponent = ({ node, row, variant }) => { console.error('Missing cards for row', node); return null; } - if (variant && !Object.keys(VARIANTS).includes(variant)) { - console.error('Unknown variant for row', node); + let style: (typeof VARIANTS)[number] = 'CENTERED'; + const { data, error } = VARIANTS_SCHEMA.safeParse(variant); + if (error) { + console.error(`Unknown variant "${variant}" for row`); + } else if (data) { + style = data; } - const style = VARIANTS[variant as keyof typeof VARIANTS] || VARIANTS.CENTERED; return ( mixins.barf}> & { - category?: Category; + category?: (typeof CATEGORIES)[number]; children?: never; component?: ElementType; href?: string; @@ -32,7 +32,7 @@ export const SidebarEntry: FunctionComponent = forwardRef< Props >(({ category, pages = [], subtitle, title, ...rest }, ref) => { const { asPath, query } = useRouter(); - const routeCategory = `${query.category}`; + const routeCategory = `${query.category}`.toUpperCase(); const routeChapter = `${query.chapter}`; const hasPages = pages.length > 0; const [isOpen, setIsOpen] = useState(hasPages && category === routeCategory); diff --git a/src/components/Sidebar/SidebarRosetta.tsx b/src/components/Sidebar/SidebarRosetta.tsx index 1fd3758d..bb431f7c 100644 --- a/src/components/Sidebar/SidebarRosetta.tsx +++ b/src/components/Sidebar/SidebarRosetta.tsx @@ -11,9 +11,10 @@ import { type SxProps } from '@mui/system'; import { useEffect, useState, type FunctionComponent } from 'react'; import { getRosetta, type Rosetta } from '@/tools/game/getRosetta'; +import { type CATEGORIES } from '@/tools/markdown/constants'; type Props = { - category: string | undefined; + category: (typeof CATEGORIES)[number] | undefined; sx?: SxProps; }; diff --git a/src/pages/404.tsx b/src/pages/404.tsx index 49b6dc46..4f710c21 100644 --- a/src/pages/404.tsx +++ b/src/pages/404.tsx @@ -2,7 +2,7 @@ import { Box } from '@mui/material'; import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type MenuEntry } from '@/tools/markdown/types'; type Props = { @@ -19,7 +19,7 @@ const Page: NextPage = ({ menu }) => ( export const getStaticProps: GetStaticProps = () => ({ props: { - menu: getMenu(), + menu: MENU, }, }); diff --git a/src/pages/[category]/[chapter].tsx b/src/pages/[category]/[chapter].tsx index b2ad2a19..3790112a 100644 --- a/src/pages/[category]/[chapter].tsx +++ b/src/pages/[category]/[chapter].tsx @@ -1,23 +1,13 @@ -import { type ParsedUrlQuery } from 'querystring'; import { Card, CardContent } from '@mui/material'; -import { - type GetStaticPaths, - type GetStaticPathsResult, - type GetStaticProps, - type NextPage, -} from 'next'; +import { type GetStaticPaths, type GetStaticProps, type NextPage } from 'next'; import { Banner } from '@/components/Banner/Banner'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; -import { getChapterCards } from '@/tools/markdown/getChapterCards'; +import { CHAPTERS } from '@/tools/markdown/files'; import { getChapter } from '@/tools/markdown/getMarkdown'; -import { getMenu } from '@/tools/markdown/getMenu'; -import { - type Chapter, - type ChapterCard, - type MenuEntry, -} from '@/tools/markdown/types'; +import { MENU } from '@/tools/markdown/getMenu'; +import { type Chapter, type MenuEntry } from '@/tools/markdown/types'; type Props = { chapter: Chapter; @@ -35,16 +25,12 @@ const Page: NextPage = ({ chapter, menu }) => ( ); -export const getStaticPaths: GetStaticPaths = async () => { - const chapters: ChapterCard[] = getChapterCards(); - const paths: GetStaticPathsResult['paths'] = chapters.map((chapter) => { - const { category, slug } = chapter; - return { params: { category, chapter: slug } }; - }); - return { fallback: false, paths }; -}; +export const getStaticPaths: GetStaticPaths = () => ({ + fallback: false, + paths: CHAPTERS.ROUTES.map((route) => ({ params: route })), +}); -type Query = ParsedUrlQuery & { +type Query = { category: string; chapter: string; }; @@ -56,7 +42,7 @@ export const getStaticProps: GetStaticProps = async ({ return { props: { chapter: await getChapter(category, chapter), - menu: getMenu(), + menu: MENU, }, }; }; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 6576075d..b094bfd2 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -5,7 +5,7 @@ import Head from 'next/head'; import { ThemeProvider } from '@/theme/ThemeContext'; -const Application = (props: AppProps): JSX.Element => { +export default function Application(props: AppProps) { const { Component, pageProps } = props; return ( <> @@ -24,6 +24,4 @@ const Application = (props: AppProps): JSX.Element => { {process.env.NODE_ENV === 'production' && } ); -}; - -export default Application; +} diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index 4959a828..6114cbbb 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,19 +1,17 @@ -import NextDocument, { Head, Html, Main, NextScript } from 'next/document'; +import { Head, Html, Main, NextScript } from 'next/document'; import { darkTheme as theme } from '@/theme/theme'; -export default class Document extends NextDocument { - render(): JSX.Element { - return ( - - - - - -
- - - - ); - } +export default function Document() { + return ( + + + + + +
+ + + + ); } diff --git a/src/pages/articles.tsx b/src/pages/articles.tsx index 81a39c95..f8297e92 100644 --- a/src/pages/articles.tsx +++ b/src/pages/articles.tsx @@ -11,7 +11,7 @@ import NextLink from 'next/link'; import { ArticleMeta } from '@/components/ArticleMeta/ArticleMeta'; import { Layout } from '@/components/Layout/Layout'; import { getArticleCards } from '@/tools/markdown/getArticleCards'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type ArticleCard, type MenuEntry } from '@/tools/markdown/types'; type Props = { @@ -45,7 +45,7 @@ const Page: NextPage = ({ articles, menu }) => ( export const getStaticProps: GetStaticProps = async () => ({ props: { articles: await getArticleCards(), - menu: getMenu(), + menu: MENU, }, }); diff --git a/src/pages/articles/[year]/[month]/[day]/[article].tsx b/src/pages/articles/[year]/[month]/[day]/[article].tsx index 3742370a..449280ca 100644 --- a/src/pages/articles/[year]/[month]/[day]/[article].tsx +++ b/src/pages/articles/[year]/[month]/[day]/[article].tsx @@ -1,21 +1,14 @@ -import { type ParsedUrlQuery } from 'querystring'; import { Card, CardContent, Divider } from '@mui/material'; -import { - type GetStaticPaths, - type GetStaticPathsResult, - type GetStaticProps, - type NextPage, -} from 'next'; +import { type GetStaticPaths, type GetStaticProps, type NextPage } from 'next'; import { Banner } from '@/components/Banner/Banner'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; -import { getArticleCards } from '@/tools/markdown/getArticleCards'; +import { ARTICLES } from '@/tools/markdown/files'; import { getArticle, getMarkdown } from '@/tools/markdown/getMarkdown'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type Article, - type ArticleCard, type MenuEntry, type Partial, } from '@/tools/markdown/types'; @@ -32,7 +25,7 @@ const Page: NextPage = ({ article, footer, menu }) => ( = ({ article, footer, menu }) => ( ); -export const getStaticPaths: GetStaticPaths = async () => { - const articles: ArticleCard[] = await getArticleCards(); - const paths: GetStaticPathsResult['paths'] = articles.map((article) => { - const { day, month, slug, year } = article; - return { params: { article: slug, day, month, year } }; - }); - return { fallback: false, paths }; -}; +export const getStaticPaths: GetStaticPaths = () => ({ + fallback: false, + paths: ARTICLES.ROUTES.map((route) => ({ params: route })), +}); -type Query = ParsedUrlQuery & { +type Query = { article: string; day: string; month: string; @@ -71,8 +60,8 @@ export const getStaticProps: GetStaticProps = async ({ return { props: { article: await getArticle(year, month, day, article), - footer: await getMarkdown('partials', 'article-footer.md'), - menu: getMenu(), + footer: await getMarkdown('partials', 'article-footer'), + menu: MENU, }, }; }; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index f7295d7b..cde0ce51 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -7,7 +7,7 @@ import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getArticleCards } from '@/tools/markdown/getArticleCards'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type ArticleCard as ArticleCardModel, type MenuEntry, @@ -81,8 +81,8 @@ const Page: NextPage = ({ articles, menu, welcome }) => { export const getStaticProps: GetStaticProps = async () => ({ props: { articles: await getArticleCards(), - menu: getMenu(), - welcome: await getMarkdown('partials', 'welcome.md'), + menu: MENU, + welcome: await getMarkdown('partials', 'welcome'), }, }); diff --git a/src/pages/license.tsx b/src/pages/license.tsx index 2a204986..39cd3730 100644 --- a/src/pages/license.tsx +++ b/src/pages/license.tsx @@ -4,7 +4,7 @@ import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type MenuEntry, type Partial } from '@/tools/markdown/types'; type Props = { @@ -27,8 +27,8 @@ const Page: NextPage = ({ license, menu }) => ( export const getStaticProps: GetStaticProps = async () => ({ props: { - license: await getMarkdown('partials', 'license.md'), - menu: getMenu(), + license: await getMarkdown('partials', 'license'), + menu: MENU, }, }); diff --git a/src/pages/sandbox/index.tsx b/src/pages/sandbox/index.tsx index fa7cd93c..5b885a31 100644 --- a/src/pages/sandbox/index.tsx +++ b/src/pages/sandbox/index.tsx @@ -13,10 +13,10 @@ import { useEffect, useState, type ChangeEvent } from 'react'; import { Layout } from '@/components/Layout/Layout'; import { SpoilsCalculator } from '@/components/SpoilsCalculator/SpoilsCalculator'; import { phyrexian } from '@/fonts/fonts'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type MenuEntry } from '@/tools/markdown/types'; -// NOTE Flavor text from "Dark Ritual" Urza's Saga +// NOTE Flavor text from "Dark Ritual" in "Urza's Saga" const DEFAULT_INPUT = `From void evolved Phyrexia. Great Yawgmoth, Father of Machines, saw its perfection. Thus the Grand Evolution began.`; @@ -122,7 +122,7 @@ const Page: NextPage = ({ menu }) => { export const getStaticProps: GetStaticProps = async () => ({ props: { - menu: getMenu(), + menu: MENU, }, }); diff --git a/src/pages/sandbox/markdown.tsx b/src/pages/sandbox/markdown.tsx index ddfef803..fa7d677a 100644 --- a/src/pages/sandbox/markdown.tsx +++ b/src/pages/sandbox/markdown.tsx @@ -4,7 +4,7 @@ import { type GetStaticProps, type NextPage } from 'next'; import { Layout } from '@/components/Layout/Layout'; import { Markdown } from '@/components/Markdown/Markdown'; import { getMarkdown } from '@/tools/markdown/getMarkdown'; -import { getMenu } from '@/tools/markdown/getMenu'; +import { MENU } from '@/tools/markdown/getMenu'; import { type MenuEntry, type Partial } from '@/tools/markdown/types'; type Props = { @@ -24,8 +24,8 @@ const Page: NextPage = ({ markdown, menu }) => ( export const getStaticProps: GetStaticProps = async () => ({ props: { - markdown: await getMarkdown('partials', 'sandbox.md'), - menu: getMenu(), + markdown: await getMarkdown('partials', 'sandbox'), + menu: MENU, }, }); diff --git a/src/theme/theme.ts b/src/theme/theme.ts index e421ed06..da7b5ac3 100644 --- a/src/theme/theme.ts +++ b/src/theme/theme.ts @@ -17,7 +17,7 @@ import { deepmerge } from '@mui/utils'; import { barf } from '@/theme/tools/barf'; import { gutters } from '@/theme/tools/gutters'; import { toolbarMargin } from '@/theme/tools/toolbarMargin'; -import { type Kind } from '@/tools/markdown/constants/Kind'; +import { type KINDS } from '@/tools/markdown/constants'; import '@fontsource/libre-baskerville'; @@ -26,12 +26,12 @@ import '@fontsource/libre-baskerville'; declare module '@mui/material/styles' { interface Palette { dividerOpaque: string; - document: Record; + document: Record<(typeof KINDS)[number], string>; } interface PaletteOptions { dividerOpaque: string; - document: Record; + document: Record<(typeof KINDS)[number], string>; } interface Theme { @@ -203,9 +203,9 @@ export const darkTheme: Theme = customizeTheme({ background: { default: '#121212', paper: grey[900] }, dividerOpaque: grey[800], document: { - article: article.A700, - primer: primer.A700, - report: report.A400, + ARTICLE: article.A700, + PRIMER: primer.A700, + REPORT: report.A400, }, mode: 'dark', primary, @@ -218,9 +218,9 @@ export const lightTheme: Theme = customizeTheme({ background: { default: grey[100] }, dividerOpaque: grey[300], document: { - article: article.A700, - primer: primer.A700, - report: report.A700, + ARTICLE: article.A700, + PRIMER: primer.A700, + REPORT: report.A700, }, mode: 'light', primary, diff --git a/src/tools/game/__tests__/getCard.test.ts b/src/tools/game/__tests__/getCard.test.ts index 9c3311c6..d483344c 100644 --- a/src/tools/game/__tests__/getCard.test.ts +++ b/src/tools/game/__tests__/getCard.test.ts @@ -1,5 +1,4 @@ import { getCard } from '@/tools/game/getCard'; -import { Category } from '@/tools/markdown/constants/Category'; describe(getCard.name, () => { it('should return the name of a known acronym', () => { @@ -15,7 +14,7 @@ describe(getCard.name, () => { const { name, categories } = getCard('AoI'); // Then expect(name).toBe('Act on Impulse'); - expect(categories).toStrictEqual([Category.DDEFT, Category.DDFT]); + expect(categories).toStrictEqual(['DDEFT', 'DDFT']); }); it('should handle unknown acronyms', () => { diff --git a/src/tools/game/__tests__/getRosetta.test.ts b/src/tools/game/__tests__/getRosetta.test.ts index d23d9822..89f6686b 100644 --- a/src/tools/game/__tests__/getRosetta.test.ts +++ b/src/tools/game/__tests__/getRosetta.test.ts @@ -1,19 +1,23 @@ import { getRosetta, type Rosetta } from '@/tools/game/getRosetta'; -import { Category } from '@/tools/markdown/constants/Category'; +import { type CATEGORIES } from '@/tools/markdown/constants'; describe(getRosetta.name, () => { - const tests: [category: Category | undefined, ok: string, ko: string][] = + const tests: [ + category: (typeof CATEGORIES)[number] | undefined, + ok: string, + ko: string, + ][] = // prettier-ignore [ - [Category.APPENDICES, 'Brainstorm', 'Consider'], - [Category.DDFT, 'Echo of Eons', 'Predict'], - [Category.DDEFT, 'Act on Impulse', 'Echo of Eons'], - [Category.MEANDECK, 'Predict', 'Manamorphose'], - [undefined, 'Brainstorm', 'Consider'], + ['APPENDICES', 'Brainstorm', 'Consider'], + ['DDFT', 'Echo of Eons', 'Predict'], + ['DDEFT', 'Act on Impulse', 'Echo of Eons'], + ['MEANDECK', 'Predict', 'Manamorphose'], + [undefined, 'Brainstorm', 'Consider'], ]; it.each(tests)( - "should return the appropriate notations for '%s'", + "should return the appropriate notation for '%s'", (category, ok, ko) => { // When const rosetta: Rosetta = getRosetta(category); diff --git a/src/tools/game/constants/Cards.ts b/src/tools/game/constants/Cards.ts index 5cc41312..29db9c8e 100644 --- a/src/tools/game/constants/Cards.ts +++ b/src/tools/game/constants/Cards.ts @@ -1,56 +1,56 @@ -import { Category as C } from '@/tools/markdown/constants/Category'; +import { type CATEGORIES } from '@/tools/markdown/constants'; /** Commonly used acronyms and their corresponding category. */ -export const CARDS: Record = +export const CARDS: Record = // prettier-ignore { - AoI: ['Act on Impulse', [C.DDEFT, C.DDFT]], + AoI: ['Act on Impulse', ['DDEFT', 'DDFT']], BS: ['Brainstorm', []], - BW: ['Burning Wish', [C.DDFT]], - CB: ["Conjurer's Bauble", [C.DDFT]], + BW: ['Burning Wish', ['DDFT']], + CB: ["Conjurer's Bauble", ['DDFT']], CR: ['Cabal Ritual', []], CT: ['Cabal Therapy', []], CoS: ['Cavern of Souls', []], CoV: ['Chain of Vapor', []], - Con: ['Consider', [C.DDFT, C.ENTOMBSDAY, C.MEANDECK]], - DA: ['Deep Analysis', [C.MEANDECK]], + Con: ['Consider', ['DDFT', 'ENTOMBSDAY', 'MEANDECK']], + DA: ['Deep Analysis', ['MEANDECK']], DD: ['Doomsday', []], DR: ['Dark Ritual', []], DW: ['Divining Witch', []], Dur: ['Duress', []], - EF: ['Experimental Frenzy', [C.DDEFT]], + EF: ['Experimental Frenzy', ['DDEFT']], ET: ['Echoing Truth', []], Em: ['Emrakul, the Aeons Torn', []], - EoA: ['Edge of Autumn', [C.DDFT, C.ENTOMBSDAY, C.MEANDECK]], - EoE: ['Echo of Eons', [C.DDFT, C.MEANDECK]], - EtW: ['Empty the Warrens', [C.DDEFT, C.DDFT]], + EoA: ['Edge of Autumn', ['DDFT', 'ENTOMBSDAY', 'MEANDECK']], + EoE: ['Echo of Eons', ['DDFT', 'MEANDECK']], + EtW: ['Empty the Warrens', ['DDEFT', 'DDFT']], FoN: ['Force of Negation', []], FoW: ['Force of Will', []], - GP: ['Gitaxian Probe', [C.DDFT, C.MEANDECK]], - IC: ['Infernal Contract', [C.DDFT]], - IU: ['Ideas Unbound', [C.DDFT, C.ENTOMBSDAY, C.MEANDECK]], - LDV: ["Lim-Dul's Vault", [C.DDEFT, C.ENTOMBSDAY, C.MEANDECK]], + GP: ['Gitaxian Probe', ['DDFT', 'MEANDECK']], + IC: ['Infernal Contract', ['DDFT']], + IU: ['Ideas Unbound', ['DDFT', 'ENTOMBSDAY', 'MEANDECK']], + LDV: ["Lim-Dul's Vault", ['DDEFT', 'ENTOMBSDAY', 'MEANDECK']], LED: ["Lion's Eye Diamond", []], LM: ['Laboratory Maniac', []], LP: ['Lotus Petal', []], - Mm: ['Manamorphose', [C.DDFT]], - NW: ["Night's Whisper", [C.MEANDECK]], - PT: ['Personal Tutor', [C.ENTOMBSDAY, C.MEANDECK]], - Pdt: ['Predict', [C.ENTOMBSDAY, C.MEANDECK]], - PiF: ['Past in Flames', [C.DDFT]], + Mm: ['Manamorphose', ['DDFT']], + NW: ["Night's Whisper", ['MEANDECK']], + PT: ['Personal Tutor', ['ENTOMBSDAY', 'MEANDECK']], + Pdt: ['Predict', ['ENTOMBSDAY', 'MEANDECK']], + PiF: ['Past in Flames', ['DDFT']], Pnd: ['Ponder', []], - PoN: ['Pact of Negation', [C.DDEFT, C.ENTOMBSDAY, C.MEANDECK]], + PoN: ['Pact of Negation', ['DDEFT', 'ENTOMBSDAY', 'MEANDECK']], Pre: ['Preordain', []], REB: ['Red Elemental Blast', []], SE: ['Surgical Extraction', []], SI: ['Shelldock Isle', []], SW: ['Street Wraith', []], SdT: ["Sensei's Divining Top", []], - SotV: ['Spoils of the Vault', [C.DDFT]], + SotV: ['Spoils of the Vault', ['DDFT']], StP: ['Swords to Plowshares', []], TO: ["Thassa's Oracle", []], - TW: ['Three Wishes', [C.DDEFT, C.DDFT]], + TW: ['Three Wishes', ['DDEFT', 'DDFT']], ToA: ['Tendrils of Agony', []], Tsz: ['Thoughtseize', []], - VoS: ['Veil of Summer', [C.DDFT, C.MEANDECK]], + VoS: ['Veil of Summer', ['DDFT', 'MEANDECK']], }; diff --git a/src/tools/game/getCard.ts b/src/tools/game/getCard.ts index 3f13e258..d531a6b3 100644 --- a/src/tools/game/getCard.ts +++ b/src/tools/game/getCard.ts @@ -1,9 +1,9 @@ import { CARDS } from '@/tools/game/constants/Cards'; -import { type Category } from '@/tools/markdown/constants/Category'; +import { type CATEGORIES } from '@/tools/markdown/constants'; export const getCard = ( key: string, -): { name: string; categories: Category[] } => { +): { name: string; categories: (typeof CATEGORIES)[number][] } => { const [name = key, categories = []] = CARDS[key] || []; return { name, categories }; }; diff --git a/src/tools/game/getRosetta.ts b/src/tools/game/getRosetta.ts index fe7e49d0..316e27c9 100644 --- a/src/tools/game/getRosetta.ts +++ b/src/tools/game/getRosetta.ts @@ -1,12 +1,17 @@ import { CARDS } from '@/tools/game/constants/Cards'; -import { type Category } from '@/tools/markdown/constants/Category'; +import { type CATEGORIES } from '@/tools/markdown/constants'; export type Rosetta = [notation: string, name: string][]; -export const getRosetta = (category: string | undefined): Rosetta => +export const getRosetta = ( + category: (typeof CATEGORIES)[number] | undefined, +): Rosetta => Object.entries(CARDS).reduce((accumulator, [notation, card]) => { const [name, categories] = card; - if (!categories.length || categories.includes(category as Category)) { + if ( + !categories.length || + (category && (categories as string[]).includes(category.toUpperCase())) + ) { accumulator.push([notation, name]); } return accumulator; diff --git a/src/tools/markdown/constants.ts b/src/tools/markdown/constants.ts new file mode 100644 index 00000000..da32b509 --- /dev/null +++ b/src/tools/markdown/constants.ts @@ -0,0 +1,11 @@ +export const CATEGORIES = [ + 'APPENDICES', + 'DDEFT', + 'DDFT', + 'ENTOMBSDAY', + 'MEANDECK', +] as const; + +export const KINDS = ['ARTICLE', 'PRIMER', 'REPORT'] as const; + +export const TAGS = ['DDEFT', 'DDFT', 'LEGACY', 'MEANDECK', 'VINTAGE'] as const; diff --git a/src/tools/markdown/constants/Category.ts b/src/tools/markdown/constants/Category.ts deleted file mode 100644 index 0961dfe1..00000000 --- a/src/tools/markdown/constants/Category.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum Category { - // TODO Migrate to a union of strings - APPENDICES = 'appendices', - DDEFT = 'ddeft', - DDFT = 'ddft', - ENTOMBSDAY = 'entombsday', - MEANDECK = 'meandeck', -} diff --git a/src/tools/markdown/constants/Files.ts b/src/tools/markdown/constants/Files.ts deleted file mode 100644 index 351297e2..00000000 --- a/src/tools/markdown/constants/Files.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { join } from 'node:path'; - -/** File extension to consider for Markdown content. */ -export const MARKDOWN_EXTENSION = '.md'; - -/** Base file URL for Markdown content. */ -export const BASE_URL = join(process.cwd(), 'markdown'); - -/** Base file URLs for Markdown content categories. */ -export const BASE_URLS = { - /** Base URL for articles. */ - ARTICLES: join(BASE_URL, 'articles'), - /** Base URL for chapters. */ - CHAPTERS: join(BASE_URL, 'chapters'), -} as const; diff --git a/src/tools/markdown/constants/Kind.ts b/src/tools/markdown/constants/Kind.ts deleted file mode 100644 index fc5592ec..00000000 --- a/src/tools/markdown/constants/Kind.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum Kind { - // TODO Migrate to a union of strings - ARTICLE = 'article', - PRIMER = 'primer', - REPORT = 'report', -} diff --git a/src/tools/markdown/constants/Menu.ts b/src/tools/markdown/constants/Menu.ts deleted file mode 100644 index 182ad36e..00000000 --- a/src/tools/markdown/constants/Menu.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Category } from '@/tools/markdown/constants/Category'; -import { type MenuDecoration } from '@/tools/markdown/types'; - -/** List the menu entries and their corresponding decorations in order. */ -export const DECORATIONS: MenuDecoration[] = [ - { - category: Category.MEANDECK, - subtitle: 'Force of Will Doomsday', - title: 'Doomsday', - }, - { - category: Category.DDFT, - subtitle: 'Doomsday Fetchland Tendrils', - title: 'DDFT', - }, - { - category: Category.ENTOMBSDAY, - subtitle: 'Tin Fins Hybrid', - title: 'Entombsday', - }, - { - category: Category.APPENDICES, - subtitle: 'Other Resources', - title: 'Appendices', - }, -]; diff --git a/src/tools/markdown/constants/Tag.ts b/src/tools/markdown/constants/Tag.ts deleted file mode 100644 index 651bc0fe..00000000 --- a/src/tools/markdown/constants/Tag.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum Tag { - // TODO Migrate to a union of strings - DDEFT = 'DDEFT', - DDFT = 'DDFT', - LEGACY = 'LEGACY', - MEANDECK = 'MEANDECK', - VINTAGE = 'VINTAGE', -} diff --git a/src/tools/markdown/files.ts b/src/tools/markdown/files.ts new file mode 100644 index 00000000..47c3c0cc --- /dev/null +++ b/src/tools/markdown/files.ts @@ -0,0 +1,35 @@ +import { join } from 'node:path'; +import { makeNextRoutes, walk } from '@korumite/kiwi/server'; +import { z } from 'zod'; + +/** @deprecated Use `BASE_URLS.ROOT` instead. */ +const BASE_URL = join(process.cwd(), 'markdown'); + +/** Base file URLs for Markdown content categories. */ +export const BASE_URLS = { + ARTICLES: join(BASE_URL, 'articles'), + CHAPTERS: join(BASE_URL, 'chapters'), + ROOT: BASE_URL, +} as const; + +const ARTICLES_TREE = z + .tuple([z.string(), z.string(), z.string(), z.string()]) + .refine((_): _ is [y: string, m: string, d: string, slug: string] => true) + .array() + .parse(walk(BASE_URLS.ARTICLES)); + +export const ARTICLES = { + ROUTES: makeNextRoutes(ARTICLES_TREE, ['year', 'month', 'day', 'article']), + TREE: ARTICLES_TREE, +} as const; + +const CHAPTERS_TREE = z + .tuple([z.string(), z.string()]) + .refine((_): _ is [chapter: string, slug: string] => true) + .array() + .parse(walk(BASE_URLS.CHAPTERS)); + +export const CHAPTERS = { + ROUTES: makeNextRoutes(CHAPTERS_TREE, ['category', 'chapter']), + TREE: CHAPTERS_TREE, +} as const; diff --git a/src/tools/markdown/getArticleCards.ts b/src/tools/markdown/getArticleCards.ts index cd292be3..9e837109 100644 --- a/src/tools/markdown/getArticleCards.ts +++ b/src/tools/markdown/getArticleCards.ts @@ -1,11 +1,8 @@ import { join } from 'node:path'; -import { read, walk } from '@korumite/kiwi/server'; +import { read } from '@korumite/kiwi/server'; import { formatDate } from '@/tools/io/formatDate'; -import { - BASE_URLS, - MARKDOWN_EXTENSION, -} from '@/tools/markdown/constants/Files'; +import { ARTICLES, BASE_URLS } from '@/tools/markdown/files'; import { getBanner } from '@/tools/markdown/getBanner'; import { readArticleMatter } from '@/tools/markdown/readMatter'; import { @@ -13,31 +10,31 @@ import { type ArticleMatter, type Banner, } from '@/tools/markdown/types'; -import { assertDepth } from '@/tools/markdown/utilities'; + +const MARKDOWN_EXTENSION = '.md'; /** Represent an article card for which the banner hasn't resolved yet. */ -type ArticleCardPending = Omit & - Partial>; +type ArticleCardPending = Omit & { + banner?: ArticleCard['banner']; +}; /** Read file system and return a list of all articles. */ export const getArticleCards = async (): Promise => { - const extension = MARKDOWN_EXTENSION; - const files = walk(BASE_URLS.ARTICLES, { extension }); /** Warmup array for banner promises. */ const banners: Promise[] = []; // NOTE Reduce rightwards to sort descending - const cards = files.reduceRight( - (accumulator, crumbs) => { - assertDepth(crumbs, 4); - const [year, month, day, slug] = crumbs; - const path = join(...crumbs) + extension; + const cards = await ARTICLES.TREE.reduceRight>( + async (accumulator, crumbs) => { + const path = join(...crumbs) + MARKDOWN_EXTENSION; + const markdown = await read([BASE_URLS.ARTICLES, path]); let matter: ArticleMatter; try { - matter = readArticleMatter(read(BASE_URLS.ARTICLES, path).matter); + matter = readArticleMatter(markdown.matter); } catch (error) { const message = error instanceof Error ? error.message : `${error}`; throw new Error(`${message} in "${path}"`); } + const [year, month, day, slug] = crumbs; const card: ArticleCardPending = { date: formatDate(year, month, day), day, @@ -56,9 +53,9 @@ export const getArticleCards = async (): Promise => { }, ), ); - return [...accumulator, card]; + return [...(await accumulator), card]; }, - [], + Promise.resolve([]), ); await Promise.all(banners); return cards as ArticleCard[]; diff --git a/src/tools/markdown/getBanner.ts b/src/tools/markdown/getBanner.ts index db4cecfe..8f44ba64 100644 --- a/src/tools/markdown/getBanner.ts +++ b/src/tools/markdown/getBanner.ts @@ -14,12 +14,11 @@ export const getBanner = async (query: string): Promise => { if (!art || !artPreview) { throw new Error(`Missing card art for banner "${name}"`); } - const banner: Banner = { + return { art, artPreview, flavor, // TODO Pass down name and artist separately title: `"${name}" by ${artist}`, }; - return banner; }; diff --git a/src/tools/markdown/getChapterCards.ts b/src/tools/markdown/getChapterCards.ts index 0e1eca48..4403245b 100644 --- a/src/tools/markdown/getChapterCards.ts +++ b/src/tools/markdown/getChapterCards.ts @@ -1,26 +1,29 @@ import { join } from 'node:path'; -import { read, walk } from '@korumite/kiwi/server'; +import { read } from '@korumite/kiwi/server'; +import { z } from 'zod'; -import { - BASE_URLS, - MARKDOWN_EXTENSION, -} from '@/tools/markdown/constants/Files'; +import { CATEGORIES } from '@/tools/markdown/constants'; +import { BASE_URLS, CHAPTERS } from '@/tools/markdown/files'; import { readChapterMatter } from '@/tools/markdown/readMatter'; import { type ChapterCard, type ChapterMatter } from '@/tools/markdown/types'; -import { assertCategory, assertDepth } from '@/tools/markdown/utilities'; +import { union } from '@/tools/z/union'; + +const MARKDOWN_EXTENSION = '.md'; /** Read file system and return a list of all chapters. */ -export const getChapterCards = (): ChapterCard[] => { - const extension = MARKDOWN_EXTENSION; - const files = walk(BASE_URLS.CHAPTERS, { extension }); - const cards = files.reduce((accumulator, crumbs) => { - assertDepth(crumbs, 2); - const [category, slug] = crumbs; - assertCategory(category); - const path = join(...crumbs) + extension; +export const getChapterCards = (): Promise => + CHAPTERS.TREE.reduce>(async (accumulator, crumbs) => { + const category = z + .preprocess( + (value) => (typeof value === 'string' ? value.toUpperCase() : value), + union(CATEGORIES), + ) + .parse(crumbs[0]); + const path = join(...crumbs) + MARKDOWN_EXTENSION; + const markdown = await read([BASE_URLS.CHAPTERS, path]); let matter: ChapterMatter; try { - matter = readChapterMatter(read(BASE_URLS.CHAPTERS, path).matter); + matter = readChapterMatter(markdown.matter); } catch (error) { const message = error instanceof Error ? error.message : `${error}`; throw new Error(`${message} in "${path}"`); @@ -29,9 +32,7 @@ export const getChapterCards = (): ChapterCard[] => { category, matter, route: ['', ...crumbs].join('/'), - slug, + slug: crumbs[1], }; - return [...accumulator, card]; - }, []); - return cards; -}; + return [...(await accumulator), card]; + }, Promise.resolve([])); diff --git a/src/tools/markdown/getMarkdown.ts b/src/tools/markdown/getMarkdown.ts index 60bb4f26..7f941497 100644 --- a/src/tools/markdown/getMarkdown.ts +++ b/src/tools/markdown/getMarkdown.ts @@ -1,13 +1,8 @@ -import { readFileSync } from 'node:fs'; import { join } from 'node:path'; -import remarkDirective from 'remark-directive'; -import remarkFrontmatter from 'remark-frontmatter'; -import remarkParse from 'remark-parse'; -import remarkStringify from 'remark-stringify'; -import { unified } from 'unified'; +import { read } from '@korumite/kiwi/server'; import { type Decklists } from '@/tools/decklists/types'; -import { BASE_URL } from '@/tools/markdown/constants/Files'; +import { BASE_URLS } from '@/tools/markdown/files'; import { getBanner } from '@/tools/markdown/getBanner'; import { readArticleMatter, @@ -19,50 +14,15 @@ import { type Partial, } from '@/tools/markdown/types'; import { remarkDecklists } from '@/tools/remark/remarkDecklists.server'; -import { remarkMatter } from '@/tools/remark/remarkFrontmatter.server'; import { remarkMana } from '@/tools/remark/remarkMana.server'; -import { remarkMinutes } from '@/tools/remark/remarkMinutes.server'; import { remarkScries } from '@/tools/remark/remarkScries.server'; import { type Scries } from '@/tools/scryfall/types'; -/** - * Read the Markdown content found at the provided path crumbs. - * This does not handle the file extension and it has to be provided in the last - * crumb. The path is relative to the root of the project. - */ -export const getMarkdown = async (...crumbs: string[]): Promise => { - const path = join(...crumbs); - const buffer = readFileSync(join(BASE_URL, path)); - try { - const { data, value } = await unified() - .use(remarkDecklists) - .use(remarkDirective) - .use(remarkFrontmatter) - .use(remarkMana) - .use(remarkMatter) - .use(remarkMinutes) - .use(remarkParse) - .use(remarkScries) - .use(remarkStringify) - .process(buffer); - return { - decklists: data.decklists as Decklists, - matter: data.matter as Record, - minutes: data.minutes as number, - scries: data.scries as Scries, - text: String(value), - }; - } catch (error) { - const message = error instanceof Error ? error.message : `${error}`; - throw new Error(`${message} in "${path}"`); - } -}; - /** Convenience helper to read an article. See `getMarkdown`. */ export const getArticle = async ( ...crumbs: [year: string, month: string, day: string, article: string] ): Promise
=> { - const path = join('articles', ...crumbs) + '.md'; + const path = join('articles', ...crumbs); const markdown = await getMarkdown(path); try { const matter = readArticleMatter(markdown.matter); @@ -78,7 +38,7 @@ export const getArticle = async ( export const getChapter = async ( ...crumbs: [category: string, chapter: string] ): Promise => { - const path = join('chapters', ...crumbs) + '.md'; + const path = join('chapters', ...crumbs); const markdown = await getMarkdown(path); try { const matter = readChapterMatter(markdown.matter); @@ -89,3 +49,31 @@ export const getChapter = async ( throw new Error(`${message} in "${path}"`); } }; + +/** + * Read the Markdown content found at the provided path crumbs. + * This handles the Markdown file extension so it should not be provided in the + * last crumb. + * The path is relative to the root of the project. + */ +export const getMarkdown = async (...crumbs: string[]): Promise => { + const path = join(...crumbs) + '.md'; + try { + const { data, ...rest } = await read( + [BASE_URLS.ROOT, path], + remarkDecklists, + remarkMana, + remarkScries, + ); + if (!data.decklists) throw new Error('Missing decklists'); + if (!data.scries) throw new Error('Missing scries'); + return { + decklists: data.decklists as Decklists, + scries: data.scries as Scries, + ...rest, + }; + } catch (error) { + const message = error instanceof Error ? error.message : `${error}`; + throw new Error(`${message} in "${path}"`); + } +}; diff --git a/src/tools/markdown/getMenu.ts b/src/tools/markdown/getMenu.ts index 3403ffe0..ac592328 100644 --- a/src/tools/markdown/getMenu.ts +++ b/src/tools/markdown/getMenu.ts @@ -1,23 +1,48 @@ -import { type Category } from '@/tools/markdown/constants/Category'; -import { DECORATIONS } from '@/tools/markdown/constants/Menu'; import { getChapterCards } from '@/tools/markdown/getChapterCards'; -import { type ChapterCard, type MenuEntry } from '@/tools/markdown/types'; +import { + type ChapterCard, + type MenuDecoration, + type MenuEntry, +} from '@/tools/markdown/types'; + +/** List the menu entries and their corresponding decorations in order. */ +const DECORATIONS: MenuDecoration[] = [ + { + category: 'MEANDECK', + subtitle: 'Force of Will Doomsday', + title: 'Doomsday', + }, + { + category: 'DDFT', + subtitle: 'Doomsday Fetchland Tendrils', + title: 'DDFT', + }, + { + category: 'ENTOMBSDAY', + subtitle: 'Tin Fins Hybrid', + title: 'Entombsday', + }, + { + category: 'APPENDICES', + subtitle: 'Other Resources', + title: 'Appendices', + }, +]; /** * Read file system and return a structured list of all chapters within their * respective categories. */ -export const getMenu = (): MenuEntry[] => { - const cards = getChapterCards(); - const menu = cards.reduce>>( - (accumulator, card) => { - const { category } = card; - accumulator[category] = accumulator[category] || []; - (accumulator[category] as ChapterCard[]).push(card); - return accumulator; - }, - {}, - ); +const getMenu = async (): Promise => { + const cards = await getChapterCards(); + const menu = cards.reduce< + Partial> + >((accumulator, card) => { + const { category } = card; + accumulator[category] = accumulator[category] || []; + accumulator[category].push(card); + return accumulator; + }, {}); return DECORATIONS.map(({ category, subtitle, title }) => { const pages = menu[category]; if (!pages) { @@ -28,3 +53,6 @@ export const getMenu = (): MenuEntry[] => { return { category, subtitle, title, pages }; }); }; + +/** A structured list of all chapters within their respective categories. */ +export const MENU = await getMenu(); diff --git a/src/tools/markdown/readMatter.ts b/src/tools/markdown/readMatter.ts index 61eeaa2f..d8c67976 100644 --- a/src/tools/markdown/readMatter.ts +++ b/src/tools/markdown/readMatter.ts @@ -1,25 +1,30 @@ -import { - sanitizeArticleKind, - sanitizeArticleTags, - sanitizeAuthors, - sanitizeBanner, - sanitizeOrder, - sanitizeTitle, -} from '@/tools/markdown/sanitize'; +import { z } from 'zod'; + +import { KINDS, TAGS } from '@/tools/markdown/constants'; import { type ArticleMatter, type ChapterMatter } from '@/tools/markdown/types'; +import { union } from '@/tools/z/union'; -type ReadMatter = (data: Record) => M; +type ReadMatter = (data: Record) => TMatter; -export const readArticleMatter: ReadMatter = (data) => ({ - authors: sanitizeAuthors(data.authors), - banner: sanitizeBanner(data.banner), - kind: sanitizeArticleKind(data.kind), - tags: sanitizeArticleTags(data.tags), - title: sanitizeTitle(data.title), -}); +export const readArticleMatter: ReadMatter = (data) => + z + .object({ + authors: z.string(), + banner: z.string(), + kind: union(KINDS), + tags: z.preprocess( + (value) => (Array.isArray(value) ? value : [value]), + union(TAGS).array(), + ), + title: z.string(), + }) + .parse(data); -export const readChapterMatter: ReadMatter = (data) => ({ - banner: sanitizeBanner(data.banner), - order: data.order === undefined ? null : sanitizeOrder(data.order), - title: sanitizeTitle(data.title), -}); +export const readChapterMatter: ReadMatter = (data) => + z + .object({ + banner: z.string(), + order: z.number().nonnegative().optional(), + title: z.string(), + }) + .parse(data); diff --git a/src/tools/markdown/sanitize.ts b/src/tools/markdown/sanitize.ts deleted file mode 100644 index fea07d5d..00000000 --- a/src/tools/markdown/sanitize.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Kind } from '@/tools/markdown/constants/Kind'; -import { Tag } from '@/tools/markdown/constants/Tag'; - -// TODO How about Zod? - -type Sanitizer = (value: unknown) => T; - -/** Verify that the article kind matter property is correctly formed. */ -export const sanitizeArticleKind: Sanitizer = (value) => { - if (!value || typeof value !== 'string') { - throw new Error(`Missing 'kind' property`); - } - const kinds: string[] = Object.keys(Kind); - if (!kinds.includes(value)) { - const options = `['${kinds.join("', '")}']`; - throw new Error( - `Invalid 'kind' property. Expected one of: ${options}, got "${value}" instead`, - ); - } - return Kind[value as keyof typeof Kind]; -}; - -/** Verify that the article tags are correctly formed. */ -export const sanitizeArticleTags: Sanitizer = (value) => { - let result: Tag[] = []; - if (value) { - const tags: Tag[] = Object.values(Tag); - const values = Array.isArray(value) ? value : [value]; - result = values.map((tag) => { - if (!tags.includes(tag)) { - const options = `['${tags.join("', '")}']`; - throw new Error( - `Invalid 'tags' property. Expected one ${options}, got "${tag}" instead`, - ); - } - return tag; - }); - } - return result; -}; - -const sanitizeString = (value: unknown, message: string): string => { - if (!value || typeof value !== 'string') { - throw new Error(message); - } - return value; -}; - -/** Verify that the authors field is correctly formed. */ -export const sanitizeAuthors: Sanitizer = (value) => - sanitizeString(value, "Missing 'authors' property"); - -/** Verify that the banner matter property is correctly formed. */ -export const sanitizeBanner: Sanitizer = (value) => - sanitizeString(value, "Missing 'banner' property"); - -/** Verify that the order field is correctly formed. */ -export const sanitizeOrder: Sanitizer = (value) => { - if (value === undefined || !Number.isInteger(value)) { - throw new Error("Missing 'order' property"); - } - return value as number; -}; - -/** Verify that the title matter property is correctly formed. */ -export const sanitizeTitle: Sanitizer = (value) => - sanitizeString(value, "Missing 'title' property"); diff --git a/src/tools/markdown/types.ts b/src/tools/markdown/types.ts index 79d23953..d9ae2651 100644 --- a/src/tools/markdown/types.ts +++ b/src/tools/markdown/types.ts @@ -1,7 +1,9 @@ import { type Decklists } from '@/tools/decklists/types'; -import { type Category } from '@/tools/markdown/constants/Category'; -import { type Kind } from '@/tools/markdown/constants/Kind'; -import { type Tag } from '@/tools/markdown/constants/Tag'; +import { + type CATEGORIES, + type KINDS, + type TAGS, +} from '@/tools/markdown/constants'; import { type Scries } from '@/tools/scryfall/types'; export type Banner = { @@ -28,7 +30,7 @@ export type ArticleCard = Card & { }; export type ChapterCard = Card & { - category: Category; + category: (typeof CATEGORIES)[number]; }; // Documents /////////////////////////////////////////////////////////////////// @@ -56,21 +58,21 @@ export type Chapter = Omit & { export type ArticleMatter = { authors: string; banner: string; - kind: Kind; - tags: Tag[]; + kind: (typeof KINDS)[number]; + tags: (typeof TAGS)[number][]; title: string; }; export type ChapterMatter = { banner: string; - order: number | null; + order?: number; title: string; }; // Menu //////////////////////////////////////////////////////////////////////// export type MenuDecoration = { - category: Category; + category: (typeof CATEGORIES)[number]; subtitle: string; title: string; }; diff --git a/src/tools/markdown/utilities.test.ts b/src/tools/markdown/utilities.test.ts deleted file mode 100644 index 10a17b9b..00000000 --- a/src/tools/markdown/utilities.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { assertCategory, assertDepth } from '@/tools/markdown/utilities'; - -describe(assertCategory.name, () => { - it('should throw when the provided category is not known', () => { - // When - const assert = () => assertCategory('unknown'); - // Then - expect(assert).toThrowError(/unknown category/i); - }); - - it('should not throw when the provided category is known', () => { - // When - const assert = () => assertCategory('meandeck'); - // Then - expect(assert).not.toThrow(); - }); -}); - -describe(assertDepth.name, () => { - it('should throw when the provided items do not have the required length', () => { - // When - const assert = () => assertDepth([1, 2, 3], 4); - // Then - expect(assert).toThrowError(/malformed path/i); - }); - - it('should not throw when the provided items have the required length', () => { - // When - const assert = () => assertDepth([1, 2, 3], 2); - // Then - expect(assert).not.toThrow(); - }); -}); diff --git a/src/tools/markdown/utilities.ts b/src/tools/markdown/utilities.ts deleted file mode 100644 index 833ba5cb..00000000 --- a/src/tools/markdown/utilities.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Category } from '@/tools/markdown/constants/Category'; - -/** Represent all available indices for the current assertion. */ -type Index = T['length'] extends L - ? T[number] - : Index; - -/** Represent the current minimum length for the assertion. */ -type MinimumLength, L extends number> = Pick< - Required, - Index ->; - -/** Throw when the provided `items` don't respect the minimum `depth`. */ -export function assertDepth, L extends number>( - items: T, - depth: L, -): asserts items is T & MinimumLength { - if (items.length < depth) { - throw new Error(`Malformed path "${items}", expected depth of ${depth}`); - } -} - -/** Throw when the provided `category` is not known. */ -export function assertCategory(category: string): asserts category is Category { - if (!Object.values(Category).includes(category as Category)) { - throw new Error(`Unknown category "${category}"`); - } -} diff --git a/src/tools/remark/remarkFrontmatter.server.ts b/src/tools/remark/remarkFrontmatter.server.ts deleted file mode 100644 index e63b6b6f..00000000 --- a/src/tools/remark/remarkFrontmatter.server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type Plugin } from 'unified'; -import { remove } from 'unist-util-remove'; -import { matter } from 'vfile-matter'; - -export const remarkMatter: Plugin = () => async (tree, file) => { - matter(file); - // NOTE Remove the frontmatter from the tree since we don't want to render it - remove(tree, 'yaml'); -}; diff --git a/src/tools/remark/remarkMinutes.server.ts b/src/tools/remark/remarkMinutes.server.ts deleted file mode 100644 index 9f0a28dd..00000000 --- a/src/tools/remark/remarkMinutes.server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import readingTime from 'reading-time'; -import { type Plugin } from 'unified'; -import { type Literal } from 'unist'; -import { visit } from 'unist-util-visit'; - -export const remarkMinutes: Plugin = () => async (tree, file) => { - let text = ''; - visit(tree, 'text', (node) => { - text += (node as Literal).value; - }); - const { minutes } = readingTime(text); - Object.assign(file.data, { minutes }); -}; diff --git a/src/tools/z/union.ts b/src/tools/z/union.ts new file mode 100644 index 00000000..2b12bc64 --- /dev/null +++ b/src/tools/z/union.ts @@ -0,0 +1,15 @@ +import { z, type Primitive, type ZodLiteral } from 'zod'; + +function isValidUnion>( + literals: T[], +): literals is [T, T, ...T[]] { + return literals.length > 1; +} + +export const union = (values: readonly T[]) => { + const literals = values.map((value) => z.literal(value)); + if (!isValidUnion(literals)) { + throw new Error('Minimum length required for union schemas is 2'); + } + return z.union(literals); +}; diff --git a/tsconfig.json b/tsconfig.json index c010e47b..b1cb3435 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,14 @@ { "compilerOptions": { "allowJs": true, - "baseUrl": ".", - "downlevelIteration": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, "incremental": true, - "isolatedModules": true, "jsx": "preserve", - "lib": ["dom", "dom.iterable", "esnext"], - "module": "esnext", - "moduleResolution": "bundler", + "module": "preserve", "noEmit": true, - "noUncheckedIndexedAccess": true, - "paths": { "@/*": ["src/*"] }, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "es5" + "paths": { "@/*": ["./src/*"] }, + "verbatimModuleSyntax": false }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "exclude": ["node_modules"], + "extends": "./node_modules/@korumite/ts/tsconfig.dom.json", + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] } diff --git a/typings.d.ts b/typings.d.ts index 089712ec..88dba3fb 100644 --- a/typings.d.ts +++ b/typings.d.ts @@ -6,3 +6,6 @@ interface String { split(separator: ''): string[]; split(separator: string): [first: string, ...rest: string[]]; } + +/** Spell out all properties for a given type parameter. */ +type Prettify = { [K in keyof T]: T[K] } & {};