diff --git a/.changeset/afraid-gifts-sparkle.md b/.changeset/afraid-gifts-sparkle.md new file mode 100644 index 0000000000..750393d4bb --- /dev/null +++ b/.changeset/afraid-gifts-sparkle.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix UX issue about highlighting the search term in search result sections diff --git a/.changeset/big-gorillas-perform.md b/.changeset/big-gorillas-perform.md new file mode 100644 index 0000000000..b9f06847ab --- /dev/null +++ b/.changeset/big-gorillas-perform.md @@ -0,0 +1,9 @@ +--- +gitbook: patch +--- + +Fix three small visual issues + +- Fix sidebar showing on `no-toc` pages in the gradient theme +- Fix variant selector truncating incorrectly in header when sections are present +- Fix page cover alignment on `lg` screens without TOC diff --git a/.changeset/breezy-falcons-drop.md b/.changeset/breezy-falcons-drop.md new file mode 100644 index 0000000000..fbb4669b39 --- /dev/null +++ b/.changeset/breezy-falcons-drop.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Respect fullWidth and defaultWidth for images diff --git a/.changeset/bright-avocados-film.md b/.changeset/bright-avocados-film.md new file mode 100644 index 0000000000..20a16ac2fd --- /dev/null +++ b/.changeset/bright-avocados-film.md @@ -0,0 +1,5 @@ +--- +"gitbook": patch +--- + +Fix hash with align in columns diff --git a/.changeset/brown-ducks-think.md b/.changeset/brown-ducks-think.md new file mode 100644 index 0000000000..72dbd108cd --- /dev/null +++ b/.changeset/brown-ducks-think.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Hide scrollbar on sections diff --git a/.changeset/clever-jokes-yell.md b/.changeset/clever-jokes-yell.md new file mode 100644 index 0000000000..7732753b9b --- /dev/null +++ b/.changeset/clever-jokes-yell.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Add docs.testgitbook.com to ADAPTIVE_CONTENT_HOSTS list diff --git a/.changeset/cold-buckets-divide.md b/.changeset/cold-buckets-divide.md new file mode 100644 index 0000000000..30b61814c0 --- /dev/null +++ b/.changeset/cold-buckets-divide.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +fix nested a tag causing hydration error diff --git a/.changeset/cold-toys-film.md b/.changeset/cold-toys-film.md new file mode 100644 index 0000000000..2c0fc7ddab --- /dev/null +++ b/.changeset/cold-toys-film.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Error handling for AI Chat diff --git a/.changeset/cool-jars-matter.md b/.changeset/cool-jars-matter.md new file mode 100644 index 0000000000..ac166a311c --- /dev/null +++ b/.changeset/cool-jars-matter.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +fix href being empty in TOC diff --git a/.changeset/cool-seas-approve.md b/.changeset/cool-seas-approve.md new file mode 100644 index 0000000000..3f1cb4fd1d --- /dev/null +++ b/.changeset/cool-seas-approve.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix navigation between sections/variants when previewing a site in v2 diff --git a/.changeset/curly-rules-learn.md b/.changeset/curly-rules-learn.md new file mode 100644 index 0000000000..5cf99ce7f7 --- /dev/null +++ b/.changeset/curly-rules-learn.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Add support for inline icons. diff --git a/.changeset/dry-pandas-rhyme.md b/.changeset/dry-pandas-rhyme.md new file mode 100644 index 0000000000..f088745740 --- /dev/null +++ b/.changeset/dry-pandas-rhyme.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix revision id for computed content diff --git a/.changeset/fair-crews-wink.md b/.changeset/fair-crews-wink.md new file mode 100644 index 0000000000..f6ac4f3b1b --- /dev/null +++ b/.changeset/fair-crews-wink.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Add circular corners and depth styling diff --git a/.changeset/famous-melons-compete.md b/.changeset/famous-melons-compete.md new file mode 100644 index 0000000000..c92a2f6a43 --- /dev/null +++ b/.changeset/famous-melons-compete.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix crash when integration script fails to render block. diff --git a/.changeset/fast-trees-battle.md b/.changeset/fast-trees-battle.md new file mode 100644 index 0000000000..0e75fbbeda --- /dev/null +++ b/.changeset/fast-trees-battle.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Add authorization header for OAuth2 diff --git a/.changeset/few-cars-joke.md b/.changeset/few-cars-joke.md new file mode 100644 index 0000000000..68d4ec2efe --- /dev/null +++ b/.changeset/few-cars-joke.md @@ -0,0 +1,5 @@ +--- +"gitbook": minor +--- + +Display MCP tool calls in AI chat. diff --git a/.changeset/fifty-ducks-press.md b/.changeset/fifty-ducks-press.md new file mode 100644 index 0000000000..a250d31243 --- /dev/null +++ b/.changeset/fifty-ducks-press.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Improve support for OAuth2 security type diff --git a/.changeset/flat-wolves-poke.md b/.changeset/flat-wolves-poke.md new file mode 100644 index 0000000000..1e14bdc3f0 --- /dev/null +++ b/.changeset/flat-wolves-poke.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Adds Columns layout block to GBO diff --git a/.changeset/forty-readers-mix.md b/.changeset/forty-readers-mix.md new file mode 100644 index 0000000000..fe80c745cc --- /dev/null +++ b/.changeset/forty-readers-mix.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Support dark-mode specific page cover image diff --git a/.changeset/fresh-shrimps-flow.md b/.changeset/fresh-shrimps-flow.md new file mode 100644 index 0000000000..a2e62c9480 --- /dev/null +++ b/.changeset/fresh-shrimps-flow.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Update Models page styling diff --git a/.changeset/fuzzy-baboons-buy.md b/.changeset/fuzzy-baboons-buy.md new file mode 100644 index 0000000000..19ec20073e --- /dev/null +++ b/.changeset/fuzzy-baboons-buy.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Show scrollbars diff --git a/.changeset/fuzzy-tables-jump.md b/.changeset/fuzzy-tables-jump.md new file mode 100644 index 0000000000..e759503da2 --- /dev/null +++ b/.changeset/fuzzy-tables-jump.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Optimize performances by using a smarter per-request cache arround data cached functions diff --git a/.changeset/gorgeous-cycles-cheat.md b/.changeset/gorgeous-cycles-cheat.md new file mode 100644 index 0000000000..60dfbb7aa9 --- /dev/null +++ b/.changeset/gorgeous-cycles-cheat.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +add a force-revalidate api route to force bust the cache in case of errors diff --git a/.changeset/gorgeous-cycles-grow.md b/.changeset/gorgeous-cycles-grow.md new file mode 100644 index 0000000000..2056ac5477 --- /dev/null +++ b/.changeset/gorgeous-cycles-grow.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Add support for icons in buttons. diff --git a/.changeset/green-bulldogs-punch.md b/.changeset/green-bulldogs-punch.md new file mode 100644 index 0000000000..d94960671d --- /dev/null +++ b/.changeset/green-bulldogs-punch.md @@ -0,0 +1,5 @@ +--- +"gitbook": patch +--- + +Fix resolution of page by resolving site redirects before space redirects diff --git a/.changeset/green-clouds-cough.md b/.changeset/green-clouds-cough.md new file mode 100644 index 0000000000..614e9d2c6a --- /dev/null +++ b/.changeset/green-clouds-cough.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Fix rendering of ogimage with SVG logos. diff --git a/.changeset/hip-bobcats-cover.md b/.changeset/hip-bobcats-cover.md new file mode 100644 index 0000000000..78edac950b --- /dev/null +++ b/.changeset/hip-bobcats-cover.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Best effort at preserving current variant when navigating between sections by matching the pathname against site spaces in the new section. diff --git a/.changeset/khaki-bees-count.md b/.changeset/khaki-bees-count.md new file mode 100644 index 0000000000..181ce84e36 --- /dev/null +++ b/.changeset/khaki-bees-count.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix crash when integration is triggering invalid requests. diff --git a/.changeset/lazy-colts-hammer.md b/.changeset/lazy-colts-hammer.md new file mode 100644 index 0000000000..b05e849f11 --- /dev/null +++ b/.changeset/lazy-colts-hammer.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Optimize the fetch of revision files by using only the getRevision cache. diff --git a/.changeset/lazy-pants-matter.md b/.changeset/lazy-pants-matter.md new file mode 100644 index 0000000000..516874dcfb --- /dev/null +++ b/.changeset/lazy-pants-matter.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +encode customization header diff --git a/.changeset/long-cameras-protect.md b/.changeset/long-cameras-protect.md new file mode 100644 index 0000000000..ff51bbc939 --- /dev/null +++ b/.changeset/long-cameras-protect.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Rework full-width layout, add support for full-width page option diff --git a/.changeset/metal-trainers-nail.md b/.changeset/metal-trainers-nail.md new file mode 100644 index 0000000000..0792a27c8b --- /dev/null +++ b/.changeset/metal-trainers-nail.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix CodeBlock layout diff --git a/.changeset/nasty-donkeys-sell.md b/.changeset/nasty-donkeys-sell.md new file mode 100644 index 0000000000..d367736685 --- /dev/null +++ b/.changeset/nasty-donkeys-sell.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Scroll to active TOC when clicking a link diff --git a/.changeset/nasty-moles-visit.md b/.changeset/nasty-moles-visit.md new file mode 100644 index 0000000000..fa65297331 --- /dev/null +++ b/.changeset/nasty-moles-visit.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +fix ISR on preview env diff --git a/.changeset/neat-walls-drum.md b/.changeset/neat-walls-drum.md new file mode 100644 index 0000000000..6eb0d6a465 --- /dev/null +++ b/.changeset/neat-walls-drum.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Add support for text alignment for headings and paragraphs. diff --git a/.changeset/nervous-students-judge.md b/.changeset/nervous-students-judge.md new file mode 100644 index 0000000000..1c39892b90 --- /dev/null +++ b/.changeset/nervous-students-judge.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix concurrent execution in Vercel causing pages to not be attached to the proper tags. diff --git a/.changeset/orange-ears-drop.md b/.changeset/orange-ears-drop.md new file mode 100644 index 0000000000..12dd7fae5d --- /dev/null +++ b/.changeset/orange-ears-drop.md @@ -0,0 +1,5 @@ +--- +"@gitbook/react-contentkit": patch +--- + +Add basic error handling when transitioning between states. diff --git a/.changeset/orange-hounds-sparkle.md b/.changeset/orange-hounds-sparkle.md new file mode 100644 index 0000000000..ec22218455 --- /dev/null +++ b/.changeset/orange-hounds-sparkle.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Generate a llms-full.txt version of the docs site diff --git a/.changeset/pink-windows-wonder.md b/.changeset/pink-windows-wonder.md new file mode 100644 index 0000000000..b244f10e34 --- /dev/null +++ b/.changeset/pink-windows-wonder.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Don't crash ogimage generation on RTL text, as a workaround until we can support it. diff --git a/.changeset/plenty-laws-buy.md b/.changeset/plenty-laws-buy.md new file mode 100644 index 0000000000..afeb96dab9 --- /dev/null +++ b/.changeset/plenty-laws-buy.md @@ -0,0 +1,5 @@ +--- +gitbook: minor +--- + +Add support for site customization option to change how external links open. diff --git a/.changeset/poor-dodos-lick.md b/.changeset/poor-dodos-lick.md new file mode 100644 index 0000000000..ca02d7382b --- /dev/null +++ b/.changeset/poor-dodos-lick.md @@ -0,0 +1,5 @@ +--- +"@gitbook/fonts": minor +--- + +Initial version of the package diff --git a/.changeset/pretty-balloons-fold.md b/.changeset/pretty-balloons-fold.md new file mode 100644 index 0000000000..4e82079e87 --- /dev/null +++ b/.changeset/pretty-balloons-fold.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix rendering of ogimage when logo or icon are AVIF images. diff --git a/.changeset/purple-cougars-breathe.md b/.changeset/purple-cougars-breathe.md new file mode 100644 index 0000000000..cf90771986 --- /dev/null +++ b/.changeset/purple-cougars-breathe.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Add margin to adjacent buttons diff --git a/.changeset/rare-pens-whisper.md b/.changeset/rare-pens-whisper.md new file mode 100644 index 0000000000..2ba1ed3793 --- /dev/null +++ b/.changeset/rare-pens-whisper.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix ogimage generation failing with some JPEG images. diff --git a/.changeset/real-trains-perform.md b/.changeset/real-trains-perform.md new file mode 100644 index 0000000000..c08f35a59b --- /dev/null +++ b/.changeset/real-trains-perform.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix page group not expanded by default diff --git a/.changeset/real-walls-glow.md b/.changeset/real-walls-glow.md new file mode 100644 index 0000000000..24bdd3f3e7 --- /dev/null +++ b/.changeset/real-walls-glow.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Don't cache unexpected API errors for more than a few minutes. diff --git a/.changeset/rich-buses-hunt.md b/.changeset/rich-buses-hunt.md new file mode 100644 index 0000000000..9cfd0f87c8 --- /dev/null +++ b/.changeset/rich-buses-hunt.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix an issue where PDF export URLs were not keeping their query params. diff --git a/.changeset/rotten-crews-tie.md b/.changeset/rotten-crews-tie.md new file mode 100644 index 0000000000..de10b1ac62 --- /dev/null +++ b/.changeset/rotten-crews-tie.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Fix markdown page generation for groups diff --git a/.changeset/rotten-donuts-bow.md b/.changeset/rotten-donuts-bow.md new file mode 100644 index 0000000000..c178bf8b3e --- /dev/null +++ b/.changeset/rotten-donuts-bow.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +add a global error boundary diff --git a/.changeset/rotten-pianos-cheat.md b/.changeset/rotten-pianos-cheat.md new file mode 100644 index 0000000000..e1bad53fe7 --- /dev/null +++ b/.changeset/rotten-pianos-cheat.md @@ -0,0 +1,5 @@ +--- +"gitbook": patch +--- + +Fix links to other spaces within a section. diff --git a/.changeset/rotten-seals-rush.md b/.changeset/rotten-seals-rush.md new file mode 100644 index 0000000000..950e25880c --- /dev/null +++ b/.changeset/rotten-seals-rush.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Indent JSON python code sample diff --git a/.changeset/rude-games-beg.md b/.changeset/rude-games-beg.md new file mode 100644 index 0000000000..0e1d1f4612 --- /dev/null +++ b/.changeset/rude-games-beg.md @@ -0,0 +1,5 @@ +--- +"gitbook": patch +--- + +Add support for cover repositioning diff --git a/.changeset/selfish-bananas-sneeze.md b/.changeset/selfish-bananas-sneeze.md new file mode 100644 index 0000000000..51fdfb1045 --- /dev/null +++ b/.changeset/selfish-bananas-sneeze.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Handle nullish OpenAPI mediaTypeObject diff --git a/.changeset/sharp-hats-applaud.md b/.changeset/sharp-hats-applaud.md new file mode 100644 index 0000000000..bf84bf6ada --- /dev/null +++ b/.changeset/sharp-hats-applaud.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix missing title on button to close the announcement banner. diff --git a/.changeset/sharp-jeans-burn.md b/.changeset/sharp-jeans-burn.md new file mode 100644 index 0000000000..1eaf192a22 --- /dev/null +++ b/.changeset/sharp-jeans-burn.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Make icons for page groups more contrasting diff --git a/.changeset/shiny-seahorses-tie.md b/.changeset/shiny-seahorses-tie.md new file mode 100644 index 0000000000..9859d9b279 --- /dev/null +++ b/.changeset/shiny-seahorses-tie.md @@ -0,0 +1,5 @@ +--- +"gitbook": minor +--- + +Enable AI chat when AI mode is configured to assistant diff --git a/.changeset/sixty-cows-pay.md b/.changeset/sixty-cows-pay.md new file mode 100644 index 0000000000..61d7c3ecca --- /dev/null +++ b/.changeset/sixty-cows-pay.md @@ -0,0 +1,5 @@ +--- +"gitbook": minor +--- + +Add AI chat diff --git a/.changeset/slimy-cows-press.md b/.changeset/slimy-cows-press.md new file mode 100644 index 0000000000..1e012a9930 --- /dev/null +++ b/.changeset/slimy-cows-press.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Ignore case while highlighting search results. diff --git a/.changeset/slimy-hornets-share.md b/.changeset/slimy-hornets-share.md new file mode 100644 index 0000000000..80cbf8c9a2 --- /dev/null +++ b/.changeset/slimy-hornets-share.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Consistently show variant selector in section bar if site has sections diff --git a/.changeset/slow-boxes-approve.md b/.changeset/slow-boxes-approve.md new file mode 100644 index 0000000000..8ac062cf46 --- /dev/null +++ b/.changeset/slow-boxes-approve.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Include page group children under the .md route diff --git a/.changeset/slow-lizards-obey.md b/.changeset/slow-lizards-obey.md new file mode 100644 index 0000000000..3d97c1c8b6 --- /dev/null +++ b/.changeset/slow-lizards-obey.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Make TOC height dynamic based on visible header and footer elements diff --git a/.changeset/slow-masks-agree.md b/.changeset/slow-masks-agree.md new file mode 100644 index 0000000000..d59622a056 --- /dev/null +++ b/.changeset/slow-masks-agree.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Clicking an active TOC item toggles its descendants diff --git a/.changeset/slow-roses-mate.md b/.changeset/slow-roses-mate.md new file mode 100644 index 0000000000..0b70530dda --- /dev/null +++ b/.changeset/slow-roses-mate.md @@ -0,0 +1,5 @@ +--- +"gitbook": patch +--- + +Improve AI Chat context popup diff --git a/.changeset/small-dots-report.md b/.changeset/small-dots-report.md new file mode 100644 index 0000000000..b3dd8899f8 --- /dev/null +++ b/.changeset/small-dots-report.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix viewing a page from a revision diff --git a/.changeset/soft-walls-change.md b/.changeset/soft-walls-change.md new file mode 100644 index 0000000000..8324a67faa --- /dev/null +++ b/.changeset/soft-walls-change.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix InlineLinkTooltip having a negative impact on performance, especially on larger pages. diff --git a/.changeset/spotty-apples-crash.md b/.changeset/spotty-apples-crash.md new file mode 100644 index 0000000000..20aa75e6d4 --- /dev/null +++ b/.changeset/spotty-apples-crash.md @@ -0,0 +1,6 @@ +--- +'@gitbook/openapi-parser': patch +'@gitbook/react-openapi': patch +--- + +Optional label in OpenAPI x-codeSamples diff --git a/.changeset/strong-poets-move.md b/.changeset/strong-poets-move.md new file mode 100644 index 0000000000..a407fd49fb --- /dev/null +++ b/.changeset/strong-poets-move.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix bold header links hover color diff --git a/.changeset/stupid-plums-perform.md b/.changeset/stupid-plums-perform.md new file mode 100644 index 0000000000..07145fb5f3 --- /dev/null +++ b/.changeset/stupid-plums-perform.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +cache fonts and static image used in OGImage in memory diff --git a/.changeset/tame-mangos-battle.md b/.changeset/tame-mangos-battle.md new file mode 100644 index 0000000000..3d7960e8e0 --- /dev/null +++ b/.changeset/tame-mangos-battle.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix border being added to cards diff --git a/.changeset/tender-poets-hang.md b/.changeset/tender-poets-hang.md new file mode 100644 index 0000000000..991a5d993f --- /dev/null +++ b/.changeset/tender-poets-hang.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Add metadata for adding site to Apple devices home diff --git a/.changeset/thick-chefs-repeat.md b/.changeset/thick-chefs-repeat.md new file mode 100644 index 0000000000..8b08d50e3e --- /dev/null +++ b/.changeset/thick-chefs-repeat.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Handle nested deprecated properties in generateSchemaExample diff --git a/.changeset/thick-cups-shout.md b/.changeset/thick-cups-shout.md new file mode 100644 index 0000000000..aad7bbf6d6 --- /dev/null +++ b/.changeset/thick-cups-shout.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix crash during rendering of ogimage for VA sites with default icon. diff --git a/.changeset/thin-buckets-grow.md b/.changeset/thin-buckets-grow.md new file mode 100644 index 0000000000..579f1033f7 --- /dev/null +++ b/.changeset/thin-buckets-grow.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Add `urlObject.hash` to `linker.toLinkForContent` to pass through URL fragment identifiers, used in search diff --git a/.changeset/thin-spiders-relate.md b/.changeset/thin-spiders-relate.md new file mode 100644 index 0000000000..e7f946f011 --- /dev/null +++ b/.changeset/thin-spiders-relate.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Allow to zoom images on mobile if relevant diff --git a/.changeset/tidy-dots-suffer.md b/.changeset/tidy-dots-suffer.md new file mode 100644 index 0000000000..7171c8f4ca --- /dev/null +++ b/.changeset/tidy-dots-suffer.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +apply customization for dynamic context diff --git a/.changeset/tiny-zoos-scream.md b/.changeset/tiny-zoos-scream.md new file mode 100644 index 0000000000..a739182859 --- /dev/null +++ b/.changeset/tiny-zoos-scream.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Reverse order of feedback smileys diff --git a/.changeset/violet-schools-care.md b/.changeset/violet-schools-care.md new file mode 100644 index 0000000000..e77a98b5cf --- /dev/null +++ b/.changeset/violet-schools-care.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Deduplicate path parameters from OpenAPI spec diff --git a/.changeset/warm-roses-sleep.md b/.changeset/warm-roses-sleep.md new file mode 100644 index 0000000000..b9b912700a --- /dev/null +++ b/.changeset/warm-roses-sleep.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +Fix ogimage using incorrect Google Font depending on language. diff --git a/.changeset/wise-gifts-smash.md b/.changeset/wise-gifts-smash.md new file mode 100644 index 0000000000..ebd6dd5dd8 --- /dev/null +++ b/.changeset/wise-gifts-smash.md @@ -0,0 +1,5 @@ +--- +gitbook: patch +--- + +remove trailing slash from linker diff --git a/.changeset/witty-forks-sell.md b/.changeset/witty-forks-sell.md new file mode 100644 index 0000000000..cfafe1a2c5 --- /dev/null +++ b/.changeset/witty-forks-sell.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': patch +'gitbook': patch +--- + +Support for OpenAPI Array request body diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..83befe8fe0 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Changes to the API data cache functions can invalidate all existing data cache +# causing a massive amount of revalidation, impacting our API. +packages/gitbook/src/lib/data/api.ts @SamyPesse diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a65357a23d..6fe349387f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -53,19 +53,42 @@ After forking this repository, you'll want to [create a branch](https://docs.git #### 3. Install dependencies and run the project locally -GitBook uses [Bun](https://bun.sh/) to run the project. Make sure you're using the specified version of `node` before running any of the development commands to ensure a smooth development experience. - -You can easily do this by running the command `nvm use`. - -To start your local version of GitBook, run the command `bun dev`. +##### Prerequisites: +- Node.js (Version: >=20.6) + - Use `nvm` for easy Node management +- [Bun](https://bun.sh/) (Version: >=1.2.15) + - We use a text-based lockfile which isn't supported below 1.2.15 + +##### Setup steps: + +1. Ensure you are using the project's version of Node: +```bash +nvm use +``` + +2. Install dependencies using Bun: +```bash +bun install +``` + +3. Start the development server: +```bash +bun dev +``` + +Additional development commands: +- `bun format`: Format the code using Biome +- `bun typecheck`: Run TypeScript type checking +- `bun unit`: Run unit tests +- `bun e2e`: Run end-to-end tests #### 4. Preview your changes -When running the development server, published GitBook sites can be rendered through your local version at `http://localhost:3000/`. +When running the development server, published GitBook sites can be rendered through your local version at `http://localhost:3000/url`. -For example, our published docs can be viewed using the local version by visiting `http://localhost:3000/docs.gitbook.com` after running the development server. +For example, our published docs can be viewed using the local version by visiting `http://localhost:3000/url/gitbook.com/docs` after running the development server. -You can visit any published GitBook site behind your development server. Please make sure your site is [published publicly](https://docs.gitbook.com/published-documentation/publish-your-content-as-a-docs-site) to ensure you can view the site correctly in your development version. +You can visit any published GitBook site behind your development server. Please make sure your site is [published publicly](https://gitbook.com/docs/published-documentation/publish-your-content-as-a-docs-site) to ensure you can view the site correctly in your development version. ### Commit your update diff --git a/.github/actions/gradual-deploy-cloudflare/action.yaml b/.github/actions/gradual-deploy-cloudflare/action.yaml new file mode 100644 index 0000000000..adb513a1bc --- /dev/null +++ b/.github/actions/gradual-deploy-cloudflare/action.yaml @@ -0,0 +1,83 @@ +name: Gradual Deploy to Cloudflare +description: Use gradual deployment to deploy to Cloudflare. This action will upload the middleware and server versions to Cloudflare and kept them bound together +inputs: + apiToken: + description: 'Cloudflare API token' + required: true + accountId: + description: 'Cloudflare account ID' + required: true + environment: + description: 'Cloudflare environment to deploy to (staging, production, preview)' + required: true + middlewareVersionId: + description: 'Middleware version ID to deploy' + required: true + serverVersionId: + description: 'Server version ID to deploy' + required: true +outputs: + deployment-url: + description: "Deployment URL" + value: ${{ steps.deploy_middleware.outputs.deployment-url }} +runs: + using: 'composite' + steps: + - id: wrangler_status + name: Check wrangler deployment status + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: deployments status --config ./packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc + + # This step is used to get the version ID that is currently deployed to Cloudflare. + - id: extract_current_version + name: Extract current version + shell: bash + run: | + version_id=$(echo "${{ steps.wrangler_status.outputs.command-output }}" | grep -A 3 "(100%)" | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}') + echo "version_id=$version_id" >> $GITHUB_OUTPUT + + - id: deploy_server + name: Deploy server to Cloudflare at 0% + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: versions deploy ${{ steps.extract_current_version.outputs.version_id }}@100% ${{ inputs.serverVersionId }}@0% -y --config ./packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc + + # Since we use version overrides headers, we can directly deploy the middleware to 100%. + - id: deploy_middleware + name: Deploy middleware to Cloudflare at 100% + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: versions deploy ${{ inputs.middlewareVersionId }}@100% -y --config ./packages/gitbook/openNext/customWorkers/middlewareWrangler.jsonc + + - name: Deploy server to Cloudflare at 100% + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: versions deploy ${{ inputs.serverVersionId }}@100% -y --config ./packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc + + - name: Outputs + shell: bash + env: + DEPLOYMENT_URL: ${{ steps.deploy_middleware.outputs.deployment-url }} + run: | + echo "URL: ${{ steps.deploy_middleware.outputs.deployment-url }}" \ No newline at end of file diff --git a/.github/composite/deploy-cloudflare/action.yaml b/.github/composite/deploy-cloudflare/action.yaml index a63c69f8eb..0906e8bc86 100644 --- a/.github/composite/deploy-cloudflare/action.yaml +++ b/.github/composite/deploy-cloudflare/action.yaml @@ -19,10 +19,16 @@ inputs: deploy: description: 'Deploy as main version for all traffic instead of uploading versions' required: true + commitTag: + description: 'Commit branch to associate with the deployment' + required: true + commitMessage: + description: 'Commit message to associate with the deployment' + required: true outputs: deployment-url: description: "Deployment URL" - value: ${{ steps.deploy.outputs.deployment-url }} + value: ${{ steps.upload_middleware.outputs.deployment-url }} runs: using: 'composite' steps: @@ -49,24 +55,84 @@ runs: GITBOOK_INTEGRATIONS_HOST: ${{ inputs.opItem }}/GITBOOK_INTEGRATIONS_HOST GITBOOK_IMAGE_RESIZE_SIGNING_KEY: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_SIGNING_KEY GITBOOK_IMAGE_RESIZE_URL: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_URL + GITBOOK_IMAGE_RESIZE_MODE: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_MODE GITBOOK_ASSETS_PREFIX: ${{ inputs.opItem }}/GITBOOK_ASSETS_PREFIX GITBOOK_FONTS_URL: ${{ inputs.opItem }}/GITBOOK_FONTS_URL - name: Build worker - run: bun run turbo build:v2:cloudflare + run: bun run turbo build:cloudflare + env: + GITBOOK_RUNTIME: cloudflare shell: bash - - id: deploy - name: Deploy to Cloudflare + + - name: Upload the DO worker uses: cloudflare/wrangler-action@v3.14.0 with: apiToken: ${{ inputs.apiToken }} accountId: ${{ inputs.accountId }} workingDirectory: ./ - wranglerVersion: '3.112.0' + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: deploy --config ./packages/gitbook/openNext/customWorkers/doWrangler.jsonc + + - id: upload_server + name: Upload server to Cloudflare + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: ${{ format('versions upload --tag {0} --message "{1}"', inputs.commitTag, inputs.commitMessage) }} --config ./packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc + + - name: Extract server version worker ID + shell: bash + id: extract_server_version_id + run: | + version_id=$(echo '${{ steps.upload_server.outputs.command-output }}' | grep "Worker Version ID" | awk '{print $4}') + echo "version_id=$version_id" >> $GITHUB_OUTPUT + + - name: Run updateWrangler scripts + shell: bash + run: | + bun run ./packages/gitbook/openNext/customWorkers/script/updateWrangler.ts ${{ steps.extract_server_version_id.outputs.version_id }} + + - id: upload_middleware + name: Upload middleware to Cloudflare + uses: cloudflare/wrangler-action@v3.14.0 + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + workingDirectory: ./ + wranglerVersion: '4.10.0' + environment: ${{ inputs.environment }} + command: ${{ format('versions upload --tag {0} --message "{1}"', inputs.commitTag, inputs.commitMessage) }} --config ./packages/gitbook/openNext/customWorkers/middlewareWrangler.jsonc + + - name: Extract middleware version worker ID + shell: bash + id: extract_middleware_version_id + run: | + version_id=$(echo '${{ steps.upload_middleware.outputs.command-output }}' | grep "Worker Version ID" | awk '{print $4}') + echo "version_id=$version_id" >> $GITHUB_OUTPUT + + - name: Deploy server and middleware to Cloudflare + if: ${{ inputs.deploy == 'true' }} + uses: ./.github/actions/gradual-deploy-cloudflare + with: + apiToken: ${{ inputs.apiToken }} + accountId: ${{ inputs.accountId }} + opServiceAccount: ${{ inputs.opServiceAccount }} + opItem: ${{ inputs.opItem }} environment: ${{ inputs.environment }} - command: ${{ fromJSON(inputs.deploy) == true && 'deploy' || 'versions upload' }} --config ./packages/gitbook-v2/wrangler.toml + serverVersionId: ${{ steps.extract_server_version_id.outputs.version_id }} + middlewareVersionId: ${{ steps.extract_middleware_version_id.outputs.version_id }} + deploy: ${{ inputs.deploy }} + + - name: Outputs shell: bash env: - DEPLOYMENT_URL: ${{ steps.deploy.outputs.deployment-url }} + DEPLOYMENT_URL: ${{ steps.upload_middleware.outputs.deployment-url }} run: | - echo "URL: ${{ steps.deploy.outputs.deployment-url }}" \ No newline at end of file + echo "URL: ${{ steps.upload_middleware.outputs.deployment-url }}" + echo "Output server: ${{ steps.upload_server.outputs.command-output }}" \ No newline at end of file diff --git a/.github/composite/deploy-vercel/action.yaml b/.github/composite/deploy-vercel/action.yaml index f0e648a4e0..74b54e8590 100644 --- a/.github/composite/deploy-vercel/action.yaml +++ b/.github/composite/deploy-vercel/action.yaml @@ -54,6 +54,7 @@ runs: GITBOOK_INTEGRATIONS_HOST: ${{ inputs.opItem }}/GITBOOK_INTEGRATIONS_HOST GITBOOK_IMAGE_RESIZE_SIGNING_KEY: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_SIGNING_KEY GITBOOK_IMAGE_RESIZE_URL: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_URL + GITBOOK_IMAGE_RESIZE_MODE: ${{ inputs.opItem }}/GITBOOK_IMAGE_RESIZE_MODE GITBOOK_ASSETS_PREFIX: ${{ inputs.opItem }}/GITBOOK_ASSETS_PREFIX GITBOOK_FONTS_URL: ${{ inputs.opItem }}/GITBOOK_FONTS_URL - name: Build Project Artifacts @@ -62,6 +63,7 @@ runs: env: VERCEL_ORG_ID: ${{ inputs.vercelOrg }} VERCEL_PROJECT_ID: ${{ inputs.vercelProject }} + GITBOOK_RUNTIME: vercel - name: Deploy Project Artifacts to Vercel id: deploy shell: bash diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index e7ce2a6a7f..ecca882e61 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -7,56 +7,10 @@ on: env: NPM_TOKEN_READONLY: ${{ secrets.NPM_TOKEN_READONLY }} jobs: - deploy-v1-cloudflare: - name: Deploy v1 to Cloudflare Pages - runs-on: ubuntu-latest - environment: - name: ${{ github.ref == 'refs/heads/main' && '1c-production' || '1c-preview' }} - url: ${{ steps.deploy.outputs.deployment-url }} - permissions: - contents: read - deployments: write - issues: write - pull-requests: write - checks: write - statuses: write - outputs: - deployment-url: ${{ steps.deploy.outputs.deployment-url }} - deployment-alias-url: ${{ steps.deploy.outputs.deployment-alias-url }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Bun - uses: ./.github/composite/setup-bun - - name: Install dependencies - run: bun install --frozen-lockfile - env: - PUPPETEER_SKIP_DOWNLOAD: 1 - - name: Sets env vars for production - if: github.ref == 'refs/heads/main' - run: | - echo "GITBOOK_ASSETS_PREFIX=https://static.gitbook.com" >> $GITHUB_ENV - - name: Build Next.js with next-on-pages - run: bun run turbo gitbook#build:cloudflare - env: - NEXT_SERVER_ACTIONS_ENCRYPTION_KEY: ${{ secrets.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY }} - - id: deploy - name: Deploy to Cloudflare - uses: cloudflare/wrangler-action@v3.14.0 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - workingDirectory: ./ - wranglerVersion: '3.112.0' - command: pages deploy ./packages/gitbook/.vercel/output/static --project-name=${{ vars.CLOUDFLARE_PROJECT_NAME }} --branch=${{ github.ref == 'refs/heads/main' && 'main' || format('pr{0}', github.event.pull_request.number) }} - - name: Outputs - run: | - echo "URL: ${{ steps.deploy.outputs.deployment-url }}" - echo "Alias URL: ${{ steps.deploy.outputs.deployment-alias-url }}" deploy-v2-vercel: name: Deploy v2 to Vercel (preview) runs-on: ubuntu-latest - environment: + environment: name: 2v-preview url: ${{ steps.deploy.outputs.deployment-url }} outputs: @@ -77,11 +31,11 @@ jobs: deploy-v2-cloudflare: name: Deploy v2 to Cloudflare Worker (preview) runs-on: ubuntu-latest - environment: + environment: name: 2c-preview url: ${{ steps.deploy.outputs.deployment-url }} outputs: - deployment-url: ${{ steps.deploy.outputs.deployment-url }} + deployment-url: ${{ steps.deploy.outputs.deployment-url || steps.extract-worker-id.outputs.worker-url }} steps: - name: Checkout uses: actions/checkout@v4 @@ -95,15 +49,24 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} opItem: op://gitbook-open/2c-preview opServiceAccount: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} + commitTag: ${{ github.ref == 'refs/heads/main' && 'main' || format('pr{0}', github.event.pull_request.number) }} + commitMessage: ${{ github.sha }} + - name: Extract Worker ID + id: extract-worker-id + if: ${{ !steps.deploy.outputs.deployment-url }} + run: | + if [[ "${{ steps.deploy.outputs.command-output }}" =~ Worker\ Version\ ID:\ ([0-9a-f]{8})-([0-9a-f-]+) ]]; then + WORKER_ID_FIRST_PART="${BASH_REMATCH[1]}" + echo "worker-url=https://${WORKER_ID_FIRST_PART}-gitbook-open-v2-preview.gitbook.workers.dev/" >> $GITHUB_OUTPUT + fi - name: Outputs run: | - echo "URL: ${{ steps.deploy.outputs.deployment-url }}" + echo "URL: ${{ steps.deploy.outputs.deployment-url || steps.extract-worker-id.outputs.worker-url }}" comment-deployments: runs-on: ubuntu-latest name: Comment Deployments (preview) if: always() && !startsWith(github.ref, 'refs/heads/main') needs: - - deploy-v1-cloudflare - deploy-v2-vercel - deploy-v2-cloudflare steps: @@ -123,15 +86,6 @@ jobs: body: | Summary of the deployments: - ### Version 1 (production) - - | Version | URL | Status | - | --- | --- | --- | - | Latest commit | [${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}](${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}) | ${{ needs.deploy-v1-cloudflare.result == 'success' && '✅' || '❌' }} | - | PR | [${{ needs.deploy-v1-cloudflare.outputs.deployment-alias-url }}](${{ needs.deploy-v1-cloudflare.outputs.deployment-alias-url }}) | ${{ needs.deploy-v1-cloudflare.result == 'success' && '✅' || '❌' }} | - - ### Version 2 (experimental) - | Version | URL | Status | | --- | --- | --- | | Vercel | [${{ needs.deploy-v2-vercel.outputs.deployment-url }}](${{ needs.deploy-v2-vercel.outputs.deployment-url }}) | ${{ needs.deploy-v2-vercel.result == 'success' && '✅' || '❌' }} | @@ -139,16 +93,16 @@ jobs: ### Test content - | Site | v1 | v2 | + | Site | `2v` | `2c` | | --- | --- | --- | - | GitBook | [${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}/docs.gitbook.com](${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}/docs.gitbook.com) | [${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/docs.gitbook.com](${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/docs.gitbook.com) | - | E2E | [${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}/gitbook.gitbook.io/test-gitbook-open](${{ needs.deploy-v1-cloudflare.outputs.deployment-url }}/gitbook.gitbook.io/test-gitbook-open) | [${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open](${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open) | + | GitBook | [${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.com/docs](${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.com/docs) | [${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/gitbook.com/docs](${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/gitbook.com/docs) | + | E2E | [${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open](${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open) | [${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open](${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/gitbook.gitbook.io/test-gitbook-open) | edit-mode: replace - visual-testing-v1: + visual-testing-v2-vercel: runs-on: ubuntu-latest - name: Visual Testing v1 - needs: deploy-v1-cloudflare - timeout-minutes: 8 + name: Visual Testing v2 + needs: deploy-v2-vercel + timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 @@ -161,12 +115,14 @@ jobs: - name: Run Playwright tests run: bun e2e env: - BASE_URL: ${{ needs.deploy-v1-cloudflare.outputs.deployment-url }} + BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }} + SITE_BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/ ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} - visual-testing-v2-vercel: + ARGOS_BUILD_NAME: 'v2-vercel' + visual-testing-v2-cloudflare: runs-on: ubuntu-latest - name: Visual Testing v2 - needs: deploy-v2-vercel + name: Visual Testing v2 (Cloudflare) + needs: deploy-v2-cloudflare timeout-minutes: 10 steps: - name: Checkout @@ -180,15 +136,15 @@ jobs: - name: Run Playwright tests run: bun e2e env: - BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }} - SITE_BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/ + BASE_URL: ${{ needs.deploy-v2-cloudflare.outputs.deployment-url }} + SITE_BASE_URL: ${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/ ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} - ARGOS_BUILD_NAME: 'v2-vercel' - visual-testing-customers-v1: + ARGOS_BUILD_NAME: 'v2-cloudflare' + visual-testing-customers-v2: runs-on: ubuntu-latest - name: Visual Testing Customers v1 - needs: deploy-v1-cloudflare - timeout-minutes: 6 + name: Visual Testing Customers v2 + needs: deploy-v2-vercel + timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 @@ -201,14 +157,15 @@ jobs: - name: Run Playwright tests run: bun e2e-customers env: - BASE_URL: ${{ needs.deploy-v1-cloudflare.outputs.deployment-url }} + BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }} + SITE_BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/ ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} - ARGOS_BUILD_NAME: 'customers-v1' - visual-testing-customers-v2: + ARGOS_BUILD_NAME: 'customers-v2' + visual-testing-customers-v2-cloudflare: runs-on: ubuntu-latest - name: Visual Testing Customers v2 - needs: deploy-v2-vercel - timeout-minutes: 6 + name: Visual Testing Customers v2 (Cloudflare) + needs: deploy-v2-cloudflare + timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v4 @@ -221,14 +178,14 @@ jobs: - name: Run Playwright tests run: bun e2e-customers env: - BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }} - SITE_BASE_URL: ${{ needs.deploy-v2-vercel.outputs.deployment-url }}/url/ + BASE_URL: ${{ needs.deploy-v2-cloudflare.outputs.deployment-url }} + SITE_BASE_URL: ${{ needs.deploy-v2-cloudflare.outputs.deployment-url }}/url/ ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} ARGOS_BUILD_NAME: 'customers-v2' - pagespeed-testing-v1: + pagespeed-testing-v2: runs-on: ubuntu-latest name: PageSpeed Testing v1 - needs: deploy-v1-cloudflare + needs: deploy-v2-vercel steps: - name: Checkout uses: actions/checkout@v4 @@ -241,5 +198,5 @@ jobs: - name: Run pagespeed tests run: bun ./packages/gitbook/tests/pagespeed-testing.ts env: - BASE_URL: ${{needs.deploy-v1-cloudflare.outputs.deployment-url}} + BASE_URL: ${{needs.deploy-v2-vercel.outputs.deployment-url}} PAGESPEED_API_KEY: ${{ secrets.PAGESPEED_API_KEY }} diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index 42bae0a3b3..9d5bb3abb9 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Deploy staging + - name: Deploy id: deploy uses: ./.github/composite/deploy-vercel with: @@ -48,6 +48,8 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} opItem: op://gitbook-open/2c-production opServiceAccount: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} + commitTag: main + commitMessage: ${{ github.sha }} - name: Outputs run: | echo "URL: ${{ steps.deploy.outputs.deployment-url }}" \ No newline at end of file diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index a1e1df62ed..ed2f290c72 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Deploy staging + - name: Deploy id: deploy uses: ./.github/composite/deploy-vercel with: @@ -48,6 +48,8 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} opItem: op://gitbook-open/2c-staging opServiceAccount: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} + commitTag: main + commitMessage: ${{ github.sha }} - name: Outputs run: | echo "URL: ${{ steps.deploy.outputs.deployment-url }}" \ No newline at end of file diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 25d6ab94cd..d7644620f8 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -39,22 +39,4 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - release-preview: - # For now it releases the cache-do to both preview and production - # Once we changed to deploy the app only on release, we should change `release:preview` in `cache-do` - name: Release Preview - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v3 - - name: Setup Bun - uses: ./.github/composite/setup-bun - - name: Install dependencies - run: bun install --frozen-lockfile - env: - PUPPETEER_SKIP_DOWNLOAD: 1 - - name: Release preview packages - run: bun run release:preview - env: - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + diff --git a/.vscode/settings.json b/.vscode/settings.json index b9d15df191..8a86e5d5d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ ], "tailwindCSS.classAttributes": ["class", "className", "style", ".*Style"], "prettier.enable": false, + "editor.formatOnSave": true, "editor.defaultFormatter": "biomejs.biome", "editor.codeActionsOnSave": { "source.organizeImports.biome": "explicit", diff --git a/README.md b/README.md index f8030c085c..6772abe21a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

GitBook

- Docs - Community - Developer Docs - Changelog - Bug reports + Docs - Community - Developer Docs - Changelog - Bug reports - Feature requests

@@ -35,10 +35,10 @@ To run a local version of this project, please follow these simple steps. ### Prerequisites -- Node.js (Version: >=20.6) - - Use nvm for easy Node management -- Bun (Version: >=1.2.1) - - We use a text-based lockfile which isn't supported below 1.2.1 +- Node.js (Version: >=20.6) + - Use nvm for easy Node management +- [Bun](https://bun.sh/) (Version: >=1.2.15) + - We use a text-based lockfile which isn't supported below 1.2.15 ### Set up @@ -62,20 +62,15 @@ bun install bun dev ``` -5. Open a published GitBook space in your web browser, prefixing it with `http://localhost:3000/`. +6. Open a published GitBook space in your web browser, prefixing it with `http://localhost:3000/url`. examples: -- http://localhost:3000/docs.gitbook.com -- http://localhost:3000/open-source.gitbook.io/midjourney +- http://localhost:3000/url/gitbook.com/docs +- http://localhost:3000/url/open-source.gitbook.io/midjourney Any published GitBook site can be accessed through your local development instance, and any updates you make to the codebase will be reflected in your browser. -### Other development commands - -- `bun format`: format the code -- `bun lint`: lint the code - ### CI and testing All pull-requests will be tested against both visual and performances testing to prevent regressions. @@ -150,11 +145,11 @@ See `LICENSE` for more information.

```md -[![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://gitbook.com/) +[![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://www.gitbook.com/preview?utm_source=gitbook_readme_badge&utm_medium=organic&utm_campaign=preview_documentation&utm_content=link) ``` ```html - + diff --git a/biome.json b/biome.json index 0ccfb6e302..ba98d9f605 100644 --- a/biome.json +++ b/biome.json @@ -20,7 +20,8 @@ "**/.wrangler/**/*", "packages/openapi-parser/src/fixtures/**/*", "packages/emoji-codepoints/index.ts", - "packages/icons/src/data/*.json" + "packages/icons/src/data/*.json", + "packages/gitbook/worker-configuration.d.ts" ] }, "formatter": { @@ -126,7 +127,6 @@ { "include": [ "packages/gitbook/**/*", - "packages/gitbook-v2/**/*", "packages/react-openapi/**/*", "packages/react-math/**/*", "packages/react-contentkit/**/*", diff --git a/bun.lock b/bun.lock index b65074ce6f..411d52e750 100644 --- a/bun.lock +++ b/bun.lock @@ -6,27 +6,15 @@ "devDependencies": { "@biomejs/biome": "^1.9.4", "@changesets/cli": "^2.27.12", - "turbo": "^2.4.4", + "turbo": "^2.5.0", "vercel": "^39.3.0", }, }, - "packages/cache-do": { - "name": "@gitbook/cache-do", - "version": "0.1.1", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "lru_map": "^0.4.1", - }, - "devDependencies": { - "typescript": "^5.5.3", - "wrangler": "^3.112.0", - }, - }, "packages/cache-tags": { "name": "@gitbook/cache-tags", - "version": "0.2.0", + "version": "0.3.1", "dependencies": { - "@gitbook/api": "*", + "@gitbook/api": "catalog:", "assert-never": "^1.2.1", }, "devDependencies": { @@ -35,7 +23,7 @@ }, "packages/colors": { "name": "@gitbook/colors", - "version": "0.3.0", + "version": "0.3.3", "devDependencies": { "typescript": "^5.5.3", }, @@ -47,49 +35,70 @@ "emoji-assets": "^8.0.0", }, }, + "packages/fonts": { + "name": "@gitbook/fonts", + "version": "0.0.0", + "dependencies": { + "@gitbook/api": "catalog:", + }, + "devDependencies": { + "google-font-metadata": "^6.0.3", + "typescript": "^5.5.3", + }, + }, "packages/gitbook": { "name": "gitbook", - "version": "0.8.2", + "version": "0.12.0", "dependencies": { - "@gitbook/api": "*", - "@gitbook/cache-do": "workspace:*", + "@gitbook/api": "catalog:", "@gitbook/cache-tags": "workspace:*", "@gitbook/colors": "workspace:*", "@gitbook/emoji-codepoints": "workspace:*", + "@gitbook/fonts": "workspace:*", "@gitbook/icons": "workspace:*", "@gitbook/openapi-parser": "workspace:*", "@gitbook/react-contentkit": "workspace:*", "@gitbook/react-math": "workspace:*", "@gitbook/react-openapi": "workspace:*", + "@opennextjs/cloudflare": "1.2.1", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.1.12", "@radix-ui/react-navigation-menu": "^1.2.3", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-tooltip": "^1.1.8", "@sindresorhus/fnv1a": "^3.1.0", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/typography": "^0.5.16", - "@upstash/redis": "^1.27.1", - "ai": "^4.1.46", - "ajv": "^8.12.0", + "ai": "^4.2.2", "assert-never": "^1.2.1", "bun-types": "^1.1.20", "classnames": "^2.5.1", + "direction": "^2.0.1", + "event-iterator": "^2.0.0", "framer-motion": "^10.16.14", + "image-size": "^2.0.2", "js-cookie": "^3.0.5", "jsontoxml": "^1.0.1", "jwt-decode": "^4.0.0", "katex": "^0.16.9", "mathjax": "^3.2.2", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", "mdast-util-to-markdown": "^2.1.2", "memoizee": "^0.4.17", - "next": "14.2.25", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "next": "^15.3.2", "next-themes": "^0.2.1", "nuqs": "^2.2.3", "object-hash": "^3.0.0", + "object-identity": "^0.1.2", "openapi-types": "^12.1.3", - "p-map": "^7.0.0", + "p-map": "^7.0.3", "parse-cache-control": "^1.0.1", - "react": "18.3.1", - "react-dom": "18.3.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-hotkeys-hook": "^4.4.1", "rehype-sanitize": "^6.0.0", "rehype-stringify": "^10.0.1", @@ -102,13 +111,15 @@ "tailwind-merge": "^2.2.0", "tailwind-shades": "^1.1.2", "unified": "^11.0.5", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0", "url-join": "^5.0.0", "usehooks-ts": "^3.1.0", + "warn-once": "^0.1.1", + "zustand": "^5.0.3", }, "devDependencies": { - "@argos-ci/playwright": "^4.3.0", - "@cloudflare/next-on-pages": "1.13.7", - "@cloudflare/workers-types": "^4.20241230.0", + "@argos-ci/playwright": "^5.0.3", "@playwright/test": "^1.51.1", "@types/js-cookie": "^3.0.6", "@types/jsontoxml": "^1.0.5", @@ -134,30 +145,6 @@ "vercel": "^39.3.0", }, }, - "packages/gitbook-v2": { - "name": "gitbook-v2", - "version": "0.2.2", - "dependencies": { - "@gitbook/api": "*", - "@gitbook/cache-tags": "workspace:*", - "@sindresorhus/fnv1a": "^3.1.0", - "jwt-decode": "^4.0.0", - "next": "^15.2.3", - "p-memoize": "^7.1.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "rison": "^0.1.1", - "server-only": "^0.0.1", - "warn-once": "^0.1.1", - }, - "devDependencies": { - "@opennextjs/cloudflare": "^0.5.10", - "@types/rison": "^0.0.9", - "gitbook": "*", - "postcss": "^8", - "tailwindcss": "^3.4.0", - }, - }, "packages/icons": { "name": "@gitbook/icons", "version": "0.2.0", @@ -180,7 +167,7 @@ }, "packages/openapi-parser": { "name": "@gitbook/openapi-parser", - "version": "2.1.1", + "version": "2.1.4", "dependencies": { "@scalar/openapi-parser": "^0.10.10", "@scalar/openapi-types": "^0.1.9", @@ -193,18 +180,11 @@ "typescript": "^5.5.3", }, }, - "packages/proxy": { - "name": "@gitbook/proxy", - "version": "0.1.0", - "devDependencies": { - "typescript": "^5.5.3", - }, - }, "packages/react-contentkit": { "name": "@gitbook/react-contentkit", "version": "0.7.0", "dependencies": { - "@gitbook/api": "*", + "@gitbook/api": "catalog:", "@gitbook/icons": "workspace:*", "classnames": "^2.5.1", }, @@ -234,11 +214,11 @@ }, "packages/react-openapi": { "name": "@gitbook/react-openapi", - "version": "1.1.6", + "version": "1.3.0", "dependencies": { "@gitbook/openapi-parser": "workspace:*", - "@scalar/api-client-react": "^1.2.5", - "@scalar/oas-utils": "^0.2.120", + "@scalar/api-client-react": "^1.3.16", + "@scalar/oas-utils": "^0.2.130", "clsx": "^2.1.1", "flatted": "^3.2.9", "json-xml-parse": "^1.3.0", @@ -262,50 +242,53 @@ }, "overrides": { "@codemirror/state": "6.4.1", - "@gitbook/api": "0.106.0", - "react": "18.3.1", - "react-dom": "18.3.1", + "esbuild": "0.24.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", + }, + "catalog": { + "@gitbook/api": "^0.128.0", }, "packages": { - "@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + "@ai-sdk/provider": ["@ai-sdk/provider@1.1.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew=="], - "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.4", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-13sEGBxB6kgaMPGOgCLYibF6r8iv8mgjhuToFrOTU09bBxbFQd8ZoARarCfJN6VomCUbUvMKwjTBLb1vQnN+WA=="], - "@ai-sdk/react": ["@ai-sdk/react@1.1.19", "", { "dependencies": { "@ai-sdk/provider-utils": "2.1.10", "@ai-sdk/ui-utils": "1.1.16", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-zqSOWmJxpB45ZrwZ04+Q7Uo3xeGM0tva2eUYz2T4gv9Yk6MQAfOBA6+scsKg8CyIuUy4M4/C4pCY3eWQf7sfQg=="], + "@ai-sdk/react": ["@ai-sdk/react@1.2.6", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.4", "@ai-sdk/ui-utils": "1.2.5", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-5BFChNbcYtcY9MBStcDev7WZRHf0NpTrk8yfSoedWctB3jfWkFd1HECBvdc8w3mUQshF2MumLHtAhRO7IFtGGQ=="], - "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.16", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-jfblR2yZVISmNK2zyNzJZFtkgX57WDAUQXcmn3XUBJyo8LFsADu+/vYMn5AOyBi9qJT0RBk11PEtIxIqvByw3Q=="], + "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.5", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.4", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-XDgqnJcaCkDez7qolvk+PDbs/ceJvgkNkxkOlc9uDWqxfDJxtvCZ+14MP/1qr4IBwGIgKVHzMDYDXvqVhSWLzg=="], "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@argos-ci/api-client": ["@argos-ci/api-client@0.8.0", "", { "dependencies": { "debug": "^4.4.0", "openapi-fetch": "0.13.4" } }, "sha512-UHa1vAf8gwHVpkqM/RaSryrFe1juqWH6dHpPeMtT4e/ZMB9hNYwYFinaGq/KRWe88JEi2WeAu776YdoeUSZQkQ=="], + "@argos-ci/api-client": ["@argos-ci/api-client@0.8.1", "", { "dependencies": { "debug": "^4.4.0", "openapi-fetch": "0.13.5" } }, "sha512-3IHv7ANSPNO6OwWgwULlHbP9/tFV9kQDu6+nL9jysfPkGj0GgtrOsyBb+iU931c7wSMo1OD+XNujCnRzDD968w=="], - "@argos-ci/browser": ["@argos-ci/browser@3.2.0", "", {}, "sha512-mHLUamfywbdzrM6SRV4KB4kEQs2lrFxC1yS+QWB/9lME7FKzr7MJW/Q++iWcQli8IbmtLsZ+PqP2eqLaDiRsUw=="], + "@argos-ci/browser": ["@argos-ci/browser@4.1.1", "", {}, "sha512-UyKdnprGftUjWQkb0jqJ0zGHJmcWBzdko8zRy4y+4efukVX4jjC/Px2HvWW8aqwjoR4aplouMZuzhmOkq2SCsA=="], - "@argos-ci/core": ["@argos-ci/core@3.1.0", "", { "dependencies": { "@argos-ci/api-client": "0.8.0", "@argos-ci/util": "2.3.0", "axios": "^1.7.9", "convict": "^6.2.4", "debug": "^4.4.0", "fast-glob": "^3.3.3", "sharp": "^0.33.5", "tmp": "^0.2.3" } }, "sha512-bo/pNKk6P0pz4NRdymgU1letwQrRbMPTeFyMsUEW8fhKNdesSFnFIWZBFGsGkkh05uw75PBjl2ZN4PvQ2TxSog=="], + "@argos-ci/core": ["@argos-ci/core@3.1.1", "", { "dependencies": { "@argos-ci/api-client": "0.8.1", "@argos-ci/util": "2.3.1", "axios": "^1.8.4", "convict": "^6.2.4", "debug": "^4.4.0", "fast-glob": "^3.3.3", "sharp": "^0.33.5", "tmp": "^0.2.3" } }, "sha512-7iE3o1XGxlfHC5AF05pzT0OxuO387sryrZt3gKGj/e+6R20DXz7J49yI8++nQ2cuT+wLhcJp8+X0ox+SGMYHmw=="], - "@argos-ci/playwright": ["@argos-ci/playwright@4.3.0", "", { "dependencies": { "@argos-ci/browser": "3.2.0", "@argos-ci/core": "3.1.0", "@argos-ci/util": "2.3.0", "chalk": "^5.4.1", "debug": "^4.4.0" } }, "sha512-UQBC78zWg+bWXDaevWOL4m6zkrNeprMfdqjy6zagvU9kq7sPQC7nN/qZQ15hs/FT+JpTCa8CbbSAq13eQrmxKQ=="], + "@argos-ci/playwright": ["@argos-ci/playwright@5.0.3", "", { "dependencies": { "@argos-ci/browser": "4.1.1", "@argos-ci/core": "3.1.1", "@argos-ci/util": "2.3.1", "chalk": "^5.4.1", "debug": "^4.4.0" } }, "sha512-sqoARsgnDRrwKm1x10L3Z8+OQukk0F9OksVj9v9rvbzNI2WVCw5zbCUMY0qD4Q3Ba7vMFbl1ELUODRc2mfCbNw=="], - "@argos-ci/util": ["@argos-ci/util@2.3.0", "", {}, "sha512-tkxnCpaj7yN9nCFzo9MX0FJ5YjUepEOGYfdvF8COQqp+EdY1qubOPpc4Z0l1B60BlC8YtjQv/oRxHSh1XzxWFg=="], + "@argos-ci/util": ["@argos-ci/util@2.3.1", "", {}, "sha512-kE61HU2480fbAnimmA4x9HK45ZJvkoqLdW5GxT5uvwhkclQykVd2S6WfGFUr3JokTXfZ5LZEEfoWgtGA316KSQ=="], - "@ast-grep/napi": ["@ast-grep/napi@0.34.3", "", { "optionalDependencies": { "@ast-grep/napi-darwin-arm64": "0.34.3", "@ast-grep/napi-darwin-x64": "0.34.3", "@ast-grep/napi-linux-arm64-gnu": "0.34.3", "@ast-grep/napi-linux-arm64-musl": "0.34.3", "@ast-grep/napi-linux-x64-gnu": "0.34.3", "@ast-grep/napi-linux-x64-musl": "0.34.3", "@ast-grep/napi-win32-arm64-msvc": "0.34.3", "@ast-grep/napi-win32-ia32-msvc": "0.34.3", "@ast-grep/napi-win32-x64-msvc": "0.34.3" } }, "sha512-2yrnMrUw3NVm9hf+YKO+BOY3Aci/qau2vDo0lGtA7qGMma18XPUIOTdzm601k5gPHo4MfxPPZLoe9QdTUviANg=="], + "@ast-grep/napi": ["@ast-grep/napi@0.35.0", "", { "optionalDependencies": { "@ast-grep/napi-darwin-arm64": "0.35.0", "@ast-grep/napi-darwin-x64": "0.35.0", "@ast-grep/napi-linux-arm64-gnu": "0.35.0", "@ast-grep/napi-linux-arm64-musl": "0.35.0", "@ast-grep/napi-linux-x64-gnu": "0.35.0", "@ast-grep/napi-linux-x64-musl": "0.35.0", "@ast-grep/napi-win32-arm64-msvc": "0.35.0", "@ast-grep/napi-win32-ia32-msvc": "0.35.0", "@ast-grep/napi-win32-x64-msvc": "0.35.0" } }, "sha512-3ucaaSxV6fxXoqHrE/rxAvP1THnDdY5jNzGlnvx+JvnY9C/dSRKc0jlRMRz59N3El572+/yNRUUpAV1T9aBJug=="], - "@ast-grep/napi-darwin-arm64": ["@ast-grep/napi-darwin-arm64@0.34.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0a8dS+mOP5TYRX3YDiejL1WXWoWga3wpMYZGSs6Ni+SlH1WEO8zyUHe/1z6jNWH8VMHfH9FSCy6+YaPTpiurCA=="], + "@ast-grep/napi-darwin-arm64": ["@ast-grep/napi-darwin-arm64@0.35.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-T+MN4Oinc+sXjXCIHzfxDDWY7r2pKgPxM6zVeVlkMTrJV2mJtyKYBIS+CABhRM6kflps2T2I6l4DGaKV/8Ym9w=="], - "@ast-grep/napi-darwin-x64": ["@ast-grep/napi-darwin-x64@0.34.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-n70ha95Fk187B8tgnvR+ZW429EAs/rXktD0839Mdm2+fWjD+JSdB3SADzOGo2cKhuLpLOKnsvfF/bmu+C/p0YQ=="], + "@ast-grep/napi-darwin-x64": ["@ast-grep/napi-darwin-x64@0.35.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-pEYiN6JI1HY2uWhMYJ9+3yIMyVYKuYdFzeD+dL7odA3qzK0o9N9AM3/NOt4ynU2EhufaWCJr0P5NoQ636qN6MQ=="], - "@ast-grep/napi-linux-arm64-gnu": ["@ast-grep/napi-linux-arm64-gnu@0.34.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-2LBUvMVkBcO/CJ4ItgZ1MOSqDq2fRmhiLwFxIYjhjG7Rz+4ZNdRY+d7Sl596g0BChB4ffNv+M5HS8uUBuUax1w=="], + "@ast-grep/napi-linux-arm64-gnu": ["@ast-grep/napi-linux-arm64-gnu@0.35.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-NBuzQngABGKz7lhG08IQb+7nPqUx81Ol37xmS3ZhVSdSgM0mtp93rCbgFTkJcAFE8IMfCHQSg7G4g0Iotz4ABQ=="], - "@ast-grep/napi-linux-arm64-musl": ["@ast-grep/napi-linux-arm64-musl@0.34.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-vlX4mOyVO1Oy2CdOIFi7HBPwMKzOyLdBpRCcu7pArBOQJkpJ2eS5GR5qSW15f7KPLTkUMpJq7juLz/rP6Rc79Q=="], + "@ast-grep/napi-linux-arm64-musl": ["@ast-grep/napi-linux-arm64-musl@0.35.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-1EcvHPwyWpCL/96LuItBYGfeI5FaMTRvL+dHbO/hL5q1npqbb5qn+ppJwtNOjTPz8tayvgggxVk9T4C2O7taYA=="], - "@ast-grep/napi-linux-x64-gnu": ["@ast-grep/napi-linux-x64-gnu@0.34.3", "", { "os": "linux", "cpu": "x64" }, "sha512-F9TwAfZT/vjjxoPH9Fk8/PTNB95Hm2V/rtva+xMCxkTnhaSh0swM+ku3vavkZ4rwk+LfKPAY37pifEVWg4JPNQ=="], + "@ast-grep/napi-linux-x64-gnu": ["@ast-grep/napi-linux-x64-gnu@0.35.0", "", { "os": "linux", "cpu": "x64" }, "sha512-FDzNdlqmQnsiWXhnLxusw5AOfEcEM+5xtmrnAf3SBRFr86JyWD9qsynnFYC2pnP9hlMfifNH2TTmMpyGJW49Xw=="], - "@ast-grep/napi-linux-x64-musl": ["@ast-grep/napi-linux-x64-musl@0.34.3", "", { "os": "linux", "cpu": "x64" }, "sha512-2W0ZYsRxdVnwJ/BfnCOSKgfcZ2UFf5I+vF5aMmeAOplOg7vlFHb8XHSa4GqO0MoBfFTGKTH76bKwxLz8d38y1Q=="], + "@ast-grep/napi-linux-x64-musl": ["@ast-grep/napi-linux-x64-musl@0.35.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wlmndjfBafT8u5p4DBnoRQyoCSGNuVSz7rT3TqhvlHcPzUouRWMn95epU9B1LNLyjXvr9xHeRjSktyCN28w57Q=="], - "@ast-grep/napi-win32-arm64-msvc": ["@ast-grep/napi-win32-arm64-msvc@0.34.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-XRWHlZnO77dEjC7IM5aQRTBC/hc/08Hdl18baJL7smG2dYGJKonUA7BQns6Vt2i63sOEghclkDw6Pq0PD60dbw=="], + "@ast-grep/napi-win32-arm64-msvc": ["@ast-grep/napi-win32-arm64-msvc@0.35.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gkhJeYc4rrZLX2icLxalPikTLMR57DuIYLwLr9g+StHYXIsGHrbfrE6Nnbdd8Izfs34ArFCrcwdaMrGlvOPSeg=="], - "@ast-grep/napi-win32-ia32-msvc": ["@ast-grep/napi-win32-ia32-msvc@0.34.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-0jR3QIkuasSrEvsaGtsgMEvgEY8FVe4pemuW77hUOH/mhO4vxFOWny7w4kUaBxQkzJ5z3lbXVoqO4Uv9rpJsRA=="], + "@ast-grep/napi-win32-ia32-msvc": ["@ast-grep/napi-win32-ia32-msvc@0.35.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-OdUuRa3chHCZ65y+qALfkUjz0W0Eg21YZ9TyPquV5why07M6HAK38mmYGzLxFH6294SvRQhs+FA/rAfbKeH0jA=="], - "@ast-grep/napi-win32-x64-msvc": ["@ast-grep/napi-win32-x64-msvc@0.34.3", "", { "os": "win32", "cpu": "x64" }, "sha512-OY1Cswkz+0bRZgt9sLjzgyA+y0X164UFjwf5WTYpbCTPUlwdpJP6L7FqJNRMemzQp0qQwwRR7ejpBUF4o/V0Aw=="], + "@ast-grep/napi-win32-x64-msvc": ["@ast-grep/napi-win32-x64-msvc@0.35.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pcQRUHqbroTN1oQ56V982a7IZTUUySQYWa2KEyksiifHGuBuitlzcyzFGjT96ThcqD9XW0UVJMvpoF2Qjh006Q=="], "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], @@ -473,19 +456,19 @@ "@changesets/write": ["@changesets/write@0.3.2", "", { "dependencies": { "@changesets/types": "^6.0.0", "fs-extra": "^7.0.1", "human-id": "^1.0.2", "prettier": "^2.7.1" } }, "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw=="], - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.3.4", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q=="], + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], - "@cloudflare/next-on-pages": ["@cloudflare/next-on-pages@1.13.7", "", { "dependencies": { "acorn": "^8.8.0", "ast-types": "^0.14.2", "chalk": "^5.2.0", "chokidar": "^3.5.3", "commander": "^11.1.0", "cookie": "^0.5.0", "esbuild": "^0.15.3", "js-yaml": "^4.1.0", "miniflare": "^3.20231218.1", "package-manager-manager": "^0.2.0", "pcre-to-regexp": "^1.1.0", "semver": "^7.5.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20240208.0", "vercel": ">=30.0.0", "wrangler": "^3.28.2" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "next-on-pages": "bin/index.js" } }, "sha512-TSMVy+1fmxzeyykOC9guMEj7G2FgENw1T8V1sIFnah6piaJNBmybdyikPdQSdikP5w6v9eQhBt/TrXDPMDw0dw=="], + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.3.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.15", "workerd": "^1.20250320.0" }, "optionalPeers": ["workerd"] }, "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250214.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cDvvedWDc5zrgDnuXe2qYcz/TwBvzmweO55C7XpPuAWJ9Oqxv81PkdekYxD8mH989aQ/GI5YD0Fe6fDYlM+T3Q=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250409.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-smA9yq77xsdQ1NMLhFz3JZxMHGd01lg0bE+X3dTFmIUs+hHskJ+HJ/IkMFInkCCeEFlUkoL4yO7ilaU/fin/xA=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250214.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NytCvRveVzu0mRKo+tvZo3d/gCUway3B2ZVqSi/TS6NXDGBYIJo7g6s3BnTLS74kgyzeDOjhu9j/RBJBS809qw=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250409.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oLVcf+Y5Qun8JHcy1VcR/YnbA5U2ne0czh3XNhDqdHZFK8+vKeC7MnVPX+kEqQA3+uLcMM1/FsIDU1U4Na0h1g=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250214.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pQ7+aHNHj8SiYEs4d/6cNoimE5xGeCMfgU1yfDFtA9YGN9Aj2BITZgOWPec+HW7ZkOy9oWlNrO6EvVjGgB4tbQ=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250409.0", "", { "os": "linux", "cpu": "x64" }, "sha512-D31B4kdC3a0RD5yfpdIa89//kGHbYsYihZmejm1k4S4NHOho3MUDHAEh4aHtafQNXbZdydGHlSyiVYjTdQ9ILQ=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250214.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Vhlfah6Yd9ny1npNQjNgElLIjR6OFdEbuR3LCfbLDCwzWEBFhIf7yC+Tpp/a0Hq7kLz3sLdktaP7xl3PJhyOjA=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250409.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Sr59P0TREayil5OQ7kcbjuIn6L6OTSRLI91LKu0D8vi1hss2q9FUwBcwxg0+Yd/x+ty/x7IISiAK5QBkAMeITQ=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250214.0", "", { "os": "win32", "cpu": "x64" }, "sha512-GMwMyFbkjBKjYJoKDhGX8nuL4Gqe3IbVnVWf2Q6086CValyIknupk5J6uQWGw2EBU3RGO3x4trDXT5WphQJZDQ=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250409.0", "", { "os": "win32", "cpu": "x64" }, "sha512-dK9I8zBX5rR7MtaaP2AhICQTEw3PVzHcsltN8o46w7JsbYlMvFOj27FfYH5dhs3IahgmIfw2e572QXW2o/dbpg=="], "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20241230.0", "", {}, "sha512-dtLD4jY35Lb750cCVyO1i/eIfdZJg2Z0i+B1RYX6BVeRPlgaHx/H18ImKAkYmy0g09Ow8R2jZy3hIxMgXun0WQ=="], @@ -541,59 +524,63 @@ "@edge-runtime/vm": ["@edge-runtime/vm@3.2.0", "", { "dependencies": { "@edge-runtime/primitives": "4.1.0" } }, "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], + "@emnapi/runtime": ["@emnapi/runtime@1.4.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw=="], "@emotion/is-prop-valid": ["@emotion/is-prop-valid@0.8.8", "", { "dependencies": { "@emotion/memoize": "0.7.4" } }, "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA=="], "@emotion/memoize": ["@emotion/memoize@0.7.4", "", {}, "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="], - "@esbuild-plugins/node-globals-polyfill": ["@esbuild-plugins/node-globals-polyfill@0.2.3", "", { "peerDependencies": { "esbuild": "*" } }, "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], - "@esbuild-plugins/node-modules-polyfill": ["@esbuild-plugins/node-modules-polyfill@0.2.2", "", { "dependencies": { "escape-string-regexp": "^4.0.0", "rollup-plugin-node-polyfills": "^0.2.1" }, "peerDependencies": { "esbuild": "*" } }, "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.17.19", "", { "os": "android", "cpu": "x64" }, "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.17.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.17.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.17.19", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.17.19", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.17.19", "", { "os": "linux", "cpu": "arm" }, "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.17.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.17.19", "", { "os": "linux", "cpu": "ia32" }, "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.17.19", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.17.19", "", { "os": "linux", "cpu": "s390x" }, "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.17.19", "", { "os": "linux", "cpu": "x64" }, "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.17.19", "", { "os": "none", "cpu": "x64" }, "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.17.19", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.17.19", "", { "os": "sunos", "cpu": "x64" }, "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.17.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + "@evan/concurrency": ["@evan/concurrency@0.0.3", "", {}, "sha512-vjhkm2nrXoM39G4aP/U4CC5vFv/ZlMRSjbTII0N65J9R0EpgjdGswnHKS1KSjfGAp/9zKSNaojBgi0SxKnGapw=="], "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], @@ -623,9 +610,7 @@ "@fortawesome/fontawesome-svg-core": ["@fortawesome/fontawesome-svg-core@6.6.0", "", { "dependencies": { "@fortawesome/fontawesome-common-types": "6.6.0" } }, "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg=="], - "@gitbook/api": ["@gitbook/api@0.106.0", "", { "dependencies": { "event-iterator": "^2.0.0", "eventsource-parser": "^3.0.0" } }, "sha512-2qA/w18JwHe2fwR2A45q1pEdCZArxqUloegfNibu0xngDhea+iKTXSBrN94wD6Lwkh7cqBp9MvtxC+YMz3hx1g=="], - - "@gitbook/cache-do": ["@gitbook/cache-do@workspace:packages/cache-do"], + "@gitbook/api": ["@gitbook/api@0.128.0", "", { "dependencies": { "event-iterator": "^2.0.0", "eventsource-parser": "^3.0.0" } }, "sha512-VO98hRGfUcFdwMplvFW49jz72/ew2waE7RCu+URKAY2AyPHAduv2zgluF5gF1VcDyuJM9PKFtsdsMtpUjI5sYg=="], "@gitbook/cache-tags": ["@gitbook/cache-tags@workspace:packages/cache-tags"], @@ -635,12 +620,12 @@ "@gitbook/fontawesome-pro": ["@gitbook/fontawesome-pro@1.0.8", "", { "dependencies": { "@fortawesome/fontawesome-common-types": "^6.6.0" } }, "sha512-i4PgiuGyUb52Muhc52kK3aMJIMfMkA2RbPW30tre8a6M8T6mWTfYo6gafSgjNvF1vH29zcuB8oBYnF0gO4XcHA=="], + "@gitbook/fonts": ["@gitbook/fonts@workspace:packages/fonts"], + "@gitbook/icons": ["@gitbook/icons@workspace:packages/icons"], "@gitbook/openapi-parser": ["@gitbook/openapi-parser@workspace:packages/openapi-parser"], - "@gitbook/proxy": ["@gitbook/proxy@workspace:packages/proxy"], - "@gitbook/react-contentkit": ["@gitbook/react-contentkit@workspace:packages/react-contentkit"], "@gitbook/react-math": ["@gitbook/react-math@workspace:packages/react-math"], @@ -661,43 +646,45 @@ "@hyperjump/uri": ["@hyperjump/uri@1.2.2", "", {}, "sha512-Zn8AZb/j54KKUCckmcOzKCSCKpIpMVBc60zYaajD8Dq/1g4UN6TfAFi+uDa5o/6rf+I+5xDZjZpdzwfuhlC0xQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.1", "", { "dependencies": { "@emnapi/runtime": "^1.4.0" }, "cpu": "none" }, "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.1", "", { "os": "win32", "cpu": "x64" }, "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw=="], "@internationalized/date": ["@internationalized/date@3.7.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ=="], @@ -721,7 +708,7 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], "@keyv/serialize": ["@keyv/serialize@1.0.3", "", { "dependencies": { "buffer": "^6.0.3" } }, "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g=="], @@ -749,27 +736,23 @@ "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0-rc.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-nhSMNprz3WmeRvd8iUs5JqkKr0Ncx46JtPxM3AhXes84XpSJfmIwKeWXRpsr53S7kqPkQfPhzrMFUxSNb23qSA=="], - "@msgpack/msgpack": ["@msgpack/msgpack@3.0.0-beta2", "", {}, "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw=="], - - "@next/env": ["@next/env@14.2.25", "", {}, "sha512-JnzQ2cExDeG7FxJwqAksZ3aqVJrHjFwZQAEJ9gQZSoEhIow7SNoKZzju/AwQ+PLIR4NY8V0rhcVozx/2izDO0w=="], + "@next/env": ["@next/env@15.3.2", "", {}, "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g=="], - "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@14.2.25", "", { "os": "darwin", "cpu": "arm64" }, "sha512-09clWInF1YRd6le00vt750s3m7SEYNehz9C4PUcSu3bAdCTpjIV4aTYQZ25Ehrr83VR1rZeqtKUPWSI7GfuKZQ=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g=="], - "@next/swc-darwin-x64": ["@next/swc-darwin-x64@14.2.25", "", { "os": "darwin", "cpu": "x64" }, "sha512-V+iYM/QR+aYeJl3/FWWU/7Ix4b07ovsQ5IbkwgUK29pTHmq+5UxeDr7/dphvtXEq5pLB/PucfcBNh9KZ8vWbug=="], + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w=="], - "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@14.2.25", "", { "os": "linux", "cpu": "arm64" }, "sha512-LFnV2899PJZAIEHQ4IMmZIgL0FBieh5keMnriMY1cK7ompR+JUd24xeTtKkcaw8QmxmEdhoE5Mu9dPSuDBgtTg=="], + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA=="], - "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@14.2.25", "", { "os": "linux", "cpu": "arm64" }, "sha512-QC5y5PPTmtqFExcKWKYgUNkHeHE/z3lUsu83di488nyP0ZzQ3Yse2G6TCxz6nNsQwgAx1BehAJTZez+UQxzLfw=="], + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg=="], - "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@14.2.25", "", { "os": "linux", "cpu": "x64" }, "sha512-y6/ML4b9eQ2D/56wqatTJN5/JR8/xdObU2Fb1RBidnrr450HLCKr6IJZbPqbv7NXmje61UyxjF5kvSajvjye5w=="], + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg=="], - "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@14.2.25", "", { "os": "linux", "cpu": "x64" }, "sha512-sPX0TSXHGUOZFvv96GoBXpB3w4emMqKeMgemrSxI7A6l55VBJp/RKYLwZIB9JxSqYPApqiREaIIap+wWq0RU8w=="], + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w=="], - "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@14.2.25", "", { "os": "win32", "cpu": "arm64" }, "sha512-ReO9S5hkA1DU2cFCsGoOEp7WJkhFzNbU/3VUF6XxNGUCQChyug6hZdYL/istQgfT/GWE6PNIg9cm784OI4ddxQ=="], + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ=="], - "@next/swc-win32-ia32-msvc": ["@next/swc-win32-ia32-msvc@14.2.25", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZ/gc0o9neuCDyD5IumyTGHVun2dCox5TfPQI/BJTYwpSNYM3CZDI4i6TOdjeq1JMo+Ug4kPSMuZdwsycwFbAw=="], - - "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@14.2.25", "", { "os": "win32", "cpu": "x64" }, "sha512-KSznmS6eFjQ9RJ1nEc66kJvtGIL1iZMYmGEXsZPh2YtnLtqrgdVvKXJY2ScjjoFnG6nGLyPFR0UiEvDwVah4Tw=="], + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA=="], "@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], @@ -789,12 +772,30 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@opennextjs/aws": ["@opennextjs/aws@https://pkg.pr.new/@opennextjs/aws@756", { "dependencies": { "@aws-sdk/client-cloudfront": "3.398.0", "@aws-sdk/client-dynamodb": "^3.398.0", "@aws-sdk/client-lambda": "^3.398.0", "@aws-sdk/client-s3": "^3.398.0", "@aws-sdk/client-sqs": "^3.398.0", "@node-minify/core": "^8.0.6", "@node-minify/terser": "^8.0.6", "@tsconfig/node18": "^1.0.1", "aws4fetch": "^1.0.18", "chalk": "^5.3.0", "esbuild": "0.19.2", "express": "5.0.1", "path-to-regexp": "^6.3.0", "urlpattern-polyfill": "^10.0.0" }, "bin": { "open-next": "./dist/index.js" } }], + "@octokit/auth-token": ["@octokit/auth-token@5.1.2", "", {}, "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw=="], + + "@octokit/core": ["@octokit/core@6.1.5", "", { "dependencies": { "@octokit/auth-token": "^5.0.0", "@octokit/graphql": "^8.2.2", "@octokit/request": "^9.2.3", "@octokit/request-error": "^6.1.8", "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" } }, "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg=="], + + "@octokit/endpoint": ["@octokit/endpoint@10.1.4", "", { "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA=="], + + "@octokit/graphql": ["@octokit/graphql@8.2.2", "", { "dependencies": { "@octokit/request": "^9.2.3", "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA=="], + + "@octokit/openapi-types": ["@octokit/openapi-types@25.1.0", "", {}, "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="], + + "@octokit/request": ["@octokit/request@9.2.3", "", { "dependencies": { "@octokit/endpoint": "^10.1.4", "@octokit/request-error": "^6.1.8", "@octokit/types": "^14.0.0", "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w=="], - "@opennextjs/cloudflare": ["@opennextjs/cloudflare@0.5.10", "", { "dependencies": { "@ast-grep/napi": "^0.34.1", "@dotenvx/dotenvx": "1.31.0", "@opennextjs/aws": "https://pkg.pr.new/@opennextjs/aws@756", "enquirer": "^2.4.1", "glob": "^11.0.0", "yaml": "^2.7.0" }, "peerDependencies": { "wrangler": "^3.111.0" }, "bin": { "opennextjs-cloudflare": "dist/cli/index.js" } }, "sha512-L/D472YT5OW1LwpFtD/aVXHJYcVPbFVX7XdphlUjCR4+2osSQIDnsuNgfDRydHMDJZMKxeZDc251ZBzUVKpCqw=="], + "@octokit/request-error": ["@octokit/request-error@6.1.8", "", { "dependencies": { "@octokit/types": "^14.0.0" } }, "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ=="], + + "@octokit/types": ["@octokit/types@14.1.0", "", { "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g=="], + + "@opennextjs/aws": ["@opennextjs/aws@3.6.5", "", { "dependencies": { "@ast-grep/napi": "^0.35.0", "@aws-sdk/client-cloudfront": "3.398.0", "@aws-sdk/client-dynamodb": "^3.398.0", "@aws-sdk/client-lambda": "^3.398.0", "@aws-sdk/client-s3": "^3.398.0", "@aws-sdk/client-sqs": "^3.398.0", "@node-minify/core": "^8.0.6", "@node-minify/terser": "^8.0.6", "@tsconfig/node18": "^1.0.1", "aws4fetch": "^1.0.18", "chalk": "^5.3.0", "cookie": "^1.0.2", "esbuild": "0.25.4", "express": "5.0.1", "path-to-regexp": "^6.3.0", "urlpattern-polyfill": "^10.0.0", "yaml": "^2.7.0" }, "bin": { "open-next": "dist/index.js" } }, "sha512-wni+CWlRCyWfhNfekQBBPPkrDDnaGdZLN9hMybKI0wKOKTO+zhPOqR65Eh3V0pzWAi84Sureb5mdMuLwCxAAcw=="], + + "@opennextjs/cloudflare": ["@opennextjs/cloudflare@1.2.1", "", { "dependencies": { "@dotenvx/dotenvx": "1.31.0", "@opennextjs/aws": "3.6.5", "enquirer": "^2.4.1", "glob": "^11.0.0", "ts-tqdm": "^0.8.6" }, "peerDependencies": { "wrangler": "^4.19.1" }, "bin": { "opennextjs-cloudflare": "dist/cli/index.js" } }, "sha512-cOco+nHwlo/PLB1bThF8IIvaS8PgAT9MEI5ZttFO/qt6spgvr2lUaPkpjgSIQmI3sBIEG2cLUykvQ2nbbZEcVw=="], "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@phosphor-icons/core": ["@phosphor-icons/core@2.1.1", "", {}, "sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], "@playwright/test": ["@playwright/test@1.51.1", "", { "dependencies": { "playwright": "1.51.1" }, "bin": { "playwright": "cli.js" } }, "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q=="], @@ -817,11 +818,15 @@ "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA=="], + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA=="], + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-primitive": "2.0.0", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA=="], - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q=="], "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wUi01RrTDTOoGtjEPHsxlzPtVzVc3R/AZ5wfh0dyqMAqolhHAHvG5iQjBCTi2AjQqa77FWWbA3kE3RkD+bDMgQ=="], @@ -835,12 +840,18 @@ "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.0", "", { "dependencies": { "@radix-ui/react-slot": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA=="], + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], @@ -1069,43 +1080,45 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], - "@scalar/api-client": ["@scalar/api-client@2.3.5", "", { "dependencies": { "@headlessui/tailwindcss": "^0.2.0", "@headlessui/vue": "^1.7.20", "@scalar/components": "0.13.37", "@scalar/draggable": "0.1.11", "@scalar/icons": "0.1.3", "@scalar/import": "0.3.2", "@scalar/oas-utils": "0.2.120", "@scalar/object-utils": "1.1.13", "@scalar/openapi-parser": "0.10.10", "@scalar/openapi-types": "0.1.9", "@scalar/postman-to-openapi": "0.1.43", "@scalar/snippetz": "0.2.16", "@scalar/themes": "0.9.79", "@scalar/types": "0.1.1", "@scalar/use-codemirror": "0.11.82", "@scalar/use-hooks": "0.1.33", "@scalar/use-toasts": "0.7.9", "@scalar/use-tooltip": "1.0.6", "@vueuse/core": "^10.10.0", "@vueuse/integrations": "^11.2.0", "focus-trap": "^7", "fuse.js": "^7.0.0", "microdiff": "^1.4.0", "nanoid": "^5.0.9", "pretty-bytes": "^6.1.1", "pretty-ms": "^8.0.0", "shell-quote": "^1.8.1", "vue": "^3.5.12", "vue-router": "^4.3.0", "whatwg-mimetype": "^4.0.0", "yaml": "^2.4.5", "zod": "^3.23.8" } }, "sha512-bVBP8H3laa4VG3dExv4Ak/Kf+q9z8aK/Glpv6CPE0wxgZJWxwkJoSrvwxUE+46JktSObUrhu4xQiqSCmBz8esQ=="], + "@scalar/api-client": ["@scalar/api-client@2.5.11", "", { "dependencies": { "@headlessui/tailwindcss": "^0.2.0", "@headlessui/vue": "^1.7.20", "@scalar/components": "0.14.12", "@scalar/draggable": "0.2.0", "@scalar/helpers": "0.0.4", "@scalar/icons": "0.4.4", "@scalar/import": "0.4.11", "@scalar/oas-utils": "0.4.7", "@scalar/object-utils": "1.2.1", "@scalar/openapi-parser": "0.18.0", "@scalar/openapi-types": "0.3.3", "@scalar/postman-to-openapi": "0.3.10", "@scalar/snippetz": "0.3.1", "@scalar/themes": "0.13.4", "@scalar/types": "0.2.3", "@scalar/use-codemirror": "0.12.13", "@scalar/use-hooks": "0.2.2", "@scalar/use-toasts": "0.8.0", "@scalar/use-tooltip": "1.1.0", "@vueuse/core": "^10.10.0", "@vueuse/integrations": "^11.2.0", "focus-trap": "^7", "fuse.js": "^7.0.0", "microdiff": "^1.4.0", "nanoid": "^5.1.5", "pretty-bytes": "^6.1.1", "pretty-ms": "^8.0.0", "shell-quote": "^1.8.1", "type-fest": "^4.20.0", "vue": "^3.5.12", "vue-router": "^4.3.0", "whatwg-mimetype": "^4.0.0", "yaml": "^2.4.5", "zod": "3.24.1" } }, "sha512-ubREY9whWXH1MdBIVUXdG/Vq4un2m1G918Z3jQhEmrkUP4wyZ0VEiV/h1N71JIYyql9apoj3HqAQb+D2U+rsDQ=="], + + "@scalar/api-client-react": ["@scalar/api-client-react@1.3.16", "", { "dependencies": { "@scalar/api-client": "2.5.11", "@scalar/types": "0.2.3", "vue": "^3.5.12" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-dt9TxdeEaMrOfwH5WuK2QW/TxVJNkccG3DQle3SHVe9Hfl7nK+i8mMjTR8QMsuUU1MCIFpQzewDtNODq0pVXiw=="], - "@scalar/api-client-react": ["@scalar/api-client-react@1.2.5", "", { "dependencies": { "@scalar/api-client": "2.3.5", "@scalar/types": "0.1.1", "vue": "^3.5.12" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-DpVDWb1rtNeU8ZqLX2Duos018q/++b3qIOYs7MzB2cXNg1802ZO7tPywXbYyizxLuy/dziI3UwGkjBuOKKXMGQ=="], + "@scalar/code-highlight": ["@scalar/code-highlight@0.1.4", "", { "dependencies": { "hast-util-to-text": "^4.0.2", "highlight.js": "^11.9.0", "highlightjs-curl": "^1.3.0", "highlightjs-vue": "^1.0.0", "lowlight": "^3.1.0", "rehype-external-links": "^3.0.0", "rehype-format": "^5.0.0", "rehype-parse": "^9.0.0", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "rehype-stringify": "^10.0.0", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.0", "remark-stringify": "^11.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-vE5q8Jn+I8x99APk4FGVff+ofVQ6y2Fc9qr8zPUncL+ASo0APCqjmVlHiMaFIC1f5nEApHU879B5N4CsLAvnFA=="], - "@scalar/code-highlight": ["@scalar/code-highlight@0.0.25", "", { "dependencies": { "hast-util-to-text": "^4.0.2", "highlight.js": "^11.9.0", "highlightjs-curl": "^1.3.0", "highlightjs-vue": "^1.0.0", "lowlight": "^3.1.0", "rehype-external-links": "^3.0.0", "rehype-format": "^5.0.0", "rehype-parse": "^9.0.0", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "rehype-stringify": "^10.0.0", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.0", "remark-stringify": "^11.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-rmiXaAoL3Zl+OycIO1CMj8apaeAU/p41EmCpHTxInZiFVW0++iClce2fun1lK6qjTMZneR6UwE4qBKiUUVLCpg=="], + "@scalar/components": ["@scalar/components@0.14.12", "", { "dependencies": { "@floating-ui/utils": "^0.2.2", "@floating-ui/vue": "^1.0.2", "@headlessui/vue": "^1.7.20", "@scalar/code-highlight": "0.1.4", "@scalar/icons": "0.4.4", "@scalar/oas-utils": "0.4.7", "@scalar/themes": "0.13.4", "@scalar/use-hooks": "0.2.2", "@scalar/use-toasts": "0.8.0", "@vueuse/core": "^10.10.0", "cva": "1.0.0-beta.2", "nanoid": "^5.1.5", "pretty-bytes": "^6.1.1", "radix-vue": "^1.9.3", "vue": "^3.5.12" } }, "sha512-y+2LK84INfD8vCGwyDvpcT+1W+gwfEdjpBGZwrdKXYzJ13Z+fLf5BDDPMCVT4cPWnzQ2MrVgyBh8UnznM8JLFw=="], - "@scalar/components": ["@scalar/components@0.13.37", "", { "dependencies": { "@floating-ui/utils": "^0.2.2", "@floating-ui/vue": "^1.0.2", "@headlessui/vue": "^1.7.20", "@scalar/code-highlight": "0.0.25", "@scalar/themes": "0.9.79", "@scalar/use-hooks": "0.1.33", "@scalar/use-toasts": "0.7.9", "@vueuse/core": "^10.10.0", "cva": "1.0.0-beta.2", "nanoid": "^5.0.9", "pretty-bytes": "^6.1.1", "radix-vue": "^1.9.3", "tailwind-merge": "^2.5.5", "vue": "^3.5.12" } }, "sha512-bhJxg0I63nUH0qoZgb8nyHKCSzL8L9widP2WIYymIvXpCFLwCvF64Z0CAbihwgXxq0YblPvNM+g5N3dRtmXqdA=="], + "@scalar/draggable": ["@scalar/draggable@0.2.0", "", { "dependencies": { "vue": "^3.5.12" } }, "sha512-UetHRB5Bqo5egVYlS21roWBcICmyk8CKh2htsidO+bFGAjl2e7Te+rY0borhNrMclr0xezHlPuLpEs1dvgLS2g=="], - "@scalar/draggable": ["@scalar/draggable@0.1.11", "", { "dependencies": { "vue": "^3.5.12" } }, "sha512-EQW9N1+mDORhsbjdtCI3XDvmUKsuKw1uf6r3kT1Mm2zQKT+rWwA0ChsAkEN6OG62C0YumMuXpH71h1seAWptxw=="], + "@scalar/helpers": ["@scalar/helpers@0.0.4", "", {}, "sha512-AkWdiU8zhztb4bJ0U2LHgCtJs+kwWB5UFXebfy9QCLwCP0guhhFR2UJtRCU3QZ8xmZnI0AX0i7BjrxU/MN1roQ=="], - "@scalar/icons": ["@scalar/icons@0.1.3", "", { "dependencies": { "vue": "^3.5.12" } }, "sha512-Bl46u7WsJ7NYjW1Fva7SMvw9c/92pGBP8B68tvDc+QevQ04DVNxw6+ny1NU/PnLtpuu1rUpPdtSCAkV1OdQGZQ=="], + "@scalar/icons": ["@scalar/icons@0.4.4", "", { "dependencies": { "@phosphor-icons/core": "^2.1.1", "@types/node": "^20.17.10", "chalk": "^5.4.1", "vue": "^3.5.12" } }, "sha512-622QsIkRPw5UG4IU4QzcTUV1UHEw7aBaZMu6QYEHPO0Wn3ue1lfFIqLZOKsoXxvDuuXGvZUqyoZahkXdRHccmQ=="], - "@scalar/import": ["@scalar/import@0.3.2", "", { "dependencies": { "@scalar/oas-utils": "0.2.120", "@scalar/openapi-parser": "0.10.10", "yaml": "^2.4.5" } }, "sha512-de7IDZgEYOhhgaq8lFFbfiJ4Hx/ITIXvuLA8SfSl5UQKg+LxiOnnn/5PSKF+pnjWmUf7Kz/ds0eHOXpZv5iMkw=="], + "@scalar/import": ["@scalar/import@0.4.11", "", { "dependencies": { "@scalar/helpers": "0.0.4", "@scalar/openapi-parser": "0.18.0", "yaml": "^2.4.5" } }, "sha512-s8GRknImMjevimqv+jLkW+7LsBuOWgQPv/p29dukLqPtCGddIyNoWgVot6/IaREEXXeu5m/PmoG+uN58AVN4Vg=="], - "@scalar/oas-utils": ["@scalar/oas-utils@0.2.120", "", { "dependencies": { "@hyperjump/json-schema": "^1.9.6", "@scalar/object-utils": "1.1.13", "@scalar/openapi-types": "0.1.9", "@scalar/themes": "0.9.79", "@scalar/types": "0.1.1", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.0.9", "yaml": "^2.4.5", "zod": "^3.23.8" } }, "sha512-npu0uLClqqXVZfxMdKBWxkWCmONK0jKaUcfmVhGza9Jij5aJyvdfDw6vH/Hh+DghgECwAvQLQeIBZTxjr9ufzg=="], + "@scalar/oas-utils": ["@scalar/oas-utils@0.2.130", "", { "dependencies": { "@hyperjump/json-schema": "^1.9.6", "@scalar/object-utils": "1.1.13", "@scalar/openapi-types": "0.2.0", "@scalar/themes": "0.9.86", "@scalar/types": "0.1.7", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "yaml": "^2.4.5", "zod": "^3.23.8" } }, "sha512-sVpdc3+3c/WiNrKEIwzJ+ml2ZQBjarMOTDJCM/IrvYhrJE0nHrdkzxlJgNPi++vJbVl0saYt8LhEItALv7NziA=="], "@scalar/object-utils": ["@scalar/object-utils@1.1.13", "", { "dependencies": { "flatted": "^3.3.1", "just-clone": "^6.2.0", "ts-deepmerge": "^7.0.1" } }, "sha512-311eTykIXgOtjCs4VTELj9UMT97jHTWc5qkGNoIzZ5nxjCcvOVe7kDQobIkE8dGT+ybOgHz5qly02Eu7nVHeZQ=="], - "@scalar/openapi-parser": ["@scalar/openapi-parser@0.10.10", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-6MSgvpNKu/anZy96dn8tXQZo1PuDCoeB4m2ZLLDS4vC2zaTnuNBvvQHx+gjwXNKWhTbIVy8bQpYBzlMAYnFNcQ=="], + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.10.14", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-VXr979NMx6wZ+kpFKor2eyCJZOjyMwcBRc6c4Gc92ZMOC7ZNYqjwbw+Ubh2ELJyP5cWAjOFSrNwtylema0pw5w=="], "@scalar/openapi-types": ["@scalar/openapi-types@0.1.9", "", {}, "sha512-HQQudOSQBU7ewzfnBW9LhDmBE2XOJgSfwrh5PlUB7zJup/kaRkBGNgV2wMjNz9Af/uztiU/xNrO179FysmUT+g=="], - "@scalar/postman-to-openapi": ["@scalar/postman-to-openapi@0.1.43", "", { "dependencies": { "@scalar/oas-utils": "0.2.120", "@scalar/openapi-types": "0.1.9" } }, "sha512-gLOkYYPCTKYFBOwyBOKZDc0seZjntmwPTchJUr3oxGQmLB1Y5VBJ+8fXJCTp5TwKiiztjALJs79y9s7jXBdWMA=="], + "@scalar/postman-to-openapi": ["@scalar/postman-to-openapi@0.3.10", "", { "dependencies": { "@scalar/helpers": "0.0.4", "@scalar/oas-utils": "0.4.7", "@scalar/openapi-types": "0.3.3" } }, "sha512-Jg+uJg56VASihtfL0sOzB8onyt7lfz/8Ztwo57WIAxUTvLcwBeCBgdTvUIw+Z4h7E2KfmKQY9HdDP/GHWMv6DQ=="], - "@scalar/snippetz": ["@scalar/snippetz@0.2.16", "", { "dependencies": { "stringify-object": "^5.0.0" } }, "sha512-xtIY4kvV619IF2uXg6fDw7emtXwuJeWzLunGAaUTIOwNRw5mGSKqJnLcSnIiSdH54YmN8D2CtdJRo2VxPP9/Wg=="], + "@scalar/snippetz": ["@scalar/snippetz@0.3.1", "", { "dependencies": { "stringify-object": "^5.0.0" } }, "sha512-r5tjYhHxSgyxEPbzIp21xUVR3oy6hjrG4B4ozQWR8qvzpST+Am1KZI+dS9l69PKzfQ0YvQROOvfCMIh3JAFTFQ=="], - "@scalar/themes": ["@scalar/themes@0.9.79", "", { "dependencies": { "@scalar/types": "0.1.1" } }, "sha512-zWiHCZAIjPGa8X9o/NORBPRMTMblLEz2+2RcfW9yIKNO/8H4Gz0rltiGGlJ6vX0o+qHwx7AdgfY+7njmWQR4ng=="], + "@scalar/themes": ["@scalar/themes@0.9.86", "", { "dependencies": { "@scalar/types": "0.1.7" } }, "sha512-QUHo9g5oSWi+0Lm1vJY9TaMZRau8LHg+vte7q5BVTBnu6NuQfigCaN+ouQ73FqIVd96TwMO6Db+dilK1B+9row=="], - "@scalar/types": ["@scalar/types@0.1.1", "", { "dependencies": { "@scalar/openapi-types": "0.1.9", "@unhead/schema": "^1.11.11", "zod": "^3.23.8" } }, "sha512-LlUX6AmOOGoRqOMoO835V2FezM1KiO5UlvQC3poT/s7oqD6ranqwRNFxyrPz/IxClPYR+SV1yBUSNKely4ZQhQ=="], + "@scalar/types": ["@scalar/types@0.2.3", "", { "dependencies": { "@scalar/openapi-types": "0.3.3", "nanoid": "^5.1.5", "zod": "3.24.1" } }, "sha512-K1/Vp5xaQ8TEGDYwHg88OBuQWJRWrE3ToZ0Z2LJwskcY1Eg+uDiRQXKF4QPngZzu5rrWgRErAq4yte4Y7omqgA=="], - "@scalar/use-codemirror": ["@scalar/use-codemirror@0.11.82", "", { "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-html": "^6.4.8", "@codemirror/lang-json": "^6.0.0", "@codemirror/lang-xml": "^6.0.0", "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.10.7", "@codemirror/lint": "^6.8.4", "@codemirror/state": "^6.5.0", "@codemirror/view": "^6.35.3", "@lezer/common": "^1.2.3", "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.2", "@replit/codemirror-css-color-picker": "^6.3.0", "@scalar/components": "0.13.37", "codemirror": "^6.0.0", "style-mod": "^4.1.2", "vue": "^3.5.12" } }, "sha512-zFECln7aWKRf6iJO9oovByD59EsrOMenNLfLhneH6L+K1CrBoHFVr4czSDlom1wlr3HPg3xwpZrukoAteHYILQ=="], + "@scalar/use-codemirror": ["@scalar/use-codemirror@0.12.13", "", { "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-html": "^6.4.8", "@codemirror/lang-json": "^6.0.0", "@codemirror/lang-xml": "^6.0.0", "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.10.7", "@codemirror/lint": "^6.8.4", "@codemirror/state": "^6.5.0", "@codemirror/view": "^6.35.3", "@lezer/common": "^1.2.3", "@lezer/highlight": "^1.2.1", "@replit/codemirror-css-color-picker": "^6.3.0", "@scalar/components": "0.14.12", "codemirror": "^6.0.0", "vue": "^3.5.12" } }, "sha512-XOXCUT3b1l0gkp4CY51e7xMgR6IP/AMpYIZ97fBOOjnrUIJ8B/J+U/BMS6+lPKiN0hexaSALRWlVBf90txdT8w=="], - "@scalar/use-hooks": ["@scalar/use-hooks@0.1.33", "", { "dependencies": { "@scalar/themes": "0.9.79", "@scalar/use-toasts": "0.7.9", "@vueuse/core": "^10.10.0", "vue": "^3.5.12", "zod": "^3.23.8" } }, "sha512-ENm0bWwRdAWWF/S6TbE+fFx0vP2mgEpG5APqQBomm0a41/6L2HJ/TN+9ajAvrJXGi0ULWuxihNS4Jue6tpEssA=="], + "@scalar/use-hooks": ["@scalar/use-hooks@0.2.2", "", { "dependencies": { "@scalar/use-toasts": "0.8.0", "@vueuse/core": "^10.10.0", "cva": "1.0.0-beta.2", "tailwind-merge": "^2.5.5", "vue": "^3.5.12", "zod": "3.24.1" } }, "sha512-9XxfqIKyUp727C2zzyc+cExsK3Gsg5M/v3pEG2TB665RZMAYV1YK8MBT1JGkJDkkugBgHKGl5PQiXsYme1rmTQ=="], - "@scalar/use-toasts": ["@scalar/use-toasts@0.7.9", "", { "dependencies": { "nanoid": "^5.0.9", "vue": "^3.5.12", "vue-sonner": "^1.0.3" } }, "sha512-EcUDJY8VozLS9sfoQKvvipStQJ9RuH/nKOzf0BBr+mZDmumi1WFZ1iIJnHVXIN3iSLcSAr5ej6rOqa6jIv4bCQ=="], + "@scalar/use-toasts": ["@scalar/use-toasts@0.8.0", "", { "dependencies": { "nanoid": "^5.1.5", "vue": "^3.5.12", "vue-sonner": "^1.0.3" } }, "sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ=="], - "@scalar/use-tooltip": ["@scalar/use-tooltip@1.0.6", "", { "dependencies": { "tippy.js": "^6.3.7", "vue": "^3.5.12" } }, "sha512-f0gadIaUnILfi9qYAk7g+fNTsvLGXnam8oOUTxovavC1ocYuGTEykdz3g2MTqnAqRS8OkAB64h9mHf0FBfg6mg=="], + "@scalar/use-tooltip": ["@scalar/use-tooltip@1.1.0", "", { "dependencies": { "tippy.js": "^6.3.7", "vue": "^3.5.12" } }, "sha512-KJConD/JDyGP8GPGpD+TXA6FEcKT9bmHQb/JyBmME+tJoJGHGtNcGy7kcezFakaKCqfKyY7cgPzL1ctUaGIRag=="], "@shikijs/core": ["@shikijs/core@3.2.0", "", { "dependencies": { "@shikijs/types": "3.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-+5dPz8q6HgNqfQ28ycm/vA8dIVd2lNFOUqVRFCQLbs0KZ6emYI+1apLpX+wuL/aDSPLOkMgARwNjkA5UjGKS1Q=="], @@ -1265,6 +1278,8 @@ "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@types/har-format": ["@types/har-format@1.2.16", "", {}, "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A=="], + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], "@types/js-cookie": ["@types/js-cookie@3.0.6", "", {}, "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ=="], @@ -1283,7 +1298,7 @@ "@types/ms": ["@types/ms@0.7.34", "", {}, "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="], - "@types/node": ["@types/node@20.16.11", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw=="], + "@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], @@ -1315,8 +1330,6 @@ "@unhead/schema": ["@unhead/schema@1.11.14", "", { "dependencies": { "hookable": "^5.5.3", "zhead": "^2.2.4" } }, "sha512-V9W9u5tF1/+TiLqxu+Qvh1ShoMDkPEwHoEo4DKdDG6ko7YlbzFfDxV6el9JwCren45U/4Vy/4Xi7j8OH02wsiA=="], - "@upstash/redis": ["@upstash/redis@1.34.3", "", { "dependencies": { "crypto-js": "^4.2.0" } }, "sha512-VT25TyODGy/8ljl7GADnJoMmtmJ1F8d84UXfGonRRF8fWYJz7+2J6GzW+a6ETGtk4OyuRTt7FRSvFG5GvrfSdQ=="], - "@vercel/build-utils": ["@vercel/build-utils@9.0.1", "", {}, "sha512-pG/izEqA0AGyqQj6QBfGoTOKU9FPG18sYw9qpncEq00uA+J4Ly4e8ssNbENsXtnXqkMjeoS3c5ncR3jT0bOyiA=="], "@vercel/error-utils": ["@vercel/error-utils@2.0.3", "", {}, "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ=="], @@ -1385,15 +1398,15 @@ "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - "acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], - "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], - "ai": ["ai@4.1.47", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10", "@ai-sdk/react": "1.1.19", "@ai-sdk/ui-utils": "1.1.16", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-9UZ8Mkv1HlprCJfQ0Kq+rgKbfkrkDtJjslr1WOHBRzvC70jDJJYp8r0Qq4vlF7zs9VBkGyy8Rhm5zQJJIUjvgw=="], + "ai": ["ai@4.3.0", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.4", "@ai-sdk/react": "1.2.6", "@ai-sdk/ui-utils": "1.2.5", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-PxyQYKhWaU3LiZEpeKRaekVonZIbWdKAwgnqm0CSAxy1MFufmYEC5SM5Mc9uiK2DoHcbAL3d1jyaQ2fSDAJL8w=="], "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -1431,8 +1444,6 @@ "assert-never": ["assert-never@1.3.0", "", {}, "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ=="], - "ast-types": ["ast-types@0.14.2", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA=="], - "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], "async-listen": ["async-listen@1.2.0", "", {}, "sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA=="], @@ -1445,7 +1456,7 @@ "aws4fetch": ["aws4fetch@1.0.20", "", {}, "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g=="], - "axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="], + "axios": ["axios@1.8.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -1453,6 +1464,8 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "before-after-hook": ["before-after-hook@3.0.2", "", {}, "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="], + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], @@ -1465,6 +1478,8 @@ "body-parser": ["body-parser@2.0.2", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "3.1.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.5.2", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "^3.0.0", "type-is": "~1.6.18" } }, "sha512-SNMk0OONlQ01uk8EPeiBvTW7W4ovpL5b1O3t1sjpPgfxOQ6BqQJ6XjxinDPR79Z6HdcD5zBBwr5ssiTlgdNztQ=="], + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + "bowser": ["bowser@2.11.0", "", {}, "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="], "boxen": ["boxen@4.2.0", "", { "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "cli-boxes": "^2.2.0", "string-width": "^4.1.0", "term-size": "^2.1.0", "type-fest": "^0.8.1", "widest-line": "^3.1.0" } }, "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ=="], @@ -1489,6 +1504,8 @@ "bytes": ["bytes@3.1.0", "", {}, "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="], + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + "cacheable": ["cacheable@1.8.9", "", { "dependencies": { "hookified": "^1.7.1", "keyv": "^5.3.1" } }, "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ=="], "cacheable-request": ["cacheable-request@6.1.0", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^4.1.0", "responselike": "^1.0.2" } }, "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg=="], @@ -1505,8 +1522,6 @@ "caniuse-lite": ["caniuse-lite@1.0.30001668", "", {}, "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw=="], - "capnp-ts": ["capnp-ts@0.7.0", "", { "dependencies": { "debug": "^4.3.1", "tslib": "^2.2.0" } }, "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g=="], - "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -1555,12 +1570,10 @@ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - "configstore": ["configstore@5.0.1", "", { "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" } }, "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="], "consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="], @@ -1573,7 +1586,7 @@ "convict": ["convict@6.2.4", "", { "dependencies": { "lodash.clonedeep": "^4.5.0", "yargs-parser": "^20.2.7" } }, "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ=="], - "cookie": ["cookie@0.5.0", "", {}, "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="], + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], @@ -1585,16 +1598,20 @@ "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], - "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], - "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], "css-functions-list": ["css-functions-list@3.2.3", "", {}, "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA=="], + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], + "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], + "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + "cssom": ["cssom@0.5.0", "", {}, "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="], + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], "cva": ["cva@1.0.0-beta.2", "", { "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { "typescript": ">= 4.5.5 < 6" }, "optionalPeers": ["typescript"] }, "sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg=="], @@ -1649,8 +1666,18 @@ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], @@ -1683,7 +1710,7 @@ "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "env-cmd": ["env-cmd@10.1.0", "", { "dependencies": { "commander": "^4.0.0", "cross-spawn": "^7.0.0" }, "bin": { "env-cmd": "bin/env-cmd.js" } }, "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA=="], @@ -1705,47 +1732,7 @@ "es6-weak-map": ["es6-weak-map@2.0.3", "", { "dependencies": { "d": "1", "es5-ext": "^0.10.46", "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA=="], - "esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], - - "esbuild-android-64": ["esbuild-android-64@0.15.18", "", { "os": "android", "cpu": "x64" }, "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA=="], - - "esbuild-android-arm64": ["esbuild-android-arm64@0.15.18", "", { "os": "android", "cpu": "arm64" }, "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ=="], - - "esbuild-darwin-64": ["esbuild-darwin-64@0.15.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg=="], - - "esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.15.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA=="], - - "esbuild-freebsd-64": ["esbuild-freebsd-64@0.15.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA=="], - - "esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.15.18", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA=="], - - "esbuild-linux-32": ["esbuild-linux-32@0.15.18", "", { "os": "linux", "cpu": "ia32" }, "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg=="], - - "esbuild-linux-64": ["esbuild-linux-64@0.15.18", "", { "os": "linux", "cpu": "x64" }, "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw=="], - - "esbuild-linux-arm": ["esbuild-linux-arm@0.15.18", "", { "os": "linux", "cpu": "arm" }, "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA=="], - - "esbuild-linux-arm64": ["esbuild-linux-arm64@0.15.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug=="], - - "esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.15.18", "", { "os": "linux", "cpu": "none" }, "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ=="], - - "esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.15.18", "", { "os": "linux", "cpu": "ppc64" }, "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w=="], - - "esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.15.18", "", { "os": "linux", "cpu": "none" }, "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg=="], - - "esbuild-linux-s390x": ["esbuild-linux-s390x@0.15.18", "", { "os": "linux", "cpu": "s390x" }, "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ=="], - - "esbuild-netbsd-64": ["esbuild-netbsd-64@0.15.18", "", { "os": "none", "cpu": "x64" }, "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg=="], - - "esbuild-openbsd-64": ["esbuild-openbsd-64@0.15.18", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ=="], - - "esbuild-sunos-64": ["esbuild-sunos-64@0.15.18", "", { "os": "sunos", "cpu": "x64" }, "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw=="], - - "esbuild-windows-32": ["esbuild-windows-32@0.15.18", "", { "os": "win32", "cpu": "ia32" }, "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ=="], - - "esbuild-windows-64": ["esbuild-windows-64@0.15.18", "", { "os": "win32", "cpu": "x64" }, "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw=="], - - "esbuild-windows-arm64": ["esbuild-windows-arm64@0.15.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ=="], + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -1753,7 +1740,7 @@ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "esniff": ["esniff@2.0.1", "", { "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", "event-emitter": "^0.3.5", "type": "^2.7.2" } }, "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg=="], @@ -1779,6 +1766,8 @@ "express": ["express@5.0.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.0.1", "content-disposition": "^1.0.0", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "^1.2.1", "debug": "4.3.6", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "^2.0.0", "fresh": "2.0.0", "http-errors": "2.0.0", "merge-descriptors": "^2.0.0", "methods": "~1.1.2", "mime-types": "^3.0.0", "on-finished": "2.4.1", "once": "1.4.0", "parseurl": "~1.3.3", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "router": "^2.0.0", "safe-buffer": "5.2.1", "send": "^1.1.0", "serve-static": "^2.1.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "^2.0.0", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ=="], + "exsolve": ["exsolve@1.0.4", "", {}, "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="], + "ext": ["ext@1.7.0", "", { "dependencies": { "type": "^2.7.2" } }, "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -1787,6 +1776,8 @@ "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + "fast-content-type-parse": ["fast-content-type-parse@2.0.1", "", {}, "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], @@ -1803,6 +1794,8 @@ "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], + "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], @@ -1829,6 +1822,8 @@ "form-data": ["form-data@4.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw=="], + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], @@ -1843,7 +1838,7 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -1867,8 +1862,6 @@ "gitbook": ["gitbook@workspace:packages/gitbook"], - "gitbook-v2": ["gitbook-v2@workspace:packages/gitbook-v2"], - "glob": ["glob@11.0.1", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^4.0.1", "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -1887,6 +1880,8 @@ "google-auth-library": ["google-auth-library@5.10.1", "", { "dependencies": { "arrify": "^2.0.0", "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "fast-text-encoding": "^1.0.0", "gaxios": "^2.1.0", "gcp-metadata": "^3.4.0", "gtoken": "^4.1.0", "jws": "^4.0.0", "lru-cache": "^5.0.0" } }, "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg=="], + "google-font-metadata": ["google-font-metadata@6.0.3", "", { "dependencies": { "@evan/concurrency": "^0.0.3", "@octokit/core": "^6.1.2", "cac": "^6.7.14", "consola": "^3.3.3", "deepmerge": "^4.3.1", "json-stringify-pretty-compact": "^4.0.0", "linkedom": "^0.18.6", "pathe": "^1.1.2", "picocolors": "^1.1.1", "playwright": "^1.49.1", "stylis": "^4.3.4", "zod": "^3.24.1" }, "bin": { "gfm": "dist/cli.mjs" } }, "sha512-62+QB+nmBKppHrxwvILZkV/EvKctEAdzkKBIJY26TtwZkUjeEqmAQnE5uHvtMTdB8odqGpQu5LAKPqqUYHI9wA=="], + "google-p12-pem": ["google-p12-pem@2.0.5", "", { "dependencies": { "node-forge": "^0.10.0" }, "bin": { "gp12-pem": "build/src/bin/gp12-pem.js" } }, "sha512-7RLkxwSsMsYh9wQ5Vb2zRtkAHvqPvfoMGag+nugl1noYO7gf0844Yr9TIFA5NEBMAeVt2Z+Imu7CQMp3oNatzQ=="], "googleapis": ["googleapis@47.0.0", "", { "dependencies": { "google-auth-library": "^5.6.1", "googleapis-common": "^3.2.0" } }, "sha512-+Fnjgcc3Na/rk57dwxqW1V0HJXJFjnt3aqFlckULqAqsPkmex/AyJJe6MSlXHC37ZmlXEb9ZtPGUp5ZzRDXpHg=="], @@ -1963,12 +1958,16 @@ "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + "html-tags": ["html-tags@3.3.1", "", {}, "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], + "htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="], + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], "http-errors": ["http-errors@1.4.0", "", { "dependencies": { "inherits": "2.0.1", "statuses": ">= 1.2.1 < 2" } }, "sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw=="], @@ -1987,6 +1986,8 @@ "ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-lazy": ["import-lazy@2.1.0", "", {}, "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A=="], @@ -2079,6 +2080,8 @@ "json-stringify-deterministic": ["json-stringify-deterministic@1.0.12", "", {}, "sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g=="], + "json-stringify-pretty-compact": ["json-stringify-pretty-compact@4.0.0", "", {}, "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q=="], + "json-xml-parse": ["json-xml-parse@1.3.0", "", {}, "sha512-MVosauc/3W2wL4dd4yaJzH5oXw+HOUfptn0+d4+bFghMiJFop7MaqIwFXJNLiRnNYJNQ6L4o7B+53n5wcvoLFw=="], "jsondiffpatch": ["jsondiffpatch@0.6.0", "", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="], @@ -2117,6 +2120,8 @@ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + "linkedom": ["linkedom@0.18.11", "", { "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.0.0", "uhyphen": "^0.2.0" } }, "sha512-K03GU3FUlnhBAP0jPb7tN7YJl7LbjZx30Z8h6wgLXusnKF7+BEZvfEbdkN/lO9LfFzxN3S0ZAriDuJ/13dIsLA=="], + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="], @@ -2157,8 +2162,6 @@ "lru-queue": ["lru-queue@0.1.0", "", { "dependencies": { "es5-ext": "~0.10.2" } }, "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ=="], - "lru_map": ["lru_map@0.4.1", "", {}, "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg=="], - "magic-string": ["magic-string@0.30.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw=="], "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], @@ -2175,9 +2178,11 @@ "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA=="], - "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], - "mdast-util-gfm": ["mdast-util-gfm@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw=="], + "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], @@ -2221,6 +2226,8 @@ "micromark-core-commonmark": ["micromark-core-commonmark@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA=="], + "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], @@ -2281,13 +2288,13 @@ "mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="], - "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], "mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "miniflare": ["miniflare@3.20250214.2", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250214.0", "ws": "8.18.0", "youch": "3.2.3", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-t+lT4p2lbOcKv4PS3sx1F/wcDAlbEYZCO2VooLp4H7JErWWYIi9yjD3UillC3CGOpiBahVg5nrPCoFltZf6UlA=="], + "miniflare": ["miniflare@4.20250409.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250409.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-Hu02dYZvFR+MyrI57O6rSrOUTofcO9EIvcodgq2SAHzAeWSJw2E0oq9lylOrcckFwPMcwxUAb/cQN1LIoCyySw=="], "minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], @@ -2303,8 +2310,6 @@ "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], - "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], - "mnemonist": ["mnemonist@0.38.3", "", { "dependencies": { "obliterator": "^1.6.1" } }, "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], @@ -2315,11 +2320,11 @@ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - "nanoid": ["nanoid@5.1.2", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g=="], + "nanoid": ["nanoid@5.1.5", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="], "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "next": ["next@14.2.25", "", { "dependencies": { "@next/env": "14.2.25", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", "postcss": "8.4.31", "styled-jsx": "5.1.1" }, "optionalDependencies": { "@next/swc-darwin-arm64": "14.2.25", "@next/swc-darwin-x64": "14.2.25", "@next/swc-linux-arm64-gnu": "14.2.25", "@next/swc-linux-arm64-musl": "14.2.25", "@next/swc-linux-x64-gnu": "14.2.25", "@next/swc-linux-x64-musl": "14.2.25", "@next/swc-win32-arm64-msvc": "14.2.25", "@next/swc-win32-ia32-msvc": "14.2.25", "@next/swc-win32-x64-msvc": "14.2.25" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-N5M7xMc4wSb4IkPvEV5X2BRRXUmhVHNyaXwEM86+voXthSZz8ZiRyQW4p9mwAoAPIm6OzuVZtn7idgEJeAJN3Q=="], + "next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="], "next-themes": ["next-themes@0.2.1", "", { "peerDependencies": { "next": "*", "react": "*", "react-dom": "*" } }, "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A=="], @@ -2345,19 +2350,23 @@ "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + "nuqs": ["nuqs@2.2.3", "", { "dependencies": { "mitt": "^3.0.1" }, "peerDependencies": { "@remix-run/react": ">=2", "next": ">=14.2.0", "react": ">=18.2.0 || ^19.0.0-0", "react-router-dom": ">=6" }, "optionalPeers": ["@remix-run/react", "next", "react-router-dom"] }, "sha512-nMCcUW06KSqEXA0xp+LiRqDpIE59BVYbjZLe0HUisJAlswfihHYSsAjYTzV0lcE1thfh8uh+LqUHGdQ8qq8rfA=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + "object-identity": ["object-identity@0.1.2", "", {}, "sha512-Px5puVllX5L2aBjbcfXpiG5xXeq6OE8RckryTeP2Zq+0PgYrCGJXmC6LblWgknKSJs11Je2W4U2NOWFj3t/QXQ=="], + "object-inspect": ["object-inspect@1.13.2", "", {}, "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="], "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], "obliterator": ["obliterator@1.6.1", "", {}, "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig=="], - "ohash": ["ohash@1.1.4", "", {}, "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -2369,7 +2378,7 @@ "oniguruma-to-es": ["oniguruma-to-es@4.1.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "oniguruma-parser": "^0.5.4", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA=="], - "openapi-fetch": ["openapi-fetch@0.13.4", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-JHX7UYjLEiHuQGCPxa3CCCIqe/nc4bTIF9c4UYVC8BegAbWoS3g4gJxKX5XcG7UtYQs2060kY6DH64KkvNZahg=="], + "openapi-fetch": ["openapi-fetch@0.13.5", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-AQK8T9GSKFREFlN1DBXTYsLjs7YV2tZcJ7zUWxbjMoQmj8dDSFRrzhLCbHPZWA1TMV3vACqfCxLEZcwf2wxV6Q=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], @@ -2391,9 +2400,7 @@ "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "p-map": ["p-map@7.0.2", "", {}, "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q=="], - - "p-memoize": ["p-memoize@7.1.1", "", { "dependencies": { "mimic-fn": "^4.0.0", "type-fest": "^3.0.0" } }, "sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA=="], + "p-map": ["p-map@7.0.3", "", {}, "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA=="], "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], @@ -2403,8 +2410,6 @@ "package-manager-detector": ["package-manager-detector@0.2.2", "", {}, "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg=="], - "package-manager-manager": ["package-manager-manager@0.2.0", "", { "dependencies": { "js-yaml": "^4.1.0", "shellac": "^0.8.0" } }, "sha512-V02gl0bafXJ2gcY6j+5IHM7UdnYwmF+2OsFZuqVcha6iMSStD4dpIOBOsypnUIwOi4jLcPz6RQuyifmAE3mG8g=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], @@ -2431,14 +2436,12 @@ "path-scurry": ["path-scurry@2.0.0", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg=="], - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + "path-to-regexp": ["path-to-regexp@6.2.1", "", {}, "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="], "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], - "pcre-to-regexp": ["pcre-to-regexp@1.1.0", "", {}, "sha512-KF9XxmUQJ2DIlMj3TqNqY1AWvyvTuIuq11CuuekxyaYMiFuMKGgQrePYMX5bXKLhLG3sDI4CsGAYHPaT7VV7+g=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "picocolors": ["picocolors@1.1.0", "", {}, "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="], @@ -2449,8 +2452,6 @@ "pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="], - "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "playwright": ["playwright@1.51.1", "", { "dependencies": { "playwright-core": "1.51.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw=="], "playwright-core": ["playwright-core@1.51.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw=="], @@ -2513,13 +2514,13 @@ "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], - "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], "react-aria": ["react-aria@3.37.0", "", { "dependencies": { "@internationalized/string": "^3.2.5", "@react-aria/breadcrumbs": "^3.5.20", "@react-aria/button": "^3.11.1", "@react-aria/calendar": "^3.7.0", "@react-aria/checkbox": "^3.15.1", "@react-aria/color": "^3.0.3", "@react-aria/combobox": "^3.11.1", "@react-aria/datepicker": "^3.13.0", "@react-aria/dialog": "^3.5.21", "@react-aria/disclosure": "^3.0.1", "@react-aria/dnd": "^3.8.1", "@react-aria/focus": "^3.19.1", "@react-aria/gridlist": "^3.10.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/link": "^3.7.8", "@react-aria/listbox": "^3.14.0", "@react-aria/menu": "^3.17.0", "@react-aria/meter": "^3.4.19", "@react-aria/numberfield": "^3.11.10", "@react-aria/overlays": "^3.25.0", "@react-aria/progress": "^3.4.19", "@react-aria/radio": "^3.10.11", "@react-aria/searchfield": "^3.8.0", "@react-aria/select": "^3.15.1", "@react-aria/selection": "^3.22.0", "@react-aria/separator": "^3.4.5", "@react-aria/slider": "^3.7.15", "@react-aria/ssr": "^3.9.7", "@react-aria/switch": "^3.6.11", "@react-aria/table": "^3.16.1", "@react-aria/tabs": "^3.9.9", "@react-aria/tag": "^3.4.9", "@react-aria/textfield": "^3.16.0", "@react-aria/tooltip": "^3.7.11", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-u3WUEMTcbQFaoHauHO3KhPaBYzEv1o42EdPcLAs05GBw9Q6Axlqwo73UFgMrsc2ElwLAZ4EKpSdWHLo1R5gfiw=="], "react-aria-components": ["react-aria-components@1.6.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@internationalized/string": "^3.2.5", "@react-aria/autocomplete": "3.0.0-alpha.37", "@react-aria/collections": "3.0.0-alpha.7", "@react-aria/color": "^3.0.3", "@react-aria/disclosure": "^3.0.1", "@react-aria/dnd": "^3.8.1", "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/menu": "^3.17.0", "@react-aria/toolbar": "3.0.0-beta.12", "@react-aria/tree": "3.0.0-beta.3", "@react-aria/utils": "^3.27.0", "@react-aria/virtualizer": "^4.1.1", "@react-stately/autocomplete": "3.0.0-alpha.0", "@react-stately/color": "^3.8.2", "@react-stately/disclosure": "^3.0.1", "@react-stately/layout": "^4.1.1", "@react-stately/menu": "^3.9.1", "@react-stately/selection": "^3.19.0", "@react-stately/table": "^3.13.1", "@react-stately/utils": "^3.10.5", "@react-stately/virtualizer": "^4.2.1", "@react-types/color": "^3.0.2", "@react-types/form": "^3.7.9", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@react-types/table": "^3.10.4", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", "react-aria": "^3.37.0", "react-stately": "^3.35.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YfG9PUE7XrXtDDAqT4pLTGyYQaiHHTBFdAK/wNgGsypVnQSdzmyYlV3Ty8aHlZJI6hP9RWkbywvosXkU7KcPHg=="], - "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], "react-hotkeys-hook": ["react-hotkeys-hook@4.5.1", "", { "peerDependencies": { "react": ">=16.8.1", "react-dom": ">=16.8.1" } }, "sha512-scAEJOh3Irm0g95NIn6+tQVf/OICCjsQsC9NBHfQws/Vxw4sfq1tDQut5fhTEvPraXhu/sHxRd9lOtxzyYuNAg=="], @@ -2551,8 +2552,6 @@ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - "reghex": ["reghex@1.0.2", "", {}, "sha512-bYtyDmFGHxn1Y4gxIs12+AUQ1WRDNvaIhn6ZuKc5KUbSVcmm6U6vx/RA66s26xGhTWBErKKDKK7lorkvvIBB5g=="], - "registry-auth-token": ["registry-auth-token@4.2.2", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg=="], "registry-url": ["registry-url@5.1.0", "", { "dependencies": { "rc": "^1.2.8" } }, "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw=="], @@ -2593,12 +2592,6 @@ "rollup": ["rollup@3.29.5", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w=="], - "rollup-plugin-inject": ["rollup-plugin-inject@3.0.2", "", { "dependencies": { "estree-walker": "^0.6.1", "magic-string": "^0.25.3", "rollup-pluginutils": "^2.8.1" } }, "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w=="], - - "rollup-plugin-node-polyfills": ["rollup-plugin-node-polyfills@0.2.1", "", { "dependencies": { "rollup-plugin-inject": "^3.0.0" } }, "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA=="], - - "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], - "router": ["router@2.0.0", "", { "dependencies": { "array-flatten": "3.0.0", "is-promise": "4.0.0", "methods": "~1.1.2", "parseurl": "~1.3.3", "path-to-regexp": "^8.0.0", "setprototypeof": "1.2.0", "utils-merge": "1.0.1" } }, "sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -2607,7 +2600,7 @@ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="], @@ -2625,7 +2618,7 @@ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "sharp": ["sharp@0.34.1", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.7.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.1", "@img/sharp-darwin-x64": "0.34.1", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.1", "@img/sharp-linux-arm64": "0.34.1", "@img/sharp-linux-s390x": "0.34.1", "@img/sharp-linux-x64": "0.34.1", "@img/sharp-linuxmusl-arm64": "0.34.1", "@img/sharp-linuxmusl-x64": "0.34.1", "@img/sharp-wasm32": "0.34.1", "@img/sharp-win32-ia32": "0.34.1", "@img/sharp-win32-x64": "0.34.1" } }, "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -2633,8 +2626,6 @@ "shell-quote": ["shell-quote@1.8.1", "", {}, "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA=="], - "shellac": ["shellac@0.8.0", "", { "dependencies": { "reghex": "^1.0.2" } }, "sha512-M3F2vzYIM7frKOs0+kgs/ITMlXhGpgtqs9HxDPciz3bckzAqqfd4LrBn+CCmSbICyJS+Jz5UDkmkR1jE+m+g+Q=="], - "shiki": ["shiki@3.2.0", "", { "dependencies": { "@shikijs/core": "3.2.0", "@shikijs/engine-javascript": "3.2.0", "@shikijs/engine-oniguruma": "3.2.0", "@shikijs/langs": "3.2.0", "@shikijs/themes": "3.2.0", "@shikijs/types": "3.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lOF6wkvZCRVQrdfGilyXclTKIjCWKujPAjD6fddLwtQ6eSmgj43pFDbjUmxivtElDRlsGO8G2dLeeRpwNY4wWg=="], "side-channel": ["side-channel@1.0.6", "", { "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" } }, "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA=="], @@ -2655,8 +2646,6 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "sourcemap-codec": ["sourcemap-codec@1.4.8", "", {}, "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="], - "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], @@ -2709,10 +2698,12 @@ "style-mod": ["style-mod@4.1.2", "", {}, "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="], - "styled-jsx": ["styled-jsx@5.1.1", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" } }, "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw=="], + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], "stylelint": ["stylelint@16.16.0", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", "debug": "^4.3.7", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^10.0.7", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", "ignore": "^7.0.3", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg=="], + "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -2787,25 +2778,27 @@ "ts-toolbelt": ["ts-toolbelt@6.15.5", "", {}, "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A=="], + "ts-tqdm": ["ts-tqdm@0.8.6", "", {}, "sha512-3X3M1PZcHtgQbnwizL+xU8CAgbYbeLHrrDwL9xxcZZrV5J+e7loJm1XrXozHjSkl44J0Zg0SgA8rXbh83kCkcQ=="], + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], - "turbo": ["turbo@2.4.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.4.4", "turbo-darwin-arm64": "2.4.4", "turbo-linux-64": "2.4.4", "turbo-linux-arm64": "2.4.4", "turbo-windows-64": "2.4.4", "turbo-windows-arm64": "2.4.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ=="], + "turbo": ["turbo@2.5.0", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.0", "turbo-darwin-arm64": "2.5.0", "turbo-linux-64": "2.5.0", "turbo-linux-arm64": "2.5.0", "turbo-windows-64": "2.5.0", "turbo-windows-arm64": "2.5.0" }, "bin": { "turbo": "bin/turbo" } }, "sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA=="], - "turbo-darwin-64": ["turbo-darwin-64@2.4.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.4.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA=="], - "turbo-linux-64": ["turbo-linux-64@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q=="], + "turbo-linux-64": ["turbo-linux-64@2.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA=="], - "turbo-windows-64": ["turbo-windows-64@2.4.4", "", { "os": "win32", "cpu": "x64" }, "sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg=="], + "turbo-windows-64": ["turbo-windows-64@2.5.0", "", { "os": "win32", "cpu": "x64" }, "sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg=="], "type": ["type@2.7.3", "", {}, "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="], - "type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + "type-fest": ["type-fest@4.40.0", "", {}, "sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw=="], "type-is": ["type-is@2.0.0", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw=="], @@ -2815,13 +2808,15 @@ "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="], + "uhyphen": ["uhyphen@0.2.0", "", {}, "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA=="], + "uid-promise": ["uid-promise@1.0.0", "", {}, "sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig=="], "undici": ["undici@5.28.4", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g=="], - "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - "unenv": ["unenv@2.0.0-rc.1", "", { "dependencies": { "defu": "^6.1.4", "mlly": "^1.7.4", "ohash": "^1.1.4", "pathe": "^1.1.2", "ufo": "^1.5.4" } }, "sha512-PU5fb40H8X149s117aB4ytbORcCvlASdtF97tfls4BPIyj4PeVxvpSuy1jAptqYHqB0vb2w2sHvzM0XWcp2OKg=="], + "unenv": ["unenv@2.0.0-rc.15", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.5.4" } }, "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA=="], "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], @@ -2833,12 +2828,16 @@ "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="], + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -2911,9 +2910,9 @@ "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], - "workerd": ["workerd@1.20250214.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250214.0", "@cloudflare/workerd-darwin-arm64": "1.20250214.0", "@cloudflare/workerd-linux-64": "1.20250214.0", "@cloudflare/workerd-linux-arm64": "1.20250214.0", "@cloudflare/workerd-windows-64": "1.20250214.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-QWcqXZLiMpV12wiaVnb3nLmfs/g4ZsFQq2mX85z546r3AX4CTIkXl0VP50W3CwqLADej3PGYiRDOTelDOwVG1g=="], + "workerd": ["workerd@1.20250409.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250409.0", "@cloudflare/workerd-darwin-arm64": "1.20250409.0", "@cloudflare/workerd-linux-64": "1.20250409.0", "@cloudflare/workerd-linux-arm64": "1.20250409.0", "@cloudflare/workerd-windows-64": "1.20250409.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-hqjX9swiHvrkOI3jlH9lrZsZRRv9lddUwcMe8Ua76jnyQz+brybWznNjHu8U5oswwcrFwvky1A4CcLjcLY31gQ=="], - "wrangler": ["wrangler@3.112.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.3.4", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@esbuild-plugins/node-modules-polyfill": "0.2.2", "blake3-wasm": "2.1.5", "esbuild": "0.17.19", "miniflare": "3.20250214.2", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.1", "workerd": "1.20250214.0" }, "optionalDependencies": { "fsevents": "~2.3.2", "sharp": "^0.33.5" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250214.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-PNQWGze3ODlWwG33LPr8kNhbht3eB3L9fogv+fapk2fjaqj0kNweRapkwmvtz46ojcqWzsxmTe4nOC0hIVUfPA=="], + "wrangler": ["wrangler@4.10.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.3.1", "blake3-wasm": "2.1.5", "esbuild": "0.24.2", "miniflare": "4.20250409.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.15", "workerd": "1.20250409.0" }, "optionalDependencies": { "fsevents": "~2.3.2", "sharp": "^0.33.5" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250409.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-fTE4hZ79msEUt8+HEjl/8Q72haCyzPLu4PgrU3L81ysmjrMEdiYfUPqnvCkBUVtJvrDNdctTEimkufT1Y0ipNg=="], "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], @@ -2945,13 +2944,13 @@ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - "youch": ["youch@3.2.3", "", { "dependencies": { "cookie": "^0.5.0", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw=="], + "youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], "zhead": ["zhead@2.2.4", "", {}, "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag=="], - "zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], "zustand": ["zustand@5.0.3", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg=="], @@ -2959,6 +2958,8 @@ "@ai-sdk/provider-utils/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + "@argos-ci/core/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "@argos-ci/core/tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], "@aws-crypto/crc32/@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], @@ -3551,14 +3552,6 @@ "@changesets/parse/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], - "@cloudflare/next-on-pages/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], - - "@cloudflare/next-on-pages/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "@cloudflare/next-on-pages/esbuild": ["esbuild@0.15.18", "", { "optionalDependencies": { "@esbuild/android-arm": "0.15.18", "@esbuild/linux-loong64": "0.15.18", "esbuild-android-64": "0.15.18", "esbuild-android-arm64": "0.15.18", "esbuild-darwin-64": "0.15.18", "esbuild-darwin-arm64": "0.15.18", "esbuild-freebsd-64": "0.15.18", "esbuild-freebsd-arm64": "0.15.18", "esbuild-linux-32": "0.15.18", "esbuild-linux-64": "0.15.18", "esbuild-linux-arm": "0.15.18", "esbuild-linux-arm64": "0.15.18", "esbuild-linux-mips64le": "0.15.18", "esbuild-linux-ppc64le": "0.15.18", "esbuild-linux-riscv64": "0.15.18", "esbuild-linux-s390x": "0.15.18", "esbuild-netbsd-64": "0.15.18", "esbuild-openbsd-64": "0.15.18", "esbuild-sunos-64": "0.15.18", "esbuild-windows-32": "0.15.18", "esbuild-windows-64": "0.15.18", "esbuild-windows-arm64": "0.15.18" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q=="], - - "@cloudflare/next-on-pages/miniflare": ["miniflare@3.20241018.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "^8.8.0", "acorn-walk": "^8.2.0", "capnp-ts": "^0.7.0", "exit-hook": "^2.2.1", "glob-to-regexp": "^0.4.1", "stoppable": "^1.1.0", "undici": "^5.28.4", "workerd": "1.20241018.1", "ws": "^8.17.1", "youch": "^3.2.2", "zod": "^3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-g7i5oGAoJOk8+hJp77A5/wAdu7PEvi5hQc+0wzwzjhUNM2I5DHd2Cc29ACPhAe1kIXvCCVkxs3+REF52qnX0aw=="], - "@codemirror/lang-html/@codemirror/autocomplete": ["@codemirror/autocomplete@6.18.1", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA=="], "@codemirror/lang-html/@codemirror/lang-css": ["@codemirror/lang-css@6.3.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.2", "@lezer/css": "^1.1.7" } }, "sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA=="], @@ -3591,6 +3584,10 @@ "@codemirror/search/@codemirror/view": ["@codemirror/view@6.34.1", "", { "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "@dotenvx/dotenvx/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -3617,10 +3614,6 @@ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - - "@jridgewell/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@lezer/css/@lezer/common": ["@lezer/common@1.2.2", "", {}, "sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw=="], "@lezer/highlight/@lezer/common": ["@lezer/common@1.2.2", "", {}, "sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw=="], @@ -3653,7 +3646,7 @@ "@node-minify/core/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - "@opennextjs/aws/esbuild": ["esbuild@0.19.2", "", { "optionalDependencies": { "@esbuild/android-arm": "0.19.2", "@esbuild/android-arm64": "0.19.2", "@esbuild/android-x64": "0.19.2", "@esbuild/darwin-arm64": "0.19.2", "@esbuild/darwin-x64": "0.19.2", "@esbuild/freebsd-arm64": "0.19.2", "@esbuild/freebsd-x64": "0.19.2", "@esbuild/linux-arm": "0.19.2", "@esbuild/linux-arm64": "0.19.2", "@esbuild/linux-ia32": "0.19.2", "@esbuild/linux-loong64": "0.19.2", "@esbuild/linux-mips64el": "0.19.2", "@esbuild/linux-ppc64": "0.19.2", "@esbuild/linux-riscv64": "0.19.2", "@esbuild/linux-s390x": "0.19.2", "@esbuild/linux-x64": "0.19.2", "@esbuild/netbsd-x64": "0.19.2", "@esbuild/openbsd-x64": "0.19.2", "@esbuild/sunos-x64": "0.19.2", "@esbuild/win32-arm64": "0.19.2", "@esbuild/win32-ia32": "0.19.2", "@esbuild/win32-x64": "0.19.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg=="], + "@opennextjs/aws/path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], "@radix-ui/react-collection/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], @@ -3667,18 +3660,102 @@ "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="], + "@radix-ui/react-dropdown-menu/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-dropdown-menu/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-dropdown-menu/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dropdown-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="], + + "@radix-ui/react-dropdown-menu/@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-id/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-menu/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-menu/@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg=="], + + "@radix-ui/react-menu/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-menu/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-menu/@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-menu/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw=="], + + "@radix-ui/react-menu/@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], + + "@radix-ui/react-menu/@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA=="], + + "@radix-ui/react-menu/@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.4", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA=="], + + "@radix-ui/react-menu/@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw=="], + + "@radix-ui/react-menu/@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], + + "@radix-ui/react-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="], + + "@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], + + "@radix-ui/react-menu/@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-menu/react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], + "@radix-ui/react-navigation-menu/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], "@radix-ui/react-navigation-menu/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + "@radix-ui/react-navigation-menu/@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + "@radix-ui/react-navigation-menu/@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], "@radix-ui/react-navigation-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="], "@radix-ui/react-popover/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-primitive": "2.0.0", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ=="], + "@radix-ui/react-popover/@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + "@radix-ui/react-popper/@radix-ui/react-context": ["@radix-ui/react-context@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A=="], + "@radix-ui/react-roving-focus/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-tooltip/@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], + + "@radix-ui/react-tooltip/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + + "@radix-ui/react-tooltip/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="], + + "@radix-ui/react-tooltip/@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + + "@radix-ui/react-tooltip/@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA=="], + + "@radix-ui/react-tooltip/@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="], + + "@radix-ui/react-tooltip/@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], + + "@radix-ui/react-tooltip/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="], + + "@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], + + "@radix-ui/react-tooltip/@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q=="], + + "@radix-ui/react-use-effect-event/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + "@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="], "@react-aria/focus/clsx": ["clsx@2.0.0", "", {}, "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q=="], @@ -3687,14 +3764,44 @@ "@rollup/pluginutils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "@scalar/api-client/@scalar/oas-utils": ["@scalar/oas-utils@0.4.7", "", { "dependencies": { "@hyperjump/browser": "^1.1.0", "@hyperjump/json-schema": "^1.9.6", "@scalar/helpers": "0.0.4", "@scalar/object-utils": "1.2.1", "@scalar/openapi-types": "0.3.3", "@scalar/themes": "0.13.4", "@scalar/types": "0.2.3", "@types/har-format": "^1.2.15", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "yaml": "^2.4.5", "zod": "3.24.1" } }, "sha512-Vp8iZZCjNKXcPpL0Yr6dmy+VOSN1LZ5CdlGAHtp+pxuQTeahV6FxiVjMc9kdFve77fTNyut4seVAD6d7rDUDcA=="], + + "@scalar/api-client/@scalar/object-utils": ["@scalar/object-utils@1.2.1", "", { "dependencies": { "flatted": "^3.3.1", "just-clone": "^6.2.0", "ts-deepmerge": "^7.0.1", "type-fest": "^4.20.0" } }, "sha512-2P/0In6XSrV1Ye8yU3LyOWJKWkzXpxf0thHmTfJriqGBZz41s06td2KKqoqHSEEi+FAsl3O1ngmOOzLM3QUkkw=="], + + "@scalar/api-client/@scalar/openapi-parser": ["@scalar/openapi-parser@0.18.0", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-qAWEfJR5f/LwSFULFeSkD56LHgU9ovyj+e1uqy9XaW9Hb9P0ewIGKi+Gd4wTyxfFkdPLXTFYXApjviP6jV+new=="], + + "@scalar/api-client/@scalar/openapi-types": ["@scalar/openapi-types@0.3.3", "", { "dependencies": { "zod": "3.24.1" } }, "sha512-mr3OvbCyvuzSDgv9gR9D3pJAsl82BRNBp1P8ldgRgKF4Wiswfa7nQeKibpX0kHSGXLgiyvxWJULUFwgdWMXNNA=="], + + "@scalar/api-client/@scalar/themes": ["@scalar/themes@0.13.4", "", { "dependencies": { "@scalar/types": "0.2.3", "nanoid": "^5.1.5" } }, "sha512-PMiSqX+MZF29u32ogEjTVA5c/LBd5cE/QPF7lK0EJeemXRy2r/nWbvrXtqD9Y7Sw54g1caVNjK8yJcCYJdB6hw=="], + "@scalar/api-client/pretty-ms": ["pretty-ms@8.0.0", "", { "dependencies": { "parse-ms": "^3.0.0" } }, "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q=="], - "@scalar/code-highlight/remark-gfm": ["remark-gfm@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA=="], + "@scalar/api-client/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@scalar/components/@scalar/oas-utils": ["@scalar/oas-utils@0.4.7", "", { "dependencies": { "@hyperjump/browser": "^1.1.0", "@hyperjump/json-schema": "^1.9.6", "@scalar/helpers": "0.0.4", "@scalar/object-utils": "1.2.1", "@scalar/openapi-types": "0.3.3", "@scalar/themes": "0.13.4", "@scalar/types": "0.2.3", "@types/har-format": "^1.2.15", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "yaml": "^2.4.5", "zod": "3.24.1" } }, "sha512-Vp8iZZCjNKXcPpL0Yr6dmy+VOSN1LZ5CdlGAHtp+pxuQTeahV6FxiVjMc9kdFve77fTNyut4seVAD6d7rDUDcA=="], + + "@scalar/components/@scalar/themes": ["@scalar/themes@0.13.4", "", { "dependencies": { "@scalar/types": "0.2.3", "nanoid": "^5.1.5" } }, "sha512-PMiSqX+MZF29u32ogEjTVA5c/LBd5cE/QPF7lK0EJeemXRy2r/nWbvrXtqD9Y7Sw54g1caVNjK8yJcCYJdB6hw=="], + + "@scalar/import/@scalar/openapi-parser": ["@scalar/openapi-parser@0.18.0", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-qAWEfJR5f/LwSFULFeSkD56LHgU9ovyj+e1uqy9XaW9Hb9P0ewIGKi+Gd4wTyxfFkdPLXTFYXApjviP6jV+new=="], + + "@scalar/oas-utils/@scalar/openapi-types": ["@scalar/openapi-types@0.2.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-waiKk12cRCqyUCWTOX0K1WEVX46+hVUK+zRPzAahDJ7G0TApvbNkuy5wx7aoUyEk++HHde0XuQnshXnt8jsddA=="], - "@scalar/oas-utils/flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], + "@scalar/oas-utils/@scalar/types": ["@scalar/types@0.1.7", "", { "dependencies": { "@scalar/openapi-types": "0.2.0", "@unhead/schema": "^1.11.11", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "zod": "^3.23.8" } }, "sha512-irIDYzTQG2KLvFbuTI8k2Pz/R4JR+zUUSykVTbEMatkzMmVFnn1VzNSMlODbadycwZunbnL2tA27AXed9URVjw=="], "@scalar/object-utils/flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], + "@scalar/postman-to-openapi/@scalar/oas-utils": ["@scalar/oas-utils@0.4.7", "", { "dependencies": { "@hyperjump/browser": "^1.1.0", "@hyperjump/json-schema": "^1.9.6", "@scalar/helpers": "0.0.4", "@scalar/object-utils": "1.2.1", "@scalar/openapi-types": "0.3.3", "@scalar/themes": "0.13.4", "@scalar/types": "0.2.3", "@types/har-format": "^1.2.15", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "yaml": "^2.4.5", "zod": "3.24.1" } }, "sha512-Vp8iZZCjNKXcPpL0Yr6dmy+VOSN1LZ5CdlGAHtp+pxuQTeahV6FxiVjMc9kdFve77fTNyut4seVAD6d7rDUDcA=="], + + "@scalar/postman-to-openapi/@scalar/openapi-types": ["@scalar/openapi-types@0.3.3", "", { "dependencies": { "zod": "3.24.1" } }, "sha512-mr3OvbCyvuzSDgv9gR9D3pJAsl82BRNBp1P8ldgRgKF4Wiswfa7nQeKibpX0kHSGXLgiyvxWJULUFwgdWMXNNA=="], + + "@scalar/themes/@scalar/types": ["@scalar/types@0.1.7", "", { "dependencies": { "@scalar/openapi-types": "0.2.0", "@unhead/schema": "^1.11.11", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "zod": "^3.23.8" } }, "sha512-irIDYzTQG2KLvFbuTI8k2Pz/R4JR+zUUSykVTbEMatkzMmVFnn1VzNSMlODbadycwZunbnL2tA27AXed9URVjw=="], + + "@scalar/types/@scalar/openapi-types": ["@scalar/openapi-types@0.3.3", "", { "dependencies": { "zod": "3.24.1" } }, "sha512-mr3OvbCyvuzSDgv9gR9D3pJAsl82BRNBp1P8ldgRgKF4Wiswfa7nQeKibpX0kHSGXLgiyvxWJULUFwgdWMXNNA=="], + + "@scalar/types/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@scalar/use-hooks/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + "@shikijs/core/hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], "@smithy/abort-controller/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -3871,8 +3978,14 @@ "@ts-morph/common/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + "@types/jsonwebtoken/@types/node": ["@types/node@20.16.11", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw=="], + "@types/react-dom/@types/react": ["@types/react@18.3.11", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ=="], + "@types/swagger2openapi/@types/node": ["@types/node@20.16.11", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw=="], + + "@types/ws/@types/node": ["@types/node@20.16.11", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw=="], + "@vercel/fun/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], "@vercel/fun/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], @@ -3881,12 +3994,8 @@ "@vercel/fun/semver": ["semver@7.5.4", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="], - "@vercel/gatsby-plugin-vercel-builder/esbuild": ["esbuild@0.14.47", "", { "optionalDependencies": { "esbuild-android-64": "0.14.47", "esbuild-android-arm64": "0.14.47", "esbuild-darwin-64": "0.14.47", "esbuild-darwin-arm64": "0.14.47", "esbuild-freebsd-64": "0.14.47", "esbuild-freebsd-arm64": "0.14.47", "esbuild-linux-32": "0.14.47", "esbuild-linux-64": "0.14.47", "esbuild-linux-arm": "0.14.47", "esbuild-linux-arm64": "0.14.47", "esbuild-linux-mips64le": "0.14.47", "esbuild-linux-ppc64le": "0.14.47", "esbuild-linux-riscv64": "0.14.47", "esbuild-linux-s390x": "0.14.47", "esbuild-netbsd-64": "0.14.47", "esbuild-openbsd-64": "0.14.47", "esbuild-sunos-64": "0.14.47", "esbuild-windows-32": "0.14.47", "esbuild-windows-64": "0.14.47", "esbuild-windows-arm64": "0.14.47" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA=="], - "@vercel/gatsby-plugin-vercel-builder/fs-extra": ["fs-extra@11.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw=="], - "@vercel/nft/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - "@vercel/nft/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "@vercel/nft/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], @@ -3895,12 +4004,8 @@ "@vercel/node/async-listen": ["async-listen@3.0.0", "", {}, "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg=="], - "@vercel/node/esbuild": ["esbuild@0.14.47", "", { "optionalDependencies": { "esbuild-android-64": "0.14.47", "esbuild-android-arm64": "0.14.47", "esbuild-darwin-64": "0.14.47", "esbuild-darwin-arm64": "0.14.47", "esbuild-freebsd-64": "0.14.47", "esbuild-freebsd-arm64": "0.14.47", "esbuild-linux-32": "0.14.47", "esbuild-linux-64": "0.14.47", "esbuild-linux-arm": "0.14.47", "esbuild-linux-arm64": "0.14.47", "esbuild-linux-mips64le": "0.14.47", "esbuild-linux-ppc64le": "0.14.47", "esbuild-linux-riscv64": "0.14.47", "esbuild-linux-s390x": "0.14.47", "esbuild-netbsd-64": "0.14.47", "esbuild-openbsd-64": "0.14.47", "esbuild-sunos-64": "0.14.47", "esbuild-windows-32": "0.14.47", "esbuild-windows-64": "0.14.47", "esbuild-windows-arm64": "0.14.47" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA=="], - "@vercel/node/node-fetch": ["node-fetch@2.6.9", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg=="], - "@vercel/node/path-to-regexp": ["path-to-regexp@6.2.1", "", {}, "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="], - "@vercel/node/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="], "@vercel/redwood/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -3911,12 +4016,16 @@ "@vercel/static-config/ajv": ["ajv@8.6.3", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw=="], + "@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "@vue/compiler-sfc/postcss": ["postcss@8.4.47", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", "source-map-js": "^1.2.1" } }, "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ=="], "@vueuse/integrations/@vueuse/core": ["@vueuse/core@11.2.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.20", "@vueuse/metadata": "11.2.0", "@vueuse/shared": "11.2.0", "vue-demi": ">=0.14.10" } }, "sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA=="], "@vueuse/integrations/@vueuse/shared": ["@vueuse/shared@11.2.0", "", { "dependencies": { "vue-demi": ">=0.14.10" } }, "sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg=="], + "acorn-walk/acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], "body-parser/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], @@ -3943,8 +4052,6 @@ "cacheable-request/lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "capnp-ts/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "codemirror/@codemirror/autocomplete": ["@codemirror/autocomplete@6.18.1", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA=="], "codemirror/@codemirror/commands": ["@codemirror/commands@6.7.0", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-+cduIZ2KbesDhbykV02K25A5xIVrquSPz4UxxYBemRlAT2aW8dhwUgLDwej7q/RJUHKk4nALYcR1puecDvbdqw=="], @@ -3961,6 +4068,8 @@ "decamelize-keys/map-obj": ["map-obj@1.0.1", "", {}, "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="], + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "edge-runtime/async-listen": ["async-listen@3.0.1", "", {}, "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA=="], "edge-runtime/picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], @@ -3971,8 +4080,6 @@ "end-of-stream/once": ["once@1.3.3", "", { "dependencies": { "wrappy": "1" } }, "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w=="], - "env-cmd/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -3995,8 +4102,6 @@ "gaxios/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - "gitbook-v2/next": ["next@15.2.3", "", { "dependencies": { "@next/env": "15.2.3", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.2.3", "@next/swc-darwin-x64": "15.2.3", "@next/swc-linux-arm64-gnu": "15.2.3", "@next/swc-linux-arm64-musl": "15.2.3", "@next/swc-linux-x64-gnu": "15.2.3", "@next/swc-linux-x64-musl": "15.2.3", "@next/swc-win32-arm64-msvc": "15.2.3", "@next/swc-win32-x64-msvc": "15.2.3", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w=="], - "global-dirs/ini": ["ini@1.3.7", "", {}, "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="], "global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], @@ -4009,6 +4114,8 @@ "google-auth-library/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "google-font-metadata/picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "googleapis-common/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], "got/get-stream": ["get-stream@4.1.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="], @@ -4033,16 +4140,20 @@ "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - - "mdast-util-gfm/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "mdast-util-gfm-footnote/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], "mdast-util-gfm-footnote/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "mdast-util-gfm-strikethrough/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], + "mdast-util-gfm-strikethrough/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "mdast-util-gfm-table/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], + "mdast-util-gfm-table/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "mdast-util-gfm-task-list-item/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], + "mdast-util-gfm-task-list-item/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], "meow/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], @@ -4053,7 +4164,7 @@ "micromark/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + "miniflare/acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], "miniflare/undici": ["undici@5.28.5", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA=="], @@ -4065,30 +4176,20 @@ "minizlib/minipass": ["minipass@2.9.0", "", { "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="], - "mlly/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - - "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "next/@swc/helpers": ["@swc/helpers@0.5.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A=="], - "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], - "onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], "package-json/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "parse5/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "path-match/path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], "path-scurry/lru-cache": ["lru-cache@11.0.2", "", {}, "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA=="], - "pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - "postcss/nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], "postcss/picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -4121,15 +4222,15 @@ "read-yaml-file/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - "remark-stringify/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "remark-gfm/mdast-util-gfm": ["mdast-util-gfm@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw=="], - "rimraf/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + "remark-parse/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], - "rollup-plugin-inject/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], + "remark-stringify/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], - "rollup-plugin-inject/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], + "rimraf/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], + "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "router/is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -4143,6 +4244,8 @@ "send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "sharp/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], "spawndamnit/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -4153,8 +4256,6 @@ "stylelint/picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - "sucrase/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -4169,24 +4270,70 @@ "terminal-link/supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], - "terser/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "ts-node/acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + "ts-node/acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], "ts-node/arg": ["arg@4.1.0", "", {}, "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg=="], + "unenv/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "update-notifier/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], "url-parse-lax/prepend-http": ["prepend-http@2.0.0", "", {}, "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="], + "wrangler/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "wrangler/path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "wrangler/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "youch/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "@argos-ci/core/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@argos-ci/core/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@argos-ci/core/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@argos-ci/core/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@argos-ci/core/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@argos-ci/core/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "@argos-ci/core/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@argos-ci/core/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@argos-ci/core/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@argos-ci/core/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "@argos-ci/core/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "@argos-ci/core/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "@aws-crypto/crc32/@aws-sdk/types/@smithy/types": ["@smithy/types@4.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw=="], "@aws-crypto/crc32c/@aws-sdk/types/@smithy/types": ["@smithy/types@4.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw=="], @@ -4609,20 +4756,6 @@ "@changesets/parse/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "@cloudflare/next-on-pages/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@cloudflare/next-on-pages/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "@cloudflare/next-on-pages/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.15.18", "", { "os": "android", "cpu": "arm" }, "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw=="], - - "@cloudflare/next-on-pages/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.15.18", "", { "os": "linux", "cpu": "none" }, "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ=="], - - "@cloudflare/next-on-pages/miniflare/acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], - - "@cloudflare/next-on-pages/miniflare/workerd": ["workerd@1.20241018.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20241018.1", "@cloudflare/workerd-darwin-arm64": "1.20241018.1", "@cloudflare/workerd-linux-64": "1.20241018.1", "@cloudflare/workerd-linux-arm64": "1.20241018.1", "@cloudflare/workerd-windows-64": "1.20241018.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-JPW2oAbYOnJj1c5boyDOdjl/Yvur45jhVE8lf+I9oxR6myyAvuH2tdXO62kye68jRluJOMUeyssLes+JRwLmaA=="], - - "@cloudflare/next-on-pages/miniflare/youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], - "@codemirror/lang-json/@codemirror/language/@codemirror/view": ["@codemirror/view@6.34.1", "", { "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ=="], "@codemirror/lang-json/@codemirror/language/@lezer/common": ["@lezer/common@1.2.2", "", {}, "sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw=="], @@ -4653,57 +4786,67 @@ "@node-minify/core/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "@opennextjs/aws/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.2", "", { "os": "android", "cpu": "arm" }, "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q=="], + "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], - "@opennextjs/aws/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.2", "", { "os": "android", "cpu": "arm64" }, "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw=="], + "@radix-ui/react-dropdown-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], - "@opennextjs/aws/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.2", "", { "os": "android", "cpu": "x64" }, "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w=="], + "@radix-ui/react-dropdown-menu/@radix-ui/react-use-controllable-state/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@opennextjs/aws/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA=="], + "@radix-ui/react-menu/@radix-ui/react-dismissable-layer/@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], - "@opennextjs/aws/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw=="], + "@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw=="], - "@opennextjs/aws/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ=="], + "@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@opennextjs/aws/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw=="], + "@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], - "@opennextjs/aws/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.2", "", { "os": "linux", "cpu": "arm" }, "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg=="], + "@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], - "@opennextjs/aws/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg=="], + "@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - "@opennextjs/aws/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ=="], + "@radix-ui/react-menu/@radix-ui/react-portal/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@opennextjs/aws/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.2", "", { "os": "linux", "cpu": "none" }, "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw=="], + "@radix-ui/react-menu/@radix-ui/react-presence/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@opennextjs/aws/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.2", "", { "os": "linux", "cpu": "none" }, "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg=="], + "@radix-ui/react-menu/react-remove-scroll/react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - "@opennextjs/aws/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw=="], + "@radix-ui/react-menu/react-remove-scroll/react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - "@opennextjs/aws/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.2", "", { "os": "linux", "cpu": "none" }, "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw=="], + "@radix-ui/react-menu/react-remove-scroll/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@opennextjs/aws/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g=="], + "@radix-ui/react-menu/react-remove-scroll/use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], - "@opennextjs/aws/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.2", "", { "os": "linux", "cpu": "x64" }, "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ=="], + "@radix-ui/react-menu/react-remove-scroll/use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - "@opennextjs/aws/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.2", "", { "os": "none", "cpu": "x64" }, "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ=="], + "@radix-ui/react-navigation-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], - "@opennextjs/aws/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw=="], + "@radix-ui/react-roving-focus/@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], - "@opennextjs/aws/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw=="], + "@radix-ui/react-roving-focus/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], - "@opennextjs/aws/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg=="], + "@radix-ui/react-roving-focus/@radix-ui/react-use-controllable-state/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@opennextjs/aws/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA=="], + "@radix-ui/react-tooltip/@radix-ui/react-popper/@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg=="], - "@opennextjs/aws/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.2", "", { "os": "win32", "cpu": "x64" }, "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw=="], + "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], - "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], + "@scalar/api-client/pretty-ms/parse-ms": ["parse-ms@3.0.0", "", {}, "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw=="], - "@radix-ui/react-navigation-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], + "@scalar/components/@scalar/oas-utils/@scalar/object-utils": ["@scalar/object-utils@1.2.1", "", { "dependencies": { "flatted": "^3.3.1", "just-clone": "^6.2.0", "ts-deepmerge": "^7.0.1", "type-fest": "^4.20.0" } }, "sha512-2P/0In6XSrV1Ye8yU3LyOWJKWkzXpxf0thHmTfJriqGBZz41s06td2KKqoqHSEEi+FAsl3O1ngmOOzLM3QUkkw=="], - "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="], + "@scalar/components/@scalar/oas-utils/@scalar/openapi-types": ["@scalar/openapi-types@0.3.3", "", { "dependencies": { "zod": "3.24.1" } }, "sha512-mr3OvbCyvuzSDgv9gR9D3pJAsl82BRNBp1P8ldgRgKF4Wiswfa7nQeKibpX0kHSGXLgiyvxWJULUFwgdWMXNNA=="], - "@scalar/api-client/pretty-ms/parse-ms": ["parse-ms@3.0.0", "", {}, "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw=="], + "@scalar/components/@scalar/oas-utils/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@scalar/postman-to-openapi/@scalar/oas-utils/@scalar/object-utils": ["@scalar/object-utils@1.2.1", "", { "dependencies": { "flatted": "^3.3.1", "just-clone": "^6.2.0", "ts-deepmerge": "^7.0.1", "type-fest": "^4.20.0" } }, "sha512-2P/0In6XSrV1Ye8yU3LyOWJKWkzXpxf0thHmTfJriqGBZz41s06td2KKqoqHSEEi+FAsl3O1ngmOOzLM3QUkkw=="], + + "@scalar/postman-to-openapi/@scalar/oas-utils/@scalar/themes": ["@scalar/themes@0.13.4", "", { "dependencies": { "@scalar/types": "0.2.3", "nanoid": "^5.1.5" } }, "sha512-PMiSqX+MZF29u32ogEjTVA5c/LBd5cE/QPF7lK0EJeemXRy2r/nWbvrXtqD9Y7Sw54g1caVNjK8yJcCYJdB6hw=="], + + "@scalar/postman-to-openapi/@scalar/oas-utils/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@scalar/postman-to-openapi/@scalar/openapi-types/zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + + "@scalar/themes/@scalar/types/@scalar/openapi-types": ["@scalar/openapi-types@0.2.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-waiKk12cRCqyUCWTOX0K1WEVX46+hVUK+zRPzAahDJ7G0TApvbNkuy5wx7aoUyEk++HHde0XuQnshXnt8jsddA=="], "@shikijs/core/hast-util-to-html/property-information": ["property-information@7.0.0", "", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], @@ -4735,47 +4878,13 @@ "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - "@vercel/fun/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-android-64": ["esbuild-android-64@0.14.47", "", { "os": "android", "cpu": "x64" }, "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-android-arm64": ["esbuild-android-arm64@0.14.47", "", { "os": "android", "cpu": "arm64" }, "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-darwin-64": ["esbuild-darwin-64@0.14.47", "", { "os": "darwin", "cpu": "x64" }, "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.14.47", "", { "os": "darwin", "cpu": "arm64" }, "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-freebsd-64": ["esbuild-freebsd-64@0.14.47", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.14.47", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-32": ["esbuild-linux-32@0.14.47", "", { "os": "linux", "cpu": "ia32" }, "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-64": ["esbuild-linux-64@0.14.47", "", { "os": "linux", "cpu": "x64" }, "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-arm": ["esbuild-linux-arm@0.14.47", "", { "os": "linux", "cpu": "arm" }, "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-arm64": ["esbuild-linux-arm64@0.14.47", "", { "os": "linux", "cpu": "arm64" }, "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.14.47", "", { "os": "linux", "cpu": "none" }, "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.14.47", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.14.47", "", { "os": "linux", "cpu": "none" }, "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-linux-s390x": ["esbuild-linux-s390x@0.14.47", "", { "os": "linux", "cpu": "s390x" }, "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-netbsd-64": ["esbuild-netbsd-64@0.14.47", "", { "os": "none", "cpu": "x64" }, "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-openbsd-64": ["esbuild-openbsd-64@0.14.47", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw=="], + "@types/jsonwebtoken/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-sunos-64": ["esbuild-sunos-64@0.14.47", "", { "os": "sunos", "cpu": "x64" }, "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ=="], + "@types/swagger2openapi/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-windows-32": ["esbuild-windows-32@0.14.47", "", { "os": "win32", "cpu": "ia32" }, "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ=="], + "@types/ws/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-windows-64": ["esbuild-windows-64@0.14.47", "", { "os": "win32", "cpu": "x64" }, "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ=="], - - "@vercel/gatsby-plugin-vercel-builder/esbuild/esbuild-windows-arm64": ["esbuild-windows-arm64@0.14.47", "", { "os": "win32", "cpu": "arm64" }, "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ=="], + "@vercel/fun/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], "@vercel/gatsby-plugin-vercel-builder/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], @@ -4785,46 +4894,6 @@ "@vercel/nft/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "@vercel/node/esbuild/esbuild-android-64": ["esbuild-android-64@0.14.47", "", { "os": "android", "cpu": "x64" }, "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g=="], - - "@vercel/node/esbuild/esbuild-android-arm64": ["esbuild-android-arm64@0.14.47", "", { "os": "android", "cpu": "arm64" }, "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ=="], - - "@vercel/node/esbuild/esbuild-darwin-64": ["esbuild-darwin-64@0.14.47", "", { "os": "darwin", "cpu": "x64" }, "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA=="], - - "@vercel/node/esbuild/esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.14.47", "", { "os": "darwin", "cpu": "arm64" }, "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw=="], - - "@vercel/node/esbuild/esbuild-freebsd-64": ["esbuild-freebsd-64@0.14.47", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ=="], - - "@vercel/node/esbuild/esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.14.47", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ=="], - - "@vercel/node/esbuild/esbuild-linux-32": ["esbuild-linux-32@0.14.47", "", { "os": "linux", "cpu": "ia32" }, "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw=="], - - "@vercel/node/esbuild/esbuild-linux-64": ["esbuild-linux-64@0.14.47", "", { "os": "linux", "cpu": "x64" }, "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw=="], - - "@vercel/node/esbuild/esbuild-linux-arm": ["esbuild-linux-arm@0.14.47", "", { "os": "linux", "cpu": "arm" }, "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA=="], - - "@vercel/node/esbuild/esbuild-linux-arm64": ["esbuild-linux-arm64@0.14.47", "", { "os": "linux", "cpu": "arm64" }, "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw=="], - - "@vercel/node/esbuild/esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.14.47", "", { "os": "linux", "cpu": "none" }, "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg=="], - - "@vercel/node/esbuild/esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.14.47", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w=="], - - "@vercel/node/esbuild/esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.14.47", "", { "os": "linux", "cpu": "none" }, "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g=="], - - "@vercel/node/esbuild/esbuild-linux-s390x": ["esbuild-linux-s390x@0.14.47", "", { "os": "linux", "cpu": "s390x" }, "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw=="], - - "@vercel/node/esbuild/esbuild-netbsd-64": ["esbuild-netbsd-64@0.14.47", "", { "os": "none", "cpu": "x64" }, "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ=="], - - "@vercel/node/esbuild/esbuild-openbsd-64": ["esbuild-openbsd-64@0.14.47", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw=="], - - "@vercel/node/esbuild/esbuild-sunos-64": ["esbuild-sunos-64@0.14.47", "", { "os": "sunos", "cpu": "x64" }, "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ=="], - - "@vercel/node/esbuild/esbuild-windows-32": ["esbuild-windows-32@0.14.47", "", { "os": "win32", "cpu": "ia32" }, "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ=="], - - "@vercel/node/esbuild/esbuild-windows-64": ["esbuild-windows-64@0.14.47", "", { "os": "win32", "cpu": "x64" }, "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ=="], - - "@vercel/node/esbuild/esbuild-windows-arm64": ["esbuild-windows-arm64@0.14.47", "", { "os": "win32", "cpu": "arm64" }, "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ=="], - "@vercel/routing-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@vue/compiler-sfc/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], @@ -4863,28 +4932,6 @@ "gaxios/https-proxy-agent/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "gitbook-v2/next/@next/env": ["@next/env@15.2.3", "", {}, "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw=="], - - "gitbook-v2/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.2.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw=="], - - "gitbook-v2/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.2.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw=="], - - "gitbook-v2/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.2.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ=="], - - "gitbook-v2/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.2.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q=="], - - "gitbook-v2/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.2.3", "", { "os": "linux", "cpu": "x64" }, "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w=="], - - "gitbook-v2/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.2.3", "", { "os": "linux", "cpu": "x64" }, "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg=="], - - "gitbook-v2/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.2.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q=="], - - "gitbook-v2/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.3", "", { "os": "win32", "cpu": "x64" }, "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w=="], - - "gitbook-v2/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - - "gitbook-v2/next/styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "globby/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "google-auth-library/jws/jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="], @@ -4905,6 +4952,10 @@ "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "remark-gfm/mdast-util-gfm/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "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" } }, "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA=="], + + "remark-gfm/mdast-util-gfm/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="], + "rimraf/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], "rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -4921,6 +4972,8 @@ "sucrase/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "tailwindcss/chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -4929,10 +4982,50 @@ "tailwindcss/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + "wrangler/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "wrangler/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "wrangler/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "wrangler/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "wrangler/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "wrangler/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "wrangler/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "wrangler/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "wrangler/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "wrangler/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "wrangler/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "wrangler/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "wrangler/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "wrangler/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "wrangler/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "wrangler/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "wrangler/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "wrangler/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "wrangler/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@argos-ci/core/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], + "@aws-sdk/client-dynamodb/@aws-crypto/sha256-js/@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], "@aws-sdk/client-dynamodb/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.734.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.734.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", "@aws-sdk/middleware-user-agent": "3.734.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.734.0", "@aws-sdk/util-user-agent-browser": "3.734.0", "@aws-sdk/util-user-agent-node": "3.734.0", "@smithy/config-resolver": "^4.0.1", "@smithy/core": "^3.1.1", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", "@smithy/middleware-endpoint": "^4.0.2", "@smithy/middleware-retry": "^4.0.3", "@smithy/middleware-serde": "^4.0.1", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", "@smithy/smithy-client": "^4.1.2", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.3", "@smithy/util-defaults-mode-node": "^4.0.3", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg=="], @@ -5067,18 +5160,6 @@ "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "@cloudflare/next-on-pages/miniflare/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20241018.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-CRySEzjNRoR8frP5AbtJXd1tgVJa5v7bZon9Dh6nljYlhG+piDv8jvOVEUqF3cXXS+M5aXwr4NlozdMvl5g5mg=="], - - "@cloudflare/next-on-pages/miniflare/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20241018.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y63yWJNTgETDFkY3Ony71/k/G1HRDFIhEzwbT+OWmg1Qbsqa4TquHPVFkgv+OJhpmD3HV9gTBcn/M2QJ/+pGmg=="], - - "@cloudflare/next-on-pages/miniflare/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20241018.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a2AbSAXNMMiREvN+PwjHdJ5zOzI4+qf8+rb6H/y4HcVbPZN5C2fanxv5Bx7NUHLiMD/W0FrGug1aU+RPUVZC9Q=="], - - "@cloudflare/next-on-pages/miniflare/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20241018.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-iCJ7bjD/+zhlp3IWnkiry180DwdNvak/sVoS98pIAS41aR3gJVzE5BCz/2yTWFdCoUVZ5yKJrv1HhSKgQRBIEw=="], - - "@cloudflare/next-on-pages/miniflare/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20241018.1", "", { "os": "win32", "cpu": "x64" }, "sha512-qwDVh/KrwEPY82h6tZ1O4BXBAKeGy30BeTr9wvTUVeY9eX/KT73GuEG+ttwiashRfqjOa0Gcqjsfpd913ITFyg=="], - - "@cloudflare/next-on-pages/miniflare/youch/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "@node-minify/core/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "@node-minify/core/glob/path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], @@ -5097,12 +5178,14 @@ "body-parser/type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "gitbook-v2/next/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], - "rimraf/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "sucrase/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "wrangler/sharp/@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], + + "@argos-ci/core/sharp/@img/sharp-wasm32/@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@aws-sdk/core/@smithy/smithy-client/@smithy/middleware-endpoint/@smithy/url-parser/@smithy/querystring-parser": ["@smithy/querystring-parser@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" } }, "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw=="], "@aws-sdk/core/@smithy/smithy-client/@smithy/util-stream/@smithy/fetch-http-handler/@smithy/querystring-builder": ["@smithy/querystring-builder@4.0.1", "", { "dependencies": { "@smithy/types": "^4.1.0", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg=="], @@ -5141,6 +5224,8 @@ "@vercel/nft/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "wrangler/sharp/@img/sharp-wasm32/@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@aws-sdk/core/@smithy/smithy-client/@smithy/util-stream/@smithy/fetch-http-handler/@smithy/querystring-builder/@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg=="], "@aws-sdk/core/@smithy/smithy-client/@smithy/util-stream/@smithy/node-http-handler/@smithy/querystring-builder/@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg=="], diff --git a/package.json b/package.json index b4d134bad0..e98bb9a832 100644 --- a/package.json +++ b/package.json @@ -4,22 +4,20 @@ "devDependencies": { "@biomejs/biome": "^1.9.4", "@changesets/cli": "^2.27.12", - "turbo": "^2.4.4", + "turbo": "^2.5.0", "vercel": "^39.3.0" }, - "packageManager": "bun@1.2.5", + "packageManager": "bun@1.2.15", "overrides": { "@codemirror/state": "6.4.1", - "react": "18.3.1", - "react-dom": "18.3.1", - "@gitbook/api": "0.106.0" + "react": "^19.0.0", + "react-dom": "^19.0.0", + "esbuild": "0.24.2" }, "private": true, "scripts": { "dev": "turbo run dev", - "dev:v2": "turbo run dev:v2", "build": "turbo run build", - "build:v2": "turbo run build:v2", "clean-deps": "rm -rf node_modules && rm -rf packages/*/node_modules", "typecheck": "turbo run typecheck", "format": "biome check --write ./", @@ -30,11 +28,15 @@ "changeset": "changeset", "changeset-version": "changeset version && bun run format", "release": "turbo run release && changeset publish", - "release:preview": "turbo run release:preview", "download:env": "op read op://gitbook-x-dev/gitbook-open/.env.local >> .env.local", "clean": "turbo run clean" }, - "workspaces": ["packages/*"], + "workspaces": { + "packages": ["packages/*"], + "catalog": { + "@gitbook/api": "^0.128.0" + } + }, "patchedDependencies": { "decode-named-character-reference@1.0.2": "patches/decode-named-character-reference@1.0.2.patch", "@vercel/next@4.4.2": "patches/@vercel%2Fnext@4.4.2.patch" diff --git a/packages/cache-do/.gitignore b/packages/cache-do/.gitignore deleted file mode 100644 index 9b16495b99..0000000000 --- a/packages/cache-do/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.wrangler -worker-configuration.d.ts -dist/ diff --git a/packages/cache-do/CHANGELOG.md b/packages/cache-do/CHANGELOG.md deleted file mode 100644 index 230e8aff43..0000000000 --- a/packages/cache-do/CHANGELOG.md +++ /dev/null @@ -1,18 +0,0 @@ -# @gitbook/cache-do - -## 0.1.1 - -### Patch Changes - -- b7a5106: Disable cloudflare observability in production - -## 0.1.0 - -### Minor Changes - -- 9b8d519: Experiment with optimizing billable duration in Cloudflare by using multiple RPC sessions instead of one -- 636b868: First version of a new cache backend powered by Cloudflare Durable Objects - -### Patch Changes - -- 56f5fa1: Enable Workers observability with a sampling of 0.1 diff --git a/packages/cache-do/README.md b/packages/cache-do/README.md deleted file mode 100644 index 7a479a82db..0000000000 --- a/packages/cache-do/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# `@gitbook/cache-do` - -Cache backend, powered by Cloudflare Durable Objects. The cache is optimized for GitBook use-cases. - -### Performances - -The cache backend is optimized for performances by being distributed and accessible close to the worker locations that are reading it. - -### Geo-distribution - -To achieve a good balance between **performances** and **consistency**, cache objects are distributed over 7 locations, representing continents. - -It makes it possible to purge all 7 locations in one go and achieve fast consistency. - -### Concepts - -**Cache tag**: unique tag in the cache environment. A cache tag groups multiple keys that should be purged together in one operation. -Cache tags should not contain a large set of unique keys. Exceeding thousands could lead to performances or reliability issues. - -**Cache key**: unique key in the cache environment. Each key should be assigned to a `tag`. - -**Location**: cache is distributed over 7 unique locations, one for each continent. diff --git a/packages/cache-do/package.json b/packages/cache-do/package.json deleted file mode 100644 index d41203a0b0..0000000000 --- a/packages/cache-do/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@gitbook/cache-do", - "type": "module", - "private": true, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "development": "./src/index.ts", - "default": "./dist/index.js" - }, - "./api": { - "types": "./dist/api.d.ts", - "development": "./src/api.ts", - "default": "./dist/api.js" - } - }, - "version": "0.1.1", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "lru_map": "^0.4.1" - }, - "devDependencies": { - "typescript": "^5.5.3", - "wrangler": "^3.112.0" - }, - "scripts": { - "generate": "wrangler types --experimental-include-runtime", - "build": "tsc", - "typecheck": "tsc --noEmit", - "dev": "tsc -w", - "release": "wrangler deploy", - "release:preview": "wrangler deploy && wrangler deploy --env preview" - }, - "files": ["dist", "src", "bin", "data", "README.md", "CHANGELOG.md"] -} diff --git a/packages/cache-do/src/CacheObject.ts b/packages/cache-do/src/CacheObject.ts deleted file mode 100644 index 817e1232b5..0000000000 --- a/packages/cache-do/src/CacheObject.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { DurableObject } from 'cloudflare:workers'; -import { decode, encode } from '@msgpack/msgpack'; -import { LRUMap } from 'lru_map'; - -export interface CacheObjectDescriptor { - get: (key: string) => Promise; - set: (key: string, value: Value, expiresAt: number) => Promise; -} - -/** - * Value stored in a chunked binary msgpack format. - * Stored under the key `prop.${key}.${index}`. - */ -interface CacheObjectProp { - value: Value; - expiresAt: number; -} - -/** - * Expiration clock stored under the key `exp.${expiresAt}.${key}`. - */ -interface CacheObjectExp { - /** Key of the property */ - k: string; - /** Number of chunks */ - c: number; -} - -/** - * Durable Object class being deployed as a distributed cache. - */ -export class CacheObject extends DurableObject { - private lru = new LRUMap(500); - - /** - * Open a descriptor to access the cache object. - * The goal is to minimize the amount of RPC sessions between the client and the cache object. - * One session is opened per request on the client side and used to perform multiple operations. - * https://developers.cloudflare.com/workers/runtime-apis/rpc/#return-functions-from-rpc-methods - */ - public open(): CacheObjectDescriptor { - return { - get: async (key: string) => { - return this.get(key); - }, - set: async (key: string, value: Value, expiresAt: number) => { - await this.set(key, value, expiresAt); - }, - }; - } - - /** - * Get the value of a property. - */ - public async get(key: string) { - return this.logOperation({ operation: 'get', key }, async (setLog) => { - // Try the memory state first. - const memoryEntry = this.lru.get(key); - if (memoryEntry) { - setLog({ memory: true }); - setLog({ memoryMatch: !!memoryEntry.match }); - if (!memoryEntry.match) { - return; - } - - const isExpired = memoryEntry.match.expiresAt < Date.now(); - setLog({ memoryExpired: isExpired }); - - if (!isExpired) { - return memoryEntry.match.value as Value; - } - } - - return await this.getFromStorage(key); - }); - } - - /** - * Get the value of a property from the DO storage. - */ - public async getFromStorage(key: string) { - return this.logOperation({ operation: 'getFromStorage', key }, async (setLog) => { - const entries = await this.ctx.storage.list({ - prefix: getStoragePropKey(key), - noCache: true, - }); - if (entries.size) { - const entry = decodeChunks>(entries); - setLog({ chunks: entries.size, chunksSize: entry?.size ?? 0 }); - if (entry && entry.value.expiresAt > Date.now()) { - // Found - this.lru.set(key, { match: entry.value }); - return entry.value.value; - } - } - - // Not found - this.lru.set(key, { match: undefined }); - }); - } - - /** - * Set a value in the cache object. - */ - public async set(key: string, value: Value, expiresAt: number) { - return this.logOperation({ operation: 'set', key }, async (setLog) => { - const prop: CacheObjectProp = { - value, - expiresAt, - }; - - this.lru.set(key, { match: prop }); - await this.ctx.storage.transaction(async (tx) => { - const entries = encodeChunks(key, prop); - const chunks = Object.keys(entries).length; - setLog({ chunks }); - - const clockValue: CacheObjectExp = { - k: key, - c: chunks, - }; - - await tx.put(getGCClockKey(key, expiresAt), clockValue); - await tx.put(entries); - - const currentAlarm = await tx.getAlarm(); - if (!currentAlarm) { - // Set an alarm to garbage collect all entries that have expired in 12h. - await tx.setAlarm(Date.now() + 12 * 60 * 60 * 1000); - } - }); - }); - } - - /** - * Purge all keys in the cache object. - */ - public async purge() { - return this.logOperation({ operation: 'purge' }, async (setLog) => { - const result = new Set(); - - try { - // List all the keys in the cache object. - const entries = await this.ctx.storage.list({ - prefix: 'exp.', - noCache: true, - }); - setLog({ entries: entries.size }); - entries.forEach((exp) => { - result.add(exp.k); - }); - } catch (_error) {} - - await this.reset(); - return Array.from(result); - }); - } - - /** - * Alarm to garbage collect all entries that have expired. - */ - async alarm() { - return this.logOperation({ operation: 'alarm' }, async (setLog) => { - try { - const entries = await this.ctx.storage.list({ - prefix: 'exp.', - noCache: true, - }); - setLog({ entries: entries.size }); - const toDeleteSet = new Set(); - - for (const [key, exp] of entries) { - const timestamp = Number.parseInt(key.split('.')[1]); - if (timestamp < Date.now()) { - toDeleteSet.add(key); - for (let i = 0; i < exp.c; i++) { - toDeleteSet.add(getStoragePropChunkKey(exp.k, i)); - } - } - } - - // Delete the keys by batch of 128. - const toDelete = Array.from(toDeleteSet); - setLog({ toDelete: toDelete.length }); - for (let i = 0; i < toDelete.length; i += 128) { - await this.ctx.storage.delete(toDelete.slice(i, i + 128)); - } - - // If there are still keys to delete, set an alarm to continue the deletion in 12h. - if (toDelete.length) { - await this.ctx.storage.setAlarm(Date.now() + 12 * 60 * 60 * 1000); - } - } catch (_error) { - await this.reset(); - } - }); - } - - /** - * Reset the cache object. - */ - async reset() { - return this.logOperation({ operation: 'reset' }, async () => { - this.lru.clear(); - await this.ctx.storage.deleteAll(); - }); - } - - /** - * Time and log an operation. - */ - async logOperation( - log: Record, - fn: (update: (log: Record) => void) => Promise - ): Promise { - const objectId = this.ctx.id.name ?? this.ctx.id.toString(); - const update: Record = {}; - const start = performance.now(); - try { - return await fn((arg) => { - Object.assign(update, arg); - }); - } finally { - const duration = performance.now() - start; - console.log({ ...log, ...update, objectId, duration }); - } - } -} - -function getStoragePropKey(key: string): string { - return `prop.${key}.`; -} - -function getStoragePropChunkKey(key: string, index: number): string { - return `${getStoragePropKey(key)}${index}`; -} - -function getGCClockRootKey(timestamp: number): string { - return `exp.${timestamp}.`; -} - -function getGCClockKey(key: string, expiresAt: number): string { - return `${getGCClockRootKey(expiresAt)}${key}`; -} - -function encodeChunks(key: string, value: T): Record { - const buf = encode(value); - const entries: Record = {}; - const chunks = chunkUint8Array(buf, 128 * 1024); - - for (let index = 0; index < chunks.length; index++) { - entries[getStoragePropChunkKey(key, index)] = chunks[index]; - } - - return entries; -} - -function decodeChunks(entries: Map): { value: T; size: number } | undefined { - const chunks = Array.from(entries.entries()) - .map(([key, value]) => { - const index = Number.parseInt(key.split('.').pop()!); - return [index, value] as const; - }) - .sort(([a], [b]) => a - b) - .map(([, value]) => value); - - if (chunks.length === 0) { - return; - } - - const buf = mergeUint8Array(chunks); - return { value: decode(buf) as T, size: buf.length }; -} - -function chunkUint8Array(input: Uint8Array, chunkSize: number): Uint8Array[] { - const chunks: Uint8Array[] = []; - for (let i = 0; i < input.length; i += chunkSize) { - chunks.push(input.slice(i, i + chunkSize)); - } - return chunks; -} - -function mergeUint8Array(chunks: Uint8Array[]): Uint8Array { - const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); - const result = new Uint8Array(totalLength); - let offset = 0; - for (const chunk of chunks) { - result.set(chunk, offset); - offset += chunk.length; - } - return result; -} diff --git a/packages/cache-do/src/CacheObjectStub.ts b/packages/cache-do/src/CacheObjectStub.ts deleted file mode 100644 index 6886b6051c..0000000000 --- a/packages/cache-do/src/CacheObjectStub.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { CacheObject } from './CacheObject'; - -export type CacheLocationId = ContinentCode; -const allLocations: CacheLocationId[] = ['AF', 'AS', 'NA', 'SA', 'AN', 'EU', 'OC']; - -/** - * Location hint for the CacheObject durable object. - */ -const doLocationHints: { - [key in CacheLocationId]: DurableObjectLocationHint; -} = { - AF: 'afr', - AS: 'apac', - NA: 'wnam', - SA: 'sam', - AN: 'oc', - EU: 'weur', - OC: 'oc', -}; - -/** - * Client to access a cache tag. - */ -export class CacheObjectStub { - private stub: DurableObjectStub; - - constructor( - /** Binding to the CacheObject durable object */ - private doNamespace: DurableObjectNamespace, - /** ID of the location to target */ - private locationId: CacheLocationId, - /** Name of the tag */ - private tag: string - ) { - const groupId = getCacheObjectIdName(this.locationId, this.tag); - this.stub = this.doNamespace.get(this.doNamespace.idFromName(groupId), { - // Initialize the object with a locaiton hint, - // as we might want to purge all locations before the object is created. - // https://developers.cloudflare.com/durable-objects/reference/data-location/ - locationHint: doLocationHints[this.locationId], - }); - } - - /** - * Open a descriptor to the cache object. - * It can be used to perform multiple operations in a single RPC session. - * Ex: - * ```ts - * using desc = cache.open(); - * await desc.set('key', 'value', Date.now() + 1000); - * await desc.get('key'); - * ``` - */ - async open() { - return await this.stub.open(); - } - - /** - * Get a value from the cache. - */ - async get(key: string) { - return (await this.stub.get(key)) as Value | undefined; - } - - /** - * Set a value in the cache. - */ - async set(key: string, value: Value, expiresAt: number) { - return await this.stub.set(key, value, expiresAt); - } - - /** - * Purge all keys in the cache tag. - */ - async purge() { - const keys = new Set(); - await Promise.all( - allLocations.map(async (locationId) => { - const groupId = getCacheObjectIdName(locationId, this.tag); - const cacheGroup = this.doNamespace.get(this.doNamespace.idFromName(groupId), { - // Initialize the object with a locaiton hint, - // as we might want to purge all locations before the object is created. - // https://developers.cloudflare.com/durable-objects/reference/data-location/ - locationHint: doLocationHints[this.locationId], - }); - const locationkeys = await cacheGroup.purge(); - locationkeys.forEach((key) => keys.add(key)); - }) - ); - - return keys; - } -} - -function getCacheObjectIdName(locationId: CacheLocationId, tag: string): string { - return `${locationId}:${tag}`; -} diff --git a/packages/cache-do/src/api.ts b/packages/cache-do/src/api.ts deleted file mode 100644 index 6000e87c64..0000000000 --- a/packages/cache-do/src/api.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './CacheObjectStub'; diff --git a/packages/cache-do/src/index.ts b/packages/cache-do/src/index.ts deleted file mode 100644 index 13099a0f59..0000000000 --- a/packages/cache-do/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { WorkerEntrypoint } from 'cloudflare:workers'; - -export * from './CacheObject'; - -export default class Worker extends WorkerEntrypoint { - fetch() { - return new Response('Hello, world!'); - } -} diff --git a/packages/cache-do/tsconfig.json b/packages/cache-do/tsconfig.json deleted file mode 100644 index 09c216749a..0000000000 --- a/packages/cache-do/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": false, - "declaration": true, - "outDir": "dist", - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "incremental": true, - "types": ["./.wrangler/types/runtime.d.ts"] - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/packages/cache-do/wrangler.toml b/packages/cache-do/wrangler.toml deleted file mode 100644 index 3936663a68..0000000000 --- a/packages/cache-do/wrangler.toml +++ /dev/null @@ -1,27 +0,0 @@ -main = "./src/index.ts" -name = "gitbook-open-cache" -compatibility_date = "2024-09-02" - -durable_objects.bindings = [ - {name = "CACHE", class_name = "CacheObject"} -] - -migrations = [ - {tag = "v1", new_classes = ["CacheObject"]} -] - -[observability] -enabled = false - -[env.preview] -name = "gitbook-open-cache-preview" -durable_objects.bindings = [ - {name = "CACHE", class_name = "CacheObject"} -] -migrations = [ - {tag = "v1", new_classes = ["CacheObject"]} -] - -[env.preview.observability] -enabled = true -head_sampling_rate = 0.1 diff --git a/packages/cache-tags/CHANGELOG.md b/packages/cache-tags/CHANGELOG.md index 46afb60398..a5589ab565 100644 --- a/packages/cache-tags/CHANGELOG.md +++ b/packages/cache-tags/CHANGELOG.md @@ -1,5 +1,17 @@ # @gitbook/cache-tags +## 0.3.1 + +### Patch Changes + +- 77397ca: Fix version of @gitbook/api referenced in package.json + +## 0.3.0 + +### Minor Changes + +- 116575c: Improve typing of getComputedContentSourceCacheTags to match latest API specification + ## 0.2.0 ### Minor Changes diff --git a/packages/cache-tags/package.json b/packages/cache-tags/package.json index b554025459..a57048f2f6 100644 --- a/packages/cache-tags/package.json +++ b/packages/cache-tags/package.json @@ -8,9 +8,9 @@ "default": "./dist/index.js" } }, - "version": "0.2.0", + "version": "0.3.1", "dependencies": { - "@gitbook/api": "*", + "@gitbook/api": "catalog:", "assert-never": "^1.2.1" }, "devDependencies": { diff --git a/packages/colors/CHANGELOG.md b/packages/colors/CHANGELOG.md index d73704be21..1695a6c97d 100644 --- a/packages/colors/CHANGELOG.md +++ b/packages/colors/CHANGELOG.md @@ -1,5 +1,19 @@ # @gitbook/colors +## 0.3.3 + +### Patch Changes + +- c3f6b8c: Update chroma ratio per step +- 5e975ab: Fix code highlighting for HTTP +- f7a3470: Change lightness check for color step 9 to allow input colors with a higher-than-needed contrast + +## 0.3.2 + +### Patch Changes + +- cdffd7c: Desaturate text colors by decreasing chroma for the last steps of the color scale + ## 0.3.1 ### Patch Changes diff --git a/packages/colors/package.json b/packages/colors/package.json index af67871cb1..16f54d1ff3 100644 --- a/packages/colors/package.json +++ b/packages/colors/package.json @@ -8,7 +8,7 @@ "default": "./dist/index.js" } }, - "version": "0.3.1", + "version": "0.3.3", "devDependencies": { "typescript": "^5.5.3" }, diff --git a/packages/colors/src/transformations.ts b/packages/colors/src/transformations.ts index ab0e25c315..8234a460a9 100644 --- a/packages/colors/src/transformations.ts +++ b/packages/colors/src/transformations.ts @@ -214,13 +214,31 @@ export function colorScale( const targetL = foregroundColor.L * mapping[index] + backgroundColor.L * (1 - mapping[index]); - if (index === 8 && !mix && Math.abs(baseColor.L - targetL) < 0.2) { + if ( + index === 8 && + !mix && + (darkMode ? targetL - baseColor.L < 0.2 : baseColor.L - targetL < 0.2) + ) { // Original colour is close enough to target, so let's use the original colour as step 9. result.push(hex); continue; } - const chromaRatio = index < 8 ? index * 0.05 : 1; + const chromaRatio = (() => { + switch (index) { + // Step 9 and 10 have max chroma, meaning they are fully saturated. + case 8: + case 9: + return 1; + // Step 11 and 12 have a reduced chroma + case 10: + return 0.4; + case 11: + return 0.1; + default: + return index * 0.05; + } + })(); const shade = { L: targetL, // Blend lightness diff --git a/packages/fonts/.gitignore b/packages/fonts/.gitignore new file mode 100644 index 0000000000..253839862f --- /dev/null +++ b/packages/fonts/.gitignore @@ -0,0 +1,2 @@ +dist/ +src/data/*.json diff --git a/packages/fonts/README.md b/packages/fonts/README.md new file mode 100644 index 0000000000..fef253f27f --- /dev/null +++ b/packages/fonts/README.md @@ -0,0 +1,3 @@ +# `@gitbook/fonts` + +Utilities to lookup default fonts supported by GitBook. diff --git a/packages/fonts/bin/generate.ts b/packages/fonts/bin/generate.ts new file mode 100644 index 0000000000..d4326d615c --- /dev/null +++ b/packages/fonts/bin/generate.ts @@ -0,0 +1,91 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; + +import { APIv2 } from 'google-font-metadata'; + +import { CustomizationDefaultFont } from '@gitbook/api'; + +import type { FontDefinitions } from '../src/types'; + +const googleFontsMap: { [fontName in CustomizationDefaultFont]: string } = { + [CustomizationDefaultFont.Inter]: 'inter', + [CustomizationDefaultFont.FiraSans]: 'fira-sans-extra-condensed', + [CustomizationDefaultFont.IBMPlexSerif]: 'ibm-plex-serif', + [CustomizationDefaultFont.Lato]: 'lato', + [CustomizationDefaultFont.Merriweather]: 'merriweather', + [CustomizationDefaultFont.NotoSans]: 'noto-sans', + [CustomizationDefaultFont.OpenSans]: 'open-sans', + [CustomizationDefaultFont.Overpass]: 'overpass', + [CustomizationDefaultFont.Poppins]: 'poppins', + [CustomizationDefaultFont.Raleway]: 'raleway', + [CustomizationDefaultFont.Roboto]: 'roboto', + [CustomizationDefaultFont.RobotoSlab]: 'roboto-slab', + [CustomizationDefaultFont.SourceSansPro]: 'source-sans-3', + [CustomizationDefaultFont.Ubuntu]: 'ubuntu', + [CustomizationDefaultFont.ABCFavorit]: 'inter', +}; + +/** + * Scripts to generate the list of all icons. + */ +async function main() { + // @ts-expect-error - we build the object + const output: FontDefinitions = {}; + + for (const font of Object.values(CustomizationDefaultFont)) { + const googleFontName = googleFontsMap[font]; + const fontMetadata = APIv2[googleFontName.toLowerCase()]; + if (!fontMetadata) { + throw new Error(`Font ${googleFontName} not found`); + } + + output[font] = { + font: googleFontName, + unicodeRange: fontMetadata.unicodeRange, + variants: { + '400': {}, + '700': {}, + }, + }; + + Object.keys(output[font].variants).forEach((weight) => { + const variants = fontMetadata.variants[weight]; + const normalVariant = variants.normal; + if (!normalVariant) { + throw new Error(`Font ${googleFontName} has no normal variant`); + } + + output[font].variants[weight] = {}; + Object.entries(normalVariant).forEach(([script, url]) => { + output[font].variants[weight][script] = url.url.woff; + }); + }); + } + + await writeDataFile('fonts', JSON.stringify(output, null, 2)); +} + +/** + * We write both in dist and src as the build process might have happen already + * and tsc doesn't copy the files. + */ +async function writeDataFile(name, content) { + const srcData = path.resolve(__dirname, '../src/data'); + const distData = path.resolve(__dirname, '../dist/data'); + + // Ensure the directories exists + await Promise.all([ + fs.mkdir(srcData, { recursive: true }), + fs.mkdir(distData, { recursive: true }), + ]); + + await Promise.all([ + fs.writeFile(path.resolve(srcData, `${name}.json`), content), + fs.writeFile(path.resolve(distData, `${name}.json`), content), + ]); +} + +main().catch((error) => { + console.error(`Error generating icons list: ${error}`); + process.exit(1); +}); diff --git a/packages/fonts/package.json b/packages/fonts/package.json new file mode 100644 index 0000000000..dbfb2d7ca0 --- /dev/null +++ b/packages/fonts/package.json @@ -0,0 +1,31 @@ +{ + "name": "@gitbook/fonts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "development": "./src/index.ts", + "default": "./dist/index.js" + } + }, + "version": "0.0.0", + "dependencies": { + "@gitbook/api": "catalog:" + }, + "devDependencies": { + "google-font-metadata": "^6.0.3", + "typescript": "^5.5.3" + }, + "scripts": { + "generate": "bun ./bin/generate.js", + "build": "tsc --project tsconfig.build.json", + "typecheck": "tsc --noEmit", + "dev": "tsc -w", + "clean": "rm -rf ./dist && rm -rf ./src/data", + "unit": "bun test" + }, + "files": ["dist", "src", "bin", "README.md", "CHANGELOG.md"], + "engines": { + "node": ">=20.0.0" + } +} diff --git a/packages/fonts/src/__snapshots__/getDefaultFont.test.ts.snap b/packages/fonts/src/__snapshots__/getDefaultFont.test.ts.snap new file mode 100644 index 0000000000..89184be22c --- /dev/null +++ b/packages/fonts/src/__snapshots__/getDefaultFont.test.ts.snap @@ -0,0 +1,57 @@ +// Bun Snapshot v1, https://goo.gl/fbAQLP + +exports[`getDefaultFont should return correct object for Latin text 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hjp-Ek-_0ew.woff", +} +`; + +exports[`getDefaultFont should return correct object for Cyrillic text 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZthjp-Ek-_0ewmM.woff", +} +`; + +exports[`getDefaultFont should return correct object for Greek text 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZxhjp-Ek-_0ewmM.woff", +} +`; + +exports[`getDefaultFont should handle mixed script text 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZthjp-Ek-_0ewmM.woff", +} +`; + +exports[`getDefaultFont should handle different font weights: regular 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hjp-Ek-_0ew.woff", +} +`; + +exports[`getDefaultFont should handle different font weights: bold 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuFuYAZ9hjp-Ek-_0ew.woff", +} +`; + +exports[`getDefaultFont should handle different fonts: inter 1`] = ` +{ + "font": "Inter", + "url": "https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hjp-Ek-_0ew.woff", +} +`; + +exports[`getDefaultFont should handle different fonts: roboto 1`] = ` +{ + "font": "Roboto", + "url": "https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxMKTU1Kg.woff", +} +`; diff --git a/packages/fonts/src/fonts.ts b/packages/fonts/src/fonts.ts new file mode 100644 index 0000000000..c9544efb19 --- /dev/null +++ b/packages/fonts/src/fonts.ts @@ -0,0 +1,5 @@ +import type { FontDefinitions } from './types'; + +import rawFonts from './data/fonts.json' with { type: 'json' }; + +export const fonts: FontDefinitions = rawFonts; diff --git a/packages/fonts/src/getDefaultFont.test.ts b/packages/fonts/src/getDefaultFont.test.ts new file mode 100644 index 0000000000..58afbeac93 --- /dev/null +++ b/packages/fonts/src/getDefaultFont.test.ts @@ -0,0 +1,119 @@ +import { describe, expect, it } from 'bun:test'; +import { CustomizationDefaultFont } from '@gitbook/api'; +import { getDefaultFont } from './getDefaultFont'; + +describe('getDefaultFont', () => { + it('should return null for invalid font', () => { + const result = getDefaultFont({ + font: 'invalid-font' as CustomizationDefaultFont, + text: 'Hello', + weight: 400, + }); + expect(result).toBeNull(); + }); + + it('should return null for invalid weight', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello', + weight: 999 as any, + }); + expect(result).toBeNull(); + }); + + it('should return null for text not supported by any script', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: '😀', // Emoji not supported by Inter + weight: 400, + }); + expect(result).toBeNull(); + }); + + it('should return correct object for Latin text', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello World', + weight: 400, + }); + expect(result).not.toBeNull(); + expect(result?.font).toBe(CustomizationDefaultFont.Inter); + expect(result).toMatchSnapshot(); + }); + + it('should return correct object for Cyrillic text', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Привет мир', + weight: 400, + }); + expect(result).not.toBeNull(); + expect(result?.font).toBe(CustomizationDefaultFont.Inter); + expect(result).toMatchSnapshot(); + }); + + it('should return correct object for Greek text', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Γεια σας', + weight: 400, + }); + expect(result).not.toBeNull(); + expect(result?.font).toBe(CustomizationDefaultFont.Inter); + expect(result).toMatchSnapshot(); + }); + + it('should handle mixed script text', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello Привет', + weight: 400, + }); + expect(result).not.toBeNull(); + expect(result?.font).toBe(CustomizationDefaultFont.Inter); + expect(result).toMatchSnapshot(); + }); + + it('should handle different font weights', () => { + const regular = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello', + weight: 400, + }); + const bold = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello', + weight: 700, + }); + expect(regular).not.toBeNull(); + expect(bold).not.toBeNull(); + expect(regular).toMatchSnapshot('regular'); + expect(bold).toMatchSnapshot('bold'); + }); + + it('should handle empty string', () => { + const result = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: '', + weight: 400, + }); + expect(result).toBeNull(); + }); + + it('should handle different fonts', () => { + const inter = getDefaultFont({ + font: CustomizationDefaultFont.Inter, + text: 'Hello', + weight: 400, + }); + const roboto = getDefaultFont({ + font: CustomizationDefaultFont.Roboto, + text: 'Hello', + weight: 400, + }); + expect(inter).not.toBeNull(); + expect(roboto).not.toBeNull(); + expect(inter).toMatchSnapshot('inter'); + expect(roboto).toMatchSnapshot('roboto'); + }); +}); diff --git a/packages/fonts/src/getDefaultFont.ts b/packages/fonts/src/getDefaultFont.ts new file mode 100644 index 0000000000..ea18e8bba2 --- /dev/null +++ b/packages/fonts/src/getDefaultFont.ts @@ -0,0 +1,112 @@ +import type { CustomizationDefaultFont } from '@gitbook/api'; +import { fonts } from './fonts'; +import type { FontWeight } from './types'; + +/** + * Get the URL to load a font for a text. + */ +export function getDefaultFont(input: { + /** + * GitBook font to use. + */ + font: CustomizationDefaultFont; + + /** + * Text to display with the font. + */ + text: string; + + /** + * Font weight to use. + */ + weight: FontWeight; +}): { font: string; url: string } | null { + if (!input.text.trim()) { + return null; + } + + const fontDefinition = fonts[input.font]; + if (!fontDefinition) { + return null; + } + + const variant = fontDefinition.variants[`${input.weight}`]; + if (!variant) { + return null; + } + + const script = getBestUnicodeRange(input.text, fontDefinition.unicodeRange); + if (!script) { + return null; + } + + return variant[script] + ? { + font: input.font, + url: variant[script], + } + : null; +} + +/** + * Determine which named @font-face unicode-range covers + * the greatest share of the characters in `text`. + * + * @param text The text you want to inspect. + * @param ranges An object whose keys are range names and whose + * values are CSS-style comma-separated unicode-range + * declarations (e.g. "U+0370-03FF,U+1F00-1FFF"). + * @returns The key of the best-matching range, or `null` + * when nothing matches at all. + */ +function getBestUnicodeRange(text: string, ranges: Record): string | null { + // ---------- helper: parse "U+XXXX" or "U+XXXX-YYYY" ---------- + const parseOne = (token: string): [number, number] | null => { + token = token.trim().toUpperCase(); + if (!token.startsWith('U+')) return null; + + const body = token.slice(2); // drop "U+" + const [startHex, endHex] = body.split('-'); + const start = Number.parseInt(startHex, 16); + const end = endHex ? Number.parseInt(endHex, 16) : start; + + if (Number.isNaN(start) || Number.isNaN(end) || end < start) return null; + return [start, end]; + }; + + // ---------- helper: build lookup table ---------- + const parsed: Record = {}; + for (const [label, list] of Object.entries(ranges)) { + parsed[label] = list + .split(',') + .map(parseOne) + .filter((x): x is [number, number] => x !== null); + } + + // ---------- tally code-point hits ---------- + const hits: Record = Object.fromEntries(Object.keys(parsed).map((k) => [k, 0])); + + for (let i = 0; i < text.length; ) { + const cp = text.codePointAt(i)!; + i += cp > 0xffff ? 2 : 1; // advance by 1 UTF-16 code-unit (or 2 for surrogates) + + for (const [label, rangesArr] of Object.entries(parsed)) { + if (rangesArr.some(([lo, hi]) => cp >= lo && cp <= hi)) { + hits[label]++; + } + } + } + + // ---------- choose the "best" ---------- + let winner: string | null = null; + let maxCount = 0; + + for (const [label, count] of Object.entries(hits)) { + if (count > maxCount) { + maxCount = count; + winner = label; + } + } + + return maxCount > 0 ? winner : null; +} diff --git a/packages/fonts/src/index.ts b/packages/fonts/src/index.ts new file mode 100644 index 0000000000..fbb3584899 --- /dev/null +++ b/packages/fonts/src/index.ts @@ -0,0 +1,2 @@ +export * from './getDefaultFont'; +export * from './types'; diff --git a/packages/fonts/src/types.ts b/packages/fonts/src/types.ts new file mode 100644 index 0000000000..899b32c49f --- /dev/null +++ b/packages/fonts/src/types.ts @@ -0,0 +1,17 @@ +import type { CustomizationDefaultFont } from '@gitbook/api'; + +export type FontWeight = 400 | 700; + +export type FontDefinition = { + font: string; + unicodeRange: { + [script: string]: string; + }; + variants: { + [weight in string]: { + [script: string]: string; + }; + }; +}; + +export type FontDefinitions = { [fontName in CustomizationDefaultFont]: FontDefinition }; diff --git a/packages/fonts/tsconfig.build.json b/packages/fonts/tsconfig.build.json new file mode 100644 index 0000000000..e4828bc1f6 --- /dev/null +++ b/packages/fonts/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "src/**/*.test.ts"] +} diff --git a/packages/proxy/tsconfig.json b/packages/fonts/tsconfig.json similarity index 81% rename from packages/proxy/tsconfig.json rename to packages/fonts/tsconfig.json index aa63c0ef4b..2b3fe87c5f 100644 --- a/packages/proxy/tsconfig.json +++ b/packages/fonts/tsconfig.json @@ -1,18 +1,19 @@ { "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, + "lib": ["es2023"], + "module": "ESNext", + "target": "es2022", "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowJs": true, "noEmit": false, "declaration": true, "outDir": "dist", - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, + "jsx": "react-jsx", "incremental": true, "types": [ "bun-types" // add Bun global diff --git a/packages/fonts/turbo.json b/packages/fonts/turbo.json new file mode 100644 index 0000000000..9097cda33c --- /dev/null +++ b/packages/fonts/turbo.json @@ -0,0 +1,9 @@ +{ + "extends": ["//"], + "tasks": { + "generate": { + "inputs": ["bin/**/*", "package.json"], + "outputs": ["src/data/*.json", "dist/data/*.json"] + } + } +} diff --git a/packages/gitbook-v2/.gitignore b/packages/gitbook-v2/.gitignore deleted file mode 100644 index 84254823d2..0000000000 --- a/packages/gitbook-v2/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# next.js -/.next/ - -# vercel -.vercel - -# cloudflare -.open-next - -# Symbolic links -public diff --git a/packages/gitbook-v2/CHANGELOG.md b/packages/gitbook-v2/CHANGELOG.md deleted file mode 100644 index b79ef4dd66..0000000000 --- a/packages/gitbook-v2/CHANGELOG.md +++ /dev/null @@ -1,47 +0,0 @@ -# gitbook-v2 - -## 0.2.3 - -### Patch Changes - -- 5b2bf82: Use stable site URL data for route rewrite in the middleware - -## 0.2.2 - -### Patch Changes - -- 54ee014: Add initial support for loading custom fonts -- bba2e52: Fix site redirects when it includes a section/variant path - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [f32bf1f] - - @gitbook/cache-tags@0.2.0 - -## 0.2.0 - -### Minor Changes - -- 76c7974: Add route to revalidate cached data - -## 0.1.2 - -### Patch Changes - -- 05ffd0e: Improving data cache management for computed content -- Updated dependencies [05ffd0e] - - @gitbook/cache-tags@0.1.0 - -## 0.1.1 - -### Patch Changes - -- 3e11678: fix: lost section groups - -## 0.1.0 - -### Minor Changes - -- cfccc44: Setup structure and deployment for new version diff --git a/packages/gitbook-v2/next-env.d.ts b/packages/gitbook-v2/next-env.d.ts deleted file mode 100644 index 1b3be0840f..0000000000 --- a/packages/gitbook-v2/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/packages/gitbook-v2/open-next.config.ts b/packages/gitbook-v2/open-next.config.ts deleted file mode 100644 index 5b590c3aa2..0000000000 --- a/packages/gitbook-v2/open-next.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineCloudflareConfig } from '@opennextjs/cloudflare'; -import d1TagCache from '@opennextjs/cloudflare/d1-tag-cache'; -import kvIncrementalCache from '@opennextjs/cloudflare/kv-cache'; -import memoryQueue from '@opennextjs/cloudflare/memory-queue'; - -export default defineCloudflareConfig({ - incrementalCache: kvIncrementalCache, - queue: memoryQueue, - tagCache: d1TagCache, -}); diff --git a/packages/gitbook-v2/package.json b/packages/gitbook-v2/package.json deleted file mode 100644 index 1b97ed7916..0000000000 --- a/packages/gitbook-v2/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "gitbook-v2", - "version": "0.2.3", - "private": true, - "dependencies": { - "next": "^15.2.3", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "@gitbook/api": "*", - "@gitbook/cache-tags": "workspace:*", - "@sindresorhus/fnv1a": "^3.1.0", - "server-only": "^0.0.1", - "warn-once": "^0.1.1", - "rison": "^0.1.1", - "jwt-decode": "^4.0.0", - "p-memoize": "^7.1.1" - }, - "devDependencies": { - "gitbook": "*", - "@opennextjs/cloudflare": "^0.5.10", - "@types/rison": "^0.0.9", - "tailwindcss": "^3.4.0", - "postcss": "^8" - }, - "scripts": { - "generate": "rm -rf ./public && cp -r ../gitbook/public ./public", - "dev:v2": "env-cmd --silent -f ../../.env.local next --turbopack", - "build": "next build", - "build:v2": "next build", - "start": "next start", - "build:v2:cloudflare": "opennextjs-cloudflare", - "dev:v2:cloudflare": "wrangler dev --port 8771", - "unit": "bun test", - "typecheck": "tsc --noEmit" - } -} diff --git a/packages/gitbook-v2/postcss.config.js b/packages/gitbook-v2/postcss.config.js deleted file mode 100644 index 67cdf1a55f..0000000000 --- a/packages/gitbook-v2/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx b/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx deleted file mode 100644 index d7bd00d7cf..0000000000 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx +++ /dev/null @@ -1,2 +0,0 @@ -import RootLayout from '@v2/app/~space/[spaceId]/~gitbook/pdf/layout'; -export default RootLayout; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx b/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx deleted file mode 100644 index b0111d68c5..0000000000 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import PDFPage, { generateMetadata } from '@v2/app/~space/[spaceId]/~gitbook/pdf/page'; - -export default PDFPage; -export { generateMetadata }; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx b/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx deleted file mode 100644 index d7bd00d7cf..0000000000 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx +++ /dev/null @@ -1,2 +0,0 @@ -import RootLayout from '@v2/app/~space/[spaceId]/~gitbook/pdf/layout'; -export default RootLayout; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx b/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx deleted file mode 100644 index b0111d68c5..0000000000 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import PDFPage, { generateMetadata } from '@v2/app/~space/[spaceId]/~gitbook/pdf/page'; - -export default PDFPage; -export { generateMetadata }; diff --git a/packages/gitbook-v2/src/lib/data/api.ts b/packages/gitbook-v2/src/lib/data/api.ts deleted file mode 100644 index 914f9be5bc..0000000000 --- a/packages/gitbook-v2/src/lib/data/api.ts +++ /dev/null @@ -1,686 +0,0 @@ -import { trace } from '@/lib/tracing'; -import { - type ComputedContentSource, - GitBookAPI, - type GitBookAPIServiceBinding, - type RenderIntegrationUI, -} from '@gitbook/api'; -import { getCacheTag, getComputedContentSourceCacheTags } from '@gitbook/cache-tags'; -import { GITBOOK_API_TOKEN, GITBOOK_API_URL, GITBOOK_USER_AGENT } from '@v2/lib/env'; -import { unstable_cacheLife as cacheLife, unstable_cacheTag as cacheTag } from 'next/cache'; -import { DataFetcherError, wrapDataFetcherError } from './errors'; -import { memoize } from './memoize'; -import type { GitBookDataFetcher } from './types'; - -interface DataFetcherInput { - /** - * API token. - */ - apiToken: string | null; -} - -/** - * Create a data fetcher using an API token. - * The data are being cached by Next.js built-in cache. - */ -export function createDataFetcher( - input: DataFetcherInput = { apiToken: null } -): GitBookDataFetcher { - return { - async api() { - return apiClient(input); - }, - - withToken({ apiToken }) { - return createDataFetcher({ - apiToken, - }); - }, - - // - // API that are tied to the token - // - getPublishedContentSite(params) { - return trace('getPublishedContentSite', () => - getPublishedContentSite(input, { - organizationId: params.organizationId, - siteId: params.siteId, - siteShareKey: params.siteShareKey, - }) - ); - }, - getSiteRedirectBySource(params) { - return trace('getSiteRedirectBySource', () => - getSiteRedirectBySource(input, { - organizationId: params.organizationId, - siteId: params.siteId, - siteShareKey: params.siteShareKey, - source: params.source, - }) - ); - }, - getRevision(params) { - return trace('getRevision', () => - getRevision(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - metadata: params.metadata, - }) - ); - }, - getRevisionPages(params) { - return trace('getRevisionPages', () => - getRevisionPages(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - metadata: params.metadata, - }) - ); - }, - getRevisionFile(params) { - return trace('getRevisionFile', () => - getRevisionFile(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - fileId: params.fileId, - }) - ); - }, - getRevisionPageByPath(params) { - return trace('getRevisionPageByPath', () => - getRevisionPageByPath(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - path: params.path, - }) - ); - }, - getRevisionPageMarkdown(params) { - return trace('getRevisionPageMarkdown', () => - getRevisionPageMarkdown(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - pageId: params.pageId, - }) - ); - }, - getReusableContent(params) { - return trace('getReusableContent', () => - getReusableContent(input, { - spaceId: params.spaceId, - revisionId: params.revisionId, - reusableContentId: params.reusableContentId, - }) - ); - }, - getLatestOpenAPISpecVersionContent(params) { - return trace('getLatestOpenAPISpecVersionContent', () => - getLatestOpenAPISpecVersionContent(input, { - organizationId: params.organizationId, - slug: params.slug, - }) - ); - }, - getSpace(params) { - return trace('getSpace', () => - getSpace(input, { - spaceId: params.spaceId, - shareKey: params.shareKey, - }) - ); - }, - getChangeRequest(params) { - return trace('getChangeRequest', () => - getChangeRequest(input, { - spaceId: params.spaceId, - changeRequestId: params.changeRequestId, - }) - ); - }, - getDocument(params) { - return trace('getDocument', () => - getDocument(input, { - spaceId: params.spaceId, - documentId: params.documentId, - }) - ); - }, - getComputedDocument(params) { - return trace('getComputedDocument', () => - getComputedDocument(input, { - organizationId: params.organizationId, - spaceId: params.spaceId, - source: params.source, - seed: params.seed, - }) - ); - }, - getEmbedByUrl(params) { - return trace('getEmbedByUrl', () => - getEmbedByUrl(input, { - url: params.url, - spaceId: params.spaceId, - }) - ); - }, - searchSiteContent(params) { - return trace('searchSiteContent', () => searchSiteContent(input, params)); - }, - - renderIntegrationUi(params) { - return trace('renderIntegrationUi', () => - renderIntegrationUi(input, { - integrationName: params.integrationName, - request: params.request, - }) - ); - }, - - getUserById(userId) { - return trace('getUserById', () => getUserById(input, { userId })); - }, - }; -} - -const getUserById = memoize(async function getUserById( - input: DataFetcherInput, - params: { userId: string } -) { - 'use cache'; - - return trace('getUserById.uncached', () => { - cacheLife('days'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.users.getUserById(params.userId); - return res.data; - }); - }); -}); - -const getSpace = memoize(async function getSpace( - input: DataFetcherInput, - params: { - spaceId: string; - shareKey: string | undefined; - } -) { - 'use cache'; - - return trace('getSpace.uncached', () => { - cacheLife('days'); - cacheTag( - getCacheTag({ - tag: 'space', - space: params.spaceId, - }) - ); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getSpaceById(params.spaceId, { - shareKey: params.shareKey, - }); - return res.data; - }); - }); -}); - -const getChangeRequest = memoize(async function getChangeRequest( - input: DataFetcherInput, - params: { - spaceId: string; - changeRequestId: string; - } -) { - 'use cache'; - - return trace('getChangeRequest.uncached', () => { - cacheLife('minutes'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getChangeRequestById( - params.spaceId, - params.changeRequestId - ); - cacheTag( - getCacheTag({ - tag: 'change-request', - space: params.spaceId, - changeRequest: res.data.id, - }) - ); - return res.data; - }); - }); -}); - -const getRevision = memoize(async function getRevision( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - metadata: boolean; - } -) { - 'use cache'; - - return trace('getRevision.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getRevisionById(params.spaceId, params.revisionId, { - metadata: params.metadata, - }); - return res.data; - }); - }); -}); - -const getRevisionPages = memoize(async function getRevisionPages( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - metadata: boolean; - } -) { - 'use cache'; - - return trace('getRevisionPages.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.listPagesInRevisionById( - params.spaceId, - params.revisionId, - { - metadata: params.metadata, - } - ); - return res.data.pages; - }); - }); -}); - -const getRevisionFile = memoize(async function getRevisionFile( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - fileId: string; - } -) { - 'use cache'; - - return trace('getRevisionFile.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getFileInRevisionById( - params.spaceId, - params.revisionId, - params.fileId, - {} - ); - return res.data; - }); - }); -}); - -const getRevisionPageMarkdown = memoize(async function getRevisionPageMarkdown( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - pageId: string; - } -) { - 'use cache'; - - return trace('getRevisionPageMarkdown.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getPageInRevisionById( - params.spaceId, - params.revisionId, - params.pageId, - { - format: 'markdown', - } - ); - - if (!('markdown' in res.data)) { - throw new DataFetcherError('Page is not a document', 404); - } - - return res.data.markdown; - }); - }); -}); - -const getRevisionPageByPath = memoize(async function getRevisionPageByPath( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - path: string; - } -) { - 'use cache'; - - return trace('getRevisionPageByPath.uncached', () => { - cacheLife('max'); - - const encodedPath = encodeURIComponent(params.path); - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getPageInRevisionByPath( - params.spaceId, - params.revisionId, - encodedPath, - {} - ); - - return res.data; - }); - }); -}); - -const getDocument = memoize(async function getDocument( - input: DataFetcherInput, - params: { - spaceId: string; - documentId: string; - } -) { - 'use cache'; - - return trace('getDocument.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getDocumentById(params.spaceId, params.documentId, {}); - return res.data; - }); - }); -}); - -const getComputedDocument = memoize(async function getComputedDocument( - input: DataFetcherInput, - params: { - spaceId: string; - organizationId: string; - source: ComputedContentSource; - seed: string; - } -) { - 'use cache'; - - return trace('getComputedDocument.uncached', () => { - cacheLife('days'); - - cacheTag( - ...getComputedContentSourceCacheTags( - { - spaceId: params.spaceId, - organizationId: params.organizationId, - }, - params.source - ) - ); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getComputedDocument(params.spaceId, { - source: params.source, - seed: params.seed, - }); - return res.data; - }); - }); -}); - -const getReusableContent = memoize(async function getReusableContent( - input: DataFetcherInput, - params: { - spaceId: string; - revisionId: string; - reusableContentId: string; - } -) { - 'use cache'; - - return trace('getReusableContent.uncached', () => { - cacheLife('max'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getReusableContentInRevisionById( - params.spaceId, - params.revisionId, - params.reusableContentId - ); - return res.data; - }); - }); -}); - -const getLatestOpenAPISpecVersionContent = memoize( - async function getLatestOpenAPISpecVersionContent( - input: DataFetcherInput, - params: { - organizationId: string; - slug: string; - } - ) { - 'use cache'; - - return trace('getLatestOpenAPISpecVersionContent.uncached', () => { - cacheTag( - getCacheTag({ - tag: 'openapi', - organization: params.organizationId, - openAPISpec: params.slug, - }) - ); - cacheLife('days'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.orgs.getLatestOpenApiSpecVersionContent( - params.organizationId, - params.slug - ); - return res.data; - }); - }); - } -); - -const getPublishedContentSite = memoize(async function getPublishedContentSite( - input: DataFetcherInput, - params: { - organizationId: string; - siteId: string; - siteShareKey: string | undefined; - } -) { - 'use cache'; - - return trace('getPublishedContentSite.uncached', () => { - cacheLife('days'); - cacheTag( - getCacheTag({ - tag: 'site', - site: params.siteId, - }) - ); - - return trace('getPublishedContentSite', () => { - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.orgs.getPublishedContentSite( - params.organizationId, - params.siteId, - { - shareKey: params.siteShareKey, - } - ); - return res.data; - }); - }); - }); -}); - -const getSiteRedirectBySource = memoize(async function getSiteRedirectBySource( - input: DataFetcherInput, - params: { - organizationId: string; - siteId: string; - siteShareKey: string | undefined; - source: string; - } -) { - 'use cache'; - - return trace('getSiteRedirectBySource.uncached', () => { - cacheTag( - getCacheTag({ - tag: 'site', - site: params.siteId, - }) - ); - cacheLife('days'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.orgs.getSiteRedirectBySource( - params.organizationId, - params.siteId, - { - shareKey: params.siteShareKey, - source: params.source, - } - ); - - return res.data; - }); - }); -}); - -const getEmbedByUrl = memoize(async function getEmbedByUrl( - input: DataFetcherInput, - params: { - url: string; - spaceId: string; - } -) { - 'use cache'; - - return trace('getEmbedByUrl.uncached', () => { - cacheLife('weeks'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.spaces.getEmbedByUrlInSpace(params.spaceId, { url: params.url }); - return res.data; - }); - }); -}); - -const searchSiteContent = memoize(async function searchSiteContent( - input: DataFetcherInput, - params: Parameters[0] -) { - 'use cache'; - - return trace('searchSiteContent.uncached', () => { - const { organizationId, siteId, query, scope } = params; - - cacheLife('days'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.orgs.searchSiteContent(organizationId, siteId, { - query, - ...scope, - }); - return res.data.items; - }); - }); -}); - -const renderIntegrationUi = memoize(async function renderIntegrationUi( - input: DataFetcherInput, - params: { - integrationName: string; - request: RenderIntegrationUI; - } -) { - 'use cache'; - - return trace('renderIntegrationUi.uncached', () => { - cacheTag(getCacheTag({ tag: 'integration', integration: params.integrationName })); - cacheLife('days'); - - return wrapDataFetcherError(async () => { - const api = await apiClient(input); - const res = await api.integrations.renderIntegrationUiWithPost( - params.integrationName, - params.request - ); - return res.data; - }); - }); -}); - -let loggedServiceBinding = false; - -/** - * Create a new API client. - */ -export async function apiClient(input: DataFetcherInput = { apiToken: null }) { - const { apiToken } = input; - let serviceBinding: GitBookAPIServiceBinding | undefined; - - try { - // HACK: This is a workaround to avoid webpack trying to bundle this cloudflare only module - // @ts-ignore - const { env } = await import( - /* webpackIgnore: true */ `${'__cloudflare:workers'.replaceAll('_', '')}` - ); - serviceBinding = env.GITBOOK_API; - if (!loggedServiceBinding) { - loggedServiceBinding = true; - if (serviceBinding) { - // biome-ignore lint/suspicious/noConsole: we want to log here - console.log(`using service binding for the API (${GITBOOK_API_URL})`); - } else { - // biome-ignore lint/suspicious/noConsole: we want to log here - console.warn(`no service binding for the API (${GITBOOK_API_URL})`); - } - } - } catch (error) { - if (process.env.NODE_ENV === 'production' && !process.env.VERCEL) { - throw error; - } - } - - const api = new GitBookAPI({ - authToken: apiToken || GITBOOK_API_TOKEN || undefined, - endpoint: GITBOOK_API_URL, - userAgent: GITBOOK_USER_AGENT, - serviceBinding, - }); - - return api; -} diff --git a/packages/gitbook-v2/src/lib/data/memoize.test.ts b/packages/gitbook-v2/src/lib/data/memoize.test.ts deleted file mode 100644 index 4764d52a7f..0000000000 --- a/packages/gitbook-v2/src/lib/data/memoize.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { describe, expect, it, mock } from 'bun:test'; -import { memoize } from './memoize'; - -describe('memoize', () => { - it('should memoize the function', async () => { - const fn = mock(async () => Math.random()); - const memoized = memoize(fn); - expect(await memoized()).toBe(await memoized()); - }); - - it('should memoize the function with different arguments', async () => { - const fn = mock(async (a: number, b: number) => a + b); - const memoized = memoize(fn); - expect(await memoized(1, 2)).toBe(await memoized(1, 2)); - expect(fn.mock.calls.length).toBe(1); - expect(await memoized(1, 2)).not.toBe(await memoized(2, 3)); - expect(fn.mock.calls.length).toBe(2); - }); - - it('should memoize a function complex object', async () => { - const fn = mock(async (a: { foo: string; bar: number }) => a.foo + a.bar); - const memoized = memoize(fn); - expect(await memoized({ foo: 'foo', bar: 1 })).toBe(await memoized({ foo: 'foo', bar: 1 })); - expect(fn.mock.calls.length).toBe(1); - expect(await memoized({ foo: 'foo', bar: 1 })).not.toBe( - await memoized({ foo: 'foo', bar: 2 }) - ); - expect(fn.mock.calls.length).toBe(2); - }); - - it('should wrap concurrent async calls', async () => { - const fn = mock(async () => Math.random()); - const memoized = memoize(fn); - const promise1 = memoized(); - const promise2 = memoized(); - expect(await promise1).toBe(await promise2); - expect(fn.mock.calls.length).toBe(1); - }); -}); diff --git a/packages/gitbook-v2/src/lib/data/memoize.ts b/packages/gitbook-v2/src/lib/data/memoize.ts deleted file mode 100644 index 9b5ca74d7f..0000000000 --- a/packages/gitbook-v2/src/lib/data/memoize.ts +++ /dev/null @@ -1,43 +0,0 @@ -import pMemoize from 'p-memoize'; - -/** - * We wrap 'use cache' calls in a p-memoize function to avoid - * executing the function multiple times when doing concurrent calls. - * - * Hopefully one day this can be done directly by 'use cache'. - */ -export function memoize any>(f: F): F { - return pMemoize(f, { - cacheKey: (args) => { - return JSON.stringify(deepSortValue(args)); - }, - }); -} - -function deepSortValue(value: unknown): unknown { - if ( - typeof value === 'string' || - typeof value === 'number' || - typeof value === 'boolean' || - value === null || - value === undefined - ) { - return value; - } - - if (Array.isArray(value)) { - return value.map(deepSortValue); - } - - if (value && typeof value === 'object') { - return Object.entries(value) - .map(([key, subValue]) => { - return [key, deepSortValue(subValue)] as const; - }) - .sort((a, b) => { - return a[0].localeCompare(b[0]); - }); - } - - return value; -} diff --git a/packages/gitbook-v2/src/lib/data/pages.ts b/packages/gitbook-v2/src/lib/data/pages.ts deleted file mode 100644 index 4324254d9b..0000000000 --- a/packages/gitbook-v2/src/lib/data/pages.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { JSONDocument, RevisionPageDocument, Space } from '@gitbook/api'; -import { getDataOrNull } from './errors'; -import type { GitBookDataFetcher } from './types'; - -/** - * Get the document for a page. - */ -export async function getPageDocument( - dataFetcher: GitBookDataFetcher, - space: Space, - page: RevisionPageDocument -): Promise { - if (page.documentId) { - return getDataOrNull( - dataFetcher.getDocument({ spaceId: space.id, documentId: page.documentId }) - ); - } - if ('computed' in page && page.computed) { - return getDataOrNull( - dataFetcher.getComputedDocument({ - organizationId: space.organization, - spaceId: space.id, - source: page.computed, - seed: page.computedSeed, - }) - ); - } - - return null; -} diff --git a/packages/gitbook-v2/src/lib/images/createImageResizer.ts b/packages/gitbook-v2/src/lib/images/createImageResizer.ts deleted file mode 100644 index b8173b9ed9..0000000000 --- a/packages/gitbook-v2/src/lib/images/createImageResizer.ts +++ /dev/null @@ -1,243 +0,0 @@ -import 'server-only'; - -import { GITBOOK_IMAGE_RESIZE_SIGNING_KEY, GITBOOK_IMAGE_RESIZE_URL } from '../env'; -import type { GitBookLinker } from '../links'; -import { type SignatureVersion, generateImageSignature } from './signatures'; -import type { ImageResizer } from './types'; - -interface CloudflareImageJsonFormat { - width: number; - height: number; - original: { - file_size: number; - width: number; - height: number; - format: string; - }; -} - -/** - * https://developers.cloudflare.com/images/image-resizing/resize-with-workers/ - */ -export interface CloudflareImageOptions { - format?: 'webp' | 'avif' | 'json' | 'jpeg'; - fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad'; - width?: number; - height?: number; - dpr?: number; - anim?: boolean; - quality?: number; -} - -/** - * Create an image resizer for a rendering context. - */ -export function createImageResizer({ - imagesContextId, - linker, -}: { - /** The linker to use to create URLs. */ - linker: GitBookLinker; - /** The site identifier to use for verifying the image signature. */ - imagesContextId: string; -}): ImageResizer { - if (!GITBOOK_IMAGE_RESIZE_URL || !GITBOOK_IMAGE_RESIZE_SIGNING_KEY) { - return createNoopImageResizer(); - } - - return { - getResizedImageURL: (urlInput) => { - if (!checkIsSizableImageURL(urlInput)) { - return null; - } - - let cachedSignature: { - signature: string; - version: SignatureVersion; - } | null = null; - - return async (options) => { - cachedSignature ??= await generateImageSignature({ - imagesContextId, - url: urlInput, - }); - - const url = linker.toAbsoluteURL(linker.toPathInSite('/~gitbook/image')); - const searchParams = new URLSearchParams(); - searchParams.set('url', getImageAPIUrl(urlInput)); - - if (options.width) { - searchParams.set('width', options.width.toString()); - } - if (options.height) { - searchParams.set('height', options.height.toString()); - } - if (options.dpr) { - searchParams.set('dpr', options.dpr.toString()); - } - if (options.quality) { - searchParams.set('quality', options.quality.toString()); - } - - searchParams.set('sign', cachedSignature.signature); - searchParams.set('sv', cachedSignature.version); - - return `${url}?${searchParams.toString()}`; - }; - }, - - getImageSize: async (input, options) => { - if (!checkIsSizableImageURL(input)) { - return null; - } - - return getImageSize(input, options); - }, - }; -} - -/** - * Create an image resizer that doesn't do any resizing. - */ -export function createNoopImageResizer(): ImageResizer { - return { - getResizedImageURL: () => null, - getImageSize: async (_input) => null, - }; -} - -/** - * Check if a URL is an HTTP URL. - */ -export function checkIsHttpURL(input: string | URL): boolean { - if (!URL.canParse(input)) { - return false; - } - const parsed = new URL(input); - return parsed.protocol === 'http:' || parsed.protocol === 'https:'; -} - -/** - * Check if an image URL is resizable. - * Skip it for non-http(s) URLs (data, etc). - * Skip it for SVGs. - * Skip it for GitBook images (to avoid recursion). - */ -export function checkIsSizableImageURL(input: string): boolean { - if (!URL.canParse(input)) { - return false; - } - - if (input.includes('/~gitbook/image')) { - return false; - } - - const parsed = new URL(input); - if (parsed.pathname.endsWith('.svg') || parsed.pathname.endsWith('.avif')) { - return false; - } - if (!checkIsHttpURL(parsed)) { - return false; - } - - return true; -} - -/** - * Get the size of an image. - */ -export async function getImageSize( - input: string, - defaultSize: Partial = {} -): Promise<{ width: number; height: number } | null> { - if (!checkIsSizableImageURL(input)) { - return null; - } - - try { - const response = await resizeImage(input, { - // Abort the request after 2 seconds to avoid blocking rendering for too long - signal: AbortSignal.timeout(2000), - // Measure size and resize it to the most common size - // to optimize caching - ...defaultSize, - format: 'json', - anim: false, - }); - - const json = (await response.json()) as CloudflareImageJsonFormat; - return { - width: json.original.width, - height: json.original.height, - }; - } catch (_error) { - return null; - } -} - -/** - * Execute a Cloudflare Image Resize operation on an image. - */ -export async function resizeImage( - input: string, - options: CloudflareImageOptions & { - signal?: AbortSignal; - } -): Promise { - const { signal, ...resizeOptions } = options; - - const parsed = new URL(input); - if (parsed.protocol === 'data:') { - throw new Error('Cannot resize data: URLs'); - } - - if (parsed.hostname === 'localhost') { - throw new Error('Cannot resize localhost URLs'); - } - - // Since Cloudflare Images options on fetch are not supported on Cloudflare Pages, - // we need to use the Cloudflare Image Resize API directly. - if (!GITBOOK_IMAGE_RESIZE_URL) { - throw new Error('GITBOOK_IMAGE_RESIZE_URL is not set'); - } - - return await fetch( - `${GITBOOK_IMAGE_RESIZE_URL}${stringifyOptions( - resizeOptions - )}/${encodeURIComponent(input)}`, - { - headers: { - // Pass the `Accept` header, as Cloudflare uses this to validate the format. - Accept: - resizeOptions.format === 'json' - ? 'application/json' - : `image/${resizeOptions.format || 'jpeg'}`, - }, - signal, - } - ); -} - -function stringifyOptions(options: CloudflareImageOptions): string { - return Object.entries({ ...options }).reduce((rest, [key, value]) => { - return `${rest}${rest ? ',' : ''}${key}=${value}`; - }, ''); -} - -/** - * Because of a bug in Cloudflare, 127.0.0.1 is replaced by localhost. - * We protect against it by converting to a special token, and then parsing - * the token in the image API. - */ -const GITBOOK_LOCALHOST_TOKEN = '$GITBOOK_LOCALHOST$'; - -/** - * Prepare a URL for the GitBook Open Image API. - */ -export function getImageAPIUrl(url: string): string { - return url.replaceAll('127.0.0.1', GITBOOK_LOCALHOST_TOKEN); -} - -export function parseImageAPIURL(url: string): string { - return url.replaceAll(GITBOOK_LOCALHOST_TOKEN, '127.0.0.1'); -} diff --git a/packages/gitbook-v2/src/lib/images/getImageResizingContextId.ts b/packages/gitbook-v2/src/lib/images/getImageResizingContextId.ts deleted file mode 100644 index 58b5608bbb..0000000000 --- a/packages/gitbook-v2/src/lib/images/getImageResizingContextId.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Get the site identifier to use for image resizing for an incoming request. - * This identifier can be obtained before resolving the request URL. - */ -export function getImageResizingContextId(url: URL): string { - if (url.host === 'proxy.gitbook.site' || url.host === 'proxy.gitbook-staging.site') { - // For proxy requests, we extract the site ID from the pathname - // e.g. https://proxy.gitbook.site/site/siteId/... - const pathname = url.pathname.slice(1).split('/'); - return pathname.slice(0, 2).join('/'); - } - - return url.host; -} diff --git a/packages/gitbook-v2/src/lib/links.test.ts b/packages/gitbook-v2/src/lib/links.test.ts deleted file mode 100644 index 26a2464f50..0000000000 --- a/packages/gitbook-v2/src/lib/links.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { describe, expect, it } from 'bun:test'; -import { createLinker } from './links'; - -const root = createLinker({ - host: 'docs.company.com', - spaceBasePath: '/', - siteBasePath: '/', -}); - -const variantInSection = createLinker({ - host: 'docs.company.com', - spaceBasePath: '/section/variant', - siteBasePath: '/', -}); - -const siteGitBookIO = createLinker({ - host: 'org.gitbook.io', - spaceBasePath: '/sitename/variant/', - siteBasePath: '/sitename/', -}); - -describe('toPathInContent', () => { - it('should return the correct path', () => { - expect(root.toPathInSpace('some/path')).toBe('/some/path'); - expect(variantInSection.toPathInSpace('some/path')).toBe('/section/variant/some/path'); - }); - - it('should handle leading slash', () => { - expect(root.toPathInSpace('/some/path')).toBe('/some/path'); - expect(variantInSection.toPathInSpace('/some/path')).toBe('/section/variant/some/path'); - }); -}); - -describe('toPathInSite', () => { - it('should return the correct path', () => { - expect(root.toPathInSite('some/path')).toBe('/some/path'); - expect(siteGitBookIO.toPathInSite('some/path')).toBe('/sitename/some/path'); - }); -}); - -describe('toRelativePathInSite', () => { - it('should return the correct path', () => { - expect(root.toRelativePathInSite('/some/path')).toBe('some/path'); - expect(siteGitBookIO.toRelativePathInSite('/sitename/some/path')).toBe('some/path'); - }); - - it('should preserve absolute paths outside of the site', () => { - expect(siteGitBookIO.toRelativePathInSite('/outside/some/path')).toBe('/outside/some/path'); - }); -}); - -describe('toAbsoluteURL', () => { - it('should return the correct path', () => { - expect(root.toAbsoluteURL('some/path')).toBe('https://docs.company.com/some/path'); - expect(variantInSection.toAbsoluteURL('some/path')).toBe( - 'https://docs.company.com/some/path' - ); - }); -}); - -describe('toLinkForContent', () => { - it('should return the correct path', () => { - expect(root.toLinkForContent('https://docs.company.com/some/path')).toBe('/some/path'); - expect(siteGitBookIO.toLinkForContent('https://org.gitbook.io/sitename/some/path')).toBe( - '/sitename/some/path' - ); - }); - - it('should preserve an absolute URL if the site is not the same', () => { - expect(siteGitBookIO.toLinkForContent('https://org.gitbook.io/anothersite/some/path')).toBe( - 'https://org.gitbook.io/anothersite/some/path' - ); - }); -}); diff --git a/packages/gitbook-v2/src/lib/links.ts b/packages/gitbook-v2/src/lib/links.ts deleted file mode 100644 index 857345703c..0000000000 --- a/packages/gitbook-v2/src/lib/links.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { getPagePath } from '@/lib/pages'; -import { withLeadingSlash, withTrailingSlash } from '@/lib/paths'; -import type { RevisionPage, RevisionPageDocument, RevisionPageGroup } from '@gitbook/api'; -import warnOnce from 'warn-once'; - -/** - * Generic interface to generate links based on a given context. - * - * URL levels: - * - * https://docs.company.com/basename/section/variant/page - * - * toPathInSpace('some/path') => /basename/section/variant/some/path - * toPathInSite('some/path') => /basename/some/path - * toPathForPage({ pages, page }) => /basename/section/variant/some/path - * toAbsoluteURL('some/path') => https://docs.company.com/some/path - */ -export interface GitBookLinker { - /** - * Generate an absolute path for a relative path to the current content. - */ - toPathInSpace(relativePath: string): string; - - /** - * Generate an absolute path for a relative path to the current site. - */ - toPathInSite(relativePath: string): string; - - /** - * Transform an absolute path in a site, to a relative path from the root of the site. - */ - toRelativePathInSite(absolutePath: string): string; - - /** - * Generate an absolute path for a page in the current content. - * The result should NOT be passed to `toPathInContent`. - */ - toPathForPage(input: { - pages: RevisionPage[]; - page: RevisionPageDocument | RevisionPageGroup; - anchor?: string; - }): string; - - /** - * Generate an absolute URL for a given path relative to the host of the current content. - */ - toAbsoluteURL(absolutePath: string): string; - - /** - * Generate a link (URL or path) for a GitBook content URL (url of another site) - */ - toLinkForContent(url: string): string; -} - -/** - * Create a linker to resolve links in a context being served on a specific URL. - */ -export function createLinker( - /** Where the top of the space is served on */ - servedOn: { - protocol?: string; - host?: string; - - /** The base path of the space */ - spaceBasePath: string; - - /** The base path of the site */ - siteBasePath: string; - } -): GitBookLinker { - warnOnce(!servedOn.host, 'No host provided to createLinker. It can lead to issues with links.'); - - const siteBasePath = withTrailingSlash(withLeadingSlash(servedOn.siteBasePath)); - const spaceBasePath = withTrailingSlash(withLeadingSlash(servedOn.spaceBasePath)); - - const linker: GitBookLinker = { - toPathInSpace(relativePath: string): string { - return joinPaths(spaceBasePath, relativePath); - }, - - toPathInSite(relativePath: string): string { - return joinPaths(siteBasePath, relativePath); - }, - - toRelativePathInSite(absolutePath: string): string { - const normalizedPath = withLeadingSlash(absolutePath); - - if (!normalizedPath.startsWith(servedOn.siteBasePath)) { - return normalizedPath; - } - - return normalizedPath.slice(servedOn.siteBasePath.length); - }, - - toAbsoluteURL(absolutePath: string): string { - if (!servedOn.host) { - return absolutePath; - } - - return `${servedOn.protocol ?? 'https:'}//${joinPaths(servedOn.host, absolutePath)}`; - }, - - toPathForPage({ pages, page, anchor }) { - return linker.toPathInSpace(getPagePath(pages, page)) + (anchor ? `#${anchor}` : ''); - }, - - toLinkForContent(rawURL: string): string { - const url = new URL(rawURL); - - // If the link points to a content in the same site, we return an absolute path - // instead of a full URL; it makes it possible to use router navigation - if (url.hostname === servedOn.host && url.pathname.startsWith(servedOn.siteBasePath)) { - return url.pathname; - } - - return rawURL; - }, - }; - - return linker; -} - -function joinPaths(prefix: string, path: string): string { - const prefixPath = prefix.endsWith('/') ? prefix : `${prefix}/`; - const suffixPath = path.startsWith('/') ? path.slice(1) : path; - return prefixPath + suffixPath; -} diff --git a/packages/gitbook-v2/src/lib/middleware.ts b/packages/gitbook-v2/src/lib/middleware.ts deleted file mode 100644 index a96bef2498..0000000000 --- a/packages/gitbook-v2/src/lib/middleware.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { CustomizationThemeMode } from '@gitbook/api'; -import { headers } from 'next/headers'; -import type { SiteURLData } from './context'; - -export enum MiddlewareHeaders { - /** - * Type of the route (static or dynamic) - */ - RouteType = 'x-gitbook-route-type', - - /** - * The URL of the site (without the pathname) - */ - SiteURL = 'x-gitbook-site-url', - - /** - * The data associated with the URL. - */ - SiteURLData = 'x-gitbook-site-url-data', - - /** - * The mode of the URL (url or url-host) - */ - URLMode = 'x-gitbook-url-mode', - - /** - * The theme of the page (light or dark) - */ - Theme = 'x-gitbook-theme', - - /** - * The customization override to apply. - */ - Customization = 'x-gitbook-customization', - - /** - * The API token used to fetch the content. - * This should only be passed for non-site dynamic routes. - */ - APIToken = 'x-gitbook-api-token', -} - -/** - * Get the URL mode from the middleware headers. - * This function should only be called in a server action or a dynamic route. - */ -export async function getURLModeFromMiddleware(): Promise<'url' | 'url-host'> { - const headersList = await headers(); - const mode = headersList.get(MiddlewareHeaders.URLMode); - if (!mode) { - throw new Error('URL mode is not set by the middleware'); - } - - return mode as 'url' | 'url-host'; -} - -/** - * Get the site URL data from the middleware headers. - * This function should only be called in a server action or a dynamic route. - */ -export async function getSiteURLDataFromMiddleware(): Promise { - const headersList = await headers(); - const siteURLData = headersList.get(MiddlewareHeaders.SiteURLData); - - if (!siteURLData) { - throw new Error( - 'Site URL data is not set by the middleware. This should only be called in a server action or a dynamic route.' - ); - } - - return JSON.parse(siteURLData); -} - -/** - * Get the URL from the middleware headers. - * This function should only be called in a server action or a dynamic route. - */ -export async function getSiteURLFromMiddleware(): Promise { - const headersList = await headers(); - const siteURL = headersList.get(MiddlewareHeaders.SiteURL); - if (!siteURL) { - throw new Error('URL mode is not set by the middleware'); - } - - return siteURL; -} - -/** - * For preview, the theme can be set via query string (?theme=light). - * This function should only be called in a dynamic route. - */ -export async function getThemeFromMiddleware() { - const headersList = await headers(); - const queryStringTheme = headersList.get(MiddlewareHeaders.Theme); - if (!queryStringTheme) { - return null; - } - - return queryStringTheme === 'light' - ? CustomizationThemeMode.Light - : CustomizationThemeMode.Dark; -} - -/** - * Get the API token from the middleware headers. - * This function should only be called in a dynamic route. - */ -export async function getAPITokenFromMiddleware(): Promise { - const headersList = await headers(); - const apiToken = headersList.get(MiddlewareHeaders.APIToken); - if (!apiToken) { - throw new Error('API token is not set by the middleware'); - } - - return apiToken; -} diff --git a/packages/gitbook-v2/src/middleware.ts b/packages/gitbook-v2/src/middleware.ts deleted file mode 100644 index ae5aa4a368..0000000000 --- a/packages/gitbook-v2/src/middleware.ts +++ /dev/null @@ -1,469 +0,0 @@ -import { CustomizationThemeMode } from '@gitbook/api'; -import type { NextRequest } from 'next/server'; -import { NextResponse } from 'next/server'; -import rison from 'rison'; - -import { getContentSecurityPolicy } from '@/lib/csp'; -import { validateSerializedCustomization } from '@/lib/customization'; -import { removeLeadingSlash, removeTrailingSlash } from '@/lib/paths'; -import { - type ResponseCookies, - getPathScopedCookieName, - getResponseCookiesForVisitorAuth, - getVisitorToken, - normalizeVisitorAuthURL, -} from '@/lib/visitor-token'; -import { serveResizedImage } from '@/routes/image'; -import { - DataFetcherError, - getPublishedContentByURL, - normalizeURL, - throwIfDataError, -} from '@v2/lib/data'; -import { isGitBookAssetsHostURL, isGitBookHostURL } from '@v2/lib/env'; -import { getImageResizingContextId } from '@v2/lib/images'; -import { MiddlewareHeaders } from '@v2/lib/middleware'; -import type { SiteURLData } from './lib/context'; - -export const config = { - matcher: [ - '/((?!_next/static|_next/image|~gitbook/static|~gitbook/revalidate|~gitbook/monitoring|~scalar/proxy).*)', - ], -}; - -type URLWithMode = { url: URL; mode: 'url' | 'url-host' }; - -export async function middleware(request: NextRequest) { - try { - const requestURL = new URL(request.url); - - // Redirect to normalize the URL - const normalized = normalizeURL(requestURL); - if (normalized.toString() !== requestURL.toString()) { - return NextResponse.redirect(normalized.toString()); - } - - for (const handler of [serveSiteRoutes, serveSpacePDFRoutes]) { - const result = await handler(requestURL, request); - if (result) { - return result; - } - } - - return NextResponse.next(); - } catch (error) { - return serveErrorResponse(error as Error); - } -} - -/** - * Handle request that are targetting the site routes group. - */ -async function serveSiteRoutes(requestURL: URL, request: NextRequest) { - const match = getSiteURLFromRequest(request); - if (!match) { - return null; - } - - const { url: siteRequestURL, mode } = match; - const imagesContextId = getImageResizingContextId(siteRequestURL); - - /** - * Serve image resizing requests (all requests containing `/~gitbook/image`). - * All URLs containing `/~gitbook/image` are rewritten to `/~gitbook/image` - * and serve from a single route handler. - * - * In GitBook v1: image resizing was done at the root of the hostname (docs.company.com/~gitbook/image) - * In GitBook v2: image resizing is done at the content level (docs.company.com/section/variant/~gitbook/image) - */ - if (siteRequestURL.pathname.endsWith('/~gitbook/image')) { - return await serveResizedImage(request, { - imagesContextId: imagesContextId, - }); - } - - // - // Detect and extract the visitor authentication token from the request - // - // @ts-ignore - request typing - const visitorToken = getVisitorToken({ - cookies: request.cookies.getAll(), - url: siteRequestURL, - }); - - const withAPIToken = async (apiToken: string | null) => { - const siteURLData = await throwIfDataError( - getPublishedContentByURL({ - url: siteRequestURL.toString(), - visitorAuthToken: visitorToken?.token ?? null, - // When the visitor auth token is pulled from the cookie, set redirectOnError when calling getPublishedContentByUrl to allow - // redirecting when the token is invalid as we could be dealing with stale token stored in the cookie. - // For example when the VA backend signature has changed but the token stored in the cookie is not yet expired. - redirectOnError: visitorToken?.source === 'visitor-auth-cookie', - - // Use the API token passed in the request, if any - // as it could be used for .preview hostnames - apiToken, - }) - ); - const cookies: ResponseCookies = []; - - // - // Handle redirects - // - if ('redirect' in siteURLData) { - // biome-ignore lint/suspicious/noConsole: we want to log the redirect - console.log('redirect', siteURLData.redirect); - if (siteURLData.target === 'content') { - let contentRedirect = new URL(siteURLData.redirect, request.url); - - // For content redirects, we redirect using the /url/:url format - // during development and testing in 'url' mode. - if (mode === 'url') { - const urlObject = new URL(siteURLData.redirect); - contentRedirect = new URL( - `/url/${urlObject.host}${urlObject.pathname}${urlObject.search}`, - request.url - ); - } - - // Keep the same search params as the original request - // as it might contain a VA token - contentRedirect.search = request.nextUrl.search; - - return NextResponse.redirect(contentRedirect); - } - - return NextResponse.redirect(siteURLData.redirect); - } - - cookies.push(...getResponseCookiesForVisitorAuth(siteURLData.siteBasePath, visitorToken)); - - // We use the host/origin from the canonical URL to ensure the links are - // correctly generated when the site is proxied. e.g. https://proxy.gitbook.com/site/siteId/... - const siteCanonicalURL = new URL(siteURLData.canonicalUrl); - - // - // Make sure the URL is clean of any va token after a successful lookup - // The token is stored in a cookie that is set on the redirect response - // - const incomingURL = mode === 'url' ? requestURL : siteCanonicalURL; - const requestURLWithoutToken = normalizeVisitorAuthURL(incomingURL); - if ( - requestURLWithoutToken !== incomingURL && - requestURLWithoutToken.toString() !== incomingURL.toString() - ) { - return writeResponseCookies( - NextResponse.redirect(requestURLWithoutToken.toString()), - cookies - ); - } - - // - // Render and serve the content - // - - // The route is static, except when using dynamic parameters from query params - // (customization override, theme, etc) - let routeType: 'dynamic' | 'static' = 'static'; - - const requestHeaders = new Headers(request.headers); - requestHeaders.set(MiddlewareHeaders.RouteType, routeType); - requestHeaders.set(MiddlewareHeaders.URLMode, mode); - requestHeaders.set( - MiddlewareHeaders.SiteURL, - `${siteCanonicalURL.origin}${siteURLData.basePath}` - ); - requestHeaders.set(MiddlewareHeaders.SiteURLData, JSON.stringify(siteURLData)); - - // Preview of customization/theme - const customization = siteRequestURL.searchParams.get('customization'); - if (customization && validateSerializedCustomization(customization)) { - routeType = 'dynamic'; - requestHeaders.set(MiddlewareHeaders.Customization, customization); - } - const theme = siteRequestURL.searchParams.get('theme'); - if (theme === CustomizationThemeMode.Dark || theme === CustomizationThemeMode.Light) { - routeType = 'dynamic'; - requestHeaders.set(MiddlewareHeaders.Theme, theme); - } - - // We support forcing dynamic routes by setting a `gitbook-dynamic-route` cookie - // This is useful for testing dynamic routes. - if (request.cookies.has('gitbook-dynamic-route')) { - routeType = 'dynamic'; - } - - // Pass a x-forwarded-host and origin that are equal to ensure Next doesn't block server actions when proxied - requestHeaders.set('x-forwarded-host', request.nextUrl.host); - requestHeaders.set('origin', request.nextUrl.origin); - - const siteURLWithoutProtocol = `${siteCanonicalURL.host}${siteURLData.basePath}`; - const { pathname, routeType: routeTypeFromPathname } = encodePathInSiteContent( - siteURLData.pathname - ); - routeType = routeTypeFromPathname ?? routeType; - - // We pick only stable data from the siteURL data to prevent re-rendering of - // the root layout when changing pages.. - const stableSiteURLData: SiteURLData = { - site: siteURLData.site, - siteSection: siteURLData.siteSection, - siteSpace: siteURLData.siteSpace, - siteBasePath: siteURLData.siteBasePath, - basePath: siteURLData.basePath, - space: siteURLData.space, - organization: siteURLData.organization, - changeRequest: siteURLData.changeRequest, - revision: siteURLData.revision, - shareKey: siteURLData.shareKey, - apiToken: siteURLData.apiToken, - imagesContextId: imagesContextId, - }; - - const route = [ - 'sites', - routeType, - mode, - encodeURIComponent(siteURLWithoutProtocol), - encodeURIComponent( - rison.encode( - // rison can't encode undefined values - Object.fromEntries( - Object.entries(stableSiteURLData).filter( - ([_, v]) => typeof v !== 'undefined' - ) - ) - ) - ), - pathname, - ].join('/'); - - console.log(`rewriting ${request.nextUrl.toString()} to ${route}`); - - const rewrittenURL = new URL(`/${route}`, request.nextUrl.toString()); - const response = NextResponse.rewrite(rewrittenURL, { - request: { - headers: requestHeaders, - }, - }); - - // Add Content Security Policy header - response.headers.set('content-security-policy', getContentSecurityPolicy()); - // Basic security headers - response.headers.set('strict-transport-security', 'max-age=31536000'); - response.headers.set('referrer-policy', 'no-referrer-when-downgrade'); - response.headers.set('x-content-type-options', 'nosniff'); - // Debug header - response.headers.set('x-gitbook-route-type', routeType); - response.headers.set('x-gitbook-route-site', siteURLWithoutProtocol); - - return writeResponseCookies(response, cookies); - }; - - // For https://preview/ requests, - if (siteRequestURL.hostname === 'preview') { - return serveWithQueryAPIToken( - // We scope the API token to the site ID. - `${siteRequestURL.hostname}/${requestURL.pathname.slice(1).split('/')[0]}`, - request, - withAPIToken - ); - } - - return withAPIToken(null); -} - -/** - * Serve routes for PDF export for a space: /~space/:spaceId/~gitbook/pdf - */ -async function serveSpacePDFRoutes(requestURL: URL, request: NextRequest) { - const pathnameParts = requestURL.pathname.slice(1).split('/'); - if (pathnameParts[0] !== '~space' && pathnameParts[0] !== '~site') { - return null; - } - - return serveWithQueryAPIToken( - pathnameParts.slice(0, 2).join('/'), - request, - async (apiToken) => { - // Handle the rest with the router default logic - return NextResponse.next({ - headers: { - [MiddlewareHeaders.APIToken]: apiToken, - }, - }); - } - ); -} - -/** - * Serve an error response. - */ -function serveErrorResponse(error: Error) { - if (error instanceof DataFetcherError) { - return new Response(error.message, { - status: error.code, - headers: { 'content-type': 'text/plain' }, - }); - } - - throw error; -} - -/** - * Server a response with an API token obtained from the query params. - */ -async function serveWithQueryAPIToken( - scopePath: string, - request: NextRequest, - serve: (apiToken: string) => Promise -) { - // We store the API token in a cookie that is scoped to the specific route - // to avoid errors when multiple previews are opened in different tabs. - const cookieName = getPathScopedCookieName('gitbook-api-token', scopePath); - - // Extract a potential GitBook API token passed in the request - // If found, we redirect to the same URL but with the token in the cookie - const queryAPIToken = request.nextUrl.searchParams.get('token'); - if (queryAPIToken) { - request.nextUrl.searchParams.delete('token'); - return writeResponseCookies(NextResponse.redirect(request.nextUrl.toString()), [ - { - name: cookieName, - value: queryAPIToken, - options: { - httpOnly: true, - sameSite: process.env.NODE_ENV === 'production' ? 'none' : undefined, - secure: process.env.NODE_ENV === 'production', - maxAge: 60 * 60, // 1 hour - }, - }, - ]); - } - - const apiToken = request.cookies.get(cookieName)?.value; - if (!apiToken) { - throw new DataFetcherError('Missing API token', 400); - } - - return serve(apiToken); -} - -/** - * The URL of the GitBook content can be passed in 3 different ways (in order of priority): - * - The request has a `X-GitBook-URL` header: - * URL is taken from the header. - * - The request has a `X-Forwarded-Host` header: - * Host is taken from the header, pathname is taken from the request URL. - * - The request URL is matching `/url/:url`: - * URL is taken from the pathname. - */ -function getSiteURLFromRequest(request: NextRequest): URLWithMode | null { - const xGitbookUrl = request.headers.get('x-gitbook-url'); - if (xGitbookUrl) { - return { - url: appendQueryParams(new URL(xGitbookUrl), request.nextUrl.searchParams), - mode: 'url-host', - }; - } - - const isMainHost = isGitBookHostURL(request.url); - const isAssetsHost = isGitBookAssetsHostURL(request.url); - - // /url/:url requests on the main host - const prefix = '/url/'; - if (isMainHost && request.nextUrl.pathname.startsWith(prefix)) { - return { - url: appendQueryParams( - new URL(`https://${request.nextUrl.pathname.slice(prefix.length)}`), - request.nextUrl.searchParams - ), - mode: 'url', - }; - } - - // Skip other requests to main hosts - if (isMainHost || isAssetsHost) { - return null; - } - - const xForwardedHost = request.headers.get('x-forwarded-host'); - // The x-forwarded-host is set by Vercel for all requests - // so we ignore it if the hostname is the same as the instance one. - if (xForwardedHost) { - return { - url: appendQueryParams( - new URL(`https://${xForwardedHost}${request.nextUrl.pathname}`), - request.nextUrl.searchParams - ), - mode: 'url-host', - }; - } - - return null; -} - -/** - * Encode path in a site content. - * Special paths are not encoded and passed to be handled by the route handlers. - */ -function encodePathInSiteContent(rawPathname: string): { - pathname: string; - routeType?: 'static' | 'dynamic'; -} { - const pathname = removeLeadingSlash(removeTrailingSlash(rawPathname)); - - if (pathname.match(/^~gitbook\/ogimage\/\S+$/)) { - return { pathname }; - } - - // If the pathname is a markdown file, we rewrite it to ~gitbook/markdown/:pathname - if (pathname.match(/\.md$/)) { - const pagePathWithoutMD = pathname.slice(0, -3); - return { - pathname: `~gitbook/markdown/${encodeURIComponent(pagePathWithoutMD)}`, - // The markdown content is always static and doesn't depend on the dynamic parameter (customization, theme, etc) - routeType: 'static', - }; - } - - switch (pathname) { - case '~gitbook/icon': - return { pathname }; - case 'llms.txt': - case 'sitemap.xml': - case 'sitemap-pages.xml': - case 'robots.txt': - // LLMs.txt, sitemap, sitemap-pages and robots.txt are always static - // as they only depend on the site structure / pages. - return { pathname, routeType: 'static' }; - case '~gitbook/pdf': - // PDF routes are always dynamic as they depend on the search params. - return { pathname, routeType: 'dynamic' }; - default: - return { pathname: encodeURIComponent(pathname || '/') }; - } -} - -/** - * Append all the query params from a URL to another URL. - */ -function appendQueryParams(url: URL, from: URLSearchParams) { - for (const [key, value] of from.entries()) { - url.searchParams.set(key, value); - } - - return url; -} - -/** - * Write the cookies to a response. - */ -function writeResponseCookies(response: R, cookies: ResponseCookies): R { - cookies.forEach((cookie) => { - response.cookies.set(cookie.name, cookie.value, cookie.options); - }); - - return response; -} diff --git a/packages/gitbook-v2/tailwind.config.ts b/packages/gitbook-v2/tailwind.config.ts deleted file mode 100644 index 10e1dd03c8..0000000000 --- a/packages/gitbook-v2/tailwind.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import config from '../gitbook/tailwind.config'; - -export default { - ...config, - content: [ - '../gitbook/src/pages/**/*.{js,ts,jsx,tsx,mdx}', - '../gitbook/src/components/**/*.{js,ts,jsx,tsx,mdx}', - '../gitbook/src/app/**/*.{js,ts,jsx,tsx,mdx}', - ], -}; diff --git a/packages/gitbook-v2/tsconfig.json b/packages/gitbook-v2/tsconfig.json deleted file mode 100644 index 2e01d01539..0000000000 --- a/packages/gitbook-v2/tsconfig.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "incremental": true, - "module": "esnext", - "esModuleInterop": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@v2/*": ["./src/*"], - "@/*": ["../gitbook/src/*"] - }, - "types": [ - "bun-types" // add Bun global - ] - }, - "include": [ - "next-env.d.ts", - ".next/types/**/*.ts", - "**/*.ts", - "**/*.tsx", - "../gitbook/types/**/*.d.ts", - "../gitbook/cf-env.d.ts" - ], - "exclude": [ - "node_modules", - "packages/openapi-parser", - "packages/react-openapi", - "packages/react-math", - "packages/gitbook" - ] -} diff --git a/packages/gitbook-v2/turbo.json b/packages/gitbook-v2/turbo.json deleted file mode 100644 index d4e12743eb..0000000000 --- a/packages/gitbook-v2/turbo.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": ["//"], - "tasks": { - "generate": { - "outputs": ["public"] - }, - "typecheck": { - "dependsOn": ["^typecheck"] - } - } -} diff --git a/packages/gitbook-v2/wrangler.toml b/packages/gitbook-v2/wrangler.toml deleted file mode 100644 index 86e45433b1..0000000000 --- a/packages/gitbook-v2/wrangler.toml +++ /dev/null @@ -1,50 +0,0 @@ -main = ".open-next/worker.js" -name = "gitbook-open-v2" -compatibility_date = "2025-03-11" -compatibility_flags = ["nodejs_compat", "allow_importable_env"] -assets = { directory = ".open-next/assets", binding = "ASSETS" } -observability = { enabled = true } - -[env.preview] -kv_namespaces = [ - { binding = "NEXT_CACHE_WORKERS_KV", id = "b7dd9cf58bf2458f84812a2d83b3760c" } # gitbook-open-v2-cache-preview -] -d1_databases = [ - { binding = "NEXT_CACHE_D1", database_id = "f59ddb40-ad72-4312-9395-0ac6a129af8e", database_name = "gitbook-open-v2-tags-preview" } -] -services = [ - { binding = "NEXT_CACHE_REVALIDATION_WORKER", service = "gitbook-open-v2-preview" }, - { binding = "GITBOOK_API", service = "gitbook-x-prod-api-cache" } -] - -[env.staging] -routes = [ - { pattern = "open-2c.gitbook-staging.com/*", zone_name = "gitbook-staging.com" }, - { pattern = "static-2c.gitbook-staging.com/*", zone_name = "gitbook-staging.com" } -] -kv_namespaces = [ - { binding = "NEXT_CACHE_WORKERS_KV", id = "a446e25f12b741afb185f1e5b4474f0a" } # gitbook-open-v2-cache-staging -] -d1_databases = [ - { binding = "NEXT_CACHE_D1", database_id = "9df62e39-1f35-4066-83aa-e9b8ed3ac8d5", database_name = "gitbook-open-v2-tags-staging" } -] -services = [ - { binding = "NEXT_CACHE_REVALIDATION_WORKER", service = "gitbook-open-v2-staging" }, - { binding = "GITBOOK_API", service = "gitbook-x-staging-api-cache" } -] - -[env.production] -routes = [ - { pattern = "open-2c.gitbook.com/*", zone_name = "gitbook.com" }, - { pattern = "static-2c.gitbook.com/*", zone_name = "gitbook.com" } -] -kv_namespaces = [ - { binding = "NEXT_CACHE_WORKERS_KV", id = "72379746280d4e79acf24440eea950dc" } # gitbook-open-v2-cache-production -] -d1_databases = [ - { binding = "NEXT_CACHE_D1", database_id = "a6f16fce-5f45-43a9-89a4-7b83ddf25b77", database_name = "gitbook-open-v2-tags-production" } -] -services = [ - { binding = "NEXT_CACHE_REVALIDATION_WORKER", service = "gitbook-open-v2-production" }, - { binding = "GITBOOK_API", service = "gitbook-x-prod-api-cache" } -] diff --git a/packages/gitbook/.env.example b/packages/gitbook/.env.example deleted file mode 100644 index 46fb085b77..0000000000 --- a/packages/gitbook/.env.example +++ /dev/null @@ -1,27 +0,0 @@ -# Configurations - -### API ### - -## API token to use when looking up the published content -# GITBOOK_API_URL=https://api.gitbook.com -# GITBOOK_TOKEN=xxx - -## User agent to use when making requests to the API -# GITBOOK_USER_AGENT=GitBook/1.0.0 -# GITBOOK_USER_AGENT_COMMENT=something - -### URL of the application ### -# NEXT_PUBLIC_GITBOOK_APP_URL=https://app.gitbook.com - -### Image resizing ### -# GITBOOK_IMAGE_RESIZE_SIGNING_KEY=1234567890 -# GITBOOK_IMAGE_RESIZE_URL=https://mycompany.com/cdn-cgi/image/ - -### SEO ### -# GITBOOK_BLOCK_SEARCH_INDEXATION=true - -## Caching -# GITBOOK_OUTPUT_CACHE=true - -### Silent logs -# SILENT=true \ No newline at end of file diff --git a/packages/gitbook/.gitignore b/packages/gitbook/.gitignore index 6c8ac3678d..f7a6b34753 100644 --- a/packages/gitbook/.gitignore +++ b/packages/gitbook/.gitignore @@ -1,3 +1,4 @@ + # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # testing @@ -31,3 +32,8 @@ screenshots/ # Generated public files /public/~gitbook/static/* !/public/~gitbook/static/images + +# cloudflare +.open-next +.wrangler +worker-configuration.d.ts \ No newline at end of file diff --git a/packages/gitbook/CHANGELOG.md b/packages/gitbook/CHANGELOG.md index fbb5ed1ae3..fb855a6305 100644 --- a/packages/gitbook/CHANGELOG.md +++ b/packages/gitbook/CHANGELOG.md @@ -1,5 +1,132 @@ # gitbook +## 0.12.0 + +### Minor Changes + +- 8339e91: Fix images in reusable content across spaces. +- 326e28e: Design tweaks to code blocks and OpenAPI pages +- 3119066: Add support for reusable content across spaces. +- 7d7806d: Pass SVG images through image resizing without resizing them to serve them from optimal host. + +### Patch Changes + +- c4ebb3f: Fix openapi-select hover in responses +- aed79fd: Decrease rounding of header logo +- 42ca7e1: Fix openapi CR preview +- e6ddc0f: Fix URL in sitemap +- 5e975ab: Fix code highlighting for HTTP +- 5d504ff: Fix resolution of links in reusable contents +- 95a1f65: Better print layouts: wrap code blocks & force table column auto-sizing +- 0499966: Fix invalid sitemap.xml generated with relative URLs instead of absolute ones +- 2a805cc: Change OpenAPI schema-optional from `info` to `tint` color +- 580101d: Fix schemas disclosure label causing client error +- 12a455d: Fix OpenAPI layout issues +- 97b7c79: Increase logging around caching behaviour causing page crashes. +- 373f18f: Prevent section group popovers from opening on click +- 3f29206: Update the regex for validating site redirect +- 0c973a3: Always link main logo to the root of the site +- ae5f1ab: Change `Dropdown`s to use Radix's `DropdownMenu` +- 0e201d5: Add border to filled sidebar on gradient theme +- dd043df: Revert investigation work around URL caches. +- 89a5816: Fix OpenAPI disclosure label ("Show properties") misalignment on mobile +- Updated dependencies [c3f6b8c] +- Updated dependencies [d00dc8c] +- Updated dependencies [42ca7e1] +- Updated dependencies [326e28e] +- Updated dependencies [5e975ab] +- Updated dependencies [f7a3470] +- Updated dependencies [580101d] +- Updated dependencies [20ebecb] +- Updated dependencies [80cb52a] +- Updated dependencies [cb5598d] +- Updated dependencies [c6637b0] +- Updated dependencies [a3ec264] + - @gitbook/colors@0.3.3 + - @gitbook/openapi-parser@2.1.4 + - @gitbook/react-openapi@1.3.0 + +## 0.11.1 + +### Patch Changes + +- Updated dependencies [ebc39e9] +- Updated dependencies [b6b09d4] + - @gitbook/react-openapi@1.2.1 + +## 0.11.0 + +### Minor Changes + +- d67699a: Add OpenAPI Webhook block + +### Patch Changes + +- 4b8a621: Show sections tabs only if there is at least two sections +- 8ed1bda: Translate OpenAPI blocks +- 7588cfe: Improve OpenAPIResponses examples and schemas +- Updated dependencies [eeb977f] +- Updated dependencies [3363a18] +- Updated dependencies [d67699a] +- Updated dependencies [8ed1bda] +- Updated dependencies [7588cfe] +- Updated dependencies [ad1dc0b] + - @gitbook/react-openapi@1.2.0 + +## 0.10.1 + +### Patch Changes + +- Updated dependencies [77397ca] + - @gitbook/cache-tags@0.3.1 + +## 0.10.0 + +### Minor Changes + +- b62b101: Do not set cookie to identify visitor for insights when disabled. + +### Patch Changes + +- 95ea22d: Cache AI Page Link summary +- daf41fc: Tweak footer design (and refactor) +- de53946: Fix security issue with injection of "javacript:` url in the back button of PDFs +- b92ecfa: Implement retry logic for the DO cache to prevent when revalidating content. +- 528eee3: Add superscript and subscript text rendering +- aa3357a: Fix OpenAPISchemas description padding +- 168a4fa: Add support for buttons to GitBook. +- 70c4182: Improve OpenAPI schema style +- 2b6c593: Remove stable from x-stability +- 580f7ad: Improve the error message returned by the revalidate endpoint. +- cbd768a: Improve OpenAPI codesample (add OpenAPISelect component) +- c765463: Fix ogimage generation crashing when site is using a custom WOFF2 font +- e59076a: Improve OpenAPI schemas block ungrouped style. Classnames have changed, please refer to this PR to update GBX. +- 29aaba5: Override Scalar's overscroll-behavior +- 90ead98: Better error handling in cache revalidation. +- Updated dependencies [116575c] +- Updated dependencies [cdffd7c] +- Updated dependencies [70c4182] +- Updated dependencies [2b6c593] +- Updated dependencies [cbd768a] +- Updated dependencies [e59076a] +- Updated dependencies [eedefdd] +- Updated dependencies [23cedd2] + - @gitbook/cache-tags@0.3.0 + - @gitbook/colors@0.3.2 + - @gitbook/react-openapi@1.1.10 + - @gitbook/openapi-parser@2.1.3 + +## 0.9.2 + +### Patch Changes + +- da7b369: Fix missing headers in OpenAPIResponses +- 139a805: Fix OpenAPI enum display +- Updated dependencies [da7b369] +- Updated dependencies [da485f5] +- Updated dependencies [139a805] + - @gitbook/react-openapi@1.1.9 + ## 0.9.1 ### Patch Changes @@ -483,7 +610,7 @@ - 4cbcc5b: Rollback of scalar modal while fixing perf issue - 3996110: Optimize images rendered in community ads - 133c3e7: Update design of Checkbox to be more consistent and readable -- 5096f7f: Disable KV cache for docs.gitbook.com as a test, also disable it for change-request to improve consistency +- 5096f7f: Disable KV cache for gitbook.com/docs as a test, also disable it for change-request to improve consistency - 0f1565c: Add optional env `GITBOOK_INTEGRATIONS_HOST` to configure the host serving the integrations - 2ff7ed1: Fix table of contents being visible on mobile when disabled at the page level - b075f0f: Fix accessibility of the table of contents by using `aria-current` instead of `aria-selected` diff --git a/packages/gitbook-v2/README.md b/packages/gitbook/README.md similarity index 100% rename from packages/gitbook-v2/README.md rename to packages/gitbook/README.md diff --git a/packages/gitbook/_routes.json b/packages/gitbook/_routes.json deleted file mode 100644 index 8f1cb3e1a3..0000000000 --- a/packages/gitbook/_routes.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": 1, - "exclude": ["/~gitbook/static/*"] -} diff --git a/packages/gitbook/cf-env.d.ts b/packages/gitbook/cf-env.d.ts deleted file mode 100644 index 3721b9eb05..0000000000 --- a/packages/gitbook/cf-env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { CacheObject } from '@gitbook/cache-do'; - -declare global { - interface CloudflareEnv { - CACHE?: DurableObjectNamespace; - } -} diff --git a/packages/gitbook/e2e/customers.spec.ts b/packages/gitbook/e2e/customers.spec.ts index 7b3b0ce262..325a44b917 100644 --- a/packages/gitbook/e2e/customers.spec.ts +++ b/packages/gitbook/e2e/customers.spec.ts @@ -10,18 +10,18 @@ const testCases: TestsCase[] = [ { name: 'OpenAPI', url: '/snyk-api/reference/apps', run: waitForCookiesDialog }, ], }, - { - name: 'Nexthink', - contentBaseURL: 'https://docs.nexthink.com', - tests: [ - { - name: 'Home', - url: '/', - screenshot: { waitForTOCScrolling: false }, - run: waitForCookiesDialog, - }, - ], - }, + // { + // name: 'Nexthink', + // contentBaseURL: 'https://docs.nexthink.com', + // tests: [ + // { + // name: 'Home', + // url: '/', + // screenshot: { waitForTOCScrolling: false }, + // run: waitForCookiesDialog, + // }, + // ], + // }, { name: 'asiksupport-stg.dto.kemkes.go.id', contentBaseURL: 'https://asiksupport-stg.dto.kemkes.go.id', @@ -92,11 +92,6 @@ const testCases: TestsCase[] = [ contentBaseURL: 'https://book.character.ai', tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], }, - { - name: 'docs.tradeonnova.io', - contentBaseURL: 'https://docs.tradeonnova.io', - tests: [{ name: 'Home', url: '/' }], - }, { name: 'azcoiner.gitbook.io', contentBaseURL: 'https://azcoiner.gitbook.io', @@ -122,11 +117,11 @@ const testCases: TestsCase[] = [ contentBaseURL: 'https://docs.gradient.network', tests: [{ name: 'Home', url: '/' }], }, - { - name: 'mygate-network.gitbook.io', - contentBaseURL: 'https://mygate-network.gitbook.io', - tests: [{ name: 'Home', url: '/' }], - }, + // { + // name: 'mygate-network.gitbook.io', + // contentBaseURL: 'https://mygate-network.gitbook.io', + // tests: [{ name: 'Home', url: '/' }], + // }, { name: 'treasurenft.gitbook.io', contentBaseURL: 'https://treasurenft.gitbook.io', @@ -162,11 +157,11 @@ const testCases: TestsCase[] = [ contentBaseURL: 'https://wiki.redmodding.org', tests: [{ name: 'Home', url: '/' }], }, - { - name: 'docs.cherry-ai.com', - contentBaseURL: 'https://docs.cherry-ai.com', - tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], - }, + // { + // name: 'docs.cherry-ai.com', + // contentBaseURL: 'https://docs.cherry-ai.com', + // tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], + // }, { name: 'docs.snyk.io', contentBaseURL: 'https://docs.snyk.io', @@ -209,11 +204,11 @@ const testCases: TestsCase[] = [ contentBaseURL: 'https://sosovalue-white-paper.gitbook.io', tests: [{ name: 'Home', url: '/' }], }, - { - name: 'docs.revrobotics.com', - contentBaseURL: 'https://docs.revrobotics.com', - tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], - }, + // { + // name: 'docs.revrobotics.com', + // contentBaseURL: 'https://docs.revrobotics.com', + // tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], + // }, { name: 'chartschool.stockcharts.com', contentBaseURL: 'https://chartschool.stockcharts.com', @@ -244,6 +239,15 @@ const testCases: TestsCase[] = [ contentBaseURL: 'https://docs.fluentbit.io', tests: [{ name: 'Home', url: '/', run: waitForCookiesDialog }], }, + { + name: 'run-ai-docs.nvidia.com', + contentBaseURL: 'https://run-ai-docs.nvidia.com', + skip: process.env.ARGOS_BUILD_NAME !== 'customers-v2', + tests: [ + { name: 'Home', url: '/' }, + { name: 'OG Image', url: '/~gitbook/ogimage/h17zQIFwy3MaafVNmItO', mode: 'image' }, + ], + }, ]; runTestCases(testCases); diff --git a/packages/gitbook/e2e/internal.spec.ts b/packages/gitbook/e2e/internal.spec.ts index 4b244a0c4a..5d22b9f60f 100644 --- a/packages/gitbook/e2e/internal.spec.ts +++ b/packages/gitbook/e2e/internal.spec.ts @@ -1,9 +1,11 @@ import { CustomizationBackground, CustomizationCorners, + CustomizationDepth, CustomizationHeaderPreset, CustomizationIconsStyle, CustomizationSidebarListStyle, + CustomizationThemeMode, } from '@gitbook/api'; import { expect } from '@playwright/test'; import jwt from 'jsonwebtoken'; @@ -12,7 +14,7 @@ import { VISITOR_TOKEN_COOKIE, getVisitorAuthCookieName, getVisitorAuthCookieValue, -} from '@/lib/visitor-token'; +} from '@/lib/visitors'; import { getSiteAPIToken } from '../tests/utils'; import { @@ -111,24 +113,24 @@ const testCases: TestsCase[] = [ name: 'Customized variant titles are displayed', url: '', run: async (page) => { - const spaceDrowpdown = page + const spaceDropdown = page .locator('[data-testid="space-dropdown-button"]') .locator('visible=true'); - await spaceDrowpdown.click(); + await spaceDropdown.click(); const variantSelectionDropdown = page.locator( - 'css=[data-testid="space-dropdown-button"] + div' + 'css=[data-testid="dropdown-menu"]' ); // the customized space title await expect( - variantSelectionDropdown.getByRole('link', { + variantSelectionDropdown.getByRole('menuitem', { name: 'Multi-Variants', }) ).toBeVisible(); // the NON-customized space title await expect( - variantSelectionDropdown.getByRole('link', { + variantSelectionDropdown.getByRole('menuitem', { name: 'RFCs', }) ).toBeVisible(); @@ -145,14 +147,17 @@ const testCases: TestsCase[] = [ url: 'api-multi-versions/reference/api-reference/pets', screenshot: false, run: async (page) => { - const spaceDrowpdown = await page + const spaceDropdown = await page .locator('[data-testid="space-dropdown-button"]') .locator('visible=true'); - await spaceDrowpdown.click(); + await spaceDropdown.click(); + const variantSelectionDropdown = page.locator( + 'css=[data-testid="dropdown-menu"]' + ); // Click the second variant in the dropdown - await page - .getByRole('link', { + await variantSelectionDropdown + .getByRole('menuitem', { name: '2.0', }) .click(); @@ -168,14 +173,18 @@ const testCases: TestsCase[] = [ url: 'api-multi-versions-share-links/8tNo6MeXg7CkFMzSSz81/reference/api-reference/pets', screenshot: false, run: async (page) => { - const spaceDrowpdown = await page + const spaceDropdown = await page .locator('[data-testid="space-dropdown-button"]') .locator('visible=true'); - await spaceDrowpdown.click(); + await spaceDropdown.click(); + + const variantSelectionDropdown = page.locator( + 'css=[data-testid="dropdown-menu"]' + ); // Click the second variant in the dropdown - await page - .getByRole('link', { + await variantSelectionDropdown + .getByRole('menuitem', { name: '2.0', }) .click(); @@ -205,14 +214,18 @@ const testCases: TestsCase[] = [ return `api-multi-versions-va/reference/api-reference/pets?jwt_token=${token}`; }, run: async (page) => { - const spaceDrowpdown = await page + const spaceDropdown = await page .locator('[data-testid="space-dropdown-button"]') .locator('visible=true'); - await spaceDrowpdown.click(); + await spaceDropdown.click(); + + const variantSelectionDropdown = page.locator( + 'css=[data-testid="dropdown-menu"]' + ); // Click the second variant in the dropdown - await page - .getByRole('link', { + await variantSelectionDropdown + .getByRole('menuitem', { name: '2.0', }) .click(); @@ -258,7 +271,7 @@ const testCases: TestsCase[] = [ }, { name: 'GitBook', - contentBaseURL: 'https://docs.gitbook.com', + contentBaseURL: 'https://gitbook.com/docs/', tests: [ { name: 'Home', @@ -419,6 +432,91 @@ const testCases: TestsCase[] = [ }, ], }, + { + name: 'llms.txt', + skip: process.env.ARGOS_BUILD_NAME !== 'v2-vercel', + contentBaseURL: 'https://gitbook.gitbook.io/test-gitbook-open/', + tests: [ + { + name: 'llms.txt', + url: 'llms.txt', + screenshot: false, + run: async (_page, response) => { + expect(response?.status()).toBe(200); + expect(response?.headers()['content-type']).toContain('text/markdown'); + }, + }, + ], + }, + { + name: 'llms-full.txt', + skip: process.env.ARGOS_BUILD_NAME !== 'v2-vercel', + contentBaseURL: 'https://gitbook.gitbook.io/test-gitbook-open/', + tests: [ + { + name: 'llms-full.txt', + url: 'llms-full.txt', + screenshot: false, + run: async (_page, response) => { + expect(response?.status()).toBe(200); + expect(response?.headers()['content-type']).toContain('text/markdown'); + }, + }, + ], + }, + { + name: '[page].md', + skip: process.env.ARGOS_BUILD_NAME !== 'v2-vercel', + contentBaseURL: 'https://gitbook.gitbook.io/test-gitbook-open/', + tests: [ + { + name: 'blocks.md', + url: 'blocks.md', + screenshot: false, + run: async (_page, response) => { + expect(response?.status()).toBe(200); + expect(response?.headers()['content-type']).toContain('text/markdown'); + }, + }, + ], + }, + { + name: 'Site subdirectory (proxy)', + skip: process.env.ARGOS_BUILD_NAME !== 'v2-vercel', + contentBaseURL: 'https://nextjs-gbo-proxy.vercel.app/documentation/', + tests: [ + { + name: 'Main', + url: '', + fullPage: true, + }, + ], + }, + { + name: 'Site subdirectory (proxy) with VA', + skip: process.env.ARGOS_BUILD_NAME !== 'v2-vercel', + contentBaseURL: 'https://nextjs-gbo-proxy-va.vercel.app/va/docs/', + tests: [ + { + name: 'Main', + url: () => { + const privateKey = + 'rqSfA6x7eAKx1qDRCDq9aCXwivpUvQ8YkXeDdFvCCUa9QchIcM7pF1iJ4o7AGOU49spmOWjKoIPtX0pVUVQ81w=='; + const token = jwt.sign( + { + name: 'gitbook-open-tests', + }, + privateKey, + { + expiresIn: '24h', + } + ); + return `?jwt_token=${token}`; + }, + fullPage: true, + }, + ], + }, { name: 'Content tests', contentBaseURL: 'https://gitbook.gitbook.io/test-gitbook-open/', @@ -521,11 +619,21 @@ const testCases: TestsCase[] = [ url: 'blocks/emojis', run: waitForCookiesDialog, }, + { + name: 'Icons', + url: 'blocks/icons', + run: waitForCookiesDialog, + }, { name: 'Links', url: 'blocks/links', run: waitForCookiesDialog, }, + { + name: 'Buttons', + url: 'blocks/buttons', + run: waitForCookiesDialog, + }, { name: 'Lists', url: 'blocks/lists', @@ -584,6 +692,7 @@ const testCases: TestsCase[] = [ name: 'Stepper', url: 'blocks/stepper', }, + { name: 'Columns', url: 'blocks/columns' }, ], }, { @@ -600,6 +709,16 @@ const testCases: TestsCase[] = [ url: 'page-options/page-with-cover', run: waitForCookiesDialog, }, + { + name: 'With cover for dark mode', + url: `page-options/page-with-dark-cover${getCustomizationURL({ + themes: { + default: CustomizationThemeMode.Dark, + toggeable: false, + }, + })}`, + run: waitForCookiesDialog, + }, { name: 'With hero cover', url: 'page-options/page-with-hero-cover', @@ -769,6 +888,16 @@ const testCases: TestsCase[] = [ }), run: waitForCookiesDialog, }, + { + name: `With flat and circular corners - Theme mode ${themeMode}`, + url: getCustomizationURL({ + styling: { + depth: CustomizationDepth.Flat, + corners: CustomizationCorners.Circular, + }, + }), + run: waitForCookiesDialog, + }, ]), }, { @@ -797,7 +926,7 @@ const testCases: TestsCase[] = [ ).toBeVisible(); const url = page.url(); expect(url.includes('shared-space-uno')).toBeTruthy(); // same uno site - expect(url.endsWith('/shared')).toBeTruthy(); // correct page + expect(url.endsWith('/shared/')).toBeTruthy(); // correct page }, screenshot: false, }, @@ -817,7 +946,7 @@ const testCases: TestsCase[] = [ ).toBeVisible(); const url = page.url(); expect(url.includes('shared-space-dos')).toBeTruthy(); // same dos site - expect(url.endsWith('/shared')).toBeTruthy(); // correct page + expect(url.endsWith('/shared/')).toBeTruthy(); // correct page }, screenshot: false, }, @@ -837,6 +966,20 @@ const testCases: TestsCase[] = [ }, ], }, + { + name: 'Content Redirects', + contentBaseURL: 'https://gitbook-open-e2e-sites.gitbook.io/gitbook-doc/', + tests: [ + { + name: 'Redirect to new location', + url: '/content-editor/editing-content/inline/redirect-test', + run: async (page) => { + await expect(page.locator('h1')).toHaveText('Redirect test'); + }, + screenshot: false, + }, + ], + }, { name: 'Site Redirects with sections', contentBaseURL: 'https://gitbook-open-e2e-sites.gitbook.io/sections/', diff --git a/packages/gitbook/e2e/pdf.spec.ts b/packages/gitbook/e2e/pdf.spec.ts new file mode 100644 index 0000000000..4798a2a047 --- /dev/null +++ b/packages/gitbook/e2e/pdf.spec.ts @@ -0,0 +1,170 @@ +import { argosScreenshot } from '@argos-ci/playwright'; +import { expect, test } from '@playwright/test'; +import { getContentTestURL } from '../tests/utils'; +import { waitForIcons } from './util'; + +test.describe('PDF export', () => { + test('export all pages as PDF (e2e)', async ({ page }) => { + // Set the header to disable the Vercel toolbar + // But only on the main document as it'd cause CORS issues on other resources + await page.route('**/*', async (route, request) => { + if (request.resourceType() === 'document') { + await route.continue({ + headers: { + ...request.headers(), + 'x-vercel-skip-toolbar': '1', + }, + }); + } else { + await route.continue(); + } + }); + + await page.goto( + getContentTestURL( + 'https://gitbook-open-e2e-sites.gitbook.io/gitbook-doc/~gitbook/pdf?limit=10' + ) + ); + + const printBtn = page.getByTestId('print-button'); + await expect(printBtn).toBeVisible(); + + await argosScreenshot(page, 'pdf - all pages', { + viewports: ['macbook-13'], + argosCSS: ` + /* Hide Intercom */ + .intercom-lightweight-app { + display: none !important; + } + `, + threshold: undefined, + fullPage: true, + beforeScreenshot: async ({ runStabilization }) => { + await runStabilization(); + await waitForIcons(page); + }, + }); + }); + + test('export all pages as PDF (GitBook docs)', async ({ page }) => { + // Set the header to disable the Vercel toolbar + // But only on the main document as it'd cause CORS issues on other resources + await page.route('**/*', async (route, request) => { + if (request.resourceType() === 'document') { + await route.continue({ + headers: { + ...request.headers(), + 'x-vercel-skip-toolbar': '1', + }, + }); + } else { + await route.continue(); + } + }); + + await page.goto(getContentTestURL('https://gitbook.com/docs/~gitbook/pdf?limit=10')); + + const printBtn = page.getByTestId('print-button'); + await expect(printBtn).toBeVisible(); + + await argosScreenshot(page, 'pdf - all pages', { + viewports: ['macbook-13'], + argosCSS: ` + /* Hide Intercom */ + .intercom-lightweight-app { + display: none !important; + } + `, + threshold: undefined, + fullPage: true, + beforeScreenshot: async ({ runStabilization }) => { + await runStabilization(); + await waitForIcons(page); + }, + }); + }); + + test('export a single page as PDF (e2e)', async ({ page }) => { + // Set the header to disable the Vercel toolbar + // But only on the main document as it'd cause CORS issues on other resources + await page.route('**/*', async (route, request) => { + if (request.resourceType() === 'document') { + await route.continue({ + headers: { + ...request.headers(), + 'x-vercel-skip-toolbar': '1', + }, + }); + } else { + await route.continue(); + } + }); + + await page.goto( + getContentTestURL( + 'https://gitbook-open-e2e-sites.gitbook.io/gitbook-doc/~gitbook/pdf?page=Bw7LjWwgTjV8nIV4s7rs&only=yes&limit=2' + ) + ); + + const printBtn = page.getByTestId('print-button'); + await expect(printBtn).toBeVisible(); + + await argosScreenshot(page, 'pdf - all pages', { + viewports: ['macbook-13'], + argosCSS: ` + /* Hide Intercom */ + .intercom-lightweight-app { + display: none !important; + } + `, + threshold: undefined, + fullPage: true, + beforeScreenshot: async ({ runStabilization }) => { + await runStabilization(); + await waitForIcons(page); + }, + }); + }); + + test('export a single page as PDF (GitBook docs)', async ({ page }) => { + // Set the header to disable the Vercel toolbar + // But only on the main document as it'd cause CORS issues on other resources + await page.route('**/*', async (route, request) => { + if (request.resourceType() === 'document') { + await route.continue({ + headers: { + ...request.headers(), + 'x-vercel-skip-toolbar': '1', + }, + }); + } else { + await route.continue(); + } + }); + + await page.goto( + getContentTestURL( + 'https://gitbook.com/docs/~gitbook/pdf?page=DfnNkU49mvLe2ythHAyx&only=yes&limit=2' + ) + ); + + const printBtn = page.getByTestId('print-button'); + await expect(printBtn).toBeVisible(); + + await argosScreenshot(page, 'pdf - all pages', { + viewports: ['macbook-13'], + argosCSS: ` + /* Hide Intercom */ + .intercom-lightweight-app { + display: none !important; + } + `, + threshold: undefined, + fullPage: true, + beforeScreenshot: async ({ runStabilization }) => { + await runStabilization(); + await waitForIcons(page); + }, + }); + }); +}); diff --git a/packages/gitbook/e2e/util.ts b/packages/gitbook/e2e/util.ts index 566daa4a93..22e6b2e1f5 100644 --- a/packages/gitbook/e2e/util.ts +++ b/packages/gitbook/e2e/util.ts @@ -1,8 +1,11 @@ import { argosScreenshot } from '@argos-ci/playwright'; import { + CustomizationAIMode, CustomizationBackground, CustomizationCorners, CustomizationDefaultFont, + CustomizationDefaultMonospaceFont, + CustomizationDepth, type CustomizationHeaderItem, CustomizationHeaderPreset, CustomizationIconsStyle, @@ -15,6 +18,7 @@ import { CustomizationThemeMode, type CustomizationThemedColor, type SiteCustomizationSettings, + SiteExternalLinksTarget, } from '@gitbook/api'; import { type BrowserContext, type Page, type Response, expect, test } from '@playwright/test'; import deepMerge from 'deepmerge'; @@ -34,6 +38,10 @@ export interface Test { * Test to run */ run?: (page: Page, response: Response | null) => Promise; + /** + * Mode for the test. + */ + mode?: 'page' | 'image'; /** * Whether the test should be fullscreened during testing. */ @@ -154,6 +162,7 @@ export function runTestCases(testCases: TestsCase[]) { test.describe(testCase.name, () => { for (const testEntry of testCase.tests) { + const { mode = 'page' } = testEntry; const testFn = testEntry.only ? test.only : test; testFn(testEntry.name, async ({ page, context }) => { const testEntryPathname = @@ -163,6 +172,7 @@ export function runTestCases(testCases: TestsCase[]) { new URL(testEntryPathname, testCase.contentBaseURL).toString() ) : getTestURL(testEntryPathname); + if (testEntry.cookies) { await context.addCookies( testEntry.cookies.map((cookie) => ({ @@ -194,24 +204,33 @@ export function runTestCases(testCases: TestsCase[]) { } const screenshotOptions = testEntry.screenshot; if (screenshotOptions !== false) { - await argosScreenshot(page, `${testCase.name} - ${testEntry.name}`, { - viewports: ['macbook-16', 'macbook-13', 'ipad-2', 'iphone-x'], - argosCSS: ` + const screenshotName = `${testCase.name} - ${testEntry.name}`; + if (mode === 'image') { + await argosScreenshot(page, screenshotName, { + viewports: ['macbook-13'], + threshold: screenshotOptions?.threshold ?? undefined, + fullPage: true, + }); + } else { + await argosScreenshot(page, screenshotName, { + viewports: ['macbook-16', 'macbook-13', 'ipad-2', 'iphone-x'], + argosCSS: ` /* Hide Intercom */ .intercom-lightweight-app { display: none !important; } `, - threshold: screenshotOptions?.threshold ?? undefined, - fullPage: testEntry.fullPage ?? false, - beforeScreenshot: async ({ runStabilization }) => { - await runStabilization(); - await waitForIcons(page); - if (screenshotOptions?.waitForTOCScrolling !== false) { - await waitForTOCScrolling(page); - } - }, - }); + threshold: screenshotOptions?.threshold ?? undefined, + fullPage: testEntry.fullPage ?? false, + beforeScreenshot: async ({ runStabilization }) => { + await runStabilization(); + if (screenshotOptions?.waitForTOCScrolling !== false) { + await waitForTOCScrolling(page); + } + await waitForIcons(page); + }, + }); + } } }); } @@ -263,7 +282,9 @@ export function getCustomizationURL(partial: DeepPartial { - const urls = new Set(); + const urlStates: Record< + string, + { state: 'pending'; uri: null } | { state: 'loaded'; uri: string } + > = (window as any).__ICONS_STATES__ || {}; + (window as any).__ICONS_STATES__ = urlStates; + + const fetchSvgAsDataUri = async (url: string): Promise => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch SVG: ${response.status}`); + } + + const svgText = await response.text(); + const encoded = encodeURIComponent(svgText).replace(/'/g, '%27').replace(/"/g, '%22'); + + return `data:image/svg+xml;charset=utf-8,${encoded}`; + }; + + const loadUrl = (url: string) => { + // Mark the URL as pending. + urlStates[url] = { state: 'pending', uri: null }; + fetchSvgAsDataUri(url).then((uri) => { + urlStates[url] = { state: 'loaded', uri }; + }); + }; + const icons = Array.from(document.querySelectorAll('svg.gb-icon')); const results = icons.map((icon) => { if (!(icon instanceof SVGElement)) { throw new Error('Icon is not an SVGElement'); } - // If loaded, good it passes the test. - if (icon.dataset.loadingState === 'loaded') { + // Ignore icons that are not visible. + if (!icon.checkVisibility()) { return true; } - // If not loaded yet, we need to load it. - if (icon.dataset.loadingState === 'pending') { + const state = icon.getAttribute('data-argos-state'); + + if (state === 'pending') { return false; } - // Ignore icons that are not visible. - if (!icon.checkVisibility()) { + if (state === 'loaded') { return true; } // url("https://ka-p.fontawesome.com/releases/v6.6.0/svgs/light/moon.svg?v=2&token=a463935e93") const maskImage = window.getComputedStyle(icon).getPropertyValue('mask-image'); const urlMatch = maskImage.match(/url\("([^"]+)"\)/); - const url = urlMatch ? urlMatch[1] : null; + const url = urlMatch?.[1]; // If URL is invalid we throw an error. if (!url) { throw new Error('No mask-image'); } - // If the URL is already loaded, we just mark it as loaded. - if (urls.has(url)) { - icon.dataset.loadingState = 'loaded'; - return true; - } - - // Mark the icon as pending and load the image. - icon.dataset.loadingState = 'pending'; - - // Mark the URL as seen. - urls.add(url); - - const img = new Image(); - img.src = url; - img.decode().then(() => { - // Wait two frames to let the time to the icon to repaint. - requestAnimationFrame(() => { + // If the URL is already queued for loading, we return the state. + if (urlStates[url]) { + if (urlStates[url].state === 'loaded') { + icon.setAttribute('data-argos-state', 'pending'); + icon.style.maskImage = `url("${urlStates[url].uri}")`; requestAnimationFrame(() => { - icon.dataset.loadingState = 'loaded'; + icon.setAttribute('data-argos-state', 'loaded'); }); - }); - }); + return false; + } + + return false; + } + loadUrl(url); return false; }); diff --git a/packages/gitbook/next.config.js b/packages/gitbook/next.config.js deleted file mode 100644 index 8aec4f2e7f..0000000000 --- a/packages/gitbook/next.config.js +++ /dev/null @@ -1,49 +0,0 @@ -module.exports = { - env: { - BUILD_VERSION: (process.env.GITHUB_SHA ?? '').slice(0, 7), - GITBOOK_ASSETS_PREFIX: process.env.GITBOOK_ASSETS_PREFIX, - GITBOOK_ICONS_URL: process.env.GITBOOK_ICONS_URL, - GITBOOK_ICONS_TOKEN: process.env.GITBOOK_ICONS_TOKEN, - NEXT_SERVER_ACTIONS_ENCRYPTION_KEY: process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY, - }, - - webpack(config) { - config.resolve.fallback = { - ...config.resolve.fallback, - - // Required for `swagger2openapi` to work: - fs: false, - path: false, - http: false, - }; - - return config; - }, - - async headers() { - return [ - // Cache all static assets for 1 year - { - source: '/~gitbook/static/:path*', - headers: [ - { - key: 'Cache-Control', - value: 'public, max-age=31536000, immutable', - }, - ], - }, - ]; - }, - - assetPrefix: process.env.GITBOOK_ASSETS_PREFIX, - poweredByHeader: false, - - images: { - remotePatterns: [ - { - protocol: 'https', - hostname: '*.gitbook.io', - }, - ], - }, -}; diff --git a/packages/gitbook-v2/next.config.mjs b/packages/gitbook/next.config.mjs similarity index 74% rename from packages/gitbook-v2/next.config.mjs rename to packages/gitbook/next.config.mjs index 659c9a536f..d915cf312d 100644 --- a/packages/gitbook-v2/next.config.mjs +++ b/packages/gitbook/next.config.mjs @@ -7,8 +7,6 @@ const nextConfig = { experimental: { // This is needed to throw "forbidden" when the api token expired during revalidation authInterrupts: true, - - // This is needed to use 'use cache' useCache: true, // Content is fully static, we can cache it in the session memory cache for a long time @@ -33,7 +31,9 @@ const nextConfig = { GITBOOK_ASSETS_PREFIX: process.env.GITBOOK_ASSETS_PREFIX, GITBOOK_SECRET: process.env.GITBOOK_SECRET, GITBOOK_IMAGE_RESIZE_SIGNING_KEY: process.env.GITBOOK_IMAGE_RESIZE_SIGNING_KEY, + GITBOOK_IMAGE_RESIZE_MODE: process.env.GITBOOK_IMAGE_RESIZE_MODE, GITBOOK_FONTS_URL: process.env.GITBOOK_FONTS_URL, + GITBOOK_RUNTIME: process.env.GITBOOK_RUNTIME, // Next.js envs NEXT_SERVER_ACTIONS_ENCRYPTION_KEY: process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY, @@ -53,6 +53,24 @@ const nextConfig = { }, ], }, + + async headers() { + return [ + { + source: '/~gitbook/static/:path*', + headers: [ + { + key: 'Cache-Control', + value: 'public, max-age=31536000, immutable', + }, + { + key: 'Access-Control-Allow-Origin', + value: '*', + }, + ], + }, + ]; + }, }; export default nextConfig; diff --git a/packages/gitbook/open-next.config.ts b/packages/gitbook/open-next.config.ts new file mode 100644 index 0000000000..1872309119 --- /dev/null +++ b/packages/gitbook/open-next.config.ts @@ -0,0 +1,29 @@ +import type { OpenNextConfig } from '@opennextjs/cloudflare'; + +export default { + default: { + override: { + wrapper: 'cloudflare-node', + converter: 'edge', + proxyExternalRequest: 'fetch', + queue: () => import('./openNext/queue/middleware').then((m) => m.default), + incrementalCache: () => import('./openNext/incrementalCache').then((m) => m.default), + tagCache: () => import('./openNext/tagCache/middleware').then((m) => m.default), + }, + }, + middleware: { + external: true, + override: { + wrapper: 'cloudflare-edge', + converter: 'edge', + proxyExternalRequest: 'fetch', + queue: () => import('./openNext/queue/middleware').then((m) => m.default), + incrementalCache: () => import('./openNext/incrementalCache').then((m) => m.default), + tagCache: () => import('./openNext/tagCache/middleware').then((m) => m.default), + }, + }, + dangerous: { + enableCacheInterception: true, + }, + edgeExternals: ['node:crypto'], +} satisfies OpenNextConfig; diff --git a/packages/gitbook/openNext/customWorkers/default.js b/packages/gitbook/openNext/customWorkers/default.js new file mode 100644 index 0000000000..535c218167 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/default.js @@ -0,0 +1,36 @@ +import { runWithCloudflareRequestContext } from '../../.open-next/cloudflare/init.js'; + +import { DurableObject } from 'cloudflare:workers'; + +// Only needed to run locally, in prod we'll use the one from do.js +export class R2WriteBuffer extends DurableObject { + writePromise; + + async write(cacheKey, value) { + // We are already writing to this key + if (this.writePromise) { + return; + } + + this.writePromise = this.env.NEXT_INC_CACHE_R2_BUCKET.put(cacheKey, value); + this.ctx.waitUntil( + this.writePromise.finally(() => { + this.writePromise = undefined; + }) + ); + } +} + +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + // We can't move the handler import to the top level, otherwise the runtime will not be properly initialized + const { handler } = await import( + '../../.open-next/server-functions/default/handler.mjs' + ); + + // - `Request`s are handled by the Next server + return handler(request, env, ctx); + }); + }, +}; diff --git a/packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc b/packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc new file mode 100644 index 0000000000..05b61fab74 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/defaultWrangler.jsonc @@ -0,0 +1,168 @@ +{ + "main": "default.js", + "name": "gitbook-open-v2-server", + "compatibility_date": "2025-04-14", + "compatibility_flags": [ + "nodejs_compat", + "allow_importable_env", + "global_fetch_strictly_public" + ], + "observability": { + "enabled": true + }, + "vars": { + "NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE": "true" + }, + "env": { + "dev": { + "vars": { + "STAGE": "dev" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-preview" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-server-dev" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["R2WriteBuffer"] + } + ] + }, + "preview": { + "vars": { + "STAGE": "preview", + // Just as a test for the preview environment to check that everything works + "NEXT_PRIVATE_DEBUG_CACHE": "true" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-preview" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-server-preview" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-preview" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-preview" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-preview" + } + ] + } + }, + "staging": { + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-staging" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-server-staging" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-staging" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-staging" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-staging" + } + ] + }, + "tail_consumers": [ + { + "service": "gitbook-x-staging-tail" + } + ] + }, + "production": { + "vars": { + // This is a bit misleading, but it means that we can have 500 concurrent revalidations + // This means that we'll have up to 100 durable objects instance running at the same time + "MAX_REVALIDATE_CONCURRENCY": "100" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-production" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-server-production" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-production" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-production" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-production" + } + ] + }, + "tail_consumers": [ + { + "service": "gitbook-x-prod-tail" + } + ] + } + } +} diff --git a/packages/gitbook/openNext/customWorkers/do.js b/packages/gitbook/openNext/customWorkers/do.js new file mode 100644 index 0000000000..04f3cf3bec --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/do.js @@ -0,0 +1,38 @@ +// This worker only purposes it to host the different DO that we will need in the other workers. +import { DurableObject } from 'cloudflare:workers'; + +// `use cache` could cause multiple writes to the same key to happen concurrently, there is a limit of 1 write per key/second +// so we need to buffer writes to the R2 bucket to avoid hitting this limit. +export class R2WriteBuffer extends DurableObject { + writePromise; + + async write(cacheKey, value) { + // We are already writing to this key + if (this.writePromise) { + return; + } + + this.writePromise = this.env.NEXT_INC_CACHE_R2_BUCKET.put(cacheKey, value); + this.ctx.waitUntil( + this.writePromise.finally(() => { + this.writePromise = undefined; + }) + ); + } +} + +export { DOQueueHandler } from '../../.open-next/.build/durable-objects/queue.js'; + +export { DOShardedTagCache } from '../../.open-next/.build/durable-objects/sharded-tag-cache.js'; + +export default { + async fetch() { + // This worker does not handle any requests, it only provides Durable Objects + return new Response('This worker is not meant to handle requests directly', { + status: 400, + headers: { + 'Content-Type': 'text/plain', + }, + }); + }, +}; diff --git a/packages/gitbook/openNext/customWorkers/doWrangler.jsonc b/packages/gitbook/openNext/customWorkers/doWrangler.jsonc new file mode 100644 index 0000000000..0ea87bbf24 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/doWrangler.jsonc @@ -0,0 +1,149 @@ +{ + "main": "do.js", + "name": "gitbook-open-v2-do", + "compatibility_date": "2025-04-14", + "compatibility_flags": [ + "nodejs_compat", + "allow_importable_env", + "global_fetch_strictly_public" + ], + "observability": { + "enabled": true + }, + "env": { + "preview": { + "vars": { + "STAGE": "preview", + "NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE": "true" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-preview" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-preview" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache" + }, + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache", "R2WriteBuffer"] + } + ] + }, + "staging": { + "vars": { + "STAGE": "staging", + "NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE": "true" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-staging" + } + ], + "tail_consumers": [ + { + "service": "gitbook-x-staging-tail" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-staging" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache" + }, + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache", "R2WriteBuffer"] + } + ] + }, + "production": { + "vars": { + // R2 is strongly consistent, so we can disable SQLite + "NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE": "true", + // We don't want to pollute the memory with broken cache entries + // Most of the time, those are fake requests. + "NEXT_CACHE_DO_QUEUE_MAX_RETRIES": "1", + "STAGE": "production" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-production" + } + ], + "tail_consumers": [ + { + "service": "gitbook-x-prod-tail" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-production" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache" + }, + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache", "R2WriteBuffer"] + } + ] + } + } +} diff --git a/packages/gitbook/openNext/customWorkers/middleware.js b/packages/gitbook/openNext/customWorkers/middleware.js new file mode 100644 index 0000000000..78a84a9760 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/middleware.js @@ -0,0 +1,42 @@ +import { WorkerEntrypoint } from 'cloudflare:workers'; +import { runWithCloudflareRequestContext } from '../../.open-next/cloudflare/init.js'; + +import { handler as middlewareHandler } from '../../.open-next/middleware/handler.mjs'; + +export { DOQueueHandler } from '../../.open-next/.build/durable-objects/queue.js'; + +export { DOShardedTagCache } from '../../.open-next/.build/durable-objects/sharded-tag-cache.js'; + +export default class extends WorkerEntrypoint { + async fetch(request) { + return runWithCloudflareRequestContext(request, this.env, this.ctx, async () => { + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, this.env, this.ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + + if (this.env.STAGE !== 'preview') { + // https://developers.cloudflare.com/workers/configuration/versions-and-deployments/gradual-deployments/#version-affinity + reqOrResp.headers.set( + 'Cloudflare-Workers-Version-Overrides', + `gitbook-open-v2-${this.env.STAGE}="${this.env.WORKER_VERSION_ID}"` + ); + return this.env.DEFAULT_WORKER?.fetch(reqOrResp, { + cf: { + cacheEverything: false, + }, + }); + } + // If we are in preview mode, we need to send the request to the preview URL + const modifiedUrl = new URL(reqOrResp.url); + modifiedUrl.hostname = this.env.PREVIEW_HOSTNAME; + const nextRequest = new Request(modifiedUrl, reqOrResp); + return fetch(nextRequest, { + cf: { + cacheEverything: false, + }, + }); + }); + } +} diff --git a/packages/gitbook/openNext/customWorkers/middlewareWrangler.jsonc b/packages/gitbook/openNext/customWorkers/middlewareWrangler.jsonc new file mode 100644 index 0000000000..09e48afcc0 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/middlewareWrangler.jsonc @@ -0,0 +1,216 @@ +{ + "main": "middleware.js", + "name": "gitbook-open-v2", + "compatibility_date": "2025-04-14", + "compatibility_flags": [ + "nodejs_compat", + "allow_importable_env", + "global_fetch_strictly_public" + ], + "assets": { + "directory": "../../.open-next/assets", + "binding": "ASSETS" + }, + "observability": { + "enabled": true + }, + "vars": { + "NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE": "true" + }, + "env": { + "dev": { + "vars": { + "STAGE": "dev", + "NEXT_PRIVATE_DEBUG_CACHE": "true" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-preview" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-dev" + }, + { + "binding": "DEFAULT_WORKER", + "service": "gitbook-open-v2-server-dev" + } + ] + }, + "preview": { + "vars": { + "STAGE": "preview", + "PREVIEW_HOSTNAME": "TO_REPLACE", + "WORKER_VERSION_ID": "TO_REPLACE" + }, + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-preview" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-preview" + }, + { + "binding": "DEFAULT_WORKER", + "service": "gitbook-open-v2-server-preview" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-preview" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-preview" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-preview" + } + ] + } + }, + "staging": { + "vars": { + "STAGE": "staging", + "WORKER_VERSION_ID": "TO_REPLACE" + }, + "routes": [ + { + "pattern": "open-2c.gitbook-staging.com/*", + "zone_name": "gitbook-staging.com" + }, + { + "pattern": "static-2c.gitbook-staging.com/*", + "zone_name": "gitbook-staging.com" + } + ], + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-staging" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-staging" + }, + { + "binding": "DEFAULT_WORKER", + "service": "gitbook-open-v2-server-staging" + } + ], + "tail_consumers": [ + { + "service": "gitbook-x-staging-tail" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-staging" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-staging" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-staging" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache"] + } + ] + }, + "production": { + "vars": { + // This is a bit misleading, but it means that we can have 500 concurrent revalidations + // This means that we'll have up to 100 durable objects instance running at the same time + "MAX_REVALIDATE_CONCURRENCY": "100", + // Temporary variable to find the issue once deployed + // TODO: remove this once the issue is fixed + "DEBUG_CLOUDFLARE": "true", + "WORKER_VERSION_ID": "TO_REPLACE", + "STAGE": "production" + }, + "routes": [ + { + "pattern": "open-2c.gitbook.com/*", + "zone_name": "gitbook.com" + }, + { + "pattern": "static-2c.gitbook.com/*", + "zone_name": "gitbook.com" + } + ], + "r2_buckets": [ + { + "binding": "NEXT_INC_CACHE_R2_BUCKET", + "bucket_name": "gitbook-open-v2-cache-production" + } + ], + "services": [ + { + "binding": "WORKER_SELF_REFERENCE", + "service": "gitbook-open-v2-production" + }, + { + "binding": "DEFAULT_WORKER", + "service": "gitbook-open-v2-server-production" + } + ], + "tail_consumers": [ + { + "service": "gitbook-x-prod-tail" + } + ], + "durable_objects": { + "bindings": [ + { + "name": "WRITE_BUFFER", + "class_name": "R2WriteBuffer", + "script_name": "gitbook-open-v2-do-production" + }, + { + "name": "NEXT_TAG_CACHE_DO_SHARDED", + "class_name": "DOShardedTagCache", + "script_name": "gitbook-open-v2-do-production" + }, + { + "name": "NEXT_CACHE_DO_QUEUE", + "class_name": "DOQueueHandler", + "script_name": "gitbook-open-v2-do-production" + } + ] + }, + "migrations": [ + { + "tag": "v1", + "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache"] + } + ] + } + } +} diff --git a/packages/gitbook/openNext/customWorkers/script/updateWrangler.ts b/packages/gitbook/openNext/customWorkers/script/updateWrangler.ts new file mode 100644 index 0000000000..0fdbf6cc70 --- /dev/null +++ b/packages/gitbook/openNext/customWorkers/script/updateWrangler.ts @@ -0,0 +1,26 @@ +// In this script, we use the args from the cli to update the PREVIEW_URL vars in the wrangler config file for the middleware +import fs from 'node:fs'; +import path from 'node:path'; + +const wranglerConfigPath = path.join(__dirname, '../middlewareWrangler.jsonc'); + +const file = fs.readFileSync(wranglerConfigPath, 'utf-8'); + +const args = process.argv.slice(2); +// The versionId is in the format xxx-xxx-xxx-xxx, we need the first part to reconstruct the preview URL +const versionId = args[0]; + +// The preview URL is in the format https://-gitbook-open-v2-server-preview.gitbook.workers.dev +const previewHostname = `${versionId.split('-')[0]}-gitbook-open-v2-server-preview.gitbook.workers.dev`; + +let updatedFile = file.replace( + /"PREVIEW_HOSTNAME": "TO_REPLACE"/, + `"PREVIEW_HOSTNAME": "${previewHostname}"` +); + +updatedFile = updatedFile.replaceAll( + /"WORKER_VERSION_ID": "TO_REPLACE"/g, + `"WORKER_VERSION_ID": "${versionId}"` +); + +fs.writeFileSync(wranglerConfigPath, updatedFile); diff --git a/packages/gitbook/openNext/incrementalCache.ts b/packages/gitbook/openNext/incrementalCache.ts new file mode 100644 index 0000000000..6a373ff32b --- /dev/null +++ b/packages/gitbook/openNext/incrementalCache.ts @@ -0,0 +1,224 @@ +import { createHash } from 'node:crypto'; + +import { trace } from '@/lib/tracing'; +import type { + CacheEntryType, + CacheValue, + IncrementalCache, + WithLastModified, +} from '@opennextjs/aws/types/overrides.js'; +import { getCloudflareContext } from '@opennextjs/cloudflare'; + +import type { DurableObjectNamespace, Rpc } from '@cloudflare/workers-types'; + +export const BINDING_NAME = 'NEXT_INC_CACHE_R2_BUCKET'; +export const DEFAULT_PREFIX = 'incremental-cache'; + +export type KeyOptions = { + cacheType?: CacheEntryType; +}; + +/** + * + * It is very similar to the `R2IncrementalCache` in the `@opennextjs/cloudflare` package, but it allow us to trace + * the cache operations. It also integrates both R2 and Cache API in a single class. + * Having our own, will allow us to customize it in the future if needed. + */ +class GitbookIncrementalCache implements IncrementalCache { + name = 'GitbookIncrementalCache'; + + protected localCache: Cache | undefined; + + async get( + key: string, + cacheType?: CacheType + ): Promise> | null> { + const cacheKey = this.getR2Key(key, cacheType); + return trace( + { + operation: 'openNextIncrementalCacheGet', + name: cacheKey, + }, + async (span) => { + span.setAttribute('cacheType', cacheType ?? 'cache'); + const r2 = getCloudflareContext().env[BINDING_NAME]; + const localCache = await this.getCacheInstance(); + if (!r2) throw new Error('No R2 bucket'); + try { + // Check local cache first if available + const localCacheEntry = await localCache.match(this.getCacheUrlKey(cacheKey)); + if (localCacheEntry) { + span.setAttribute('cacheHit', 'local'); + const result = (await localCacheEntry.json()) as WithLastModified< + CacheValue + >; + return this.returnNullOn404(result); + } + + const r2Object = await r2.get(cacheKey); + if (!r2Object) return null; + + span.setAttribute('cacheHit', 'r2'); + return this.returnNullOn404({ + value: await r2Object.json(), + lastModified: r2Object.uploaded.getTime(), + }); + } catch (e) { + console.error('Failed to get from cache', e); + return null; + } + } + ); + } + + //TODO: This is a workaround to handle 404 responses in the cache. + // It should be handled by OpenNext cache interception directly. This should be removed once OpenNext cache interception is fixed. + returnNullOn404( + cacheEntry: WithLastModified> | null + ): WithLastModified> | null { + if (!cacheEntry?.value) return null; + if ('meta' in cacheEntry.value && cacheEntry.value.meta?.status === 404) { + return null; + } + return cacheEntry; + } + + async set( + key: string, + value: CacheValue, + cacheType?: CacheType + ): Promise { + const cacheKey = this.getR2Key(key, cacheType); + return trace( + { + operation: 'openNextIncrementalCacheSet', + name: cacheKey, + }, + async (span) => { + span.setAttribute('cacheType', cacheType ?? 'cache'); + const localCache = await this.getCacheInstance(); + + try { + await this.writeToR2(cacheKey, JSON.stringify(value)); + + //TODO: Check if there is any places where we don't have tags + // Ideally we should always have tags, but in case we don't, we need to decide how to handle it + // For now we default to a build ID tag, which allow us to invalidate the cache in case something is wrong in this deployment + const tags = this.getTagsFromCacheEntry(value) ?? [ + `build_id/${process.env.NEXT_BUILD_ID}`, + ]; + + // We consider R2 as the source of truth, so we update the local cache + // only after a successful R2 write + await localCache.put( + this.getCacheUrlKey(cacheKey), + new Response( + JSON.stringify({ + value, + // Note: `Date.now()` returns the time of the last IO rather than the actual time. + // See https://developers.cloudflare.com/workers/reference/security-model/ + lastModified: Date.now(), + }), + { + headers: { + // Cache-Control default to 30 minutes, will be overridden by `revalidate` + // In theory we should always get the `revalidate` value + 'cache-control': `max-age=${value.revalidate ?? 60 * 30}`, + 'cache-tag': tags.join(','), + }, + } + ) + ); + } catch (e) { + console.error('Failed to set to cache', e); + } + } + ); + } + + async delete(key: string): Promise { + const cacheKey = this.getR2Key(key); + return trace( + { + operation: 'openNextIncrementalCacheDelete', + name: cacheKey, + }, + async () => { + const r2 = getCloudflareContext().env[BINDING_NAME]; + const localCache = await this.getCacheInstance(); + if (!r2) throw new Error('No R2 bucket'); + + try { + await r2.delete(cacheKey); + + // Here again R2 is the source of truth, so we delete from local cache first + await localCache.delete(this.getCacheUrlKey(cacheKey)); + } catch (e) { + console.error('Failed to delete from cache', e); + } + } + ); + } + + async writeToR2(key: string, value: string): Promise { + const env = getCloudflareContext().env as { + WRITE_BUFFER: DurableObjectNamespace< + Rpc.DurableObjectBranded & { + write: (key: string, value: string) => Promise; + } + >; + }; + const id = env.WRITE_BUFFER.idFromName(key); + + // A stub is a client used to invoke methods on the Durable Object + const stub = env.WRITE_BUFFER.get(id); + + await stub.write(key, value); + } + + async getCacheInstance(): Promise { + if (this.localCache) return this.localCache; + this.localCache = await caches.open('incremental-cache'); + return this.localCache; + } + + // Utility function to generate keys for R2/Cache API + getR2Key(initialKey: string, cacheType: CacheEntryType = 'cache'): string { + let key = initialKey; + if (cacheType === 'composable') { + // For composable cache, we need to discard the build ID from the key + const [_buildId, ...restOfTheKey] = JSON.parse(initialKey); + key = JSON.stringify([...restOfTheKey]); + } + + const hash = createHash('sha256').update(key).digest('hex'); + return `${DEFAULT_PREFIX}/${cacheType === 'cache' ? process.env?.NEXT_BUILD_ID : 'dataCache'}/${hash}.${cacheType}`.replace( + /\/+/g, + '/' + ); + } + + getCacheUrlKey(cacheKey: string): string { + return `http://cache.local/${cacheKey}`; + } + + getTagsFromCacheEntry( + entry: CacheValue + ): string[] | undefined { + if ('tags' in entry && entry.tags) { + return entry.tags; + } + + if ('meta' in entry && entry.meta && 'headers' in entry.meta && entry.meta.headers) { + const rawTags = entry.meta.headers['x-next-cache-tags']; + if (typeof rawTags === 'string') { + return rawTags.split(','); + } + } + if ('value' in entry) { + return entry.tags; + } + } +} + +export default new GitbookIncrementalCache(); diff --git a/packages/gitbook/openNext/queue/middleware.ts b/packages/gitbook/openNext/queue/middleware.ts new file mode 100644 index 0000000000..5ab486a975 --- /dev/null +++ b/packages/gitbook/openNext/queue/middleware.ts @@ -0,0 +1,14 @@ +import { trace } from '@/lib/tracing'; +import type { Queue } from '@opennextjs/aws/types/overrides.js'; +import { getCloudflareContext } from '@opennextjs/cloudflare'; +import doQueue from '@opennextjs/cloudflare/overrides/queue/do-queue'; + +export default { + name: 'GitbookISRQueue', + send: async (msg) => { + return trace({ operation: 'gitbookISRQueueSend', name: msg.MessageBody.url }, async () => { + const { ctx } = getCloudflareContext(); + ctx.waitUntil(doQueue.send(msg)); + }); + }, +} satisfies Queue; diff --git a/packages/gitbook/openNext/queue/server.ts b/packages/gitbook/openNext/queue/server.ts new file mode 100644 index 0000000000..9a5b3b689b --- /dev/null +++ b/packages/gitbook/openNext/queue/server.ts @@ -0,0 +1,9 @@ +import type { Queue } from '@opennextjs/aws/types/overrides.js'; + +export default { + name: 'GitbookISRQueue', + send: async (msg) => { + // We should never reach this point in the server. If that's the case, we should log it. + console.warn('GitbookISRQueue: send called on server side, this should not happen.', msg); + }, +} satisfies Queue; diff --git a/packages/gitbook/openNext/tagCache/middleware.ts b/packages/gitbook/openNext/tagCache/middleware.ts new file mode 100644 index 0000000000..4f06d7896b --- /dev/null +++ b/packages/gitbook/openNext/tagCache/middleware.ts @@ -0,0 +1,81 @@ +import { trace } from '@/lib/tracing'; +import type { NextModeTagCache } from '@opennextjs/aws/types/overrides.js'; +import doShardedTagCache from '@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache'; +import { softTagFilter } from '@opennextjs/cloudflare/overrides/tag-cache/tag-cache-filter'; + +const originalTagCache = doShardedTagCache({ + baseShardSize: 12, + regionalCache: true, + // We can probably increase this value even further + regionalCacheTtlSec: 60, + shardReplication: { + numberOfSoftReplicas: 2, + numberOfHardReplicas: 1, + regionalReplication: { + defaultRegion: 'enam', + }, + }, +}); + +export default { + name: 'GitbookTagCache', + mode: 'nextMode', + getLastRevalidated: async (tags: string[]) => { + const tagsToCheck = tags.filter(softTagFilter); + if (tagsToCheck.length === 0) { + // If we reach here, it probably means that there is an issue that we'll need to address. + console.warn( + 'getLastRevalidated - No valid tags to check for last revalidation, original tags:', + tags + ); + return 0; // If no tags to check, return 0 + } + return trace( + { + operation: 'gitbookTagCacheGetLastRevalidated', + name: tagsToCheck.join(', '), + }, + async () => { + return await originalTagCache.getLastRevalidated(tagsToCheck); + } + ); + }, + hasBeenRevalidated: async (tags: string[], lastModified?: number) => { + const tagsToCheck = tags.filter(softTagFilter); + if (tagsToCheck.length === 0) { + // If we reach here, it probably means that there is an issue that we'll need to address. + console.warn( + 'hasBeenRevalidated - No valid tags to check for revalidation, original tags:', + tags + ); + return false; // If no tags to check, return false + } + return trace( + { + operation: 'gitbookTagCacheHasBeenRevalidated', + name: tagsToCheck.join(', '), + }, + async () => { + const result = await originalTagCache.hasBeenRevalidated(tagsToCheck, lastModified); + return result; + } + ); + }, + writeTags: async (tags: string[]) => { + return trace( + { + operation: 'gitbookTagCacheWriteTags', + name: tags.join(', '), + }, + async () => { + const tagsToWrite = tags.filter(softTagFilter); + if (tagsToWrite.length === 0) { + console.warn('writeTags - No valid tags to write'); + return; // If no tags to write, exit early + } + // Write only the filtered tags + await originalTagCache.writeTags(tagsToWrite); + } + ); + }, +} satisfies NextModeTagCache; diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 58b07756ad..67fd18e937 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -1,79 +1,78 @@ { "name": "gitbook", - "version": "0.9.1", + "version": "0.12.0", "private": true, - "scripts": { - "dev": "env-cmd --silent -f ../../.env.local next dev", - "build": "next build", - "build:cloudflare": "next-on-pages --custom-entrypoint=./src/cloudflare-entrypoint.ts", - "start": "next start", - "typecheck": "tsc --noEmit", - "e2e": "playwright test e2e/internal.spec.ts", - "e2e-customers": "playwright test e2e/customers.spec.ts", - "unit": "bun test {src,packages}", - "generate": "gitbook-icons ./public/~gitbook/static/icons custom-icons && gitbook-math ./public/~gitbook/static/math", - "copy:icons": "gitbook-icons ./public/~gitbook/static/icons", - "clean": "rm -rf ./.next && rm -rf ./public/~gitbook/static/icons && rm -rf ./public/~gitbook/static/math" - }, "dependencies": { - "@gitbook/api": "*", - "@gitbook/cache-do": "workspace:*", + "@gitbook/api": "catalog:", "@gitbook/cache-tags": "workspace:*", + "@opennextjs/cloudflare": "1.2.1", + "@sindresorhus/fnv1a": "^3.1.0", + "assert-never": "^1.2.1", + "jwt-decode": "^4.0.0", + "next": "^15.3.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rison": "^0.1.1", + "server-only": "^0.0.1", + "warn-once": "^0.1.1", + "object-identity": "^0.1.2", "@gitbook/colors": "workspace:*", "@gitbook/emoji-codepoints": "workspace:*", "@gitbook/icons": "workspace:*", + "@gitbook/fonts": "workspace:*", "@gitbook/openapi-parser": "workspace:*", "@gitbook/react-contentkit": "workspace:*", "@gitbook/react-math": "workspace:*", "@gitbook/react-openapi": "workspace:*", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.1.12", "@radix-ui/react-navigation-menu": "^1.2.3", "@radix-ui/react-popover": "^1.0.7", - "@sindresorhus/fnv1a": "^3.1.0", + "@radix-ui/react-tooltip": "^1.1.8", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/typography": "^0.5.16", - "@upstash/redis": "^1.27.1", - "ai": "^4.1.46", - "ajv": "^8.12.0", - "assert-never": "^1.2.1", + "ai": "^4.2.2", "bun-types": "^1.1.20", "classnames": "^2.5.1", + "event-iterator": "^2.0.0", "framer-motion": "^10.16.14", "js-cookie": "^3.0.5", "jsontoxml": "^1.0.1", - "jwt-decode": "^4.0.0", "katex": "^0.16.9", "mathjax": "^3.2.2", "mdast-util-to-markdown": "^2.1.2", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0", "memoizee": "^0.4.17", - "next": "14.2.25", "next-themes": "^0.2.1", "nuqs": "^2.2.3", "object-hash": "^3.0.0", "openapi-types": "^12.1.3", - "p-map": "^7.0.0", + "p-map": "^7.0.3", "parse-cache-control": "^1.0.1", - "react": "18.3.1", - "react-dom": "18.3.1", "react-hotkeys-hook": "^4.4.1", "rehype-sanitize": "^6.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", - "rison": "^0.1.1", - "server-only": "^0.0.1", "shiki": "^3.2.0", "tailwind-merge": "^2.2.0", "tailwind-shades": "^1.1.2", "unified": "^11.0.5", "url-join": "^5.0.0", - "usehooks-ts": "^3.1.0" + "usehooks-ts": "^3.1.0", + "zustand": "^5.0.3", + "image-size": "^2.0.2", + "direction": "^2.0.1" }, "devDependencies": { - "@argos-ci/playwright": "^4.3.0", - "@cloudflare/next-on-pages": "1.13.7", - "@cloudflare/workers-types": "^4.20241230.0", + "@argos-ci/playwright": "^5.0.3", "@playwright/test": "^1.51.1", "@types/js-cookie": "^3.0.6", "@types/jsontoxml": "^1.0.5", @@ -97,5 +96,21 @@ "ts-essentials": "^10.0.1", "typescript": "^5.5.3", "vercel": "^39.3.0" + }, + "scripts": { + "generate": "gitbook-icons ./public/~gitbook/static/icons custom-icons && gitbook-math ./public/~gitbook/static/math && wrangler types", + "copy:icons": "gitbook-icons ./public/~gitbook/static/icons", + "clean": "rm -rf ./.next && rm -rf ./public/~gitbook/static/icons && rm -rf ./public/~gitbook/static/math", + "dev": "env-cmd --silent -f ../../.env.local next --turbopack", + "build": "next build", + "start": "next start", + "build:cloudflare": "opennextjs-cloudflare build", + "dev:cloudflare": "wrangler dev --port 8771 --env preview", + "dev:cf:middleware": "wrangler dev --port 8771 --inspector-port 9230 --env dev --config ./openNext/customWorkers/middlewareWrangler.jsonc", + "dev:cf:server": "wrangler dev --port 8772 --env dev --config ./openNext/customWorkers/defaultWrangler.jsonc", + "e2e": "playwright test e2e/internal.spec.ts e2e/pdf.spec.ts", + "e2e-customers": "playwright test e2e/customers.spec.ts", + "unit": "bun test {src,packages} --preload ./tests/preload-bun.ts", + "typecheck": "tsc --noEmit" } } diff --git a/packages/gitbook/public/_headers b/packages/gitbook/public/_headers index 193088b369..0d7eadbf4b 100644 --- a/packages/gitbook/public/_headers +++ b/packages/gitbook/public/_headers @@ -1,3 +1,7 @@ # GitBook immutable static assets +# Duplicated from next.config.mjs until OpenNext supports generating static headers /~gitbook/static/* cache-control: public,max-age=31536000,immutable + Access-Control-Allow-Origin: * +/_next/static/* + Access-Control-Allow-Origin: * diff --git a/packages/gitbook/src/app/(global)/~gitbook/image/route.ts b/packages/gitbook/src/app/(global)/~gitbook/image/route.ts deleted file mode 100644 index 3888e1f2af..0000000000 --- a/packages/gitbook/src/app/(global)/~gitbook/image/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextRequest } from 'next/server'; - -import { serveResizedImage } from '@/routes/image'; - -export const runtime = 'edge'; - -export async function GET(request: NextRequest) { - return serveResizedImage(request); -} diff --git a/packages/gitbook/src/app/(global)/~gitbook/revalidate/route.ts b/packages/gitbook/src/app/(global)/~gitbook/revalidate/route.ts deleted file mode 100644 index 91c214e127..0000000000 --- a/packages/gitbook/src/app/(global)/~gitbook/revalidate/route.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type NextRequest, NextResponse } from 'next/server'; - -import { revalidateTags } from '@/lib/cache'; - -export const runtime = 'edge'; - -interface JsonBody { - tags: string[]; - purge?: boolean; -} - -/** - * Revalidate cached data based on tags. - * The body should be a JSON with { tags: string[] } - */ -export async function POST(req: NextRequest) { - const json = (await req.json()) as JsonBody; - - if (!json.tags || !Array.isArray(json.tags)) { - return NextResponse.json( - { - error: 'tags must be an array', - }, - { status: 400 } - ); - } - - const result = await revalidateTags(json.tags); - - return NextResponse.json({ - success: true, - stats: result.stats, - }); -} diff --git a/packages/gitbook/src/app/global-error.tsx b/packages/gitbook/src/app/global-error.tsx index 872877b1af..abf0186a40 100644 --- a/packages/gitbook/src/app/global-error.tsx +++ b/packages/gitbook/src/app/global-error.tsx @@ -2,7 +2,12 @@ import NextError from 'next/error'; -export default function GlobalError() { +export default function GlobalError({ + error, +}: { + error: Error & { digest?: string }; +}) { + console.error('Global error:', error); return ( diff --git a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/PageClientLayout.tsx b/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/PageClientLayout.tsx deleted file mode 100644 index b9febb51a4..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/PageClientLayout.tsx +++ /dev/null @@ -1,40 +0,0 @@ -'use client'; - -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; -import React from 'react'; - -import { useScrollPage } from '@/components/hooks'; - -/** - * Client component to initialize interactivity for a page. - */ -export function PageClientLayout(props: { withSections?: boolean }) { - // We use this hook in the page layout to ensure the elements for the blocks - // are rendered before we scroll to a hash or to the top of the page - useScrollPage({ scrollMarginTop: props.withSections ? 50 : undefined }); - - useStripFallbackQueryParam(); - return null; -} - -/** - * Strip the fallback query parameter from current URL. - * - * When the user switches variants using the space dropdown, we pass a fallback=true parameter. - * This parameter indicates that we should redirect to the root page if the path from the - * previous variant doesn't exist in the new variant. If the path does exist, no redirect occurs, - * so we need to remove the fallback parameter. - */ -function useStripFallbackQueryParam() { - const router = useRouter(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - - React.useEffect(() => { - if (searchParams.has('fallback')) { - const params = new URLSearchParams(searchParams.toString()); - params.delete('fallback'); - router.push(`${pathname}?${params.toString()}${window.location.hash ?? ''}`); - } - }, [router, pathname, searchParams]); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/loading.tsx b/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/loading.tsx deleted file mode 100644 index dff2bfbced..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/loading.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { SitePageSkeleton } from '@/components/SitePage'; - -/** - * Placeholder when loading a page. - */ -export default function PageSkeleton() { - return ; -} diff --git a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/not-found.tsx b/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/not-found.tsx deleted file mode 100644 index c715d5dd4e..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/not-found.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { SitePageNotFound } from '@/components/SitePage'; - -export default async function NotFound() { - return ; -} diff --git a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/page.tsx b/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/page.tsx deleted file mode 100644 index d680e8ce47..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(content)/[[...pathname]]/page.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { Metadata, Viewport } from 'next'; - -import { - type PagePathParams, - SitePage, - generateSitePageMetadata, - generateSitePageViewport, -} from '@/components/SitePage'; -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; - -export const runtime = 'edge'; -export const dynamic = 'force-dynamic'; - -type PageProps = { - params: Promise; - searchParams: Promise<{ fallback?: string }>; -}; - -/** - * Fetch and render a page. - */ -export default async function Page(props: PageProps) { - const sitePageProps = await getSitePageProps(props); - return ; -} - -export async function generateViewport(): Promise { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return generateSitePageViewport(context); -} - -export async function generateMetadata(props: PageProps): Promise { - const sitePageProps = await getSitePageProps(props); - return generateSitePageMetadata(sitePageProps); -} - -async function getSitePageProps(props: PageProps) { - const { params: rawParams } = props; - - const params = await rawParams; - - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return { - context, - pageParams: params, - }; -} diff --git a/packages/gitbook/src/app/middleware/(site)/(content)/layout.tsx b/packages/gitbook/src/app/middleware/(site)/(content)/layout.tsx deleted file mode 100644 index 10db3a3459..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(content)/layout.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { getSiteURLDataFromMiddleware, getThemeFromMiddleware } from '@v2/lib/middleware'; -import type { Metadata, Viewport } from 'next'; -import type React from 'react'; - -import { - SiteLayout, - generateSiteLayoutMetadata, - generateSiteLayoutViewport, -} from '@/components/SiteLayout'; -import { getVisitorAuthClaims } from '@/lib/adaptive'; -import { getSiteContentPointer } from '@/lib/pointer'; -import { shouldTrackEvents } from '@/lib/tracking'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; - -export const runtime = 'edge'; -export const dynamic = 'force-dynamic'; - -/** - * Layout when rendering the content. - */ -export default async function ContentLayout(props: { children: React.ReactNode }) { - const { children } = props; - - const context = await fetchLayoutData(); - const queryStringTheme = await getThemeFromMiddleware(); - const siteData = await getSiteURLDataFromMiddleware(); - - return ( - - {children} - - ); -} - -export async function generateViewport(): Promise { - const context = await fetchLayoutData(); - return generateSiteLayoutViewport(context); -} - -export async function generateMetadata(): Promise { - const context = await fetchLayoutData(); - return generateSiteLayoutMetadata(context); -} - -async function fetchLayoutData() { - const pointer = await getSiteContentPointer(); - return fetchV1ContextForSitePointer(pointer); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/llms.txt/route.ts b/packages/gitbook/src/app/middleware/(site)/(core)/llms.txt/route.ts deleted file mode 100644 index 0d9cb6e529..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/llms.txt/route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { NextRequest } from 'next/server'; - -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { serveLLMsTxt } from '@/routes/llms'; - -export const runtime = 'edge'; - -export async function GET(_req: NextRequest) { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return serveLLMsTxt(context); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/robots.txt/route.ts b/packages/gitbook/src/app/middleware/(site)/(core)/robots.txt/route.ts deleted file mode 100644 index c279317254..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/robots.txt/route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { NextRequest } from 'next/server'; - -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { serveRobotsTxt } from '@/routes/robots'; - -export const runtime = 'edge'; - -export async function GET(_request: NextRequest) { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return serveRobotsTxt(context); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/sitemap-pages.xml/route.ts b/packages/gitbook/src/app/middleware/(site)/(core)/sitemap-pages.xml/route.ts deleted file mode 100644 index 1027017ef4..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/sitemap-pages.xml/route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { servePagesSitemap } from '@/routes/sitemap'; - -export const runtime = 'edge'; - -export async function GET() { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return servePagesSitemap(context); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/sitemap.xml/route.ts b/packages/gitbook/src/app/middleware/(site)/(core)/sitemap.xml/route.ts deleted file mode 100644 index 21af744922..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/sitemap.xml/route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { serveRootSitemap } from '@/routes/sitemap'; - -export const runtime = 'edge'; - -export async function GET() { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return serveRootSitemap(context); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/icon/route.tsx b/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/icon/route.tsx deleted file mode 100644 index 9d8a1f5861..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/icon/route.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import type { NextRequest } from 'next/server'; - -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { serveIcon } from '@/routes/icon'; - -export const runtime = 'edge'; - -export async function GET(req: NextRequest) { - const pointer = await getSiteContentPointer(); - const context = await fetchV1ContextForSitePointer(pointer); - - return serveIcon(context, req); -} diff --git a/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/ogimage/[pageId]/route.tsx b/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/ogimage/[pageId]/route.tsx deleted file mode 100644 index 90ac301bd4..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/(core)/~gitbook/ogimage/[pageId]/route.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import type { NextRequest } from 'next/server'; - -import type { PageIdParams } from '@/components/SitePage'; -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; -import { serveOGImage } from '@/routes/ogimage'; - -export const runtime = 'edge'; - -export async function GET(_req: NextRequest, { params }: { params: Promise }) { - const pointer = await getSiteContentPointer(); - const baseContext = await fetchV1ContextForSitePointer(pointer); - - return serveOGImage(baseContext, await params); -} diff --git a/packages/gitbook/src/app/middleware/(site)/error.tsx b/packages/gitbook/src/app/middleware/(site)/error.tsx deleted file mode 100644 index 4f96f4e658..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/error.tsx +++ /dev/null @@ -1,45 +0,0 @@ -'use client'; - -import { Button } from '@/components/primitives/Button'; -import { t, useLanguage } from '@/intl/client'; -import { tcls } from '@/lib/tailwind'; - -export default function ErrorPage(props: { - error: Error & { digest?: string }; - reset: () => void; -}) { - const { reset } = props; - const language = useLanguage(); - - return ( -
-
-

- {t(language, 'unexpected_error_title')} -

-

{t(language, 'unexpected_error')}

-
- -
-
-
- ); -} diff --git a/packages/gitbook/src/app/middleware/(site)/layout.tsx b/packages/gitbook/src/app/middleware/(site)/layout.tsx deleted file mode 100644 index 80be81d821..0000000000 --- a/packages/gitbook/src/app/middleware/(site)/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { CustomizationRootLayout } from '@/components/RootLayout'; -import { getSiteContentPointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer } from '@/lib/v1'; - -/** - * Layout to be used for the site root. It fetches the customization data for the site - * and initializes the CustomizationRootLayout with it. - */ -export default async function SiteRootLayout(props: { children: React.ReactNode }) { - const { children } = props; - - const pointer = await getSiteContentPointer(); - const { customization } = await fetchV1ContextForSitePointer(pointer); - - return ( - {children} - ); -} diff --git a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/layout.tsx deleted file mode 100644 index 83a21df68a..0000000000 --- a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { PDFRootLayout } from '@/components/PDF'; -import { getV1ContextForPDF } from './pointer'; - -export default async function RootLayout(props: { children: React.ReactNode }) { - const { children } = props; - const context = await getV1ContextForPDF(); - - return {children}; -} diff --git a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/page.tsx deleted file mode 100644 index 80882c9d8a..0000000000 --- a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/page.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { PDFPage, generatePDFMetadata } from '@/components/PDF'; -import { getV1ContextForPDF } from './pointer'; - -export const runtime = 'edge'; -export const dynamic = 'force-dynamic'; - -export async function generateMetadata() { - const context = await getV1ContextForPDF(); - return generatePDFMetadata(context); -} - -export default async function Page(props: { - searchParams: Promise<{ [key: string]: string }>; -}) { - const context = await getV1ContextForPDF(); - return ; -} diff --git a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/pointer.ts b/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/pointer.ts deleted file mode 100644 index 402670825c..0000000000 --- a/packages/gitbook/src/app/middleware/(space)/~gitbook/pdf/pointer.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { GitBookSiteContext, GitBookSpaceContext } from '@v2/lib/context'; - -import type { SiteContentPointer, SpaceContentPointer } from '@/lib/api'; -import { getSiteContentPointer, getSpacePointer } from '@/lib/pointer'; -import { fetchV1ContextForSitePointer, fetchV1ContextForSpacePointer } from '@/lib/v1'; - -/** - * Get the context for the PDF pointer. - */ -export async function getV1ContextForPDF(): Promise { - const pointer = await getSiteOrSpacePointerForPDF(); - - return 'siteId' in pointer && pointer.siteId - ? await fetchV1ContextForSitePointer(pointer) - : await fetchV1ContextForSpacePointer(pointer); -} - -/** - * PDF generation can be done at the site level (e.g. docs.foo.com/~gitbook/pdf) or - * at the space level (e.g. open.gitbook.com/~space/:spaceId/~gitbook/pdf) which is - * for PDF export of in-app private spaces. - * - * This function returns the pointer depending on the context. - */ -async function getSiteOrSpacePointerForPDF(): Promise { - try { - return await getSiteContentPointer(); - } catch (_error) { - return getSpacePointer(); - } -} diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/loading.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/loading.tsx similarity index 100% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/loading.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/loading.tsx diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/not-found.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/not-found.tsx similarity index 100% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/not-found.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/not-found.tsx diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx similarity index 97% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx index e5f520d392..5d4395d12f 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/[pagePath]/page.tsx @@ -1,9 +1,9 @@ +import { type RouteParams, getDynamicSiteContext, getPagePathFromParams } from '@/app/utils'; import { SitePage, generateSitePageMetadata, generateSitePageViewport, } from '@/components/SitePage'; -import { type RouteParams, getDynamicSiteContext, getPagePathFromParams } from '@v2/app/utils'; import type { Metadata, Viewport } from 'next'; type PageProps = { diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx similarity index 91% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx index 8934279f01..3599edab21 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/(content)/layout.tsx @@ -1,12 +1,12 @@ +import { type RouteLayoutParams, getDynamicSiteContext } from '@/app/utils'; import { CustomizationRootLayout } from '@/components/RootLayout'; import { SiteLayout, generateSiteLayoutMetadata, generateSiteLayoutViewport, } from '@/components/SiteLayout'; -import { type RouteLayoutParams, getDynamicSiteContext } from '@v2/app/utils'; -import { GITBOOK_DISABLE_TRACKING } from '@v2/lib/env'; -import { getThemeFromMiddleware } from '@v2/lib/middleware'; +import { GITBOOK_DISABLE_TRACKING } from '@/lib/env'; +import { getThemeFromMiddleware } from '@/lib/middleware'; interface SiteDynamicLayoutProps { params: Promise; diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts similarity index 96% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts index cd6a118f7e..1ea6f0650d 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getDynamicSiteContext } from '@/app/utils'; import { serveIcon } from '@/routes/icon'; -import { type RouteLayoutParams, getDynamicSiteContext } from '@v2/app/utils'; export async function GET( request: NextRequest, diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts similarity index 96% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts index 6a25bad9a5..5c52031e48 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts @@ -1,8 +1,8 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getDynamicSiteContext } from '@/app/utils'; import type { PageIdParams } from '@/components/SitePage'; import { serveOGImage } from '@/routes/ogimage'; -import { type RouteLayoutParams, getDynamicSiteContext } from '@v2/app/utils'; export async function GET( _request: NextRequest, diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx similarity index 96% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx index 068d740c0c..30aa899476 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/layout.tsx @@ -1,5 +1,5 @@ +import { type RouteLayoutParams, getDynamicSiteContext } from '@/app/utils'; import { PDFRootLayout } from '@/components/PDF'; -import { type RouteLayoutParams, getDynamicSiteContext } from '@v2/app/utils'; export default async function RootLayout(props: { params: Promise; diff --git a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx similarity index 97% rename from packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx rename to packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx index 3fa3b3ff06..6f1c13e034 100644 --- a/packages/gitbook-v2/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx +++ b/packages/gitbook/src/app/sites/dynamic/[mode]/[siteURL]/[siteData]/~gitbook/pdf/page.tsx @@ -1,5 +1,5 @@ +import { type RouteLayoutParams, getDynamicSiteContext } from '@/app/utils'; import { PDFPage, generatePDFMetadata } from '@/components/PDF'; -import { type RouteLayoutParams, getDynamicSiteContext } from '@v2/app/utils'; export async function generateMetadata({ params, diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/not-found.tsx b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/not-found.tsx similarity index 100% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/not-found.tsx rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/not-found.tsx diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx similarity index 80% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx index e5d4ebc216..238630ae73 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/[pagePath]/page.tsx @@ -1,12 +1,11 @@ +import { type RouteParams, getPagePathFromParams, getStaticSiteContext } from '@/app/utils'; import { SitePage, generateSitePageMetadata, generateSitePageViewport, } from '@/components/SitePage'; -import { getCacheTag } from '@gitbook/cache-tags'; -import { type RouteParams, getPagePathFromParams, getStaticSiteContext } from '@v2/app/utils'; + import type { Metadata, Viewport } from 'next'; -import { unstable_cacheTag as cacheTag } from 'next/cache'; export const dynamic = 'force-static'; @@ -15,19 +14,10 @@ type PageProps = { }; export default async function Page(props: PageProps) { - 'use cache'; - const params = await props.params; const { context } = await getStaticSiteContext(params); const pathname = getPagePathFromParams(params); - cacheTag( - getCacheTag({ - tag: 'site', - site: context.site.id, - }) - ); - return ; } diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx similarity index 76% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx index 86a6b867f0..8b9fbf3ca9 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/layout.tsx @@ -1,13 +1,11 @@ +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { CustomizationRootLayout } from '@/components/RootLayout'; import { SiteLayout, generateSiteLayoutMetadata, generateSiteLayoutViewport, } from '@/components/SiteLayout'; -import { getCacheTag } from '@gitbook/cache-tags'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; -import { GITBOOK_DISABLE_TRACKING } from '@v2/lib/env'; -import { unstable_cacheTag as cacheTag } from 'next/cache'; +import { GITBOOK_DISABLE_TRACKING } from '@/lib/env'; interface SiteStaticLayoutProps { params: Promise; @@ -17,17 +15,8 @@ export default async function SiteStaticLayout({ params, children, }: React.PropsWithChildren) { - 'use cache'; - const { context, visitorAuthClaims } = await getStaticSiteContext(await params); - cacheTag( - getCacheTag({ - tag: 'site', - site: context.site.id, - }) - ); - return ( } +) { + const { context } = await getStaticSiteContext(await params); + return serveLLMsFullTxt(context); +} diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts similarity index 82% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts index 80343b911a..da1176d9b7 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/llms.txt/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { serveLLMsTxt } from '@/routes/llms'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts similarity index 82% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts index 95820d768f..3ea9e6b008 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/robots.txt/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { serveRobotsTxt } from '@/routes/robots'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts similarity index 82% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts index 472ae6309a..b9329ac82a 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap-pages.xml/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { servePagesSitemap } from '@/routes/sitemap'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts similarity index 82% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts index eac5149cd9..c306ca1e68 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/sitemap.xml/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { serveRootSitemap } from '@/routes/sitemap'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts similarity index 81% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts index 050aef9ef9..ed56130203 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/icon/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import { serveIcon } from '@/routes/icon'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts similarity index 93% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts index 311a3a0b13..1631baf317 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/markdown/[pagePath]/route.ts @@ -1,5 +1,5 @@ +import { type RouteParams, getPagePathFromParams, getStaticSiteContext } from '@/app/utils'; import { servePageMarkdown } from '@/routes/markdownPage'; -import { type RouteParams, getPagePathFromParams, getStaticSiteContext } from '@v2/app/utils'; import type { NextRequest } from 'next/server'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts similarity index 85% rename from packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts rename to packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts index 211de17274..08d3b3c283 100644 --- a/packages/gitbook-v2/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts +++ b/packages/gitbook/src/app/sites/static/[mode]/[siteURL]/[siteData]/~gitbook/ogimage/[pageId]/route.ts @@ -1,8 +1,8 @@ import type { NextRequest } from 'next/server'; +import { type RouteLayoutParams, getStaticSiteContext } from '@/app/utils'; import type { PageIdParams } from '@/components/SitePage'; import { serveOGImage } from '@/routes/ogimage'; -import { type RouteLayoutParams, getStaticSiteContext } from '@v2/app/utils'; export const dynamic = 'force-static'; diff --git a/packages/gitbook-v2/src/app/utils.ts b/packages/gitbook/src/app/utils.ts similarity index 91% rename from packages/gitbook-v2/src/app/utils.ts rename to packages/gitbook/src/app/utils.ts index da810b3b90..0e5d1688b0 100644 --- a/packages/gitbook-v2/src/app/utils.ts +++ b/packages/gitbook/src/app/utils.ts @@ -1,6 +1,7 @@ import { getVisitorAuthClaims, getVisitorAuthClaimsFromToken } from '@/lib/adaptive'; +import { type SiteURLData, fetchSiteContextByURLLookup, getBaseContext } from '@/lib/context'; +import { getDynamicCustomizationSettings } from '@/lib/customization'; import type { SiteAPIToken } from '@gitbook/api'; -import { type SiteURLData, fetchSiteContextByURLLookup, getBaseContext } from '@v2/lib/context'; import { jwtDecode } from 'jwt-decode'; import { forbidden } from 'next/navigation'; import rison from 'rison'; @@ -13,7 +14,7 @@ export type RouteLayoutParams = { /** URL encoded site URL */ siteURL: string; - /** URL and Rison encoded site data from getPublishedContentByUrl */ + /** URL and Rison encoded site data from resolvePublishedContentByUrl */ siteData: string; }; @@ -67,6 +68,8 @@ export async function getDynamicSiteContext(params: RouteLayoutParams) { siteURLData ); + context.customization = await getDynamicCustomizationSettings(context.customization); + return { context, visitorAuthClaims: getVisitorAuthClaims(siteURLData), diff --git a/packages/gitbook-v2/src/app/~gitbook/env/route.ts b/packages/gitbook/src/app/~gitbook/env/route.ts similarity index 97% rename from packages/gitbook-v2/src/app/~gitbook/env/route.ts rename to packages/gitbook/src/app/~gitbook/env/route.ts index b890ea6774..5d89fe423e 100644 --- a/packages/gitbook-v2/src/app/~gitbook/env/route.ts +++ b/packages/gitbook/src/app/~gitbook/env/route.ts @@ -14,7 +14,7 @@ import { GITBOOK_SECRET, GITBOOK_URL, GITBOOK_USER_AGENT, -} from '@v2/lib/env'; +} from '@/lib/env'; /** * Output the public environment variables for this deployment diff --git a/packages/gitbook-v2/src/app/~gitbook/revalidate/route.ts b/packages/gitbook/src/app/~gitbook/revalidate/route.ts similarity index 94% rename from packages/gitbook-v2/src/app/~gitbook/revalidate/route.ts rename to packages/gitbook/src/app/~gitbook/revalidate/route.ts index 9b000f6c93..17d03c1b84 100644 --- a/packages/gitbook-v2/src/app/~gitbook/revalidate/route.ts +++ b/packages/gitbook/src/app/~gitbook/revalidate/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server'; -import { withVerifySignature } from '@v2/lib/routes'; +import { withVerifySignature } from '@/lib/routes'; import { revalidateTag } from 'next/cache'; interface JsonBody { diff --git a/packages/gitbook/src/app/~scalar/proxy/route.ts b/packages/gitbook/src/app/~scalar/proxy/route.ts deleted file mode 100644 index 07827de49b..0000000000 --- a/packages/gitbook/src/app/~scalar/proxy/route.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { type NextRequest, NextResponse } from 'next/server'; - -type ProxyRequest = { - url: string; - method: string; - headers: Record; - data: Record; -}; - -export const runtime = 'edge'; - -/** - * Taken from https://github.com/scalar/scalar/tree/main/packages/api-client-proxy - */ -export async function POST(req: NextRequest) { - const requestBody: ProxyRequest = await req.json(); - - const isGetOrHeadRequest = ['get', 'head'].includes(requestBody.method.trim().toLowerCase()); - const body = isGetOrHeadRequest - ? null - : requestBody.data - ? JSON.stringify(requestBody.data) - : null; - - // Default options are marked with * - try { - const response = await fetch(requestBody.url.trim(), { - // *GET, POST, PUT, DELETE, etc. - method: requestBody.method.trim(), - // no-cors, *cors, same-origin - // mode: 'cors', // Not supported on Cloudflare Workers - // *default, no-cache, reload, force-cache, only-if-cached - // cache: 'no-cache', // Not supported on Cloudflare Workers - // include, *same-origin, omit - // credentials: 'include', // Not supported on Cloudflare Workers - headers: requestBody.headers, - // manual, *follow, error - redirect: 'follow', - // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url - // referrerPolicy: 'no-referrer', // Not supported on Cloudflare Workers - // body data type must match "Content-Type" header - body, - }); - - const headers: Record = {}; - - const proxyHeaders = [...response.headers]; - proxyHeaders.forEach(([key, value]) => { - if (['access-control-allow-origin'].includes(key.toLowerCase())) { - return; - } - - headers[key] = value; - }); - - const text = await response.text(); - - return NextResponse.json({ - statusCode: response.status, - // TODO: Do we need body? - // body: … - data: text, - headers: { - ...headers, - 'X-API-Client-Content-Length': text.length, - }, - // TODO: transform cookie data - cookies: response.headers.get('cookies'), - }); - } catch (_error) { - return NextResponse.json({ - data: 'Scalar API Client Proxy Error', - }); - } -} diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/pdf.ts b/packages/gitbook/src/app/~space/[spaceId]/pdf.ts similarity index 87% rename from packages/gitbook-v2/src/app/~space/[spaceId]/pdf.ts rename to packages/gitbook/src/app/~space/[spaceId]/pdf.ts index 47feb1933e..44ab82b992 100644 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/pdf.ts +++ b/packages/gitbook/src/app/~space/[spaceId]/pdf.ts @@ -2,10 +2,10 @@ import { type GitBookBaseContext, type GitBookSpaceContext, fetchSpaceContextByIds, -} from '@v2/lib/context'; -import { createDataFetcher } from '@v2/lib/data'; -import { createLinker } from '@v2/lib/links'; -import { getAPITokenFromMiddleware } from '@v2/lib/middleware'; +} from '@/lib/context'; +import { createDataFetcher } from '@/lib/data'; +import { createLinker } from '@/lib/links'; +import { getAPITokenFromMiddleware } from '@/lib/middleware'; export type SpacePDFRouteParams = { spaceId: string; diff --git a/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx new file mode 100644 index 0000000000..521ade4200 --- /dev/null +++ b/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/layout.tsx @@ -0,0 +1,2 @@ +import RootLayout from '@/app/~space/[spaceId]/~gitbook/pdf/layout'; +export default RootLayout; diff --git a/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx new file mode 100644 index 0000000000..f66ca58645 --- /dev/null +++ b/packages/gitbook/src/app/~space/[spaceId]/~/changes/[changeRequestId]/~gitbook/pdf/page.tsx @@ -0,0 +1,4 @@ +import PDFPage, { generateMetadata } from '@/app/~space/[spaceId]/~gitbook/pdf/page'; + +export default PDFPage; +export { generateMetadata }; diff --git a/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx new file mode 100644 index 0000000000..521ade4200 --- /dev/null +++ b/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/layout.tsx @@ -0,0 +1,2 @@ +import RootLayout from '@/app/~space/[spaceId]/~gitbook/pdf/layout'; +export default RootLayout; diff --git a/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx new file mode 100644 index 0000000000..f66ca58645 --- /dev/null +++ b/packages/gitbook/src/app/~space/[spaceId]/~/revisions/[changeRequestId]/~gitbook/pdf/page.tsx @@ -0,0 +1,4 @@ +import PDFPage, { generateMetadata } from '@/app/~space/[spaceId]/~gitbook/pdf/page'; + +export default PDFPage; +export { generateMetadata }; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx similarity index 79% rename from packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx rename to packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx index dfdcc6b624..c3205d2bf0 100644 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx +++ b/packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/layout.tsx @@ -1,5 +1,5 @@ +import { type SpacePDFRouteParams, getSpacePDFContext } from '@/app/~space/[spaceId]/pdf'; import { PDFRootLayout } from '@/components/PDF'; -import { type SpacePDFRouteParams, getSpacePDFContext } from '@v2/app/~space/[spaceId]/pdf'; export default async function RootLayout(props: { params: Promise; diff --git a/packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx similarity index 86% rename from packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx rename to packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx index e9f59ded35..fdf11e13d7 100644 --- a/packages/gitbook-v2/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx +++ b/packages/gitbook/src/app/~space/[spaceId]/~gitbook/pdf/page.tsx @@ -1,5 +1,5 @@ +import { type SpacePDFRouteParams, getSpacePDFContext } from '@/app/~space/[spaceId]/pdf'; import { PDFPage, generatePDFMetadata } from '@/components/PDF'; -import { type SpacePDFRouteParams, getSpacePDFContext } from '@v2/app/~space/[spaceId]/pdf'; export async function generateMetadata({ params, diff --git a/packages/gitbook/src/cloudflare-entrypoint.ts b/packages/gitbook/src/cloudflare-entrypoint.ts deleted file mode 100644 index 4f7bab8764..0000000000 --- a/packages/gitbook/src/cloudflare-entrypoint.ts +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-ignore -import nextOnPagesHandler from '@cloudflare/next-on-pages/fetch-handler'; - -import { withResponseCacheTags } from './lib/cache/response'; -import { withMiddlewareHeadersStorage } from './lib/middleware'; - -/** - * We use a custom entrypoint until we can move to opennext (https://github.com/opennextjs/opennextjs-cloudflare/issues/92). - * There is a bug in next-on-pages where headers can't be set on the response in the middleware for RSC requests (https://github.com/cloudflare/next-on-pages/issues/897). - */ -export default { - async fetch(request, env, ctx) { - const response = await withResponseCacheTags(() => - withMiddlewareHeadersStorage(() => nextOnPagesHandler.fetch(request, env, ctx)) - ); - - return response; - }, -} as ExportedHandler<{ ASSETS: Fetcher }>; diff --git a/packages/gitbook/src/components/AI/index.ts b/packages/gitbook/src/components/AI/index.ts new file mode 100644 index 0000000000..676ce84559 --- /dev/null +++ b/packages/gitbook/src/components/AI/index.ts @@ -0,0 +1 @@ +export * from './useAIChat'; diff --git a/packages/gitbook/src/components/AI/server-actions/AIMessageView.tsx b/packages/gitbook/src/components/AI/server-actions/AIMessageView.tsx new file mode 100644 index 0000000000..7fee28343a --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/AIMessageView.tsx @@ -0,0 +1,41 @@ +import type { GitBookSiteContext } from '@/lib/context'; +import type { AIMessage } from '@gitbook/api'; +import { DocumentView } from '../../DocumentView'; +import { AIToolCallsSummary } from './AIToolCallsSummary'; +import type { RenderAIMessageOptions } from './types'; + +/** + * Render a message from the API backend. + */ +export function AIMessageView( + props: RenderAIMessageOptions & { + message: AIMessage; + context: GitBookSiteContext; + } +) { + const { message, context, renderToolCalls = true } = props; + + return ( +
+ {message.steps.map((step, index) => { + return ( +
+ + {renderToolCalls && step.toolCalls && step.toolCalls.length > 0 ? ( + + ) : null} +
+ ); + })} +
+ ); +} diff --git a/packages/gitbook/src/components/AI/server-actions/AIToolCallsSummary.tsx b/packages/gitbook/src/components/AI/server-actions/AIToolCallsSummary.tsx new file mode 100644 index 0000000000..ed4738751b --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/AIToolCallsSummary.tsx @@ -0,0 +1,285 @@ +import { HighlightQuery } from '@/components/Search/HighlightQuery'; +import { Link, StyledLink } from '@/components/primitives'; +import { getSpaceLanguage } from '@/intl/server'; +import { t } from '@/intl/translate'; +import type { GitBookSiteContext } from '@/lib/context'; +import { resolveContentRef } from '@/lib/references'; +import type { + AIToolCall, + AIToolCallGetPageContent, + AIToolCallGetPages, + AIToolCallMCP, + AIToolCallSearch, + ContentRef, +} from '@gitbook/api'; +import { Icon, type IconName } from '@gitbook/icons'; +import type * as React from 'react'; + +/** + * Display the tool calls in a message or step. + */ +export function AIToolCallsSummary(props: { + toolCalls: AIToolCall[]; + context: GitBookSiteContext; +}) { + const { toolCalls, context } = props; + + return ( +
+ {toolCalls.map((toolCall, index) => ( + + ))} +
+ ); +} + +function ToolCallSummary(props: { toolCall: AIToolCall; context: GitBookSiteContext }) { + const { toolCall, context } = props; + + return ( +
+ + {getDescriptionForToolCall(toolCall, context)} +
+ ); +} + +function getDescriptionForToolCall(toolCall: AIToolCall, context: GitBookSiteContext) { + switch (toolCall.tool) { + case 'getPageContent': + return ; + case 'search': + return ; + case 'getPages': + return ; + case 'mcp': + return ; + default: + return <>{toolCall.tool}; + } +} + +function DescriptionForPageContentToolCall(props: { + toolCall: AIToolCallGetPageContent; + context: GitBookSiteContext; +}) { + const { toolCall, context } = props; + + const language = getSpaceLanguage(context.customization); + + return ( +

+ {t( + language, + 'ai_chat_tools_read_page', + <> + + + + )} +

+ ); +} + +function DescriptionForMCPToolCall(props: { + toolCall: AIToolCallMCP; + context: GitBookSiteContext; +}) { + const { toolCall, context } = props; + + const language = getSpaceLanguage(context.customization); + + return ( +

+ {t( + language, + 'ai_chat_tools_mcp_tool', + {toolCall.mcpToolTitle ?? toolCall.mcpToolName} + )} +

+ ); +} + +async function DescriptionForSearchToolCall(props: { + toolCall: AIToolCallSearch; + context: GitBookSiteContext; +}) { + const { toolCall, context } = props; + + const language = getSpaceLanguage(context.customization); + + // Resolve all hrefs for search results in parallel + const searchResultsWithHrefs = await Promise.all( + toolCall.results.map(async (result) => { + const resolved = await resolveContentRef( + result.anchor + ? { + kind: 'anchor', + page: result.pageId, + space: result.spaceId, + anchor: result.anchor, + } + : { + kind: 'page', + page: result.pageId, + space: result.spaceId, + }, + context + ); + return { + ...result, + href: resolved?.href || '#', + }; + }) + ); + + return ( +
+ +
+

{t(language, 'searched_for', {toolCall.query})}

+

+ {toolCall.results.length + ? t(language, 'search_results_count', toolCall.results.length) + : t(language, 'search_no_results')} +

+
+
+ {t(language, 'view')} + {t(language, 'close')} + +
+
+
+
    + {searchResultsWithHrefs.map((result, index) => ( +
  1. + + +
    +

    + +

    + {result.description && ( +

    + +

    + )} +
    + + +
  2. + ))} +
+
+
+ ); +} + +function DescriptionForGetPagesToolCall(props: { + toolCall: AIToolCallGetPages; + context: GitBookSiteContext; +}) { + const { toolCall, context } = props; + + const language = getSpaceLanguage(context.customization); + + return ( +

+ {t(language, 'ai_chat_tools_listed_pages')} + +

+ ); +} + +function getIconForToolCall(toolCall: AIToolCall): IconName { + switch (toolCall.tool) { + case 'getPageContent': + return 'memo'; + case 'search': + return 'magnifying-glass'; + case 'getPages': + return 'files'; + default: + return 'hammer'; + } +} + +/** + * Link to a space that is not the current space. + */ +function OtherSpaceLink(props: { + spaceId: string; + context: GitBookSiteContext; + prefix?: React.ReactNode; +}) { + const { spaceId, prefix = ' in ', context } = props; + + if (context.space.id === spaceId) { + return null; + } + + return ( + <> + {prefix} + + + ); +} + +async function ContentRefLink(props: { + contentRef: ContentRef; + context: GitBookSiteContext; + fallback?: React.ReactNode; +}) { + const { contentRef, context, fallback } = props; + + const resolved = await resolveContentRef(contentRef, context); + + if (!resolved) { + return {fallback}; + } + + return {resolved.text}; +} diff --git a/packages/gitbook/src/components/AI/server-actions/api.tsx b/packages/gitbook/src/components/AI/server-actions/api.tsx new file mode 100644 index 0000000000..12e82b62a8 --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/api.tsx @@ -0,0 +1,161 @@ +'use server'; +import type { GitBookBaseContext } from '@/lib/context'; +import { fetchServerActionSiteContext } from '@/lib/server-actions'; +import { + type AIMessage, + AIMessageRole, + type AIMessageStep, + type AIStreamResponse, +} from '@gitbook/api'; +import { EventIterator } from 'event-iterator'; +import { AIMessageView } from './AIMessageView'; +import type { RenderAIMessageOptions } from './types'; + +/** + * Stream the generation of a document. + */ +export async function streamRenderAIMessage( + baseContext: GitBookBaseContext, + rawStream: AsyncIterable, + options?: RenderAIMessageOptions +) { + const message: AIMessage = { + id: '', + role: AIMessageRole.Assistant, + steps: [], + }; + + const updateProcessingMessageStep = ( + stepIndex: number, + callback: (step: AIMessageStep) => void + ) => { + if (stepIndex > message.steps.length) { + throw new Error( + `Step index out of bounds ${stepIndex} (${message.steps.length} steps)` + ); + } + + if (message.steps[stepIndex]) { + message.steps = [...message.steps]; + message.steps[stepIndex] = { ...message.steps[stepIndex] }; + callback(message.steps[stepIndex]); + } else { + message.steps = [ + ...message.steps, + { + content: { + object: 'document', + data: {}, + nodes: [], + }, + }, + ]; + callback(message.steps[stepIndex]); + } + }; + + // Fetch the full-context in the background to avoid blocking the stream. + const promiseContext = fetchServerActionSiteContext(baseContext); + + return parseResponse<{ + content: React.ReactNode; + event: AIStreamResponse; + }>(rawStream, async (event) => { + switch (event.type) { + /** + * The agent is processing a tool call in a new message. + */ + case 'response_tool_call': { + updateProcessingMessageStep(event.stepIndex, (step) => { + step.toolCalls ??= []; + step.toolCalls.push(event.toolCall); + }); + break; + } + + /** + * The agent is writing the content of a new message. + */ + case 'response_reasoning': + case 'response_document': { + updateProcessingMessageStep(event.stepIndex, (step) => { + const container = event.type === 'response_reasoning' ? 'reasoning' : 'content'; + + step[container] ??= { + object: 'document', + data: {}, + nodes: [], + }; + step[container] = { + ...step[container], + nodes: [...step[container].nodes], + }; + if (event.operation === 'insert') { + step[container].nodes.push(...event.blocks); + } else { + step[container].nodes.splice( + -event.blocks.length, + event.blocks.length, + ...event.blocks + ); + } + }); + break; + } + } + + return { + event, + content: ( + + ), + }; + }); +} + +/** + * Parse a stream from the API to extract the responseId. + */ +function parseResponse( + responseStream: EventIterator, + parse: (response: AIStreamResponse) => T | undefined | Promise +): { + stream: EventIterator; + response: Promise<{ responseId: string }>; +} { + let resolveResponse: (value: { responseId: string }) => void; + const response = new Promise<{ responseId: string }>((resolve) => { + resolveResponse = resolve; + }); + + const stream = new EventIterator((queue) => { + (async () => { + let foundResponse = false; + + for await (const event of responseStream) { + const parsed = await parse(event); + if (parsed !== undefined) { + queue.push(parsed); + } + + if (event.type === 'response_finish') { + foundResponse = true; + resolveResponse({ responseId: event.responseId }); + } + } + + if (!foundResponse) { + throw new Error('No response found'); + } + })().then( + () => { + queue.stop(); + }, + (error) => { + queue.fail(error); + } + ); + }); + + return { stream, response }; +} diff --git a/packages/gitbook/src/components/AI/server-actions/chat.ts b/packages/gitbook/src/components/AI/server-actions/chat.ts new file mode 100644 index 0000000000..57900c6005 --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/chat.ts @@ -0,0 +1,45 @@ +'use server'; +import { getSiteURLDataFromMiddleware } from '@/lib/middleware'; +import { getServerActionBaseContext } from '@/lib/server-actions'; +import { type AIMessageContext, AIMessageRole, AIModel } from '@gitbook/api'; +import { streamRenderAIMessage } from './api'; +import type { RenderAIMessageOptions } from './types'; + +/** + * Generate a response to a chat message. + */ +export async function* streamAIChatResponse({ + message, + messageContext, + previousResponseId, + options, +}: { + message: string; + messageContext: AIMessageContext; + previousResponseId?: string; + options?: RenderAIMessageOptions; +}) { + const context = await getServerActionBaseContext(); + const siteURLData = await getSiteURLDataFromMiddleware(); + + const api = await context.dataFetcher.api(); + const rawStream = api.orgs.streamAiResponseInSite(siteURLData.organization, siteURLData.site, { + mode: 'assistant', + input: [ + { + role: AIMessageRole.User, + content: message, + context: messageContext, + }, + ], + output: { type: 'document' }, + model: AIModel.ReasoningLow, + previousResponseId, + }); + + const { stream } = await streamRenderAIMessage(context, rawStream, options); + + for await (const output of stream) { + yield output; + } +} diff --git a/packages/gitbook/src/components/AI/server-actions/index.ts b/packages/gitbook/src/components/AI/server-actions/index.ts new file mode 100644 index 0000000000..51f681fc7e --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './responses'; +export * from './chat'; diff --git a/packages/gitbook/src/components/AI/server-actions/responses.ts b/packages/gitbook/src/components/AI/server-actions/responses.ts new file mode 100644 index 0000000000..8326fe42fd --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/responses.ts @@ -0,0 +1,31 @@ +'use server'; +import { getSiteURLDataFromMiddleware } from '@/lib/middleware'; +import { getServerActionBaseContext } from '@/lib/server-actions'; +import { streamRenderAIMessage } from './api'; +import type { RenderAIMessageOptions } from './types'; + +/** + * Stream an existing AI responses. + */ +export async function* streamAIResponseById({ + responseId, + options, +}: { + responseId: string; + options?: RenderAIMessageOptions; +}) { + const context = await getServerActionBaseContext(); + const siteURLData = await getSiteURLDataFromMiddleware(); + + const api = await context.dataFetcher.api(); + const rawStream = api.orgs.streamExistingAiResponseInSite( + siteURLData.organization, + siteURLData.site, + responseId + ); + const { stream } = await streamRenderAIMessage(context, rawStream, options); + + for await (const output of stream) { + yield output; + } +} diff --git a/packages/gitbook/src/components/AI/server-actions/types.ts b/packages/gitbook/src/components/AI/server-actions/types.ts new file mode 100644 index 0000000000..8aef764a22 --- /dev/null +++ b/packages/gitbook/src/components/AI/server-actions/types.ts @@ -0,0 +1,20 @@ +import type { AIStreamResponse } from '@gitbook/api'; + +/** + * Stream when rendering an AI message. + */ +export type AIMessageRenderStream = AsyncIterable<{ + content: React.ReactNode; + event: AIStreamResponse; +}>; + +/** + * Options that can be passed when generating a AI message stream. + */ +export type RenderAIMessageOptions = { + /** + * Render the tool calls. + * @default true + */ + renderToolCalls?: boolean; +}; diff --git a/packages/gitbook/src/components/AI/useAIChat.tsx b/packages/gitbook/src/components/AI/useAIChat.tsx new file mode 100644 index 0000000000..2dec0b2daf --- /dev/null +++ b/packages/gitbook/src/components/AI/useAIChat.tsx @@ -0,0 +1,200 @@ +'use client'; + +import * as zustand from 'zustand'; + +import { AIMessageRole } from '@gitbook/api'; +import * as React from 'react'; +import { useTrackEvent } from '../Insights'; +import { streamAIChatResponse } from './server-actions'; +import { useAIMessageContextRef } from './useAIMessageContext'; + +export type AIChatMessage = { + role: AIMessageRole; + content: React.ReactNode; +}; + +export type AIChatState = { + /** + * If true, the chat is open. + */ + opened: boolean; + + /** + * ID of the latest AI response. + */ + responseId: string | null; + + /** + * Messages in the session. + */ + messages: AIChatMessage[]; + + /** + * Suggestions for follow-up messages. + */ + followUpSuggestions: string[]; + + /** + * If true, the session is in progress. + */ + loading: boolean; + + /** + * Set to true when an error occurred while communicating with the server. When + * this flag is true, the chat input should be read-only and the UI should + * display an error alert. Clearing the conversation will reset this flag. + */ + error: boolean; +}; + +export type AIChatController = { + /** Open the dialog */ + open: () => void; + + /** Close the dialog */ + close: () => void; + + /** Post a message to the session */ + postMessage: (input: { + /** The message to post to the session. it can be markdown formatted. */ + message: string; + }) => void; + + /** Clear the conversation */ + clear: () => void; +}; + +const globalState = zustand.create<{ + state: AIChatState; + setState: (fn: (state: AIChatState) => Partial) => void; +}>((set) => { + return { + state: { + opened: false, + responseId: null, + messages: [], + followUpSuggestions: [], + loading: false, + error: false, + }, + setState: (fn) => set((state) => ({ state: { ...state.state, ...fn(state.state) } })), + }; +}); + +/** + * Get the current state of the AI chat. + */ +export function useAIChatState(): AIChatState { + const state = zustand.useStore(globalState, (state) => state.state); + return state; +} + +/** + * Get the controller to interact with the AI chat. + */ +export function useAIChatController(): AIChatController { + const messageContextRef = useAIMessageContextRef(); + const setState = zustand.useStore(globalState, (state) => state.setState); + const trackEvent = useTrackEvent(); + + return React.useMemo(() => { + return { + open: () => setState((state) => ({ ...state, opened: true })), + close: () => setState((state) => ({ ...state, opened: false })), + clear: () => + setState((state) => ({ + opened: state.opened, + loading: false, + messages: [], + followUpSuggestions: [], + responseId: null, + error: false, + })), + postMessage: async (input: { message: string }) => { + trackEvent({ type: 'ask_question', query: input.message }); + setState((state) => { + return { + ...state, + messages: [ + ...state.messages, + { + // TODO: how to handle markdown here? + // to avoid rendering as plain text + role: AIMessageRole.User, + content: input.message, + }, + { + role: AIMessageRole.Assistant, + content: null, + }, + ], + followUpSuggestions: [], + loading: true, + error: false, + }; + }); + + try { + const stream = await streamAIChatResponse({ + message: input.message, + messageContext: messageContextRef.current, + previousResponseId: globalState.getState().state.responseId ?? undefined, + }); + + for await (const data of stream) { + if (!data) continue; + + const event = data.event; + + switch (event.type) { + case 'response_finish': { + setState((state) => ({ + ...state, + responseId: event.responseId, + // Mark as not loading when the response is finished + // Even if the stream might continue as we receive 'response_followup_suggestion' + loading: false, + error: false, + })); + break; + } + case 'response_followup_suggestion': { + setState((state) => ({ + ...state, + followUpSuggestions: [ + ...state.followUpSuggestions, + ...event.suggestions, + ], + })); + break; + } + } + + setState((state) => ({ + ...state, + messages: [ + ...state.messages.slice(0, -1), + { + role: AIMessageRole.Assistant, + content: data.content, + }, + ], + })); + } + + setState((state) => ({ + ...state, + loading: false, + error: false, + })); + } catch { + setState((state) => ({ + ...state, + loading: false, + error: true, + })); + } + }, + }; + }, [messageContextRef, setState, trackEvent]); +} diff --git a/packages/gitbook/src/components/AI/useAIMessageContext.ts b/packages/gitbook/src/components/AI/useAIMessageContext.ts new file mode 100644 index 0000000000..dd8d1dbc32 --- /dev/null +++ b/packages/gitbook/src/components/AI/useAIMessageContext.ts @@ -0,0 +1,35 @@ +import type { AIMessageContext } from '@gitbook/api'; +import React from 'react'; +import { useCurrentPage } from '../hooks'; + +/** + * Return the context for the AI message. + */ +export function useAIMessageContext(): AIMessageContext { + const currentPage = useCurrentPage(); + + return React.useMemo(() => { + return { + location: currentPage + ? { + spaceId: currentPage.spaceId, + pageId: currentPage.pageId, + } + : undefined, + }; + }, [currentPage]); +} + +/** + * Return the context for the AI message as a mutable React ref + */ +export function useAIMessageContextRef(): React.MutableRefObject { + const context = useAIMessageContext(); + const ref = React.useRef(context); + + React.useEffect(() => { + ref.current = context; + }, [context]); + + return ref; +} diff --git a/packages/gitbook/src/components/AIChat/AIChat.tsx b/packages/gitbook/src/components/AIChat/AIChat.tsx new file mode 100644 index 0000000000..febf6dad91 --- /dev/null +++ b/packages/gitbook/src/components/AIChat/AIChat.tsx @@ -0,0 +1,226 @@ +'use client'; + +import { t, tString, useLanguage } from '@/intl/client'; +import { Icon } from '@gitbook/icons'; +import React from 'react'; +import { + type AIChatController, + type AIChatState, + useAIChatController, + useAIChatState, +} from '../AI/useAIChat'; +import { useNow } from '../hooks'; +import { Button } from '../primitives'; +import { DropdownMenu, DropdownMenuItem } from '../primitives/DropdownMenu'; +import AIChatIcon from './AIChatIcon'; +import { AIChatInput } from './AIChatInput'; +import { AIChatMessages } from './AIChatMessages'; +import AIChatSuggestedQuestions from './AIChatSuggestedQuestions'; +import { AIChatFollowupSuggestions } from './AiChatFollowupSuggestions'; + +export function AIChat() { + const chat = useAIChatState(); + + if (!chat.opened) { + return null; + } + + return ; +} + +export function AIChatWindow(props: { chat: AIChatState }) { + const { chat } = props; + + const [input, setInput] = React.useState(''); + const chatController = useAIChatController(); + + const containerRef = React.useRef(null); + const scrollContainerRef = React.useRef(null); + // Ref for the last user message element + const lastUserMessageRef = React.useRef(null); + const inputRef = React.useRef(null); + + const [inputHeight, setInputHeight] = React.useState(0); + const language = useLanguage(); + const now = useNow(60 * 60 * 1000); // Refresh every hour for greeting + + const isEmpty = !chat.messages.length; + + const timeGreeting = React.useMemo(() => { + const hour = new Date(now).getHours(); + if (hour < 6) return tString(language, 'ai_chat_assistant_greeting_night'); + if (hour < 12) return tString(language, 'ai_chat_assistant_greeting_morning'); + if (hour < 18) return tString(language, 'ai_chat_assistant_greeting_afternoon'); + return tString(language, 'ai_chat_assistant_greeting_evening'); + }, [now, language]); + + // Auto-scroll to the latest user message when messages change + React.useEffect(() => { + if (chat.messages.length > 0 && lastUserMessageRef.current) { + lastUserMessageRef.current.scrollIntoView({ + behavior: 'smooth', + block: 'start', + }); + } + }, [chat.messages.length]); + + React.useEffect(() => { + // When the chat is opened, scroll to it (applicable on mobile, where it's displayed above the content) + containerRef.current?.scrollIntoView({ + behavior: 'smooth', + block: 'start', + }); + + // We want the chat messages to scroll underneath the input, but they should scroll past the input when scrolling all the way down. + // The best way to do this is to observe the input height and adjust the padding bottom of the scroll container accordingly. + const observer = new ResizeObserver((entries) => { + entries.forEach((entry) => { + setInputHeight(entry.contentRect.height + 32); + }); + }); + if (inputRef.current) { + observer.observe(inputRef.current); + } + return () => observer.disconnect(); + }, [chat.opened]); + + return ( +
+
+
+ +
+
Docs Assistant
+
+ {chat.loading + ? chat.messages[chat.messages.length - 1].content + ? t(language, 'ai_chat_working') + : t(language, 'ai_chat_thinking') + : ''} +
+
+
+ {}} + iconOnly + icon="ellipsis" + label={tString(language, 'more')} + className="!px-2" + variant="blank" + size="default" + /> + } + > + { + chatController.clear(); + }} + disabled={isEmpty} + > + + {t(language, 'ai_chat_clear_conversation')} + + +
+
+
+ {isEmpty ? ( +
+
+ +
+
+
+ {timeGreeting} +
+

+ {t(language, 'ai_chat_assistant_description')} +

+
+ {!chat.error ? ( + + ) : null} +
+ ) : ( + + )} +
+
+ {/* Display an error banner when something went wrong. */} + {chat.error ? ( + + ) : ( + + )} + + { + chatController.postMessage({ message: input }); + setInput(''); + }} + /> +
+
+
+ ); +} + +function AIChatError(props: { chatController: AIChatController }) { + const language = useLanguage(); + const { chatController } = props; + + return ( +
+
+ + {t(language, 'ai_chat_error')} +
+
+
+
+ ); +} diff --git a/packages/gitbook/src/components/AIChat/AIChatButton.tsx b/packages/gitbook/src/components/AIChat/AIChatButton.tsx new file mode 100644 index 0000000000..b4194d1a86 --- /dev/null +++ b/packages/gitbook/src/components/AIChat/AIChatButton.tsx @@ -0,0 +1,33 @@ +'use client'; +import { tString, useLanguage } from '@/intl/client'; +import { useAIChatController, useAIChatState } from '../AI/useAIChat'; +import { Button } from '../primitives'; +import AIChatIcon from './AIChatIcon'; + +/** + * Button to open/close the AI chat. + */ +export function AIChatButton() { + const chatController = useAIChatController(); + const chat = useAIChatState(); + + const language = useLanguage(); + + return ( +