diff --git a/.claude/skills/upgrade-npm-packages/SKILL.md b/.claude/skills/vitnode-upgrade-npm-packages/SKILL.md similarity index 97% rename from .claude/skills/upgrade-npm-packages/SKILL.md rename to .claude/skills/vitnode-upgrade-npm-packages/SKILL.md index 02a524efd..3780a5dda 100644 --- a/.claude/skills/upgrade-npm-packages/SKILL.md +++ b/.claude/skills/vitnode-upgrade-npm-packages/SKILL.md @@ -1,5 +1,5 @@ --- -name: upgrade-npm-packages +name: vitnode-upgrade-npm-packages description: A skill that helps users upgrade their npm packages to the latest versions. --- diff --git a/.claude/skills/vitnode-write-docs/SKILL.md b/.claude/skills/vitnode-write-docs/SKILL.md new file mode 100644 index 000000000..345c76aa9 --- /dev/null +++ b/.claude/skills/vitnode-write-docs/SKILL.md @@ -0,0 +1,1077 @@ +--- +name: vitnode-write-docs +description: > + Write, rewrite, and review VitNode documentation. Use for How-to guides, + Reference pages, and Explanation pages. Produces concise, example-first, + developer-focused MDX documentation using Fumadocs components where useful. +--- + +# VitNode Documentation Writer + +Write documentation that helps developers understand or complete a task +as quickly as possible. + +VitNode documentation should be: + +- concise +- practical +- easy to scan +- example-first +- technically precise +- written in simple English +- useful without reading every paragraph + +A reader should usually understand the main solution from: + +1. the title +2. the first paragraph +3. the first code example + +Avoid documentation that reads like an article, marketing page, or AI-generated +explanation. + +--- + +# 1. Choose the page type first + +Before writing, classify the page as exactly one primary type: + +- **How-to** +- **Reference** +- **Explanation** + +Do not mix multiple documentation styles unless there is a strong reason. + +If an existing page mixes them, separate the concerns mentally and keep the +primary page focused. + +## How-to + +Use when the reader wants to accomplish something. + +Examples: + +- Create a plugin +- Add a route +- Use the fetcher +- Register an AdminCP navigation item +- Add translations +- Create a widget +- Add Elasticsearch to a plugin + +The reader already has a goal. + +Answer: + +> How do I do this? + +Prefer working code over conceptual explanation. + +--- + +## Reference + +Use when the reader needs precise technical information. + +Examples: + +- `fetcher()` API +- plugin configuration +- lifecycle hooks +- widget options +- content field types +- API context +- event definitions + +Answer: + +> What options exist and what exactly do they do? + +Reference pages should be predictable, structured, and complete. + +Do not turn reference pages into tutorials. + +--- + +## Explanation + +Use when the reader needs to understand a concept or architectural decision. + +Examples: + +- How the plugin system works +- Server and client data fetching +- Content Engine architecture +- Widget zones +- Cache architecture +- Internationalization +- Permissions + +Answer: + +> How does this work and why is it designed this way? + +Examples are still encouraged, but explanation comes before procedural steps. + +--- + +# 2. Writing style + +Use simple technical English. + +Prefer: + +> Plugins can register routes. + +Avoid: + +> VitNode provides developers with a powerful and highly flexible mechanism +> that allows plugins to register custom routes. + +Prefer: + +> Use `fetcher()` to call another plugin. + +Avoid: + +> In order to communicate with APIs exposed by other plugins, developers can +> make use of the powerful `fetcher()` utility provided by VitNode. + +--- + +## Sentence rules + +Use short sentences. + +Prefer one idea per sentence. + +Use active voice whenever possible. + +Prefer: + +> VitNode validates the configuration when the plugin loads. + +Avoid: + +> The configuration will be validated by VitNode when the plugin is loaded. + +--- + +## Paragraph rules + +Keep most paragraphs between 1 and 3 sentences. + +Break long explanations into sections. + +If a paragraph contains more than one independent concept, split it. + +--- + +## Remove filler + +Delete phrases such as: + +- In this guide, we will... +- In this section... +- It is important to note that... +- Keep in mind that... +- As you can see... +- Basically... +- Simply... +- Obviously... +- This allows developers to... +- VitNode provides a powerful... +- VitNode offers a flexible... +- One of the key benefits... +- When it comes to... +- In order to... +- It should be noted... + +Start with the useful information instead. + +--- + +# 3. Example-first documentation + +Prefer examples over long explanations. + +When possible, show the smallest realistic example first. + +Example: + +```ts +const posts = await fetcher({ + plugin: blogPlugin, + method: "GET", + path: "/posts", +}); +``` + +Then explain only the parts that are not obvious. + +Do not explain basic TypeScript or JavaScript syntax. + +Do explain: + +- VitNode-specific behavior +- lifecycle behavior +- caching +- permissions +- server/client differences +- plugin boundaries +- unusual defaults +- important constraints + +--- + +# 4. Examples must be realistic + +Examples should look like code someone could actually use in a VitNode plugin. + +Avoid: + +```ts +const foo = doSomething(); +``` + +Prefer domain examples: + +```ts +const posts = await fetcher({ + plugin: blogPlugin, + method: "GET", + path: "/posts", +}); +``` + +Use realistic names such as: + +- `blogPlugin` +- `forumPlugin` +- `posts` +- `comments` +- `category` +- `user` +- `page` +- `widget` + +Avoid meaningless names like: + +- `foo` +- `bar` +- `test` +- `exampleThing` + +unless the API itself requires them. + +--- + +# 5. Keep examples small + +Show only code relevant to the concept. + +Aim for roughly 5–20 lines for most examples. + +Do not include: + +- unrelated imports +- boilerplate already explained elsewhere +- complete application files when a fragment is enough +- duplicated types +- unrelated error handling + +If readers need the full file structure, use a Fumadocs `Files` component. + +--- + +# 6. Code must match the current VitNode API + +Never invent an API because it looks plausible. + +Before rewriting technical documentation: + +1. inspect the existing implementation when available +2. inspect existing VitNode examples +3. preserve exact names and signatures +4. update outdated examples when the implementation changed + +Prefer actual source code over old documentation when they disagree. + +If behavior cannot be verified, do not state it as fact. + +--- + +# 7. Page structure + +## How-to page + +Prefer this structure: + +````mdx +--- +title: Do something +description: Short sentence describing the result. +--- + +Short introduction describing what the reader will achieve. + +## Example + +```ts +// smallest useful working example +``` +```` + +Brief explanation. + +## Steps + + + + + +### First action + +Explain only what is necessary. + +```ts +// code +``` + + + + + +### Next action + +```ts +// code +``` + + + + + +## Next steps + + + ... + +``` + +Not every guide needs every section. + +For very small tasks, skip `Steps` and show the solution directly. + +--- + +## Reference page + +Prefer this structure: + +````mdx +--- +title: API name +description: What this API represents. +--- + +One short description. + +## Usage + +```ts +// minimal example +``` +```` + +## Parameters + + + +## Behavior + +Explain behavior that cannot be expressed by the type signature. + +## Examples + +### Example name + +```ts +// example +``` + +## Related APIs + +Cards or normal links. + +```` + +The reference page should make it easy to answer: + +- What is this? +- How do I call it? +- Which options exist? +- Which values are required? +- What does it return? +- What are the defaults? +- What are the important edge cases? + +--- + +## Explanation page + +Prefer this structure: + +```mdx +--- +title: Concept +description: Short description of the concept. +--- + +Explain the concept in 1–2 short paragraphs. + +## How it works + +Explain the architecture or data flow. + +## Example + +```ts +// example if useful +```` + +## Why VitNode works this way + +Explain relevant design decisions and tradeoffs. + +## Related concepts + +Links or cards. + +```` + +Do not convert explanation pages into step-by-step tutorials. + +--- + +# 8. Fumadocs components + +Use Fumadocs components to improve comprehension and scanning. + +Do not use components purely for decoration. + +--- + +## Steps + +Use `Steps` for sequential actions that must be completed in order. + +```mdx +import { Step, Steps } from "fumadocs-ui/components/steps"; + + + + + +### Create the plugin + +```ts +export const blogPlugin = createPlugin({ + id: "blog", +}); +```` + + + + + +### Register it + +Add the plugin to your VitNode configuration. + + + + +``` + +Do not use Steps when there is only one action. + +--- + +## Tabs + +Use Tabs when the reader can choose between equivalent approaches. + +Good uses: + +- pnpm / npm / bun +- server / client +- JavaScript / TypeScript +- different adapters + +Example: + +````mdx + + + + +```bash +pnpm add package-name +``` +```` + + + + + +```bash +npm install package-name +``` + + + + + +```bash +bun add package-name +``` + + + + +``` + +Do not duplicate large sections inside Tabs. + +--- + +## Callouts + +Use Callouts only for information that deserves extra attention. + +Use them for: + +- important constraints +- breaking behavior +- security implications +- common mistakes +- compatibility notes +- destructive operations + +Example: + +```mdx + + This API can only be called from the server. + +``` + +Do not put normal documentation paragraphs inside Callouts. + +Too many callouts make every callout meaningless. + +--- + +## Cards + +Use Cards to help readers navigate to related concepts or next steps. + +Good: + +```mdx + + + + + +``` + +Use Cards mainly for navigation. + +Do not replace normal prose with dozens of cards. + +--- + +## TypeTable + +Use `TypeTable` for APIs, options, configuration objects, and props. + +Prefer it over manually written Markdown tables when documenting structured +TypeScript configuration. + +Example: + +```mdx +import { TypeTable } from "fumadocs-ui/components/type-table"; + + +``` + +Keep descriptions short. + +Do not repeat the property name in its description. + +Bad: + +> `path` — The path property containing the path. + +Good: + +> `path` — API route inside the plugin. + +--- + +## Files + +Use a file tree when location matters. + +Example: + +```mdx + + + + + + + +``` + +Use this when the reader needs to understand where code belongs. + +Do not manually describe a complex folder structure in prose. + +--- + +## Accordion + +Use an Accordion for secondary information that most readers do not need. + +Examples: + +- migration notes +- implementation details +- uncommon edge cases +- advanced configuration + +Do not hide core instructions inside accordions. + +--- + +# 9. Package installation + +When installation is required, support: + +- pnpm +- npm +- bun + +Prefer Fumadocs package-install/tab syntax already configured in the VitNode +documentation. + +Do not manually create three repetitive sections if the docs already support +package-manager tabs. + +Keep commands equivalent. + +Example intent: + +```bash +pnpm add package-name +npm install package-name +bun add package-name +``` + +--- + +# 10. Headings + +Use descriptive headings. + +Good: + +## Register the route + +## Load posts + +## Cache the result + +Bad: + +## Usage + +## Example 1 + +## More information + +Headings should help someone understand the page from the table of contents. + +Avoid excessive heading depth. + +Usually stop at `###`. + +--- + +# 11. Titles + +Prefer task-oriented titles for How-to pages. + +Good: + +- Create a plugin +- Add a custom route +- Fetch data from another plugin +- Add an AdminCP navigation item + +Avoid: + +- Plugin Creation Guide +- Working With Routes +- Understanding How Fetching Works in VitNode + +Reference pages can use API names: + +- `fetcher()` +- `createPlugin()` +- `PluginConfig` +- Content fields + +Explanation pages can use concepts: + +- Plugin architecture +- Cache system +- Content localization + +--- + +# 12. Introductions + +The introduction should normally be 1–3 sentences. + +For How-to documentation, immediately state the result. + +Good: + +> Use `fetcher()` to call an API exposed by another VitNode plugin. It works +> with the plugin's typed API definition, so the request and response stay +> type-safe. + +Avoid: + +> VitNode provides a powerful and flexible mechanism that makes communication +> between plugins easy and efficient. In this guide, we will explore how the +> fetcher utility works and how developers can take advantage of it. + +--- + +# 13. Explain after the example + +For practical APIs, prefer: + +1. short introduction +2. working example +3. explanation +4. options +5. edge cases + +instead of: + +1. long architecture explanation +2. terminology +3. configuration theory +4. example at the bottom + +Let developers see the solution first. + +--- + +# 14. Progressive disclosure + +Keep the common path obvious. + +Move advanced information later. + +Preferred order: + +1. common usage +2. important behavior +3. options +4. advanced usage +5. edge cases + +Do not make beginners understand every internal detail before they can use an +API. + +--- + +# 15. Avoid duplication + +Do not explain the same concept on many pages. + +Instead: + +```md +See [Plugin permissions](/docs/plugins/permissions). +``` + +A How-to page should link to the Reference page for exhaustive option details. + +A Reference page should link to Explanation pages for architecture. + +An Explanation page should link to How-to pages for implementation. + +--- + +# 16. Cross-link documentation types + +Whenever useful: + +How-to → Reference + +> See [`fetcher()`](/docs/api/fetcher) for all available options. + +Reference → How-to + +> See [Fetch data from another plugin](/docs/plugins/fetch-data) for a complete example. + +Explanation → How-to + +> To implement this, see [Add cache to a plugin](/docs/cache/plugin-cache). + +This keeps individual pages short. + +--- + +# 17. SEO and AI readability + +Write headings that explicitly describe the concept. + +Prefer: + +> ## Fetch data from another plugin + +instead of: + +> ## Usage + +Prefer explicit nouns in the first paragraph. + +Mention the important VitNode concept naturally near the beginning. + +Do not keyword-stuff. + +Each page should make sense when retrieved independently by: + +- search engines +- AI assistants +- documentation search +- embeddings/RAG + +Avoid references like: + +> As explained above... + +Prefer: + +> Plugin routes are registered when the plugin loads. + +Each important section should retain enough context to make sense by itself. + +--- + +# 18. Terminology + +Use terminology consistently. + +Do not introduce synonyms for existing VitNode concepts. + +If the project uses: + +- plugin +- widget +- zone +- AdminCP +- ModeratorCP +- fetcher +- content field + +use exactly those terms. + +Do not alternate between: + +- plugin / extension / module / addon +- AdminCP / admin panel / dashboard + +unless they represent different concepts. + +--- + +# 19. API names + +Always format: + +- functions as `functionName()` +- properties as `property` +- types as `TypeName` +- file names as `file.ts` +- package names as `package-name` +- CLI commands as code + +Example: + +> `fetcher()` accepts a `plugin`, `method`, and `path`. + +--- + +# 20. Rewrite behavior + +When asked to rewrite an existing page: + +1. determine the page type +2. preserve technically important information +3. remove duplicated text +4. remove filler +5. shorten paragraphs +6. move the main example toward the top +7. simplify examples +8. improve headings +9. replace long prose with suitable Fumadocs components +10. add missing realistic examples +11. link to related pages instead of duplicating them +12. preserve useful SEO terminology +13. verify examples against the current API when source is available + +Do not preserve bad structure simply because the original page used it. + +Rewrite aggressively when clarity improves. + +--- + +# 21. Editing checklist + +Before finishing, check: + +### Content + +- Is the page clearly How-to, Reference, or Explanation? +- Is the purpose obvious from the first paragraph? +- Is important information missing? +- Is anything repeated? + +### Examples + +- Is there a useful example near the beginning? +- Is the example realistic? +- Is it small enough? +- Does it use current VitNode APIs? +- Can it be copied with minimal modification? + +### Writing + +- Can any paragraph be shorter? +- Can any sentence be simpler? +- Is there filler? +- Is active voice possible? +- Is terminology consistent? + +### Structure + +- Are headings descriptive? +- Can someone scan the page without reading everything? +- Should any section become Steps, Tabs, TypeTable, Files, Cards, or a Callout? +- Are components being used because they help, rather than because they look nice? + +### Reader experience + +A developer should be able to answer: + +> What do I need to do? + +within roughly 10 seconds of opening a How-to page. + +A developer should be able to answer: + +> What options does this API accept? + +within roughly 10 seconds of opening a Reference page. + +A developer should be able to answer: + +> How does this concept work? + +from the first few paragraphs of an Explanation page. + +--- + +# 22. Output format + +When creating a documentation page, output complete MDX ready to place in the +VitNode documentation. + +Do not include commentary before or after the document unless requested. + +Preserve frontmatter when editing an existing page unless it should be updated. + +Use existing VitNode/Fumadocs components when available. + +Do not invent custom components unless requested. + +--- + +# 23. Preferred VitNode documentation style + +Aim for documentation that feels closer to: + +- Vercel +- Cloudflare +- Stripe +- Resend + +than to a long-form framework manual. + +Prioritize: + +**working example → concise explanation → details** + +over: + +**introduction → theory → terminology → long explanation → example** + +The goal is not to make documentation as short as possible. + +The goal is to make it as short as possible **without removing information the +developer needs**. + +``` + +A few details here are based on current Fumadocs behavior: `Steps`/`Step`, `Tabs`/`Tab`, and `TypeTable` are supported components, while the default MDX set includes things like Cards, Callouts, code blocks, and headings. Fumadocs also supports `Files`, Accordions, auto type tables, and other docs-oriented components. + +One change I'd make in your actual VitNode repository is to **teach the skill the exact components already registered in `components/mdx.tsx`**. Then the agent won't introduce ``, ``, or `` on a page if VitNode hasn't installed/registered that component yet. Fumadocs requires additional components such as Tabs/Steps to be registered or installed when they're not already part of your MDX setup. + +For VitNode specifically, I'd also consider adding **Tutorial** later as a fourth type, but I would keep it out for now if your docs are mainly task-oriented. How-to + Reference + Explanation covers most of the developer documentation you've been working on without making the structure more complicated than necessary. +``` diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 000000000..6afcf74f1 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,129 @@ +# VitNode + +VitNode is a plugin-based community platform: a core package plus plugins that add pages, API modules, content types and widgets to a host app. This glossary names the concepts shared by the core, plugins and docs. + +## Staff and sessions + +**Staff**: +A user who holds a root role, or who has an admin or moderator permission entry, directly or through any primary or secondary role. An entry with zero permissions still makes the user staff. +_Avoid_: admin user, privileged user + +**Admin**: +Staff of the admin type: the only staff who can open an AdminCP session. +_Avoid_: administrator (that is a seeded role name, not a type) + +**Moderator**: +Staff of the moderator type. Moderators act from the public site with their user session and never get an AdminCP session. + +**Root role**: +A role flagged root. It grants every staff permission of both types to everyone who holds it, as a primary or a secondary role. +_Avoid_: superadmin, owner + +**Primary role / Secondary role**: +A user has exactly one primary role and any number of secondary roles. Every permission decision counts all of them. + +**Session kind**: +Either a user session (public site, long-lived cookie) or an AdminCP session (AdminCP, browser-session cookie, sliding idle timeout, admins only). Each kind has its own storage, cookie and cache. + +**AdminCP session**: +A session of the admin kind. Signing in to the AdminCP opens one separately from the user session. +_Avoid_: admin session cookie, staff session + +**Device**: +A browser identified by its device cookie. A session is valid only on the device it was created on, and revoking a device ends every session of every kind on it. + +**Admin module**: +An API module declared as requiring an AdminCP session. Every route under it requires one. +_Avoid_: /admin/ route + +## Content Engine + +**Content type**: +A plugin-defined kind of entry (for example a blog post), with its fields, localization and editorial settings. + +**Editorial content type**: +A content type with drafts, versions and revisions. Shared-field changes require the version the editor started from. + +**Shared fields**: +The values of an entry that every language has in common. + +**Translation**: +One locale's localized values of an entry, with its own version and publication state. + +**Default translation**: +The translation in the content type's default locale. Every localized entry has one. + +**Save**: +One transactional write of an entry's shared fields and any number of its translations. + +**Content commit**: +The committed outcome of one content write, for a record or a translation. + +**Commit effects**: +Everything a content commit triggers once its transaction has ended: events, delivery events, search indexing and revalidation. + +**Public reachability**: +Whether a record or one of its locales was, or is, readable through the public API, before or after a commit. + +**Revalidation origin**: +A front-end deployment that opted in to being told which content tags expired. + +## Navigation + +**Navigation location**: +Which menu an item belongs to: the header or the bottom bar. It decides whether items can nest and how many fit. + +**Bottom bar**: +The mobile navigation location: flat, with at most three root items. + +**Root item**: +An item with no effective parent. Only root items count toward a location's capacity, and only root items can be parents. + +**Menu order**: +The full nested order of one location's items, as edited in the AdminCP. + +**Placement**: +The parent and position one item takes when a menu order is applied. + +## Dashboard widgets + +**Widget definition**: +A widget a plugin provides to the AdminCP dashboard, with its size limits and whether it may be placed more than once. + +**Widget instance**: +One card on the dashboard, identified by its widget and a copy number. Its settings belong to the instance. + +**Span**: +A widget instance's width in grid columns, never below its definition's minimum. + +**Layout**: +The ordered list of widget instances one admin arranged. + +## Routes and messages + +**Page declaration**: +The browser-safe entry that names a page's path, messages, pending skeleton and lazily loaded screen. + +**Table contract**: +The description of an AdminCP list's URL: sorting, filters, search and default page size. + +**Table screen**: +The only per-list code of an AdminCP table: the query it runs and the table it renders. + +**Route messages**: +A named set of at most sixteen translation namespaces, declared once and used to preload and to provide translations. + +**Namespace**: +A dotted path into the merged message tree, such as `admin.staff`. + +**Host intl provider**: +The host app's own translation provider, registered with the core so core screens render inside it. + +**Host route**: +A URL the host app answers with its own file route, rather than one a plugin provides. + +**Plugin surface**: +Everything the configured plugins export, discovered in one pass. Every generated registry is rendered from it. + +**Cookie relay**: +A host server copying the API's session cookies onto its own response. Core auth never needs one. diff --git a/apps/api/package.json b/apps/api/package.json index 754f223f0..fa5165265 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -21,8 +21,8 @@ "i18n:update:ai": "vitnode i18n:update:ai" }, "dependencies": { - "@ai-sdk/anthropic": "^4.0.53", - "@ai-sdk/google": "^4.0.69", + "@ai-sdk/anthropic": "^4.0.70", + "@ai-sdk/google": "^4.0.87", "@hono/zod-openapi": "^1.6.3", "@hono/zod-validator": "^0.9.1", "@vitnode/core": "workspace:*", @@ -30,29 +30,29 @@ "@vitnode/supabase-storage": "workspace:*", "drizzle-kit": "1.0.0-rc.4", "drizzle-orm": "1.0.0-rc.4", - "hono": "^4.13.7", + "hono": "^4.13.12", "react": "^19.3.0", "react-dom": "^19.3.0", - "use-intl": "^4.14.4", - "ws": "^8.21.3", - "zod": "^4.6.2" + "use-intl": "^4.14.8", + "ws": "^8.22.0", + "zod": "^4.6.5" }, "devDependencies": { - "@hono/node-server": "^2.1.1", - "@react-email/ui": "^6.9.5", - "@types/node": "^26.5.1", + "@hono/node-server": "^2.1.3", + "@react-email/ui": "^6.11.0", + "@types/node": "^26.6.3", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "@types/ws": "^8.18.1", + "@types/ws": "^8.18.2", "@vitnode/blog": "workspace:*", "@vitnode/config": "workspace:*", "@vitnode/example": "workspace:*", "@vitnode/nodemailer": "workspace:*", - "dotenv": "^17.4.2", - "eslint": "^10.10.0", - "react-email": "^6.9.5", - "tsc-alias": "^1.9.5", - "tsx": "^4.23.13", + "dotenv": "^18.0.5", + "eslint": "^10.11.0", + "react-email": "^6.11.0", + "tsc-alias": "^1.9.7", + "tsx": "^4.23.15", "typescript": "^6.0.3" } } diff --git a/apps/web/content/docs/dev/passkeys/admincp.mdx b/apps/web/content/docs/dev/passkeys/admincp.mdx index 31a544708..13f1c6357 100644 --- a/apps/web/content/docs/dev/passkeys/admincp.mdx +++ b/apps/web/content/docs/dev/passkeys/admincp.mdx @@ -61,7 +61,7 @@ The check runs at both steps, so an AdminCP session that expires or is signed ou - **consumes** the challenge atomically, scoped to the cookie's token hash, the `admin_sign_in` ceremony and "not expired". A public sign-in or registration challenge never matches, and a replay always fails. - **verifies** the assertion with SimpleWebAuthn against your configured `origins` and `rpId`, with `requireUserVerification: true`, the same user-handle and signature-counter checks as public sign-in. - **resolves the user from the stored credential** - never from anything else the browser sends, and never from the public session cookie. - - **checks staff access right now** with `SessionAdminModel.checkIfUserIsAdmin()`. Someone whose access was removed gets `403 not_staff`, even though their passkey is still valid. + - **checks staff access right now**, skipping the cache, and counting the user's primary role, every secondary role and any root role. Someone whose access was removed gets `403 not_staff`, even though their passkey is still valid. - only then calls `SessionAdminModel.createSessionByUserId()` - the same call the password form makes - which sets the `vitnode_auth_admin` cookie. The routes live under `users/passkeys` rather than `admin/` on purpose: every `/admin/*` API path demands an AdminCP session, which nobody has yet while signing in. diff --git a/apps/web/package.json b/apps/web/package.json index e28835c25..f2e32c251 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -17,55 +17,55 @@ }, "dependencies": { "@hono/zod-openapi": "^1.6.3", - "@tailwindcss/vite": "^4.1.18", - "@tanstack/react-devtools": "^0.10.12", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/react-devtools": "^0.10.13", "@tanstack/react-form": "^1.33.5", - "@tanstack/react-query": "^5.102.8", - "@tanstack/react-query-devtools": "^5.102.8", - "@tanstack/react-router": "^1.170.35", - "@tanstack/react-router-devtools": "^1.167.1", - "@tanstack/react-router-ssr-query": "^1.167.2", - "@tanstack/react-start": "^1.168.52", + "@tanstack/react-query": "^5.104.0", + "@tanstack/react-query-devtools": "^5.104.0", + "@tanstack/react-router": "^1.170.41", + "@tanstack/react-router-devtools": "^1.167.2", + "@tanstack/react-router-ssr-query": "^1.167.3", + "@tanstack/react-start": "^1.168.60", "@vitnode/blog": "workspace:*", "@vitnode/core": "workspace:*", "@vitnode/example": "workspace:*", "@vitnode/supabase-storage": "workspace:*", - "dotenv": "^17.4.2", + "dotenv": "^18.0.5", "drizzle-kit": "1.0.0-rc.4", "drizzle-orm": "1.0.0-rc.4", - "fumadocs-core": "^16.15.9", - "fumadocs-mdx": "^15.4.0", - "fumadocs-ui": "^16.15.9", - "hono": "^4.13.7", - "lucide-react": "^1.45.0", - "motion": "^13.2.0", + "fumadocs-core": "^16.15.17", + "fumadocs-mdx": "^15.4.5", + "fumadocs-ui": "^16.15.17", + "hono": "^4.13.12", + "lucide-react": "^1.49.0", + "motion": "^13.4.6", "nitro": "3.0.260903-beta", "react": "^19.3.0", "react-dom": "^19.3.0", "shadcn": "^4.21.0", "sonner": "^2.0.8", - "tailwindcss": "^4.1.18", + "tailwindcss": "^4.3.3", "tslib": "^2.8.1", - "use-intl": "^4.14.4", - "zod": "^4.6.2" + "use-intl": "^4.14.8", + "zod": "^4.6.5" }, "devDependencies": { "@tanstack/devtools-vite": "^0.8.5", "@tanstack/eslint-config": "^0.4.0", - "@tanstack/router-cli": "^1.167.35", + "@tanstack/router-cli": "^1.167.40", "@types/mdx": "^2.0.14", - "@types/node": "^26.5.1", + "@types/node": "^26.6.3", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitejs/plugin-react": "^6.1.1", "@vitnode/config": "workspace:*", - "cn": "^0.3.0", - "eslint": "^10.10.0", + "cn": "^0.4.0", + "eslint": "^10.11.0", "jiti": "^2.7.0", - "jsdom": "^30.0.1", + "jsdom": "^30.1.1", "tw-animate-css": "^1.4.0", "typescript": "^6.0.2", - "vite": "^8.3.0" + "vite": "^8.3.1" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/apps/web/src/locales/@vitnode/core/pl.json b/apps/web/src/locales/@vitnode/core/pl.json index 771ac8162..7abfd9842 100644 --- a/apps/web/src/locales/@vitnode/core/pl.json +++ b/apps/web/src/locales/@vitnode/core/pl.json @@ -884,6 +884,8 @@ "settings": { "devices": { "active_now": "Aktywne teraz", + "admin_session": "AdminCP", + "admin_session_desc": "Zalogowano do AdminCP na tym urządzeniu. Wylogowanie urządzenia zakończy również tę sesję.", "browser_on_os": "{browser} na {os}", "current_device": "To urządzenie", "desc": "Zarządzaj urządzeniami, na których jesteś zalogowany.", diff --git a/apps/web/src/site/home/sections/integrations.tsx b/apps/web/src/site/home/sections/integrations.tsx index b9d9f4224..d0ffd0e99 100644 --- a/apps/web/src/site/home/sections/integrations.tsx +++ b/apps/web/src/site/home/sections/integrations.tsx @@ -7,14 +7,23 @@ import { TooltipProvider, TooltipTrigger, } from '@vitnode/core/components/ui/tooltip' -import { HardDrive, Mail, ShieldCheck, Sparkles } from 'lucide-react' +import { Sparkles } from 'lucide-react' +import { + AmazonS3Mark, + NodemailerMark, + PostgreSQLElephant, + ReCaptchaMark, +} from '@/site/home/sections/logos/integration-logos' import { INTEGRATION_MARKS } from '@/site/home/sections/logos/integration-marks' import { MarketingSection, TextLink } from '@/site/marketing/shared' type Destination = { docs: string } | { href: string } -type Logo = { glyph: LucideIcon } | { mark: string } +type Logo = + | { glyph: LucideIcon } + | { logo: React.ElementType<{ className: string }> } + | { mark: string } type Integration = Destination & Logo & { @@ -60,7 +69,7 @@ const DRIZZLE: Integration = { const POSTGRESQL: Integration = { color: '#4169e1', docs: 'dev/search', - mark: INTEGRATION_MARKS.postgresql, + logo: PostgreSQLElephant, name: 'PostgreSQL', role: 'Database and search', } @@ -74,17 +83,17 @@ const TAILWIND: Integration = { } const NODEMAILER: Integration = { - color: '#0e9f6e', + color: '#22b573', docs: 'dev/email/nodemailer', - glyph: Mail, + logo: NodemailerMark, name: 'Nodemailer', role: 'Email', } const S3: Integration = { - color: '#ec7211', + color: '#e25444', docs: 'dev/storage/s3-r2', - glyph: HardDrive, + logo: AmazonS3Mark, name: 'S3 / R2', role: 'Storage', } @@ -116,7 +125,7 @@ const TURNSTILE: Integration = { const RECAPTCHA: Integration = { color: '#4285f4', docs: 'dev/captcha/recaptcha', - glyph: ShieldCheck, + logo: ReCaptchaMark, name: 'Google reCAPTCHA', role: 'Captcha', } @@ -147,13 +156,58 @@ const COLUMNS: Integration[][] = [ [NODE_CRON], ] -const TILE = - 'mk-integration-tile focus-visible:outline-ring block size-11 touch-manipulation rounded-xl focus-visible:outline-2 focus-visible:outline-offset-2 sm:size-18 sm:rounded-2xl lg:size-24 lg:rounded-3xl' +const TILE = 'mk-integration-tile touch-manipulation' + +type Point = readonly [number, number] + +const HEX_RADIUS = 50 +const HEX_HEIGHT = HEX_RADIUS * Math.sqrt(3) +const HEX_VIEW_BOX = `${-HEX_RADIUS} ${-HEX_HEIGHT / 2} ${HEX_RADIUS * 2} ${HEX_HEIGHT}` + +const towards = ([x, y]: Point, [toX, toY]: Point, distance: number) => { + const length = Math.hypot(toX - x, toY - y) + + return `${(x + ((toX - x) / length) * distance).toFixed(2)} ${(y + ((toY - y) / length) * distance).toFixed(2)}` +} + +const roundedHexagonPath = (radius: number, cornerRadius: number) => { + const points = Array.from({ length: 6 }, (_, index): Point => { + const angle = (Math.PI / 3) * index + + return [radius * Math.cos(angle), radius * Math.sin(angle)] + }) + + return `${points + .map((point, index) => { + const previous = points[(index + points.length - 1) % points.length] + const next = points[(index + 1) % points.length] + + return `${index === 0 ? 'M' : 'L'}${towards(point, previous, cornerRadius)}Q${point[0].toFixed(2)} ${point[1].toFixed(2)} ${towards(point, next, cornerRadius)}` + }) + .join('')}Z` +} + +const HEX_PATH = roundedHexagonPath(HEX_RADIUS, 10) + +const Hexagon = ({ className }: { className: string }) => ( + + + +) const TileFace = ({ integration }: { integration: Integration }) => ( - - - + <> + + + + + + ) const IntegrationMark = ({ integration }: { integration: Integration }) => { @@ -162,6 +216,8 @@ const IntegrationMark = ({ integration }: { integration: Integration }) => { if ('glyph' in integration) return + if ('logo' in integration) return + return ( (
{COLUMNS.map((column) => ( -
+
{column.map((integration) => (
diff --git a/apps/web/src/site/home/sections/logos/integration-logos.tsx b/apps/web/src/site/home/sections/logos/integration-logos.tsx new file mode 100644 index 000000000..090960b2d --- /dev/null +++ b/apps/web/src/site/home/sections/logos/integration-logos.tsx @@ -0,0 +1,138 @@ +export const PostgreSQLElephant = ({ className }: { className: string }) => ( + + + + + + + + + + + + + + + +) + +export const ReCaptchaMark = ({ className }: { className: string }) => ( + + + + + +) + +export const NodemailerMark = ({ className }: { className: string }) => ( + + + + + +) + +export const AmazonS3Mark = ({ className }: { className: string }) => ( + + + + + + + + + + + + + + + + + +) diff --git a/apps/web/src/site/home/sections/logos/integration-marks.ts b/apps/web/src/site/home/sections/logos/integration-marks.ts index 5d018062d..49fd82381 100644 --- a/apps/web/src/site/home/sections/logos/integration-marks.ts +++ b/apps/web/src/site/home/sections/logos/integration-marks.ts @@ -10,8 +10,6 @@ export const INTEGRATION_MARKS = { hono: 'M12.445.002a45.529 45.529 0 0 0-5.252 8.146 8.595 8.595 0 0 1-.555-.53 27.796 27.796 0 0 0-1.205-1.542 8.762 8.762 0 0 0-1.251 2.12 20.743 20.743 0 0 0-1.448 5.88 8.867 8.867 0 0 0 .338 3.468c1.312 3.48 3.794 5.593 7.445 6.337 3.055.438 5.755-.333 8.097-2.312 2.677-2.59 3.359-5.634 2.047-9.132a33.287 33.287 0 0 0-2.988-5.59A91.34 91.34 0 0 0 12.615.053a.216.216 0 0 0-.17-.051Zm-.336 3.906a50.93 50.93 0 0 1 4.794 6.552c.448.767.817 1.57 1.108 2.41.606 2.386-.044 4.354-1.951 5.904-1.845 1.298-3.87 1.683-6.072 1.156-2.376-.737-3.75-2.335-4.121-4.794a5.107 5.107 0 0 1 .242-2.266c.358-.908.79-1.774 1.3-2.601l1.446-2.121a397.33 397.33 0 0 0 3.254-4.24Z', nodejs: 'M11.998,24c-0.321,0-0.641-0.084-0.922-0.247l-2.936-1.737c-0.438-0.245-0.224-0.332-0.08-0.383 c0.585-0.203,0.703-0.25,1.328-0.604c0.065-0.037,0.151-0.023,0.218,0.017l2.256,1.339c0.082,0.045,0.197,0.045,0.272,0l8.795-5.076 c0.082-0.047,0.134-0.141,0.134-0.238V6.921c0-0.099-0.053-0.192-0.137-0.242l-8.791-5.072c-0.081-0.047-0.189-0.047-0.271,0 L3.075,6.68C2.99,6.729,2.936,6.825,2.936,6.921v10.15c0,0.097,0.054,0.189,0.139,0.235l2.409,1.392 c1.307,0.654,2.108-0.116,2.108-0.89V7.787c0-0.142,0.114-0.253,0.256-0.253h1.115c0.139,0,0.255,0.112,0.255,0.253v10.021 c0,1.745-0.95,2.745-2.604,2.745c-0.508,0-0.909,0-2.026-0.551L2.28,18.675c-0.57-0.329-0.922-0.945-0.922-1.604V6.921 c0-0.659,0.353-1.275,0.922-1.603l8.795-5.082c0.557-0.315,1.296-0.315,1.848,0l8.794,5.082c0.57,0.329,0.924,0.944,0.924,1.603 v10.15c0,0.659-0.354,1.273-0.924,1.604l-8.794,5.078C12.643,23.916,12.324,24,11.998,24z M19.099,13.993 c0-1.9-1.284-2.406-3.987-2.763c-2.731-0.361-3.009-0.548-3.009-1.187c0-0.528,0.235-1.233,2.258-1.233 c1.807,0,2.473,0.389,2.747,1.607c0.024,0.115,0.129,0.199,0.247,0.199h1.141c0.071,0,0.138-0.031,0.186-0.081 c0.048-0.054,0.074-0.123,0.067-0.196c-0.177-2.098-1.571-3.076-4.388-3.076c-2.508,0-4.004,1.058-4.004,2.833 c0,1.925,1.488,2.457,3.895,2.695c2.88,0.282,3.103,0.703,3.103,1.269c0,0.983-0.789,1.402-2.642,1.402 c-2.327,0-2.839-0.584-3.011-1.742c-0.02-0.124-0.126-0.215-0.253-0.215h-1.137c-0.141,0-0.254,0.112-0.254,0.253 c0,1.482,0.806,3.248,4.655,3.248C17.501,17.007,19.099,15.91,19.099,13.993z', - postgresql: - 'M23.5594 14.7228a.5269.5269 0 0 0-.0563-.1191c-.139-.2632-.4768-.3418-1.0074-.2321-1.6533.3411-2.2935.1312-2.5256-.0191 1.342-2.0482 2.445-4.522 3.0411-6.8297.2714-1.0507.7982-3.5237.1222-4.7316a1.5641 1.5641 0 0 0-.1509-.235C21.6931.9086 19.8007.0248 17.5099.0005c-1.4947-.0158-2.7705.3461-3.1161.4794a9.449 9.449 0 0 0-.5159-.0816 8.044 8.044 0 0 0-1.3114-.1278c-1.1822-.0184-2.2038.2642-3.0498.8406-.8573-.3211-4.7888-1.645-7.2219.0788C.9359 2.1526.3086 3.8733.4302 6.3043c.0409.818.5069 3.334 1.2423 5.7436.4598 1.5065.9387 2.7019 1.4334 3.582.553.9942 1.1259 1.5933 1.7143 1.7895.4474.1491 1.1327.1441 1.8581-.7279.8012-.9635 1.5903-1.8258 1.9446-2.2069.4351.2355.9064.3625 1.39.3772a.0569.0569 0 0 0 .0004.0041 11.0312 11.0312 0 0 0-.2472.3054c-.3389.4302-.4094.5197-1.5002.7443-.3102.064-1.1344.2339-1.1464.8115-.0025.1224.0329.2309.0919.3268.2269.4231.9216.6097 1.015.6331 1.3345.3335 2.5044.092 3.3714-.6787-.017 2.231.0775 4.4174.3454 5.0874.2212.5529.7618 1.9045 2.4692 1.9043.2505 0 .5263-.0291.8296-.0941 1.7819-.3821 2.5557-1.1696 2.855-2.9059.1503-.8707.4016-2.8753.5388-4.1012.0169-.0703.0357-.1207.057-.1362.0007-.0005.0697-.0471.4272.0307a.3673.3673 0 0 0 .0443.0068l.2539.0223.0149.001c.8468.0384 1.9114-.1426 2.5312-.4308.6438-.2988 1.8057-1.0323 1.5951-1.6698zM2.371 11.8765c-.7435-2.4358-1.1779-4.8851-1.2123-5.5719-.1086-2.1714.4171-3.6829 1.5623-4.4927 1.8367-1.2986 4.8398-.5408 6.108-.13-.0032.0032-.0066.0061-.0098.0094-2.0238 2.044-1.9758 5.536-1.9708 5.7495-.0002.0823.0066.1989.0162.3593.0348.5873.0996 1.6804-.0735 2.9184-.1609 1.1504.1937 2.2764.9728 3.0892.0806.0841.1648.1631.2518.2374-.3468.3714-1.1004 1.1926-1.9025 2.1576-.5677.6825-.9597.5517-1.0886.5087-.3919-.1307-.813-.5871-1.2381-1.3223-.4796-.839-.9635-2.0317-1.4155-3.5126zm6.0072 5.0871c-.1711-.0428-.3271-.1132-.4322-.1772.0889-.0394.2374-.0902.4833-.1409 1.2833-.2641 1.4815-.4506 1.9143-1.0002.0992-.126.2116-.2687.3673-.4426a.3549.3549 0 0 0 .0737-.1298c.1708-.1513.2724-.1099.4369-.0417.156.0646.3078.26.3695.4752.0291.1016.0619.2945-.0452.4444-.9043 1.2658-2.2216 1.2494-3.1676 1.0128zm2.094-3.988-.0525.141c-.133.3566-.2567.6881-.3334 1.003-.6674-.0021-1.3168-.2872-1.8105-.8024-.6279-.6551-.9131-1.5664-.7825-2.5004.1828-1.3079.1153-2.4468.079-3.0586-.005-.0857-.0095-.1607-.0122-.2199.2957-.2621 1.6659-.9962 2.6429-.7724.4459.1022.7176.4057.8305.928.5846 2.7038.0774 3.8307-.3302 4.7363-.084.1866-.1633.3629-.2311.5454zm7.3637 4.5725c-.0169.1768-.0358.376-.0618.5959l-.146.4383a.3547.3547 0 0 0-.0182.1077c-.0059.4747-.054.6489-.115.8693-.0634.2292-.1353.4891-.1794 1.0575-.11 1.4143-.8782 2.2267-2.4172 2.5565-1.5155.3251-1.7843-.4968-2.0212-1.2217a6.5824 6.5824 0 0 0-.0769-.2266c-.2154-.5858-.1911-1.4119-.1574-2.5551.0165-.5612-.0249-1.9013-.3302-2.6462.0044-.2932.0106-.5909.019-.8918a.3529.3529 0 0 0-.0153-.1126 1.4927 1.4927 0 0 0-.0439-.208c-.1226-.4283-.4213-.7866-.7797-.9351-.1424-.059-.4038-.1672-.7178-.0869.067-.276.1831-.5875.309-.9249l.0529-.142c.0595-.16.134-.3257.213-.5012.4265-.9476 1.0106-2.2453.3766-5.1772-.2374-1.0981-1.0304-1.6343-2.2324-1.5098-.7207.0746-1.3799.3654-1.7088.5321a5.6716 5.6716 0 0 0-.1958.1041c.0918-1.1064.4386-3.1741 1.7357-4.4823a4.0306 4.0306 0 0 1 .3033-.276.3532.3532 0 0 0 .1447-.0644c.7524-.5706 1.6945-.8506 2.802-.8325.4091.0067.8017.0339 1.1742.081 1.939.3544 3.2439 1.4468 4.0359 2.3827.8143.9623 1.2552 1.9315 1.4312 2.4543-1.3232-.1346-2.2234.1268-2.6797.779-.9926 1.4189.543 4.1729 1.2811 5.4964.1353.2426.2522.4522.2889.5413.2403.5825.5515.9713.7787 1.2552.0696.087.1372.1714.1885.245-.4008.1155-1.1208.3825-1.0552 1.717-.0123.1563-.0423.4469-.0834.8148-.0461.2077-.0702.4603-.0994.7662zm.8905-1.6211c-.0405-.8316.2691-.9185.5967-1.0105a2.8566 2.8566 0 0 0 .135-.0406 1.202 1.202 0 0 0 .1342.103c.5703.3765 1.5823.4213 3.0068.1344-.2016.1769-.5189.3994-.9533.6011-.4098.1903-1.0957.333-1.7473.3636-.7197.0336-1.0859-.0807-1.1721-.151zm.5695-9.2712c-.0059.3508-.0542.6692-.1054 1.0017-.055.3576-.112.7274-.1264 1.1762-.0142.4368.0404.8909.0932 1.3301.1066.887.216 1.8003-.2075 2.7014a3.5272 3.5272 0 0 1-.1876-.3856c-.0527-.1276-.1669-.3326-.3251-.6162-.6156-1.1041-2.0574-3.6896-1.3193-4.7446.3795-.5427 1.3408-.5661 2.1781-.463zm.2284 7.0137a12.3762 12.3762 0 0 0-.0853-.1074l-.0355-.0444c.7262-1.1995.5842-2.3862.4578-3.4385-.0519-.4318-.1009-.8396-.0885-1.2226.0129-.4061.0666-.7543.1185-1.0911.0639-.415.1288-.8443.1109-1.3505.0134-.0531.0188-.1158.0118-.1902-.0457-.4855-.5999-1.938-1.7294-3.253-.6076-.7073-1.4896-1.4972-2.6889-2.0395.5251-.1066 1.2328-.2035 2.0244-.1859 2.0515.0456 3.6746.8135 4.8242 2.2824a.908.908 0 0 1 .0667.1002c.7231 1.3556-.2762 6.2751-2.9867 10.5405zm-8.8166-6.1162c-.025.1794-.3089.4225-.6211.4225a.5821.5821 0 0 1-.0809-.0056c-.1873-.026-.3765-.144-.5059-.3156-.0458-.0605-.1203-.178-.1055-.2844.0055-.0401.0261-.0985.0925-.1488.1182-.0894.3518-.1226.6096-.0867.3163.0441.6426.1938.6113.4186zm7.9305-.4114c.0111.0792-.049.201-.1531.3102-.0683.0717-.212.1961-.4079.2232a.5456.5456 0 0 1-.075.0052c-.2935 0-.5414-.2344-.5607-.3717-.024-.1765.2641-.3106.5611-.352.297-.0414.6111.0088.6356.1851z', react: 'M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z', tailwindcss: diff --git a/apps/web/src/site/marketing/marketing.css b/apps/web/src/site/marketing/marketing.css index d7ccf3299..0e0279f42 100644 --- a/apps/web/src/site/marketing/marketing.css +++ b/apps/web/src/site/marketing/marketing.css @@ -868,14 +868,79 @@ } } +.mk-integration-comb { + --hex-w: 3.25rem; + --hex-gap: calc(var(--hex-w) * 0.1); + + display: flex; + align-items: center; + justify-content: center; +} + +@media (width >= 40rem) { + .mk-integration-comb { + --hex-w: 5.5rem; + } +} + +@media (width >= 64rem) { + .mk-integration-comb { + --hex-w: 7rem; + } +} + +.mk-integration-column { + display: flex; + flex-direction: column; + gap: var(--hex-gap); +} + +.mk-integration-column + .mk-integration-column { + margin-left: calc(var(--hex-w) * -0.25 + var(--hex-gap) * 0.8660254); +} + +.mk-integration-tile { + display: grid; + width: var(--hex-w); + aspect-ratio: 100 / 86.6; + pointer-events: none; +} + +.mk-integration-tile > * { + grid-area: 1 / 1; +} + +.mk-integration-tile:focus-visible { + outline: none; +} + +.mk-integration-hit path { + fill: transparent; + pointer-events: all; +} + .mk-integration-face { - border: 1px solid var(--border); - background-color: var(--card); + display: grid; + place-items: center; transition: translate 220ms cubic-bezier(0.23, 1, 0.32, 1), scale 150ms ease-out, - border-color 150ms ease-out, - box-shadow 220ms cubic-bezier(0.23, 1, 0.32, 1); + filter 220ms cubic-bezier(0.23, 1, 0.32, 1); +} + +.mk-integration-face > * { + grid-area: 1 / 1; +} + +.mk-integration-outline path { + fill: var(--card); + stroke: var(--border); + transition: stroke 150ms ease-out; +} + +.mk-integration-tile:focus-visible .mk-integration-outline path { + stroke: var(--ring); + stroke-width: 2; } .mk-integration-mark { @@ -885,9 +950,13 @@ @media (hover: hover) and (pointer: fine) { .mk-integration-tile:hover .mk-integration-face { translate: 0 -4px; - border-color: color-mix(in oklch, var(--brand) 45%, transparent); - box-shadow: 0 14px 28px -14px - color-mix(in oklch, var(--brand) 55%, transparent); + filter: drop-shadow( + 0 8px 10px color-mix(in oklch, var(--brand) 30%, transparent) + ); + } + + .mk-integration-tile:hover .mk-integration-outline path { + stroke: color-mix(in oklch, var(--brand) 45%, transparent); } .mk-integration-tile:hover .mk-integration-mark { @@ -901,7 +970,8 @@ @media (prefers-reduced-motion: reduce) { .mk-integration-face, - .mk-integration-mark { + .mk-integration-mark, + .mk-integration-outline path { transition: none; } diff --git a/package.json b/package.json index 14f8cfe40..cf881609b 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,14 @@ "i18n:update:ai": "cd apps/api && pnpm run i18n:update:ai" }, "devDependencies": { - "@types/node": "^26.5.1", + "@types/node": "^26.6.3", "@vitnode/config": "workspace:*", - "prettier": "^3.9.6", + "prettier": "^3.9.9", "prettier-plugin-tailwindcss": "^0.8.1", - "tsx": "^4.23.13", - "turbo": "^2.10.12", + "tsx": "^4.23.15", + "turbo": "^2.11.5", "typescript": "^6.0.3", - "zod": "^4.6.2" + "zod": "^4.6.5" }, "engines": { "node": ">=22" diff --git a/packages/config/package.json b/packages/config/package.json index bd7fabd59..d0421e322 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -42,20 +42,20 @@ "typescript": "6.0.x" }, "devDependencies": { - "eslint": "^10.10.0", + "eslint": "^10.11.0", "typescript": "^6.0.3" }, "dependencies": { - "@eslint-react/eslint-plugin": "^5.19.0", + "@eslint-react/eslint-plugin": "^5.23.3", "@eslint/js": "^10.0.1", "@shadcn/lint": "^0.2.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-perfectionist": "^5.11.0", + "eslint-plugin-perfectionist": "^5.12.1", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.2", "prettier-plugin-tailwindcss": "^0.8.1", - "typescript-eslint": "^8.70.0" + "typescript-eslint": "^8.71.0" } } diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 75db7025d..0e9e09801 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -44,12 +44,12 @@ "validate-npm-package-name": "^8.0.0" }, "devDependencies": { - "@types/node": "^26.5.1", + "@types/node": "^26.6.3", "@types/prompts": "^2.4.9", "@types/validate-npm-package-name": "^4.0.2", "@vitnode/config": "workspace:*", - "eslint": "^10.10.0", + "eslint": "^10.11.0", "typescript": "^6.0.3", - "vitest": "^5.0.0" + "vitest": "^5.0.3" } } diff --git a/packages/create-vitnode-app/src/create/package-versions.ts b/packages/create-vitnode-app/src/create/package-versions.ts index 4664ac689..f65f44ccc 100644 --- a/packages/create-vitnode-app/src/create/package-versions.ts +++ b/packages/create-vitnode-app/src/create/package-versions.ts @@ -1,26 +1,26 @@ export const versionsPackageJson = { - typesNode: "^26.5", + typesNode: "^26.6", typesReact: "^19.3", typesReactDom: "^19.3", typesBun: "latest", - turbo: "^2.10", + turbo: "^2.11", typescript: "^6.0", tsx: "^4.23", tscAlias: "^1.9", - eslint: "^10.10", + eslint: "^10.11", prettier: "^3.9", prettierTailwind: "^0.8", tailwind: "^4.2", twAnimateCss: "^1.4.0", - cn: "^0.3.0", + cn: "^0.4.0", react: "^19.3", reactDom: "^19.3", - useIntl: "^4.14.4", - lucide: "^1.45", + useIntl: "^4.14.8", + lucide: "^1.49", sonner: "^2.0.8", - dotenv: "^17.4", + dotenv: "^18.0", drizzleKit: "1.0.0-rc.4", drizzleOrm: "1.0.0-rc.4", @@ -28,19 +28,19 @@ export const versionsPackageJson = { hono: "^4.13", honoZodOpenapi: "^1.6", honoZodValidator: "^0.9.1", - reactEmail: "^6.9", - reactEmailUi: "^6.9", + reactEmail: "^6.11", + reactEmailUi: "^6.11", zod: "^4.6", ws: "^8", cva: "^0.7.1", tanstackReactForm: "^1.33", tanstackReactRouter: "^1.170", tanstackReactStart: "^1.168", - tanstackReactQuery: "^5.102", + tanstackReactQuery: "^5.104", tanstackRouterSsrQuery: "^1.167", tanstackReactDevtools: "^0.10", tanstackDevtoolsVite: "^0.8", - tanstackQueryDevtools: "^5.102", + tanstackQueryDevtools: "^5.104", tanstackRouterDevtools: "^1.167", vite: "^8.3", viteReact: "^6.1", diff --git a/packages/elasticsearch/package.json b/packages/elasticsearch/package.json index a95147ed8..078e75394 100644 --- a/packages/elasticsearch/package.json +++ b/packages/elasticsearch/package.json @@ -34,11 +34,11 @@ }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index e39857941..209fdf4cc 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -35,11 +35,11 @@ }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 9a30ecae6..60a218dd2 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -30,16 +30,16 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "nodemailer": "^10.0.9" + "nodemailer": "^10.0.13" }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", - "@types/nodemailer": "^8.0.1", + "@swc/core": "^1.16.13", + "@types/nodemailer": "^8.0.2", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/resend/package.json b/packages/resend/package.json index 5af810bba..fb08e9487 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -29,15 +29,15 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "resend": "^6.28.0" + "resend": "^6.31.0" }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/s3/package.json b/packages/s3/package.json index aa67e7fad..b717682f2 100644 --- a/packages/s3/package.json +++ b/packages/s3/package.json @@ -31,15 +31,15 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@aws-sdk/client-s3": "^3.1131.0" + "@aws-sdk/client-s3": "^3.1144.0" }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/supabase-storage/package.json b/packages/supabase-storage/package.json index ad084e38a..018c8bd3a 100644 --- a/packages/supabase-storage/package.json +++ b/packages/supabase-storage/package.json @@ -30,15 +30,15 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@supabase/storage-js": "^2.116.0" + "@supabase/storage-js": "^2.117.2" }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@vitnode/config": "workspace:*", "@vitnode/core": "workspace:*", - "eslint": "^10.10.0", - "tsc-alias": "^1.9.5", + "eslint": "^10.11.0", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3" } } diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 1e244ad7a..877080f01 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -50,42 +50,42 @@ "devDependencies": { "@hono/zod-openapi": "^1.6.3", "@hono/zod-validator": "^0.9.1", - "@react-email/ui": "^6.9.5", + "@react-email/ui": "^6.11.0", "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@tanstack/react-form": "^1.33.5", - "@tanstack/react-query": "^5.102.8", - "@tanstack/react-router": "^1.170.35", - "@tanstack/react-start": "^1.168.52", - "@testing-library/dom": "^10.4.1", + "@tanstack/react-query": "^5.104.0", + "@tanstack/react-router": "^1.170.41", + "@tanstack/react-start": "^1.168.60", + "@testing-library/dom": "^10.4.2", "@testing-library/react": "^16.3.3", - "@types/node": "^26.5.1", + "@types/node": "^26.6.3", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "@types/sanitize-html": "^2.16.1", + "@types/sanitize-html": "^2.16.2", "@vitejs/plugin-react": "^6.1.1", - "@vitest/coverage-v8": "^5.0.0", + "@vitest/coverage-v8": "^5.0.3", "@vitnode/config": "workspace:*", "drizzle-kit": "1.0.0-rc.4", "drizzle-orm": "1.0.0-rc.4", - "eslint": "^10.10.0", - "hono": "^4.13.7", + "eslint": "^10.11.0", + "hono": "^4.13.12", "jiti": "^2.7.0", - "jsdom": "^30.0.1", - "lucide-react": "^1.45.0", + "jsdom": "^30.1.1", + "lucide-react": "^1.49.0", "react": "^19.3.0", "react-dom": "^19.3.0", - "react-email": "^6.9.5", + "react-email": "^6.11.0", "sonner": "^2.0.8", "tailwindcss": "^4.3.3", - "tsc-alias": "^1.9.5", + "tsc-alias": "^1.9.7", "tsup": "^8.5.1", - "tsx": "^4.23.13", + "tsx": "^4.23.15", "tw-animate-css": "^1.4.0", "typescript": "^6.0.3", - "vite": "^8.3.0", - "vitest": "^5.0.0", - "zod": "^4.6.2" + "vite": "^8.3.1", + "vitest": "^5.0.3", + "zod": "^4.6.5" }, "bin": { "vitnode": "./cli.mjs" @@ -229,44 +229,44 @@ "@inquirer/prompts": "^8.7.2", "@simplewebauthn/browser": "^14.0.0", "@simplewebauthn/server": "^14.0.3", - "@tiptap/extension-audio": "^3.31.3", - "@tiptap/extension-drag-handle": "^3.31.3", - "@tiptap/extension-drag-handle-react": "^3.31.3", - "@tiptap/extension-emoji": "^3.31.3", - "@tiptap/extension-list": "^3.31.3", - "@tiptap/extension-table": "^3.31.3", - "@tiptap/extension-text-align": "^3.31.3", - "@tiptap/extension-text-style": "^3.31.3", - "@tiptap/extension-typography": "^3.31.3", - "@tiptap/extensions": "^3.31.3", - "@tiptap/pm": "^3.31.3", - "@tiptap/react": "^3.31.3", - "@tiptap/starter-kit": "^3.31.3", - "@tiptap/suggestion": "^3.31.3", - "ai": "^7.0.99", + "@tiptap/extension-audio": "^3.31.4", + "@tiptap/extension-drag-handle": "^3.31.4", + "@tiptap/extension-drag-handle-react": "^3.31.4", + "@tiptap/extension-emoji": "^3.31.4", + "@tiptap/extension-list": "^3.31.4", + "@tiptap/extension-table": "^3.31.4", + "@tiptap/extension-text-align": "^3.31.4", + "@tiptap/extension-text-style": "^3.31.4", + "@tiptap/extension-typography": "^3.31.4", + "@tiptap/extensions": "^3.31.4", + "@tiptap/pm": "^3.31.4", + "@tiptap/react": "^3.31.4", + "@tiptap/starter-kit": "^3.31.4", + "@tiptap/suggestion": "^3.31.4", + "ai": "^7.0.124", "class-variance-authority": "^0.7.1", "cmdk": "^1.1.1", - "cn": "^0.3.0", - "cron-parser": "^5.10.0", + "cn": "^0.4.0", + "cron-parser": "^5.10.1", "date-fns": "^4.4.0", - "dotenv": "^17.4.2", + "dotenv": "^18.0.5", "embla-carousel-react": "^8.6.0", "input-otp": "^1.5.0", "jiti": "^2.7.0", - "motion": "^13.2.0", + "motion": "^13.4.6", "postgres": "^3.4.9", - "rate-limiter-flexible": "^11.2.0", + "rate-limiter-flexible": "^11.2.1", "react-colorful": "^5.8.1", - "react-day-picker": "^10.0.1", - "react-resizable-panels": "^4.12.4", + "react-day-picker": "^10.0.2", + "react-resizable-panels": "^4.14.1", "react-scan": "^0.5.7", "recharts": "^3.10.1", - "redis": "^6.2.1", + "redis": "^6.3.0", "sanitize-html": "^2.17.7", "shadcn": "^4.21.0", - "sharp": "^0.35.4", + "sharp": "^0.35.5", "use-debounce": "^10.1.1", - "use-intl": "^4.14.4", + "use-intl": "^4.14.8", "vaul": "^1.1.2" }, "peerDependenciesMeta": { diff --git a/packages/vitnode/src/api/lib/check-staff-permission.test.ts b/packages/vitnode/src/api/lib/check-staff-permission.test.ts new file mode 100644 index 000000000..f8b44e9a0 --- /dev/null +++ b/packages/vitnode/src/api/lib/check-staff-permission.test.ts @@ -0,0 +1,134 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { describe, expect, it } from "vitest"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { grantStaffPermissions } from "@/tests/staff-permissions"; + +import { isStaff, resolveStaffPermissions } from "./check-staff-permission"; + +const ROOT_ROLE = 1; +const MEMBER_ROLE = 3; +const STAFF_ROLE = 4; + +const USER = { id: 7, roleId: MEMBER_ROLE }; + +const DELETE_POSTS = { + module: "posts", + permission: "can_delete", + plugin: "@vitnode/core", +}; + +const staffEntry = (entry: { + permissions?: (typeof DELETE_POSTS)[]; + roleId?: number; + unrestricted?: boolean; + userId?: number; +}) => ({ + permissions: [], + roleId: null, + unrestricted: false, + userId: null, + ...entry, +}); + +const contextWith = ({ + admin = [], + cache = createTestCache(), + moderator = [], + secondaryRoleIds = [], +}: { + admin?: ReturnType[]; + cache?: ReturnType; + moderator?: ReturnType[]; + secondaryRoleIds?: number[]; +}) => { + const { db } = createMemoryDb([ + [core_users, [USER]], + [ + core_users_secondary_roles, + secondaryRoleIds.map(roleId => ({ roleId, userId: USER.id })), + ], + [ + core_roles, + [ + { id: ROOT_ROLE, root: true }, + { id: MEMBER_ROLE, root: false }, + { id: STAFF_ROLE, root: false }, + ], + ], + [core_admin_permissions, admin], + [core_moderators_permissions, moderator], + ]); + const values: Record = { cache, db }; + + return { get: (key: string) => values[key] } as unknown as Context; +}; + +describe("isStaff", () => { + it("is false for a member with no staff entry", async () => { + const c = contextWith({}); + + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(false); + expect(await isStaff(c, { type: "moderator", userId: USER.id })).toBe( + false, + ); + }); + + it("counts an entry with zero permissions as staff", async () => { + const c = contextWith({ admin: [staffEntry({ userId: USER.id })] }); + + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(true); + expect( + await resolveStaffPermissions(c, { type: "admin", user: USER }), + ).toEqual({ permissions: [], root: false, staff: true }); + }); + + it("keeps the two staff types apart", async () => { + const c = contextWith({ + moderator: [staffEntry({ permissions: [DELETE_POSTS], userId: USER.id })], + }); + + expect(await isStaff(c, { type: "moderator", userId: USER.id })).toBe(true); + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(false); + }); + + it("finds a staff entry held through a secondary role", async () => { + const c = contextWith({ + admin: [staffEntry({ roleId: STAFF_ROLE })], + secondaryRoleIds: [STAFF_ROLE], + }); + + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(true); + }); + + it("makes a secondary root role staff of both types", async () => { + const c = contextWith({ secondaryRoleIds: [ROOT_ROLE] }); + + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(true); + expect(await isStaff(c, { type: "moderator", userId: USER.id })).toBe(true); + }); + + it("is false for a user that does not exist", async () => { + expect(await isStaff(contextWith({}), { type: "admin", userId: 404 })).toBe( + false, + ); + }); + + it("answers from the cache unless asked to look live", async () => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { permissions: [], userId: USER.id }); + const c = contextWith({ cache }); + + expect(await isStaff(c, { type: "admin", userId: USER.id })).toBe(true); + expect( + await isStaff(c, { live: true, type: "admin", userId: USER.id }), + ).toBe(false); + }); +}); diff --git a/packages/vitnode/src/api/lib/check-staff-permission.ts b/packages/vitnode/src/api/lib/check-staff-permission.ts index 5dd3a9921..801857c9f 100644 --- a/packages/vitnode/src/api/lib/check-staff-permission.ts +++ b/packages/vitnode/src/api/lib/check-staff-permission.ts @@ -6,12 +6,12 @@ import { HTTPException } from "hono/http-exception"; import { core_admin_permissions } from "@/database/admins"; import { core_moderators_permissions } from "@/database/moderators"; import { core_roles } from "@/database/roles"; -import { core_users_secondary_roles } from "@/database/users"; +import { core_users, core_users_secondary_roles } from "@/database/users"; import type { PermissionsStaffArgs, PermissionStaffType, - StaffPermissionSet, + ResolvedStaffPermissionSet, } from "./permission-staff"; import { hasStaffPermission, staffPermissionKey } from "./staff-permission"; @@ -25,9 +25,14 @@ const tableByType = { moderator: core_moderators_permissions, } as const; +interface StaffUser { + id: number; + roleId: number; +} + export const getUserRoleIds = async ( c: Context, - user: { id: number; roleId: number }, + user: StaffUser, ): Promise => { const secondary = await c .get("db") @@ -40,11 +45,8 @@ export const getUserRoleIds = async ( const loadStaffPermissions = async ( c: Context, - { - type, - user, - }: { type: PermissionStaffType; user: { id: number; roleId: number } }, -): Promise => { + { type, user }: { type: PermissionStaffType; user: StaffUser }, +): Promise => { const roleIds = await getUserRoleIds(c, user); const rootRoles = await c @@ -55,7 +57,7 @@ const loadStaffPermissions = async ( .limit(1); if (rootRoles.length > 0) { - return { root: true, permissions: [] }; + return { root: true, permissions: [], staff: true }; } const table = tableByType[type]; @@ -69,7 +71,7 @@ const loadStaffPermissions = async ( .where(or(eq(table.userId, user.id), inArray(table.roleId, roleIds))); if (entries.some(entry => entry.unrestricted)) { - return { root: true, permissions: [] }; + return { root: true, permissions: [], staff: true }; } const seen = new Set(); @@ -83,23 +85,63 @@ const loadStaffPermissions = async ( } } - return { root: false, permissions }; + return { root: false, permissions, staff: entries.length > 0 }; +}; + +const loadAndCacheStaffPermissions = async ( + c: Context, + args: { type: PermissionStaffType; user: StaffUser }, +): Promise => { + const resolved = await loadStaffPermissions(c, args); + await writeStaffPermissions( + c, + { type: args.type, userId: args.user.id }, + resolved, + ); + + return resolved; }; export const resolveStaffPermissions = async ( + c: Context, + { type, user }: { type: PermissionStaffType; user: StaffUser }, +): Promise => + (await readStaffPermissions(c, { type, userId: user.id })) ?? + (await loadAndCacheStaffPermissions(c, { type, user })); + +const findStaffUser = async ( + c: Context, + userId: number, +): Promise => { + const [user] = await c + .get("db") + .select({ id: core_users.id, roleId: core_users.roleId }) + .from(core_users) + .where(eq(core_users.id, userId)) + .limit(1); + + return user ?? null; +}; + +export const isStaff = async ( c: Context, { + live = false, type, - user, - }: { type: PermissionStaffType; user: { id: number; roleId: number } }, -): Promise => { - const cached = await readStaffPermissions(c, { type, userId: user.id }); - if (cached) return cached; + userId, + }: { live?: boolean; type: PermissionStaffType; userId: number }, +): Promise => { + const cached = live ? null : await readStaffPermissions(c, { type, userId }); + if (cached) return cached.staff; - const resolved = await loadStaffPermissions(c, { type, user }); - await writeStaffPermissions(c, { type, userId: user.id }, resolved); + const user = await findStaffUser(c, userId); + if (!user) return false; - return resolved; + const resolved = live + ? await loadStaffPermissions(c, { type, user }) + : await loadAndCacheStaffPermissions(c, { type, user }); + + return resolved.staff; }; export const checkStaffPermission = async ( diff --git a/packages/vitnode/src/api/lib/permission-staff.ts b/packages/vitnode/src/api/lib/permission-staff.ts index 65d9a952e..dd4c4802a 100644 --- a/packages/vitnode/src/api/lib/permission-staff.ts +++ b/packages/vitnode/src/api/lib/permission-staff.ts @@ -60,3 +60,7 @@ export interface StaffPermissionSet { permissions: PermissionsStaffArgs[]; root: boolean; } + +export interface ResolvedStaffPermissionSet extends StaffPermissionSet { + staff: boolean; +} diff --git a/packages/vitnode/src/api/lib/staff-permission-cache.test.ts b/packages/vitnode/src/api/lib/staff-permission-cache.test.ts index 01440c0ff..f83ca2d76 100644 --- a/packages/vitnode/src/api/lib/staff-permission-cache.test.ts +++ b/packages/vitnode/src/api/lib/staff-permission-cache.test.ts @@ -3,7 +3,7 @@ import type { Context } from "hono"; import { beforeEach, describe, expect, it } from "vitest"; -import type { StaffPermissionSet } from "./permission-staff"; +import type { ResolvedStaffPermissionSet } from "./permission-staff"; import { resolveStaffPermissions } from "./check-staff-permission"; import { @@ -96,9 +96,10 @@ describe("staff permission cache", () => { it("round-trips a permission set", async () => { const c = context(cache); - const value: StaffPermissionSet = { + const value: ResolvedStaffPermissionSet = { root: false, permissions: [MODERATOR_PERMISSION], + staff: true, }; await writeStaffPermissions(c, { type: "admin", userId: 1 }, value); @@ -114,7 +115,7 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId: 1 }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); expect( @@ -128,7 +129,7 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId: 1 }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); expect( @@ -143,7 +144,7 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); } @@ -163,12 +164,12 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); await writeStaffPermissions( c, { type: "moderator", userId }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); } @@ -192,12 +193,12 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId: 1 }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); await writeStaffPermissions( c, { type: "admin", userId: 2 }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); await invalidateStaffEntry(c, { roleId: null, userId: 1 }); @@ -216,7 +217,7 @@ describe("staff permission cache", () => { await writeStaffPermissions( c, { type: "admin", userId: 2 }, - { root: true, permissions: [] }, + { root: true, permissions: [], staff: true }, ); await invalidateStaffEntry(c, { roleId: 5, userId: null }); @@ -232,9 +233,10 @@ describe("resolveStaffPermissions", () => { it("queries the database once and serves the rest from the cache", async () => { const cache = fakeCache(); const first = fakeDb(oneStaffEntry()); - const expected: StaffPermissionSet = { + const expected: ResolvedStaffPermissionSet = { root: false, permissions: [MODERATOR_PERMISSION], + staff: true, }; const one = await resolveStaffPermissions(context(cache, first.db), { @@ -277,9 +279,10 @@ describe("resolveStaffPermissions", () => { it("resolves from the database on every call without Redis", async () => { const cache = fakeCache({ configured: false }); - const expected: StaffPermissionSet = { + const expected: ResolvedStaffPermissionSet = { root: false, permissions: [MODERATOR_PERMISSION], + staff: true, }; for (const attempt of [0, 1]) { @@ -303,7 +306,7 @@ describe("resolveStaffPermissions", () => { user: USER, }); - expect(one).toEqual({ root: true, permissions: [] }); + expect(one).toEqual({ root: true, permissions: [], staff: true }); const second = fakeDb([]); const two = await resolveStaffPermissions(context(cache, second.db), { @@ -311,7 +314,7 @@ describe("resolveStaffPermissions", () => { user: USER, }); - expect(two).toEqual({ root: true, permissions: [] }); + expect(two).toEqual({ root: true, permissions: [], staff: true }); expect(second.state.selects).toBe(0); }); }); diff --git a/packages/vitnode/src/api/lib/staff-permission-cache.ts b/packages/vitnode/src/api/lib/staff-permission-cache.ts index dcde84eef..3e7a87362 100644 --- a/packages/vitnode/src/api/lib/staff-permission-cache.ts +++ b/packages/vitnode/src/api/lib/staff-permission-cache.ts @@ -4,7 +4,7 @@ import { randomUUID } from "node:crypto"; import type { PermissionStaffType, - StaffPermissionSet, + ResolvedStaffPermissionSet, } from "./permission-staff"; export const STAFF_PERMISSIONS_CACHE_TTL_SECONDS = 60; @@ -19,22 +19,24 @@ const readEpoch = async (c: Context): Promise => const permissionsKey = ( epoch: string, { type, userId }: { type: PermissionStaffType; userId: number }, -): string => `staff-permissions:${epoch}:${type}:${userId}`; +): string => `staff-permissions:v2:${epoch}:${type}:${userId}`; /** The cached resolution, or `null` on a miss, without Redis, or on error. */ export const readStaffPermissions = async ( c: Context, args: { type: PermissionStaffType; userId: number }, -): Promise => +): Promise => await c .get("cache") - .getSystem(permissionsKey(await readEpoch(c), args)); + .getSystem( + permissionsKey(await readEpoch(c), args), + ); /** Stores one resolution for {@link STAFF_PERMISSIONS_CACHE_TTL_SECONDS}. */ export const writeStaffPermissions = async ( c: Context, args: { type: PermissionStaffType; userId: number }, - value: StaffPermissionSet, + value: ResolvedStaffPermissionSet, ): Promise => { await c .get("cache") diff --git a/packages/vitnode/src/api/models/passkey.ts b/packages/vitnode/src/api/models/passkey.ts index 4231bb37f..e36c648f1 100644 --- a/packages/vitnode/src/api/models/passkey.ts +++ b/packages/vitnode/src/api/models/passkey.ts @@ -16,6 +16,7 @@ import { getCookie } from "hono/cookie"; import type { PasskeyErrorCode } from "@/api/modules/users/passkeys/schema"; import { deleteAuthCookie, setAuthCookie } from "@/api/lib/auth-cookie"; +import { isStaff } from "@/api/lib/check-staff-permission"; import { describeError } from "@/api/lib/error-details"; import { isPasswordSignInEnabled } from "@/api/lib/password-sign-in"; import { hashSessionToken } from "@/api/lib/session-token"; @@ -113,10 +114,11 @@ export class PasskeyModel { protected readonly c: Context; private async assertStaffEnrollmentAllowed(userId: number) { - const admin = new SessionAdminModel(this.c); - if (!(await admin.checkIfUserIsAdmin(userId))) return; + if (!(await isStaff(this.c, { live: true, type: "admin", userId }))) return; - const adminSession = await admin.getSession({ extend: true }); + const adminSession = await new SessionAdminModel(this.c).getSession({ + extend: true, + }); if (adminSession?.user.id !== userId) { throw new PasskeyError("admin_session_required", 403); } diff --git a/packages/vitnode/src/api/models/session-admin.test.ts b/packages/vitnode/src/api/models/session-admin.test.ts index 83f508c68..234d0bea1 100644 --- a/packages/vitnode/src/api/models/session-admin.test.ts +++ b/packages/vitnode/src/api/models/session-admin.test.ts @@ -1,12 +1,19 @@ // @vitest-environment node +import type { Table } from "drizzle-orm"; + import { Hono } from "hono"; import { describe, expect, it } from "vitest"; import type { EnvVariablesVitNode } from "@/api/middlewares/global.middleware"; +import { hashSessionToken } from "@/api/lib/session-token"; import { core_admin_permissions, core_admin_sessions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; import { core_sessions_known_devices } from "@/database/sessions"; -import { core_users } from "@/database/users"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb, type MemoryRow } from "@/tests/memory-db"; import type { AdminSession } from "./session-cache"; @@ -218,3 +225,163 @@ describe("admin session idle timeout", () => { ).toBe(true); }); }); + +const ROOT_ROLE = 1; +const MEMBER_ROLE = 3; +const STAFF_ROLE = 4; +const USER_ID = 7; +const DEVICE_ID = 3; + +type StaffShape = + | "admin entry via a secondary role" + | "member" + | "moderator only" + | "root via a secondary role" + | "zero-permission admin entry"; + +const staffTables = (shape: StaffShape): [Table, MemoryRow[]][] => { + const entry = (row: Record) => ({ + permissions: [], + roleId: null, + unrestricted: false, + userId: null, + ...row, + }); + const secondaryRoleId: Partial> = { + "admin entry via a secondary role": STAFF_ROLE, + "root via a secondary role": ROOT_ROLE, + }; + const admin: Partial[]>> = { + "admin entry via a secondary role": [entry({ roleId: STAFF_ROLE })], + "zero-permission admin entry": [entry({ userId: USER_ID })], + }; + const moderator: Partial[]>> = { + "moderator only": [entry({ unrestricted: true, userId: USER_ID })], + }; + const secondary = secondaryRoleId[shape]; + + return [ + [ + core_users, + [ + { + email: "admin@example.com", + id: USER_ID, + name: "Test", + roleId: MEMBER_ROLE, + }, + ], + ], + [ + core_users_secondary_roles, + secondary === undefined ? [] : [{ roleId: secondary, userId: USER_ID }], + ], + [ + core_roles, + [ + { id: ROOT_ROLE, root: true }, + { id: MEMBER_ROLE, root: false }, + { id: STAFF_ROLE, root: false }, + ], + ], + [core_admin_permissions, admin[shape] ?? []], + [core_moderators_permissions, moderator[shape] ?? []], + [core_sessions_known_devices, [{ id: DEVICE_ID, publicId: "device" }]], + ]; +}; + +const runAsAdminModel = async ( + tables: [Table, MemoryRow[]][], + run: (model: SessionAdminModel) => Promise, +) => { + const memory = createMemoryDb(tables); + const app = new Hono(); + let result: { error: unknown } | { value: T } = { error: undefined }; + + app.all("*", async c => { + c.set("core", { + authorization: AUTHORIZATION, + } as unknown as EnvVariablesVitNode["core"]); + c.set("db", memory.db as unknown as EnvVariablesVitNode["db"]); + c.set("cache", createTestCache()); + c.set("ipAddress", "203.0.113.7"); + + try { + result = { value: await run(new SessionAdminModel(c)) }; + } catch (error) { + result = { error }; + } + + return c.body(null, 204); + }); + + await app.request("https://vitnode.com/api/x", { + headers: { cookie: "vitnode_auth_admin=token; vitnode_device=device" }, + }); + + return { memory, result }; +}; + +const admitted: StaffShape[] = [ + "root via a secondary role", + "admin entry via a secondary role", + "zero-permission admin entry", +]; + +const refused: StaffShape[] = ["moderator only", "member"]; + +describe("who may hold an AdminCP session", () => { + it.each(admitted)("opens one for a user with %s", async shape => { + const { memory, result } = await runAsAdminModel( + staffTables(shape), + async model => await model.createSessionByUserId(USER_ID), + ); + + expect(result).toMatchObject({ value: { token: expect.any(String) } }); + expect(memory.rows(core_admin_sessions)).toHaveLength(1); + }); + + it.each(refused)("refuses one to a %s user", async shape => { + const { memory, result } = await runAsAdminModel( + staffTables(shape), + async model => await model.createSessionByUserId(USER_ID), + ); + + expect(result).toMatchObject({ error: { status: 403 } }); + expect(memory.rows(core_admin_sessions)).toHaveLength(0); + }); + + const withOpenSession = async (shape: StaffShape) => [ + ...staffTables(shape), + [ + core_admin_sessions, + [ + { + deviceId: DEVICE_ID, + expiresAt: new Date(Date.now() + 10 * 60_000), + token: await hashSessionToken("token"), + userId: USER_ID, + }, + ], + ] satisfies [Table, MemoryRow[]], + ]; + + it.each(admitted)("keeps an open session for a user with %s", async shape => { + const { result } = await runAsAdminModel( + await withOpenSession(shape), + async model => await model.getSession({ extend: false }), + ); + + expect(result).toMatchObject({ value: { user: { id: USER_ID } } }); + }); + + it.each(refused)("ends an open session of a %s user", async shape => { + const { memory, result } = await runAsAdminModel( + await withOpenSession(shape), + async model => await model.getSession({ extend: false }), + ); + + expect(result).toEqual({ value: null }); + expect(memory.rows(core_admin_sessions)).toHaveLength(0); + }); +}); diff --git a/packages/vitnode/src/api/models/session-admin.ts b/packages/vitnode/src/api/models/session-admin.ts index 651274fa4..15901d3f9 100644 --- a/packages/vitnode/src/api/models/session-admin.ts +++ b/packages/vitnode/src/api/models/session-admin.ts @@ -1,12 +1,13 @@ import type { Context } from "hono"; -import { and, eq, gt, or } from "drizzle-orm"; +import { and, eq, gt } from "drizzle-orm"; import { getCookie } from "hono/cookie"; import { HTTPException } from "hono/http-exception"; import { deleteAuthCookie, setAuthCookie } from "@/api/lib/auth-cookie"; +import { isStaff } from "@/api/lib/check-staff-permission"; import { hashSessionToken } from "@/api/lib/session-token"; -import { core_admin_permissions, core_admin_sessions } from "@/database/admins"; +import { core_admin_sessions } from "@/database/admins"; import { DeviceModel } from "./device"; import { @@ -83,28 +84,8 @@ export class SessionAdminModel { return user ? { expiresAt: session.expiresAt, user } : null; } - async checkIfUserIsAdmin(userId: number) { - const user = await new UserModel().getUserById({ id: userId, c: this.c }); - if (!user) return false; - - const [permission] = await this.c - .get("db") - .select() - .from(core_admin_permissions) - .where( - or( - eq(core_admin_permissions.userId, user.id), - eq(core_admin_permissions.roleId, user.roleId), - ), - ) - .limit(1); - - return !!permission; - } - async createSessionByUserId(userId: number) { - const isAdmin = await this.checkIfUserIsAdmin(userId); - if (!isAdmin) { + if (!(await isStaff(this.c, { live: true, type: "admin", userId }))) { throw new HTTPException(403, { message: "Forbidden" }); } @@ -197,7 +178,13 @@ export class SessionAdminModel { return null; } - if (!(await this.checkIfUserIsAdmin(session.user.id))) { + if ( + !(await isStaff(this.c, { + live: true, + type: "admin", + userId: session.user.id, + })) + ) { await this.deleteSession(); return null; diff --git a/packages/vitnode/src/api/models/session-cache.test.ts b/packages/vitnode/src/api/models/session-cache.test.ts index 2d08958e3..eacb81298 100644 --- a/packages/vitnode/src/api/models/session-cache.test.ts +++ b/packages/vitnode/src/api/models/session-cache.test.ts @@ -66,9 +66,7 @@ describe("the public and admin session caches cannot collide", () => { expect(admin.startsWith(user)).toBe(false); }); - it("shares the session: namespace so a revocation can name both", () => { - // `revoke-device.route.ts` deletes both keys for one device in a single - // call, which is only possible because they are built from the same inputs. + it("shares the session: namespace", () => { expect(sessionCacheKey(TOKEN_A, 1).startsWith("session:")).toBe(true); expect(adminSessionCacheKey(TOKEN_A, 1).startsWith("session:")).toBe(true); }); diff --git a/packages/vitnode/src/api/models/session-revoke.test.ts b/packages/vitnode/src/api/models/session-revoke.test.ts new file mode 100644 index 000000000..06a1d3a8f --- /dev/null +++ b/packages/vitnode/src/api/models/session-revoke.test.ts @@ -0,0 +1,109 @@ +// @vitest-environment node +import { describe, expect, it } from "vitest"; + +import { ForgotPasswordTokenModel } from "@/api/models/password"; +import { changePasswordRoute } from "@/api/modules/users/routes/change-password.route"; +import { core_users_forgot_password } from "@/database/users"; +import { createSessionWorld, fakeSession } from "@/tests/sessions"; + +import { invalidateSessionCacheForUser } from "./session-revoke"; + +const LAPTOP = { id: 3, publicId: "laptop" }; +const PHONE = { id: 4, publicId: "phone" }; + +const onLaptop = fakeSession(7, LAPTOP); +const onPhone = fakeSession(7, PHONE); +const someoneElse = fakeSession(8, LAPTOP); +const everyone = [onLaptop, onPhone, someoneElse]; + +const RESET_TOKEN = "reset-token"; + +const setup = async () => { + const world = await createSessionWorld({ + extraTables: [ + [ + core_users_forgot_password, + [ + { + expiresAt: new Date(Date.now() + 1000 * 60 * 10), + id: 1, + token: new ForgotPasswordTokenModel().hashResetToken(RESET_TOKEN), + userId: 7, + }, + ], + ], + ], + sessions: everyone, + }); + world.app.openapi(changePasswordRoute.route, changePasswordRoute.handler); + world.app.post("/invalidate/:userId", async c => { + await invalidateSessionCacheForUser(c, Number(c.req.param("userId"))); + + return c.body(null, 204); + }); + + for (const session of everyone) { + expect(await world.probe(session)).toEqual({ admin: 200, user: 200 }); + } + + return world; +}; + +describe("completing a password reset", () => { + const resetPassword = async (world: Awaited>) => + await world.app.request("/change-password", { + body: JSON.stringify({ + password: "NewPassword1!", + token: RESET_TOKEN, + userId: 7, + }), + headers: { "content-type": "application/json" }, + method: "POST", + }); + + it("ends every user and AdminCP session the user has, on every device", async () => { + const world = await setup(); + + const response = await resetPassword(world); + + expect(response.status).toBe(201); + for (const session of [onLaptop, onPhone]) { + expect(world.rowsFor(session)).toEqual({ admin: 0, user: 0 }); + expect(await world.isCached(session)).toEqual({ + admin: false, + user: false, + }); + expect(await world.probe(session)).toEqual({ admin: 401, user: 401 }); + } + }); + + it("leaves other users signed in", async () => { + const world = await setup(); + + await resetPassword(world); + + expect(world.rowsFor(someoneElse)).toEqual({ admin: 1, user: 1 }); + expect(await world.probe(someoneElse)).toEqual({ admin: 200, user: 200 }); + }); +}); + +describe("invalidateSessionCacheForUser", () => { + it("drops both cached session kinds and keeps the sessions", async () => { + const world = await setup(); + + await world.app.request("/invalidate/7", { method: "POST" }); + + for (const session of [onLaptop, onPhone]) { + expect(await world.isCached(session)).toEqual({ + admin: false, + user: false, + }); + expect(world.rowsFor(session)).toEqual({ admin: 1, user: 1 }); + expect(await world.probe(session)).toEqual({ admin: 200, user: 200 }); + } + expect(await world.isCached(someoneElse)).toEqual({ + admin: true, + user: true, + }); + }); +}); diff --git a/packages/vitnode/src/api/models/session-revoke.ts b/packages/vitnode/src/api/models/session-revoke.ts index 49e4fa04f..0055a877f 100644 --- a/packages/vitnode/src/api/models/session-revoke.ts +++ b/packages/vitnode/src/api/models/session-revoke.ts @@ -1,46 +1,63 @@ import type { Context } from "hono"; -import { eq } from "drizzle-orm"; +import { and, eq } from "drizzle-orm"; import { core_admin_sessions } from "@/database/admins"; import { core_sessions } from "@/database/sessions"; import { adminSessionCacheKey, sessionCacheKey } from "./session-cache"; -/** - * The cache keys holding one user's resolved sessions, read off their rows. - * - * The cache is keyed by token, so there is no way back from a user id to those - * keys other than looking the sessions up first. Both callers below need exactly - * that, for opposite reasons - one is about to delete the rows, the other wants - * them re-read - so the lookup lives here once. - */ -const sessionCacheKeysForUser = async ( - c: Context, - userId: number, -): Promise => { - const db = c.get("db"); +export interface SessionScope { + deviceId?: number; + userId: number; +} - const [sessions, adminSessions] = await Promise.all([ - db - .select({ token: core_sessions.token, deviceId: core_sessions.deviceId }) - .from(core_sessions) - .where(eq(core_sessions.userId, userId)), - db - .select({ - token: core_admin_sessions.token, - deviceId: core_admin_sessions.deviceId, - }) - .from(core_admin_sessions) - .where(eq(core_admin_sessions.userId, userId)), - ]); +interface SessionRow { + deviceId: number; + token: string; +} - return [ +const userSessionsIn = ({ deviceId, userId }: SessionScope) => + and( + eq(core_sessions.userId, userId), + deviceId === undefined ? undefined : eq(core_sessions.deviceId, deviceId), + ); + +const adminSessionsIn = ({ deviceId, userId }: SessionScope) => + and( + eq(core_admin_sessions.userId, userId), + deviceId === undefined + ? undefined + : eq(core_admin_sessions.deviceId, deviceId), + ); + +const userSessionColumns = { + deviceId: core_sessions.deviceId, + token: core_sessions.token, +}; + +const adminSessionColumns = { + deviceId: core_admin_sessions.deviceId, + token: core_admin_sessions.token, +}; + +const deleteSessionCacheKeys = async ( + c: Context, + { + adminSessions, + sessions, + }: { adminSessions: SessionRow[]; sessions: SessionRow[] }, +): Promise => { + const keys = [ ...sessions.map(({ token, deviceId }) => sessionCacheKey(token, deviceId)), ...adminSessions.map(({ token, deviceId }) => adminSessionCacheKey(token, deviceId), ), ]; + + if (keys.length > 0) { + await c.get("cache").deleteSystem(keys); + } }; /** @@ -64,43 +81,39 @@ export const invalidateSessionCacheForUser = async ( c: Context, userId: number, ): Promise => { - const keys = await sessionCacheKeysForUser(c, userId); + const db = c.get("db"); + const scope = { userId }; - if (keys.length > 0) { - await c.get("cache").deleteSystem(keys); - } + const [sessions, adminSessions] = await Promise.all([ + db + .select(userSessionColumns) + .from(core_sessions) + .where(userSessionsIn(scope)), + db + .select(adminSessionColumns) + .from(core_admin_sessions) + .where(adminSessionsIn(scope)), + ]); + + await deleteSessionCacheKeys(c, { adminSessions, sessions }); }; -/** - * Signs one user out everywhere - every device, every browser, the AdminCP - * included. - * - * Called when a credential changes hands. A password reset that leaves the old - * sessions alive only locks the attacker out of *signing in again*: whatever - * they already hold keeps working for the ninety days the session cookie lasts, - * which is the opposite of what somebody resetting a password after a breach - * believes they just did. - * - * The rows are read before they are deleted because the session cache is keyed - * by token, and there is no other way back from a user id to the keys holding - * them. Its TTL is only a minute, so this is about closing that minute rather - * than about correctness over time. - */ -export const revokeAllSessionsForUser = async ( +export const revokeSessions = async ( c: Context, - userId: number, + scope: SessionScope, ): Promise => { const db = c.get("db"); - const keys = await sessionCacheKeysForUser(c, userId); - await Promise.all([ - db.delete(core_sessions).where(eq(core_sessions.userId, userId)), + const [sessions, adminSessions] = await Promise.all([ + db + .delete(core_sessions) + .where(userSessionsIn(scope)) + .returning(userSessionColumns), db .delete(core_admin_sessions) - .where(eq(core_admin_sessions.userId, userId)), + .where(adminSessionsIn(scope)) + .returning(adminSessionColumns), ]); - if (keys.length > 0) { - await c.get("cache").deleteSystem(keys); - } + await deleteSessionCacheKeys(c, { adminSessions, sessions }); }; diff --git a/packages/vitnode/src/api/models/user/sign-up.test.ts b/packages/vitnode/src/api/models/user/sign-up.test.ts new file mode 100644 index 000000000..abe7ba4ae --- /dev/null +++ b/packages/vitnode/src/api/models/user/sign-up.test.ts @@ -0,0 +1,76 @@ +import type { Context } from "hono"; + +import { describe, expect, it, vi } from "vitest"; + +import { core_roles } from "@/database/roles"; +import { core_users } from "@/database/users"; +import { createMemoryDb } from "@/tests/memory-db"; + +import { signUp } from "./sign-up"; + +const ROOT_ROLE = 1; +const MEMBER_ROLE = 2; + +const harness = () => { + const memory = createMemoryDb([ + [ + core_roles, + [ + { default: false, id: ROOT_ROLE, root: true }, + { default: true, id: MEMBER_ROLE, root: false }, + ], + ], + [core_users, []], + ]); + const vars: Record = { + core: {}, + db: memory.db, + events: { emit: vi.fn(async () => Promise.resolve()) }, + ipAddress: "127.0.0.1", + }; + const c = { get: (key: string) => vars[key] } as unknown as Context; + + const register = async (name: string) => + await signUp( + { + email: `${name}@example.com`, + hashedPassword: "hashed", + name, + }, + c, + ); + + const roleIdsOfUsers = () => + memory + .rows(core_users) + .map(row => row.roleId) + .sort((a, b) => Number(a) - Number(b)); + + return { register, roleIdsOfUsers }; +}; + +describe("signUp - first user", () => { + it("gives the root role to the very first user and the default role after", async () => { + const h = harness(); + + const first = await h.register("first"); + const second = await h.register("second"); + + expect(first.roleId).toBe(ROOT_ROLE); + expect(first.emailVerified).toBe(true); + expect(second.roleId).toBe(MEMBER_ROLE); + }); + + it("gives root to only one of two concurrent first sign-ups", async () => { + const h = harness(); + + const users = await Promise.all([ + h.register("alice"), + h.register("bob"), + h.register("carol"), + ]); + + expect(users.filter(user => user.roleId === ROOT_ROLE)).toHaveLength(1); + expect(h.roleIdsOfUsers()).toEqual([ROOT_ROLE, MEMBER_ROLE, MEMBER_ROLE]); + }); +}); diff --git a/packages/vitnode/src/api/models/user/sign-up.ts b/packages/vitnode/src/api/models/user/sign-up.ts index f945360ee..c6eac1ee2 100644 --- a/packages/vitnode/src/api/models/user/sign-up.ts +++ b/packages/vitnode/src/api/models/user/sign-up.ts @@ -1,6 +1,6 @@ import type { Context } from "hono"; -import { and, count, eq, or } from "drizzle-orm"; +import { and, count, eq, or, sql } from "drizzle-orm"; import { HTTPException } from "hono/http-exception"; import { emailAliases, matchesEmail } from "@/api/lib/user-email-lookup"; @@ -10,21 +10,22 @@ import { core_users } from "@/database/users"; import { canonicalizeEmail } from "@/lib/email-canonical"; import { removeSpecialCharacters } from "@/lib/special-characters"; +type SignUpDatabase = Omit; + +const SIGN_UP_LOCK_KEY = "core_users:sign_up"; + const getDefaultData = async ( c: Context, + db: SignUpDatabase, ): Promise<{ emailVerified: boolean; roleId: number; }> => { - const [countUsers] = await c - .get("db") - .select({ count: count() }) - .from(core_users); + const [countUsers] = await db.select({ count: count() }).from(core_users); // If no users, return root group if (countUsers.count === 0) { - const [defaultRole] = await c - .get("db") + const [defaultRole] = await db .select({ id: core_roles.id, }) @@ -44,8 +45,7 @@ const getDefaultData = async ( }; } - const [defaultRole] = await c - .get("db") + const [defaultRole] = await db .select({ id: core_roles.id, }) @@ -112,32 +112,34 @@ export const signUp = async ( }); } - const defaults = await getDefaultData(c); - const emailVerified = emailVerifiedByCaller ?? defaults.emailVerified; - const [data] = await c - .get("db") - .insert(core_users) - .values({ - email, - name, - nameCode: convertToNameSEO, - // TODO: Handle newsletter only if email is allowed - newsletter, - password: hashedPassword, - avatarColor: generateAvatarColor(name), - roleId: defaults.roleId, - emailVerified, - ipAddress: c.get("ipAddress"), - // TODO: Handle language - }) - .returning(); + const data = await c.get("db").transaction(async tx => { + await tx.execute( + sql`select pg_advisory_xact_lock(hashtext(${SIGN_UP_LOCK_KEY}))`, + ); + + const defaults = await getDefaultData(c, tx); + const [inserted] = await tx + .insert(core_users) + .values({ + email, + name, + nameCode: convertToNameSEO, + // TODO: Handle newsletter only if email is allowed + newsletter, + password: hashedPassword, + avatarColor: generateAvatarColor(name), + roleId: defaults.roleId, + emailVerified: emailVerifiedByCaller ?? defaults.emailVerified, + ipAddress: c.get("ipAddress"), + // TODO: Handle language + }) + .returning(); + + return inserted; + }); const { password: _, ...user } = data; - // The insert above runs on `c.get("db")` (auto-commit), so the row is - // committed here - even when a caller (e.g. the SSO callback) wraps this in - // `db.transaction`. If this insert ever moves onto a `tx` handle, the emit - // must move after that transaction returns. await c.get("events").emit("user.created", { userId: data.id, email: data.email, diff --git a/packages/vitnode/src/api/modules/admin/roles/lib/assert-can-list-roles.ts b/packages/vitnode/src/api/modules/admin/roles/lib/assert-can-list-roles.ts new file mode 100644 index 000000000..b71d68c69 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/roles/lib/assert-can-list-roles.ts @@ -0,0 +1,33 @@ +import type { Context } from "hono"; + +import { HTTPException } from "hono/http-exception"; + +import { resolveStaffPermissions } from "@/api/lib/check-staff-permission"; +import { hasStaffPermission } from "@/api/lib/staff-permission"; +import { CONFIG_PLUGIN } from "@/config"; + +const ROLE_LIST_READERS = [ + { module: "roles", permission: "can_view" }, + { module: "users", permission: "can_view" }, + { module: "staff_admins", permission: "can_create" }, + { module: "staff_moderators", permission: "can_create" }, +] as const; + +export const assertCanListRoles = async (c: Context): Promise => { + const user = c.get("admin")?.user; + if (!user) { + throw new HTTPException(403, { message: "Forbidden" }); + } + + const permissions = await resolveStaffPermissions(c, { type: "admin", user }); + const allowed = ROLE_LIST_READERS.some(reader => + hasStaffPermission(permissions, { + plugin: CONFIG_PLUGIN.pluginId, + ...reader, + }), + ); + + if (!allowed) { + throw new HTTPException(403, { message: "Forbidden" }); + } +}; diff --git a/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.test.ts b/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.test.ts new file mode 100644 index 000000000..d803f084a --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.test.ts @@ -0,0 +1,93 @@ +import type { Context } from "hono"; + +import { describe, expect, it } from "vitest"; + +import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { grantStaffPermissions } from "@/tests/staff-permissions"; + +import { assertCanManageAdminRole } from "./assert-manage-admin-role"; + +const ADMIN = { id: 1, roleId: 1 }; +const ROLE_ID = 9; + +const roles = (permission: string): PermissionsStaffArgs => ({ + module: "roles", + permission, + plugin: "@vitnode/core", +}); + +interface StaffRole { + admin?: boolean; + moderator?: boolean; + root?: boolean; +} + +const manage = async ( + staff: StaffRole, + permission: "can_delete_admin" | "can_edit_admin", + granted: PermissionsStaffArgs[], +): Promise => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { + permissions: granted, + userId: ADMIN.id, + }); + + const entry = { id: 1, roleId: ROLE_ID }; + const { db } = createMemoryDb([ + [core_roles, [{ id: ROLE_ID, root: staff.root ?? false }]], + [core_admin_permissions, staff.admin ? [entry] : []], + [core_moderators_permissions, staff.moderator ? [entry] : []], + ]); + const values: Record = { admin: { user: ADMIN }, cache, db }; + + await assertCanManageAdminRole( + { get: (key: string) => values[key] } as Context, + { permission, roleId: ROLE_ID }, + ); +}; + +const staffRoles: [string, StaffRole][] = [ + ["a root role without an admin entry", { root: true }], + ["a role with a moderator entry", { moderator: true }], + ["a role with an admin entry", { admin: true }], +]; + +describe("assertCanManageAdminRole", () => { + it.each(staffRoles)( + "requires roles:can_edit_admin to edit %s", + async (_label, staff) => { + await expect( + manage(staff, "can_edit_admin", [roles("can_view"), roles("can_edit")]), + ).rejects.toMatchObject({ status: 403 }); + await expect( + manage(staff, "can_edit_admin", [roles("can_edit_admin")]), + ).resolves.toBeUndefined(); + }, + ); + + it.each(staffRoles)( + "requires roles:can_delete_admin to delete %s", + async (_label, staff) => { + await expect( + manage(staff, "can_delete_admin", [ + roles("can_view"), + roles("can_delete"), + ]), + ).rejects.toMatchObject({ status: 403 }); + await expect( + manage(staff, "can_delete_admin", [roles("can_delete_admin")]), + ).resolves.toBeUndefined(); + }, + ); + + it("asks nothing elevated for an ordinary role", async () => { + await expect(manage({}, "can_edit_admin", [])).resolves.toBeUndefined(); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.ts b/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.ts index b4d504e20..09cf601dd 100644 --- a/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.ts +++ b/packages/vitnode/src/api/modules/admin/roles/lib/assert-manage-admin-role.ts @@ -1,10 +1,40 @@ import type { Context } from "hono"; -import { eq } from "drizzle-orm"; +import { and, eq } from "drizzle-orm"; import { assertStaffPermission } from "@/api/lib/check-staff-permission"; import { CONFIG_PLUGIN } from "@/config"; import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; + +const isStaffRole = async (c: Context, roleId: number): Promise => { + const db = c.get("db"); + + const [rootRoles, adminEntries, moderatorEntries] = await Promise.all([ + db + .select({ id: core_roles.id }) + .from(core_roles) + .where(and(eq(core_roles.id, roleId), eq(core_roles.root, true))) + .limit(1), + db + .select({ id: core_admin_permissions.id }) + .from(core_admin_permissions) + .where(eq(core_admin_permissions.roleId, roleId)) + .limit(1), + db + .select({ id: core_moderators_permissions.id }) + .from(core_moderators_permissions) + .where(eq(core_moderators_permissions.roleId, roleId)) + .limit(1), + ]); + + return ( + rootRoles.length > 0 || + adminEntries.length > 0 || + moderatorEntries.length > 0 + ); +}; export const assertCanManageAdminRole = async ( c: Context, @@ -16,14 +46,7 @@ export const assertCanManageAdminRole = async ( roleId: number; }, ): Promise => { - const [adminRole] = await c - .get("db") - .select({ id: core_admin_permissions.id }) - .from(core_admin_permissions) - .where(eq(core_admin_permissions.roleId, roleId)) - .limit(1); - - if (!adminRole) return; + if (!(await isStaffRole(c, roleId))) return; await assertStaffPermission(c, { type: "admin", diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.test.ts b/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.test.ts new file mode 100644 index 000000000..3d6b97d11 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.test.ts @@ -0,0 +1,138 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it, vi } from "vitest"; + +import { + adminSessionCacheKey, + sessionCacheKey, +} from "@/api/models/session-cache"; +import { core_admin_sessions } from "@/database/admins"; +import { core_roles } from "@/database/roles"; +import { core_sessions } from "@/database/sessions"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { + grantStaffPermissions, + ROOT_STAFF_PERMISSIONS, +} from "@/tests/staff-permissions"; + +import { deleteRoleAdminRoute } from "./delete.route"; + +const MEMBER_ROLE = 3; +const DOOMED_ROLE = 5; + +const CALLER = { email: "root@example.com", id: 1, roleId: MEMBER_ROLE }; +const PRIMARY_HOLDER = 7; +const SECONDARY_HOLDER = 8; +const BYSTANDER = 9; + +const session = (userId: number) => ({ + deviceId: userId * 10, + token: `token-${userId}`, + userId, +}); + +const userKey = (userId: number) => + sessionCacheKey(session(userId).token, session(userId).deviceId); + +const adminKey = (userId: number) => + adminSessionCacheKey(session(userId).token, session(userId).deviceId); + +const harness = async () => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { + permissions: ROOT_STAFF_PERMISSIONS, + userId: CALLER.id, + }); + + for (const userId of [PRIMARY_HOLDER, SECONDARY_HOLDER, BYSTANDER]) { + await cache.setSystem(userKey(userId), { id: userId }, 60); + } + await cache.setSystem(adminKey(SECONDARY_HOLDER), { id: SECONDARY_HOLDER }); + + const memory = createMemoryDb([ + [ + core_roles, + [ + { default: true, guest: false, id: MEMBER_ROLE, root: false }, + { default: false, guest: false, id: DOOMED_ROLE, root: false }, + ], + ], + [ + core_users, + [ + CALLER, + { id: PRIMARY_HOLDER, roleId: DOOMED_ROLE }, + { id: SECONDARY_HOLDER, roleId: MEMBER_ROLE }, + { id: BYSTANDER, roleId: MEMBER_ROLE }, + ], + ], + [ + core_users_secondary_roles, + [{ roleId: DOOMED_ROLE, userId: SECONDARY_HOLDER }], + ], + [ + core_sessions, + [session(PRIMARY_HOLDER), session(SECONDARY_HOLDER), session(BYSTANDER)], + ], + [core_admin_sessions, [session(SECONDARY_HOLDER)]], + ]); + + const app = new OpenAPIHono(); + app.use("*", async (c, next) => { + c.set("admin", { user: CALLER } as unknown as Context["var"]["admin"]); + c.set("cache", cache); + c.set("db", memory.db as unknown as Context["var"]["db"]); + c.set("events", { + emit: vi.fn(async () => Promise.resolve()), + } as unknown as Context["var"]["events"]); + await next(); + }); + app.openapi(deleteRoleAdminRoute.route, deleteRoleAdminRoute.handler); + + const remove = async () => + await app.request(`/${DOOMED_ROLE}?moveToRoleId=${MEMBER_ROLE}`, { + method: "DELETE", + }); + + return { cache, memory, remove }; +}; + +describe("DELETE /admin/roles/{id} - session caches", () => { + it("drops the cached sessions of primary and secondary holders of the deleted role", async () => { + const h = await harness(); + + const response = await h.remove(); + + expect(response.status).toBe(200); + expect(await h.cache.getSystem(userKey(PRIMARY_HOLDER))).toBeNull(); + expect(await h.cache.getSystem(userKey(SECONDARY_HOLDER))).toBeNull(); + expect(await h.cache.getSystem(adminKey(SECONDARY_HOLDER))).toBeNull(); + }); + + it("keeps the cached sessions of users who never held the role", async () => { + const h = await harness(); + + await h.remove(); + + expect(await h.cache.getSystem(userKey(BYSTANDER))).toEqual({ + id: BYSTANDER, + }); + }); + + it("moves primary holders to the fallback role", async () => { + const h = await harness(); + + await h.remove(); + + expect( + h.memory.rows(core_users).find(row => row.id === PRIMARY_HOLDER)?.roleId, + ).toBe(MEMBER_ROLE); + expect(h.memory.rows(core_roles).some(row => row.id === DOOMED_ROLE)).toBe( + false, + ); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.ts b/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.ts index 3f2b50486..9ca8da378 100644 --- a/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.ts +++ b/packages/vitnode/src/api/modules/admin/roles/routes/delete.route.ts @@ -3,6 +3,7 @@ import { and, count, eq, inArray } from "drizzle-orm"; import { buildRoute } from "@/api/lib/route"; import { invalidateAllStaffPermissions } from "@/api/lib/staff-permission-cache"; +import { invalidateSessionCacheForUser } from "@/api/models/session-revoke"; import { assertCanAssignPrimaryRole } from "@/api/modules/admin/users/lib/assert-edit-user-permission"; import { CONFIG_PLUGIN } from "@/config"; import { core_languages_words } from "@/database/languages"; @@ -129,14 +130,18 @@ export const deleteRoleAdminRoute = buildRoute({ await assertCanAssignPrimaryRole(c, targetRoleId); } - await db.transaction(async tx => { - if (targetRoleId != null) { - const members = await tx - .select({ id: core_users.id }) - .from(core_users) - .where(eq(core_users.roleId, roleId)); - const memberIds = members.map(member => member.id); + const affectedUserIds = await db.transaction(async tx => { + const members = await tx + .select({ id: core_users.id }) + .from(core_users) + .where(eq(core_users.roleId, roleId)); + const secondaryHolders = await tx + .select({ userId: core_users_secondary_roles.userId }) + .from(core_users_secondary_roles) + .where(eq(core_users_secondary_roles.roleId, roleId)); + const memberIds = members.map(member => member.id); + if (targetRoleId != null) { await tx .update(core_users) .set({ roleId: targetRoleId }) @@ -170,11 +175,23 @@ export const deleteRoleAdminRoute = buildRoute({ ); await tx.delete(core_roles).where(eq(core_roles.id, roleId)); + + return [ + ...new Set([ + ...memberIds, + ...secondaryHolders.map(holder => holder.userId), + ]), + ]; }); // Every member of the deleted role was just reassigned, and the staff // entries that pointed at it are gone with it. await invalidateAllStaffPermissions(c); + await Promise.all( + affectedUserIds.map( + async userId => await invalidateSessionCacheForUser(c, userId), + ), + ); await c.get("events").emit("role.deleted", { roleId }); diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/list-mapping.ts b/packages/vitnode/src/api/modules/admin/roles/routes/list-mapping.ts index 473345d36..37cc542dc 100644 --- a/packages/vitnode/src/api/modules/admin/roles/routes/list-mapping.ts +++ b/packages/vitnode/src/api/modules/admin/roles/routes/list-mapping.ts @@ -41,9 +41,13 @@ export const withRolesAdminListFields = ({ namesByRoleId.set(word.itemId, forRole); } - const usersCountByRoleId = new Map( - userCounts.map(item => [item.roleId, item.total]), - ); + const usersCountByRoleId = new Map(); + for (const item of userCounts) { + usersCountByRoleId.set( + item.roleId, + (usersCountByRoleId.get(item.roleId) ?? 0) + item.total, + ); + } return roles.map(role => ({ ...role, diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/list.route.test.ts b/packages/vitnode/src/api/modules/admin/roles/routes/list.route.test.ts new file mode 100644 index 000000000..700d40933 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/roles/routes/list.route.test.ts @@ -0,0 +1,168 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it } from "vitest"; + +import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_languages_words } from "@/database/languages"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { grantStaffPermissions } from "@/tests/staff-permissions"; + +import { listRolesAdminRoute } from "./list.route"; + +const ADMIN = { id: 1, roleId: 1 }; + +const permission = (module: string, name: string): PermissionsStaffArgs => ({ + module, + permission: name, + plugin: "@vitnode/core", +}); + +const roleRow = (id: number, root = false) => ({ + allowEditPersonalInfo: true, + allowUploadAvatar: true, + allowUploadCover: true, + allowUploadFiles: false, + color: null, + createdAt: new Date("2026-01-01T00:00:00Z"), + default: false, + guest: false, + id, + maxAvatarSize: 2048, + maxCoverSize: 5120, + maxStorageForSubmit: null, + prefix: null, + protected: false, + root, + totalMaxStorage: null, + updatedAt: new Date("2026-01-01T00:00:00Z"), +}); + +const ROOT_ROLE = 1; +const MODERATOR_ROLE = 2; +const MEMBER_ROLE = 3; + +const userRow = (id: number, roleId: number) => ({ id, roleId }); + +const seed = () => + createMemoryDb([ + [ + core_roles, + [roleRow(ROOT_ROLE, true), roleRow(MODERATOR_ROLE), roleRow(MEMBER_ROLE)], + ], + [core_languages_words, []], + [ + core_users, + [ + userRow(ADMIN.id, ROOT_ROLE), + userRow(2, MEMBER_ROLE), + userRow(3, MEMBER_ROLE), + userRow(4, MEMBER_ROLE), + userRow(5, MEMBER_ROLE), + ], + ], + [ + core_users_secondary_roles, + [ + { roleId: MEMBER_ROLE, userId: ADMIN.id }, + { roleId: MEMBER_ROLE, userId: 2 }, + { roleId: MODERATOR_ROLE, userId: 2 }, + { roleId: MODERATOR_ROLE, userId: 3 }, + { roleId: MODERATOR_ROLE, userId: 4 }, + ], + ], + [core_admin_permissions, []], + [core_moderators_permissions, [{ id: 1, roleId: MODERATOR_ROLE }]], + ]); + +const list = async (permissions: PermissionsStaffArgs[]) => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { permissions, userId: ADMIN.id }); + const { db } = seed(); + const app = new OpenAPIHono(); + + app.use("*", async (c, next) => { + c.set("admin", { user: ADMIN } as unknown as Context["var"]["admin"]); + c.set("cache", cache); + c.set("db", db as unknown as Context["var"]["db"]); + await next(); + }); + app.openapi(listRolesAdminRoute.route, listRolesAdminRoute.handler); + + return await app.request("/list?orderBy=id&order=desc"); +}; + +interface ListedRole { + grantsAdmin: boolean; + id: number; + usersCount: number; +} + +const edgesOf = async (res: Response): Promise => { + const body = (await res.json()) as { edges: ListedRole[] }; + + return body.edges; +}; + +describe("roles list", () => { + it("refuses an administrator who cannot read roles anywhere", async () => { + const res = await list([ + permission("roles", "can_create"), + permission("users", "can_create"), + permission("staff_admins", "can_view"), + ]); + + expect(res.status).toBe(403); + }); + + it.each([ + ["the roles screen", permission("roles", "can_view")], + ["the users screens", permission("users", "can_view")], + ["creating an admin entry", permission("staff_admins", "can_create")], + [ + "creating a moderator entry", + permission("staff_moderators", "can_create"), + ], + ])("serves the role picker for %s", async (_label, granted) => { + const res = await list([granted]); + + expect(res.status).toBe(200); + }); + + it("counts secondary holders alongside primary ones", async () => { + const edges = await edgesOf(await list([permission("roles", "can_view")])); + + expect( + Object.fromEntries(edges.map(role => [role.id, role.usersCount])), + ).toEqual({ [MEMBER_ROLE]: 5, [MODERATOR_ROLE]: 3, [ROOT_ROLE]: 1 }); + }); + + it("lists the roles in the requested order", async () => { + const edges = await edgesOf(await list([permission("roles", "can_view")])); + + expect(edges.map(role => role.id)).toEqual([ + MEMBER_ROLE, + MODERATOR_ROLE, + ROOT_ROLE, + ]); + }); + + it("marks root and moderator roles as granting admin", async () => { + const edges = await edgesOf(await list([permission("roles", "can_view")])); + + expect( + Object.fromEntries(edges.map(role => [role.id, role.grantsAdmin])), + ).toEqual({ + [MEMBER_ROLE]: false, + [MODERATOR_ROLE]: true, + [ROOT_ROLE]: true, + }); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/list.route.ts b/packages/vitnode/src/api/modules/admin/roles/routes/list.route.ts index 27986e356..5108f86ad 100644 --- a/packages/vitnode/src/api/modules/admin/roles/routes/list.route.ts +++ b/packages/vitnode/src/api/modules/admin/roles/routes/list.route.ts @@ -1,5 +1,5 @@ import { z } from "@hono/zod-openapi"; -import { and, count, eq, ilike, inArray } from "drizzle-orm"; +import { and, count, eq, ilike, inArray, ne } from "drizzle-orm"; import { buildRoute } from "@/api/lib/route"; import { @@ -10,9 +10,11 @@ import { import { CONFIG_PLUGIN } from "@/config"; import { core_admin_permissions } from "@/database/admins"; import { core_languages_words } from "@/database/languages"; +import { core_moderators_permissions } from "@/database/moderators"; import { core_roles } from "@/database/roles"; -import { core_users } from "@/database/users"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { assertCanListRoles } from "../lib/assert-can-list-roles"; import { withRolesAdminListFields } from "./list-mapping"; const rolesAdminListSchema = z.object({ @@ -44,9 +46,6 @@ const rolesAdminListSchema = z.object({ createdAt: z.date(), updatedAt: z.date(), usersCount: z.number(), - // A role grants admin access when it has a row in - // `core_admin_permissions`. Editing/deleting such roles needs the - // elevated `can_edit_admin` / `can_delete_admin` permission. grantsAdmin: z.boolean(), }), ), @@ -81,6 +80,8 @@ export const listRolesAdminRoute = buildRoute({ }, }, handler: async c => { + await assertCanListRoles(c); + const query = c.req.valid("query"); const search = query.search?.trim(); @@ -165,7 +166,7 @@ export const listRolesAdminRoute = buildRoute({ ), ) : []; - const userCounts = roleIds.length + const primaryCounts = roleIds.length ? await c .get("db") .select({ @@ -176,15 +177,45 @@ export const listRolesAdminRoute = buildRoute({ .where(inArray(core_users.roleId, roleIds)) .groupBy(core_users.roleId) : []; - // Roles with a `core_admin_permissions` row grant admin access. - const adminRoles = roleIds.length + const secondaryCounts = roleIds.length ? await c .get("db") - .selectDistinct({ roleId: core_admin_permissions.roleId }) - .from(core_admin_permissions) - .where(inArray(core_admin_permissions.roleId, roleIds)) + .select({ + roleId: core_users_secondary_roles.roleId, + total: count(), + }) + .from(core_users_secondary_roles) + .innerJoin( + core_users, + eq(core_users.id, core_users_secondary_roles.userId), + ) + .where( + and( + inArray(core_users_secondary_roles.roleId, roleIds), + ne(core_users.roleId, core_users_secondary_roles.roleId), + ), + ) + .groupBy(core_users_secondary_roles.roleId) : []; - const adminRoleIds = new Set(adminRoles.map(row => row.roleId)); + const [adminEntryRoles, moderatorEntryRoles] = roleIds.length + ? await Promise.all([ + c + .get("db") + .selectDistinct({ roleId: core_admin_permissions.roleId }) + .from(core_admin_permissions) + .where(inArray(core_admin_permissions.roleId, roleIds)), + c + .get("db") + .selectDistinct({ roleId: core_moderators_permissions.roleId }) + .from(core_moderators_permissions) + .where(inArray(core_moderators_permissions.roleId, roleIds)), + ]) + : [[], []]; + const adminRoleIds = new Set([ + ...data.edges.filter(role => role.root).map(role => role.id), + ...adminEntryRoles.map(row => row.roleId), + ...moderatorEntryRoles.map(row => row.roleId), + ]); return c.json({ pageInfo: data.pageInfo, @@ -192,7 +223,7 @@ export const listRolesAdminRoute = buildRoute({ adminRoleIds, names, roles: data.edges, - userCounts, + userCounts: [...primaryCounts, ...secondaryCounts], }), }); }, diff --git a/packages/vitnode/src/api/modules/admin/roles/routes/show.route.ts b/packages/vitnode/src/api/modules/admin/roles/routes/show.route.ts index ea0d405b0..dcc0fa197 100644 --- a/packages/vitnode/src/api/modules/admin/roles/routes/show.route.ts +++ b/packages/vitnode/src/api/modules/admin/roles/routes/show.route.ts @@ -36,11 +36,6 @@ const roleAdminSchema = z.object({ export const showRoleAdminRoute = buildRoute({ pluginId: CONFIG_PLUGIN.pluginId, - // `list` is deliberately ungated - a role *picker* has to work for an - // administrator who cannot open the roles screen - but that rationale does not - // reach one role's full record, which is the edit screen's read and nothing - // else's. `can_edit` depends on `can_view` in the catalog, so every role that - // could already open this screen still can. adminStaffPermission: { module: "roles", permission: "can_view" }, route: { method: "get", diff --git a/packages/vitnode/src/api/modules/admin/staff/lib/staff-entry-guards.ts b/packages/vitnode/src/api/modules/admin/staff/lib/staff-entry-guards.ts new file mode 100644 index 000000000..98d241ecb --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/staff/lib/staff-entry-guards.ts @@ -0,0 +1,107 @@ +import type { Context } from "hono"; + +import { eq } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; + +import type { + PermissionsStaffArgs, + PermissionStaffType, +} from "@/api/lib/permission-staff"; + +import { + getUserRoleIds, + resolveStaffPermissions, +} from "@/api/lib/check-staff-permission"; +import { staffPermissionKey } from "@/api/lib/staff-permission"; +import { core_roles } from "@/database/roles"; + +interface StaffEntryTarget { + roleId?: null | number; + userId?: null | number; +} + +const currentAdminUser = (c: Context) => { + const user = c.get("admin")?.user; + if (!user) { + throw new HTTPException(403, { message: "Forbidden" }); + } + + return user; +}; + +export const assertNotOwnStaffEntry = async ( + c: Context, + entry: StaffEntryTarget, + message: string, +): Promise => { + const user = currentAdminUser(c); + const roleIds = await getUserRoleIds(c, user); + + const isSelf = + (entry.userId != null && entry.userId === user.id) || + (entry.roleId != null && roleIds.includes(entry.roleId)); + + if (isSelf) { + throw new HTTPException(403, { message }); + } +}; + +export const assertStaffAssignableRole = async ( + c: Context, + roleId: number, +): Promise => { + const [role] = await c + .get("db") + .select({ default: core_roles.default, guest: core_roles.guest }) + .from(core_roles) + .where(eq(core_roles.id, roleId)) + .limit(1); + + if (!role) { + throw new HTTPException(404, { message: "Role not found" }); + } + + if (role.default || role.guest) { + throw new HTTPException(400, { + message: "The default and guest roles cannot be given staff access.", + }); + } +}; + +export const assertWithinStaffPrivilegeCeiling = async ( + c: Context, + { + type, + current, + requested, + }: { + current: { permissions: PermissionsStaffArgs[]; unrestricted: boolean }; + requested: { permissions: PermissionsStaffArgs[]; unrestricted: boolean }; + type: PermissionStaffType; + }, +): Promise => { + const ceiling = await resolveStaffPermissions(c, { + type, + user: currentAdminUser(c), + }); + if (ceiling.root || current.unrestricted) return; + + if (requested.unrestricted) { + throw new HTTPException(403, { + message: "Only a root administrator can grant unrestricted access.", + }); + } + + const allowed = new Set( + [...ceiling.permissions, ...current.permissions].map(staffPermissionKey), + ); + const exceedsCeiling = requested.permissions.some( + permission => !allowed.has(staffPermissionKey(permission)), + ); + + if (exceedsCeiling) { + throw new HTTPException(403, { + message: "You cannot grant a permission you do not hold.", + }); + } +}; diff --git a/packages/vitnode/src/api/modules/admin/staff/routes/create.route.ts b/packages/vitnode/src/api/modules/admin/staff/routes/create.route.ts index 9b11b8cdc..24e98666c 100644 --- a/packages/vitnode/src/api/modules/admin/staff/routes/create.route.ts +++ b/packages/vitnode/src/api/modules/admin/staff/routes/create.route.ts @@ -9,6 +9,10 @@ import { core_admin_permissions } from "@/database/admins"; import { core_moderators_permissions } from "@/database/moderators"; import { staffPermissionModuleByType, staffTypeSchema } from "../lib/schema"; +import { + assertNotOwnStaffEntry, + assertStaffAssignableRole, +} from "../lib/staff-entry-guards"; const tableByType = { admin: core_admin_permissions, @@ -51,9 +55,15 @@ export const createStaffAdminRoute = buildRoute({ }, description: "Staff entry created", }, + 400: { + description: "The default and guest roles cannot be given staff access", + }, 403: { description: "Access Denied", }, + 404: { + description: "Role not found", + }, 409: { content: { "application/json": { @@ -76,6 +86,16 @@ export const createStaffAdminRoute = buildRoute({ const { roleId, userId } = c.req.valid("json"); const table = tableByType[type]; + await assertNotOwnStaffEntry( + c, + { roleId, userId }, + "You cannot create a staff entry that governs your own access.", + ); + + if (roleId) { + await assertStaffAssignableRole(c, roleId); + } + // Prevent assigning the same role/user twice. const [existing] = await c .get("db") diff --git a/packages/vitnode/src/api/modules/admin/staff/routes/staff-entry-routes.test.ts b/packages/vitnode/src/api/modules/admin/staff/routes/staff-entry-routes.test.ts new file mode 100644 index 000000000..0bd277480 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/staff/routes/staff-entry-routes.test.ts @@ -0,0 +1,394 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it } from "vitest"; + +import type { + PermissionsStaffArgs, + PermissionStaffType, + StaffPermissionSet, +} from "@/api/lib/permission-staff"; +import type { buildRoute } from "@/api/lib/route"; + +import { normalizePermissionStaffModules } from "@/api/lib/permission-staff"; +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { + grantStaffPermissions, + ROOT_STAFF_PERMISSIONS, +} from "@/tests/staff-permissions"; + +import { createStaffAdminRoute } from "./create.route"; +import { updatePermissionsStaffAdminRoute } from "./update-permissions.route"; + +const CORE = "@vitnode/core"; + +const permission = (module: string, name: string): PermissionsStaffArgs => ({ + module, + permission: name, + plugin: CORE, +}); + +const VIEW_ADMINS = permission("staff_admins", "can_view"); +const CREATE_ADMINS = permission("staff_admins", "can_create"); +const EDIT_ADMINS = permission("staff_admins", "can_edit"); +const MANAGE_ADMINS = [VIEW_ADMINS, CREATE_ADMINS, EDIT_ADMINS]; +const VIEW_USERS = permission("users", "can_view"); +const EDIT_MODERATORS = permission("staff_moderators", "can_edit"); +const CREATE_MODERATORS = permission("staff_moderators", "can_create"); +const MODERATE_WIDGETS = permission("widgets", "can_edit"); +const MODERATE_USERS = permission("users", "can_edit"); + +const CATALOG = [ + { + pluginId: CORE, + admin: normalizePermissionStaffModules({ + staff_admins: [ + "can_view", + { permission: "can_create", dependsOn: ["can_view"] }, + { permission: "can_edit", dependsOn: ["can_view"] }, + ], + staff_moderators: [ + "can_view", + { permission: "can_create", dependsOn: ["can_view"] }, + { permission: "can_edit", dependsOn: ["can_view"] }, + ], + users: ["can_view"], + }), + moderator: normalizePermissionStaffModules({ + users: ["can_edit"], + widgets: ["can_edit"], + }), + }, +]; + +const CALLER = { id: 1, roleId: 10 }; +const CALLER_SECONDARY_ROLE_ID = 11; +const TARGET_ROLE_ID = 20; + +interface Entry { + id: number; + permissions: PermissionsStaffArgs[]; + protected: boolean; + roleId: null | number; + unrestricted: boolean; + userId: null | number; +} + +interface TargetRole { + default: boolean; + guest: boolean; +} + +const ORDINARY_ROLE: TargetRole = { default: false, guest: false }; + +const entryFor = (overrides: Partial = {}): Entry => ({ + id: 5, + permissions: [], + protected: false, + roleId: TARGET_ROLE_ID, + unrestricted: false, + userId: null, + ...overrides, +}); + +const tableByType = { + admin: core_admin_permissions, + moderator: core_moderators_permissions, +} as const; + +const appFor = async ( + built: ReturnType, + { + entry, + grants, + role = ORDINARY_ROLE, + }: { + entry?: Entry; + grants: Partial< + Record + >; + role?: null | TargetRole; + }, +) => { + const cache = createTestCache(); + for (const [type, permissions] of Object.entries(grants)) { + await grantStaffPermissions(cache, { + permissions, + type: type as PermissionStaffType, + userId: CALLER.id, + }); + } + const memory = createMemoryDb([ + [ + core_roles, + [ + { ...ORDINARY_ROLE, id: CALLER.roleId, root: false }, + { ...ORDINARY_ROLE, id: CALLER_SECONDARY_ROLE_ID, root: false }, + ...(role ? [{ ...role, id: TARGET_ROLE_ID, root: false }] : []), + ], + ], + [ + core_users_secondary_roles, + [{ roleId: CALLER_SECONDARY_ROLE_ID, userId: CALLER.id }], + ], + [core_admin_permissions, entry ? [entry] : []], + [core_moderators_permissions, entry ? [entry] : []], + ]); + const app = new OpenAPIHono(); + + app.use("*", async (c, next) => { + c.set("admin", { user: CALLER } as unknown as Context["var"]["admin"]); + c.set("cache", cache); + c.set("db", memory.db as unknown as Context["var"]["db"]); + c.set("core", { + permissionStaff: CATALOG, + } as unknown as Context["var"]["core"]); + await next(); + }); + app.openapi(built.route, built.handler); + + const storedEntries = (type: PermissionStaffType = "admin") => + memory.rows(tableByType[type]); + + return { app, storedEntries }; +}; + +const patch = async ( + app: OpenAPIHono, + body: { permissions: PermissionsStaffArgs[]; unrestricted: boolean }, + type: PermissionStaffType = "admin", +) => + await app.request(`/entry/${type}/5`, { + body: JSON.stringify(body), + headers: { "Content-Type": "application/json" }, + method: "PATCH", + }); + +const post = async ( + app: OpenAPIHono, + body: { roleId?: number; userId?: number }, + type: PermissionStaffType = "admin", +) => + await app.request(`/entry/${type}`, { + body: JSON.stringify(body), + headers: { "Content-Type": "application/json" }, + method: "POST", + }); + +describe("updating a staff entry", () => { + it("refuses unrestricted access from a non-root administrator", async () => { + const { app, storedEntries } = await appFor( + updatePermissionsStaffAdminRoute, + { + entry: entryFor(), + grants: { admin: MANAGE_ADMINS }, + }, + ); + + const res = await patch(app, { permissions: [], unrestricted: true }); + + expect(res.status).toBe(403); + expect(storedEntries()).toEqual([entryFor()]); + }); + + it("lets a root administrator grant unrestricted access", async () => { + const { app, storedEntries } = await appFor( + updatePermissionsStaffAdminRoute, + { + entry: entryFor({ permissions: [VIEW_ADMINS] }), + grants: { admin: ROOT_STAFF_PERMISSIONS }, + }, + ); + + const res = await patch(app, { permissions: [], unrestricted: true }); + + expect(res.status).toBe(200); + expect(storedEntries()).toEqual([ + expect.objectContaining({ + id: entryFor().id, + permissions: [], + unrestricted: true, + }), + ]); + }); + + it("refuses a permission the caller does not hold", async () => { + const { app, storedEntries } = await appFor( + updatePermissionsStaffAdminRoute, + { + entry: entryFor(), + grants: { admin: MANAGE_ADMINS }, + }, + ); + + const res = await patch(app, { + permissions: [VIEW_ADMINS, VIEW_USERS], + unrestricted: false, + }); + + expect(res.status).toBe(403); + expect(storedEntries()).toEqual([entryFor()]); + }); + + it("grants a subset of the caller's own permissions", async () => { + const { app, storedEntries } = await appFor( + updatePermissionsStaffAdminRoute, + { + entry: entryFor(), + grants: { admin: MANAGE_ADMINS }, + }, + ); + + const res = await patch(app, { + permissions: [VIEW_ADMINS, CREATE_ADMINS], + unrestricted: false, + }); + + expect(res.status).toBe(200); + expect(await res.json()).toEqual({ + permissions: [VIEW_ADMINS, CREATE_ADMINS], + unrestricted: false, + }); + expect(storedEntries()).toEqual([ + expect.objectContaining({ + permissions: [VIEW_ADMINS, CREATE_ADMINS], + unrestricted: false, + }), + ]); + }); + + it("keeps a permission the entry already had", async () => { + const { app } = await appFor(updatePermissionsStaffAdminRoute, { + entry: entryFor({ permissions: [VIEW_USERS] }), + grants: { admin: MANAGE_ADMINS }, + }); + + const res = await patch(app, { + permissions: [VIEW_USERS, VIEW_ADMINS], + unrestricted: false, + }); + + expect(res.status).toBe(200); + }); + + it("measures a moderator grant against the caller's moderator permissions", async () => { + const withoutWidgets = await appFor(updatePermissionsStaffAdminRoute, { + entry: entryFor(), + grants: { admin: [EDIT_MODERATORS], moderator: [MODERATE_USERS] }, + }); + const withWidgets = await appFor(updatePermissionsStaffAdminRoute, { + entry: entryFor(), + grants: { + admin: [EDIT_MODERATORS], + moderator: [MODERATE_USERS, MODERATE_WIDGETS], + }, + }); + const body = { + permissions: [MODERATE_WIDGETS], + unrestricted: false, + }; + + expect((await patch(withoutWidgets.app, body, "moderator")).status).toBe( + 403, + ); + expect((await patch(withWidgets.app, body, "moderator")).status).toBe(200); + }); + + it.each([ + ["default", { default: true, guest: false }], + ["guest", { default: false, guest: true }], + ])( + "refuses to grant anything to an entry for the %s role", + async (_label, role) => { + const { app, storedEntries } = await appFor( + updatePermissionsStaffAdminRoute, + { + entry: entryFor(), + grants: { admin: ROOT_STAFF_PERMISSIONS }, + role, + }, + ); + + const res = await patch(app, { permissions: [], unrestricted: true }); + + expect(res.status).toBe(400); + expect(storedEntries()).toEqual([entryFor()]); + }, + ); +}); + +describe("creating a staff entry", () => { + it("creates an entry for an ordinary role", async () => { + const { app, storedEntries } = await appFor(createStaffAdminRoute, { + grants: { admin: MANAGE_ADMINS }, + }); + + const res = await post(app, { roleId: TARGET_ROLE_ID }); + + expect(res.status).toBe(201); + const stored = storedEntries(); + expect(stored).toEqual([ + expect.objectContaining({ roleId: TARGET_ROLE_ID, userId: null }), + ]); + expect(await res.json()).toEqual({ id: stored[0]?.id }); + }); + + it.each([ + ["default", { default: true, guest: false }], + ["guest", { default: false, guest: true }], + ])("refuses the %s role", async (_label, role) => { + const { app, storedEntries } = await appFor(createStaffAdminRoute, { + grants: { admin: ROOT_STAFF_PERMISSIONS }, + role, + }); + + const res = await post(app, { roleId: TARGET_ROLE_ID }); + + expect(res.status).toBe(400); + expect(storedEntries()).toEqual([]); + }); + + it("refuses a role that does not exist", async () => { + const { app, storedEntries } = await appFor(createStaffAdminRoute, { + grants: { admin: ROOT_STAFF_PERMISSIONS }, + role: null, + }); + + const res = await post(app, { roleId: TARGET_ROLE_ID }); + + expect(res.status).toBe(404); + expect(storedEntries()).toEqual([]); + }); + + it.each([ + ["the caller's own user", { userId: CALLER.id }], + ["the caller's primary role", { roleId: CALLER.roleId }], + ["the caller's secondary role", { roleId: CALLER_SECONDARY_ROLE_ID }], + ])("refuses an entry for %s", async (_label, body) => { + const { app, storedEntries } = await appFor(createStaffAdminRoute, { + grants: { admin: ROOT_STAFF_PERMISSIONS }, + }); + + const res = await post(app, body); + + expect(res.status).toBe(403); + expect(storedEntries()).toEqual([]); + }); + + it("refuses a moderator entry for the caller's own role", async () => { + const { app, storedEntries } = await appFor(createStaffAdminRoute, { + grants: { admin: [CREATE_MODERATORS] }, + }); + + expect( + (await post(app, { roleId: CALLER.roleId }, "moderator")).status, + ).toBe(403); + expect(storedEntries("moderator")).toEqual([]); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/staff/routes/update-permissions.route.ts b/packages/vitnode/src/api/modules/admin/staff/routes/update-permissions.route.ts index 6afeb5e9a..84df835ff 100644 --- a/packages/vitnode/src/api/modules/admin/staff/routes/update-permissions.route.ts +++ b/packages/vitnode/src/api/modules/admin/staff/routes/update-permissions.route.ts @@ -4,10 +4,7 @@ import { HTTPException } from "hono/http-exception"; import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; -import { - assertStaffPermission, - getUserRoleIds, -} from "@/api/lib/check-staff-permission"; +import { assertStaffPermission } from "@/api/lib/check-staff-permission"; import { buildRoute } from "@/api/lib/route"; import { staffPermissionKey } from "@/api/lib/staff-permission"; import { invalidateStaffEntry } from "@/api/lib/staff-permission-cache"; @@ -20,6 +17,11 @@ import { staffPermissionModuleByType, staffTypeSchema, } from "../lib/schema"; +import { + assertNotOwnStaffEntry, + assertStaffAssignableRole, + assertWithinStaffPrivilegeCeiling, +} from "../lib/staff-entry-guards"; const tableByType = { admin: core_admin_permissions, @@ -60,6 +62,9 @@ export const updatePermissionsStaffAdminRoute = buildRoute({ }, description: "Updated permissions", }, + 400: { + description: "The default and guest roles cannot be given staff access", + }, 403: { description: "Access Denied", }, @@ -97,6 +102,8 @@ export const updatePermissionsStaffAdminRoute = buildRoute({ protected: table.protected, userId: table.userId, roleId: table.roleId, + unrestricted: table.unrestricted, + permissions: table.permissions, }) .from(table) .where(eq(table.id, entryId)) @@ -110,23 +117,25 @@ export const updatePermissionsStaffAdminRoute = buildRoute({ throw new HTTPException(403, { message: "Forbidden" }); } - // An admin cannot edit the entry that governs their own access - their own - // user entry or an entry for any role they belong to (primary or - // secondary). This stops them from escalating their own permissions. - const currentUser = c.get("admin")?.user; - const currentUserRoleIds = currentUser - ? await getUserRoleIds(c, currentUser) - : []; - const isSelf = - currentUser != null && - ((entry.userId != null && entry.userId === currentUser.id) || - (entry.roleId != null && currentUserRoleIds.includes(entry.roleId))); - if (isSelf) { - throw new HTTPException(403, { - message: "You cannot edit your own staff permissions.", - }); + await assertNotOwnStaffEntry( + c, + entry, + "You cannot edit your own staff permissions.", + ); + + if (entry.roleId != null) { + await assertStaffAssignableRole(c, entry.roleId); } + await assertWithinStaffPrivilegeCeiling(c, { + type, + current: { + unrestricted: entry.unrestricted, + permissions: entry.permissions, + }, + requested: { unrestricted, permissions }, + }); + // Only persist permissions that actually exist in the catalog for this // staff type - silently drops anything unknown/forged. Also record each // permission's dependencies (the keys of the permissions it `dependsOn` diff --git a/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.test.ts b/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.test.ts index e5a5a0a5b..6f74677af 100644 --- a/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.test.ts +++ b/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.test.ts @@ -1,151 +1,322 @@ +// @vitest-environment node import type { Context } from "hono"; import { HTTPException } from "hono/http-exception"; import { describe, expect, it } from "vitest"; -import type { CacheModel } from "@/api/lib/cache"; import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; import { core_admin_permissions } from "@/database/admins"; import { core_moderators_permissions } from "@/database/moderators"; import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; import { createTestCache } from "@/tests/cache"; -import { grantStaffPermissions } from "@/tests/staff-permissions"; +import { createMemoryDb } from "@/tests/memory-db"; +import { + grantStaffPermissions, + ROOT_STAFF_PERMISSIONS, +} from "@/tests/staff-permissions"; -import { assertCanAssignRoles } from "./assert-edit-user-permission"; +import { + assertCanAssignRoles, + assertCanEditAdminTarget, +} from "./assert-edit-user-permission"; -const ADMIN = { id: 1, roleId: 1 }; +const CALLER = { id: 1, roleId: 2 }; +const TARGET_ID = 7; -const CAN_EDIT_ADMIN: PermissionsStaffArgs = { - module: "users", - permission: "can_edit_admin", +const ROOT_ROLE = 1; +const MEMBER_ROLE = 3; +const STAFF_ROLE = 9; + +const permission = (name: string, module = "users"): PermissionsStaffArgs => ({ + module, + permission: name, plugin: "@vitnode/core", -}; +}); -const CAN_EDIT: PermissionsStaffArgs = { - ...CAN_EDIT_ADMIN, - permission: "can_edit", -}; +const CAN_EDIT = permission("can_edit"); +const CAN_EDIT_ADMIN = permission("can_edit_admin"); +const CAN_MANAGE_PLUGINS = permission("can_manage", "plugins"); +const CAN_DELETE_POSTS = permission("can_delete", "posts"); -/** - * Which roles the fake database considers staff-granting, by the table that - * would say so. The guard runs one query per table, so the stub answers by - * which table the query named. - */ -interface StaffRoles { - admin?: number[]; - moderator?: number[]; - root?: number[]; +interface StaffEntry { + permissions?: PermissionsStaffArgs[]; + roleId?: number; + unrestricted?: boolean; + userId?: number; } -/** - * A stand-in for the Drizzle query builder: `.select().from(t).where().limit()` - * resolves to a row when `t`'s set contains any of the roles under test. - * - * A stub rather than a database because the thing worth asserting is the - * *decision* - "does attaching these roles need `can_edit_admin`" - and that is - * three lookups and a boolean, not a schema. - */ -const contextWith = ( - staff: StaffRoles, - roleIds: number[], - cache: CacheModel, -): Context => { - const idsFor = (table: unknown): number[] => { - if (table === core_roles) return staff.root ?? []; - if (table === core_admin_permissions) return staff.admin ?? []; - if (table === core_moderators_permissions) return staff.moderator ?? []; - - throw new Error("unexpected table"); - }; +interface World { + admin?: StaffEntry[]; + moderator?: StaffEntry[]; + secondaryRoleIds?: number[]; +} - const db = { - select: () => ({ - from: (table: unknown) => { - const matches = idsFor(table).filter(id => roleIds.includes(id)); - - return { - where: () => ({ - limit: async () => - await Promise.resolve(matches.map(id => ({ id }))), - }), - }; - }, - }), - }; +interface Caller { + admin: PermissionsStaffArgs[] | typeof ROOT_STAFF_PERMISSIONS; + moderator?: PermissionsStaffArgs[] | typeof ROOT_STAFF_PERMISSIONS; +} - const values: Record = { admin: { user: ADMIN }, cache, db }; +const entryRow = (entry: StaffEntry) => ({ + permissions: [], + roleId: null, + unrestricted: false, + userId: null, + ...entry, +}); + +const contextFor = async (world: World, caller: Caller): Promise => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { + permissions: caller.admin, + userId: CALLER.id, + }); + if (caller.moderator) { + await grantStaffPermissions(cache, { + permissions: caller.moderator, + type: "moderator", + userId: CALLER.id, + }); + } - return { get: (key: string) => values[key] } as Context; + const { db } = createMemoryDb([ + [core_users, [CALLER, { id: TARGET_ID, roleId: MEMBER_ROLE }]], + [ + core_users_secondary_roles, + (world.secondaryRoleIds ?? []).map(roleId => ({ + roleId, + userId: TARGET_ID, + })), + ], + [ + core_roles, + [ + { id: ROOT_ROLE, root: true }, + { id: CALLER.roleId, root: false }, + { id: MEMBER_ROLE, root: false }, + { id: STAFF_ROLE, root: false }, + ], + ], + [core_admin_permissions, (world.admin ?? []).map(entryRow)], + [core_moderators_permissions, (world.moderator ?? []).map(entryRow)], + ]); + const values: Record = { + admin: { user: CALLER }, + cache, + db, + }; + + return { get: (key: string) => values[key] } as unknown as Context; }; const assign = async ( - staff: StaffRoles, + world: World, roleIds: number[], - permissions: PermissionsStaffArgs[], + caller: Caller, ): Promise => { - const cache = createTestCache(); - await grantStaffPermissions(cache, { permissions, userId: ADMIN.id }); - await assertCanAssignRoles(contextWith(staff, roleIds, cache), roleIds); + await assertCanAssignRoles(await contextFor(world, caller), roleIds); }; +const ELEVATED_ADMIN: Caller = { admin: [CAN_EDIT, CAN_EDIT_ADMIN] }; +const ROOT_CALLER: Caller = { admin: ROOT_STAFF_PERMISSIONS }; + describe("assertCanAssignRoles", () => { it("lets an ordinary role through without an elevated check", async () => { await expect( - assign({ admin: [9], root: [9] }, [2], []), + assign({ admin: [{ roleId: STAFF_ROLE }] }, [MEMBER_ROLE], { admin: [] }), ).resolves.toBeUndefined(); }); it("asks for nothing when no roles are being assigned", async () => { - await expect(assign({ admin: [9] }, [], [])).resolves.toBeUndefined(); + await expect(assign({}, [], { admin: [] })).resolves.toBeUndefined(); }); - const staffRoles: [string, StaffRoles][] = [ - ["a role with an admin-permissions row", { admin: [9] }], - ["a root role", { root: [9] }], - ["a role with a moderator-permissions row", { moderator: [9] }], + const staffRoles: [string, World, number][] = [ + [ + "a role with an admin entry", + { admin: [{ roleId: STAFF_ROLE }] }, + STAFF_ROLE, + ], + ["a root role", {}, ROOT_ROLE], + [ + "a role with a moderator entry", + { moderator: [{ roleId: STAFF_ROLE }] }, + STAFF_ROLE, + ], ]; it.each(staffRoles)( "requires users:can_edit_admin for %s", - async (_label, staff) => { - await expect(assign(staff, [9], [CAN_EDIT])).rejects.toMatchObject({ - status: 403, - }); + async (_label, world, roleId) => { + await expect( + assign(world, [roleId], { admin: [CAN_EDIT] }), + ).rejects.toMatchObject({ status: 403 }); }, ); it.each(staffRoles)( - "allows %s with users:can_edit_admin alone", - async (_label, staff) => { + "lets a root caller assign %s", + async (_label, world, roleId) => { await expect( - assign(staff, [9], [CAN_EDIT_ADMIN]), + assign(world, [roleId], ROOT_CALLER), ).resolves.toBeUndefined(); }, ); + it("allows a zero-permission staff role with users:can_edit_admin", async () => { + await expect( + assign( + { + admin: [{ roleId: STAFF_ROLE }], + moderator: [{ roleId: STAFF_ROLE }], + }, + [STAFF_ROLE], + ELEVATED_ADMIN, + ), + ).resolves.toBeUndefined(); + }); + + it("refuses the root role to a caller who is not root", async () => { + await expect(assign({}, [ROOT_ROLE], ELEVATED_ADMIN)).rejects.toMatchObject( + { status: 403 }, + ); + }); + + it("refuses the root role to a caller who is root only as a moderator", async () => { + await expect( + assign({}, [ROOT_ROLE], { + ...ELEVATED_ADMIN, + moderator: ROOT_STAFF_PERMISSIONS, + }), + ).rejects.toMatchObject({ status: 403 }); + }); + + it("refuses a role with an unrestricted admin entry to a caller who is not root", async () => { + await expect( + assign( + { admin: [{ roleId: STAFF_ROLE, unrestricted: true }] }, + [STAFF_ROLE], + ELEVATED_ADMIN, + ), + ).rejects.toMatchObject({ status: 403 }); + }); + + it("refuses a role with an unrestricted moderator entry unless the caller is root there", async () => { + const world = { + moderator: [{ roleId: STAFF_ROLE, unrestricted: true }], + }; + + await expect( + assign(world, [STAFF_ROLE], ELEVATED_ADMIN), + ).rejects.toMatchObject({ status: 403 }); + await expect( + assign(world, [STAFF_ROLE], { + ...ELEVATED_ADMIN, + moderator: ROOT_STAFF_PERMISSIONS, + }), + ).resolves.toBeUndefined(); + }); + + it("refuses an admin permission the caller does not hold", async () => { + const world = { + admin: [{ permissions: [CAN_MANAGE_PLUGINS], roleId: STAFF_ROLE }], + }; + + await expect( + assign(world, [STAFF_ROLE], ELEVATED_ADMIN), + ).rejects.toMatchObject({ status: 403 }); + await expect( + assign(world, [STAFF_ROLE], { + admin: [CAN_EDIT, CAN_EDIT_ADMIN, CAN_MANAGE_PLUGINS], + }), + ).resolves.toBeUndefined(); + }); + + it("checks moderator permissions against the caller's moderator set", async () => { + const world = { + moderator: [{ permissions: [CAN_DELETE_POSTS], roleId: STAFF_ROLE }], + }; + + await expect( + assign(world, [STAFF_ROLE], { + admin: [CAN_EDIT, CAN_EDIT_ADMIN, CAN_DELETE_POSTS], + }), + ).rejects.toMatchObject({ status: 403 }); + await expect( + assign(world, [STAFF_ROLE], { + ...ELEVATED_ADMIN, + moderator: [CAN_DELETE_POSTS], + }), + ).resolves.toBeUndefined(); + }); + it("catches a staff role hidden among ordinary ones", async () => { - // The escalation this guard exists for: a `users:can_edit` administrator - // sending `secondaryRoleIds: [2, 3, ]`. Guarding only the primary role - // let the whole secondary list past, and a secondary root role grants - // everything - `loadStaffPermissions` reads primary and secondary alike. await expect( - assign({ root: [9] }, [2, 3, 9], [CAN_EDIT]), + assign({}, [MEMBER_ROLE, CALLER.roleId, ROOT_ROLE], { + admin: [CAN_EDIT], + }), ).rejects.toMatchObject({ status: 403 }); }); it("propagates the refusal when the caller lacks the permission", async () => { - await expect(assign({ root: [9] }, [9], [])).rejects.toBeInstanceOf( + await expect(assign({}, [ROOT_ROLE], { admin: [] })).rejects.toBeInstanceOf( HTTPException, ); }); it("decides a role list with duplicates like the single role", async () => { + const world = { admin: [{ roleId: STAFF_ROLE }] }; + await expect( - assign({ admin: [9] }, [9, 9, 9], [CAN_EDIT_ADMIN]), + assign(world, [STAFF_ROLE, STAFF_ROLE, STAFF_ROLE], ELEVATED_ADMIN), ).resolves.toBeUndefined(); await expect( - assign({ admin: [9] }, [9, 9, 9], [CAN_EDIT]), + assign(world, [STAFF_ROLE, STAFF_ROLE, STAFF_ROLE], { + admin: [CAN_EDIT], + }), ).rejects.toMatchObject({ status: 403 }); }); }); + +describe("assertCanEditAdminTarget", () => { + const protectedTargets: [string, World][] = [ + ["root through a secondary role", { secondaryRoleIds: [ROOT_ROLE] }], + [ + "an admin through a secondary role", + { admin: [{ roleId: STAFF_ROLE }], secondaryRoleIds: [STAFF_ROLE] }, + ], + ["an admin with zero permissions", { admin: [{ userId: TARGET_ID }] }], + [ + "a moderator", + { moderator: [{ permissions: [CAN_DELETE_POSTS], userId: TARGET_ID }] }, + ], + ]; + + it.each(protectedTargets)( + "requires users:can_edit_admin for a target who is %s", + async (_label, world) => { + await expect( + assertCanEditAdminTarget( + await contextFor(world, { admin: [CAN_EDIT] }), + TARGET_ID, + ), + ).rejects.toMatchObject({ status: 403 }); + await expect( + assertCanEditAdminTarget( + await contextFor(world, ELEVATED_ADMIN), + TARGET_ID, + ), + ).resolves.toBeUndefined(); + }, + ); + + it("lets users:can_edit alone edit a member", async () => { + await expect( + assertCanEditAdminTarget( + await contextFor({}, { admin: [CAN_EDIT] }), + TARGET_ID, + ), + ).resolves.toBeUndefined(); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.ts b/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.ts index 9f934688f..e6bf97d17 100644 --- a/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.ts +++ b/packages/vitnode/src/api/modules/admin/users/lib/assert-edit-user-permission.ts @@ -1,14 +1,40 @@ import type { Context } from "hono"; import { and, eq, inArray } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; -import { assertStaffPermission } from "@/api/lib/check-staff-permission"; -import { SessionAdminModel } from "@/api/models/session-admin"; +import type { + PermissionsStaffArgs, + PermissionStaffType, + StaffPermissionSet, +} from "@/api/lib/permission-staff"; + +import { + assertStaffPermission, + isStaff, + resolveStaffPermissions, +} from "@/api/lib/check-staff-permission"; +import { hasStaffPermission } from "@/api/lib/staff-permission"; import { CONFIG_PLUGIN } from "@/config"; import { core_admin_permissions } from "@/database/admins"; import { core_moderators_permissions } from "@/database/moderators"; import { core_roles } from "@/database/roles"; +const STAFF_TYPES: PermissionStaffType[] = ["admin", "moderator"]; + +interface StaffGrant { + permissions: PermissionsStaffArgs[]; + unrestricted: boolean; +} + +interface RoleStaffGrants { + admin: StaffGrant[]; + moderator: StaffGrant[]; + root: boolean; +} + +const forbidden = () => new HTTPException(403, { message: "Forbidden" }); + const assertCanEditAdmin = async (c: Context): Promise => { await assertStaffPermission(c, { type: "admin", @@ -22,43 +48,87 @@ export const assertCanEditAdminTarget = async ( c: Context, userId: number, ): Promise => { - const isTargetAdmin = await new SessionAdminModel(c).checkIfUserIsAdmin( - userId, + const staffByType = await Promise.all( + STAFF_TYPES.map(async type => await isStaff(c, { type, userId })), ); - if (!isTargetAdmin) return; + if (!staffByType.some(Boolean)) return; await assertCanEditAdmin(c); }; -const rolesGrantStaffAccess = async ( +const loadRoleStaffGrants = async ( c: Context, roleIds: number[], -): Promise => { - if (roleIds.length === 0) return false; - +): Promise => { const db = c.get("db"); - const [rootRoles, adminRoles, moderatorRoles] = await Promise.all([ + const [rootRoles, admin, moderator] = await Promise.all([ db .select({ id: core_roles.id }) .from(core_roles) .where(and(inArray(core_roles.id, roleIds), eq(core_roles.root, true))) .limit(1), db - .select({ id: core_admin_permissions.id }) + .select({ + permissions: core_admin_permissions.permissions, + unrestricted: core_admin_permissions.unrestricted, + }) .from(core_admin_permissions) - .where(inArray(core_admin_permissions.roleId, roleIds)) - .limit(1), + .where(inArray(core_admin_permissions.roleId, roleIds)), db - .select({ id: core_moderators_permissions.id }) + .select({ + permissions: core_moderators_permissions.permissions, + unrestricted: core_moderators_permissions.unrestricted, + }) .from(core_moderators_permissions) - .where(inArray(core_moderators_permissions.roleId, roleIds)) - .limit(1), + .where(inArray(core_moderators_permissions.roleId, roleIds)), ]); - return ( - rootRoles.length > 0 || adminRoles.length > 0 || moderatorRoles.length > 0 + return { admin, moderator, root: rootRoles.length > 0 }; +}; + +const grantsStaffAccess = (grants: RoleStaffGrants): boolean => + grants.root || grants.admin.length > 0 || grants.moderator.length > 0; + +const holdsEveryGrant = ( + holder: StaffPermissionSet, + grants: StaffGrant[], +): boolean => + holder.root || + grants.every( + grant => + !grant.unrestricted && + grant.permissions.every(permission => + hasStaffPermission(holder, permission), + ), ); + +const assertCallerHoldsGrants = async ( + c: Context, + grants: RoleStaffGrants, +): Promise => { + const caller = c.get("admin")?.user; + if (!caller) throw forbidden(); + + const callerAdmin = await resolveStaffPermissions(c, { + type: "admin", + user: caller, + }); + if (callerAdmin.root) return; + + if (grants.root || !holdsEveryGrant(callerAdmin, grants.admin)) { + throw forbidden(); + } + + if (grants.moderator.length === 0) return; + + const callerModerator = await resolveStaffPermissions(c, { + type: "moderator", + user: caller, + }); + if (!holdsEveryGrant(callerModerator, grants.moderator)) { + throw forbidden(); + } }; export const assertCanAssignRoles = async ( @@ -66,9 +136,13 @@ export const assertCanAssignRoles = async ( roleIds: number[], ): Promise => { const unique = [...new Set(roleIds)]; - if (!(await rolesGrantStaffAccess(c, unique))) return; + if (unique.length === 0) return; + + const grants = await loadRoleStaffGrants(c, unique); + if (!grantsStaffAccess(grants)) return; await assertCanEditAdmin(c); + await assertCallerHoldsGrants(c, grants); }; export const assertCanAssignPrimaryRole = async ( diff --git a/packages/vitnode/src/api/modules/admin/users/routes/show.route.test.ts b/packages/vitnode/src/api/modules/admin/users/routes/show.route.test.ts new file mode 100644 index 000000000..83dd16569 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/users/routes/show.route.test.ts @@ -0,0 +1,126 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it } from "vitest"; + +import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { grantStaffPermissions } from "@/tests/staff-permissions"; + +import { showUserAdminRoute } from "./show.route"; + +const ROOT_ROLE = 1; +const VIEWER_ROLE = 2; +const MEMBER_ROLE = 3; + +const VIEWER = { email: "viewer@example.com", id: 1, roleId: VIEWER_ROLE }; +const TARGET_ID = 7; + +const CAN_VIEW: PermissionsStaffArgs = { + module: "users", + permission: "can_view", + plugin: "@vitnode/core", +}; + +type TargetShape = + "admin" | "member" | "moderator" | "root via a secondary role"; + +const entryRow = (entry: Record) => ({ + permissions: [], + roleId: null, + unrestricted: false, + userId: null, + ...entry, +}); + +const showTarget = async (target: TargetShape) => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { + permissions: [CAN_VIEW], + userId: VIEWER.id, + }); + + const memory = createMemoryDb([ + [ + core_users, + [ + VIEWER, + { + email: "target@example.com", + id: TARGET_ID, + name: "Target", + nameCode: "target", + roleId: MEMBER_ROLE, + }, + ], + ], + [ + core_users_secondary_roles, + target === "root via a secondary role" + ? [{ roleId: ROOT_ROLE, userId: TARGET_ID }] + : [], + ], + [ + core_roles, + [ + { guest: false, id: ROOT_ROLE, root: true }, + { guest: false, id: VIEWER_ROLE, root: false }, + { guest: false, id: MEMBER_ROLE, root: false }, + ], + ], + [ + core_admin_permissions, + [ + entryRow({ permissions: [CAN_VIEW], roleId: VIEWER_ROLE }), + ...(target === "admin" ? [entryRow({ userId: TARGET_ID })] : []), + ], + ], + [ + core_moderators_permissions, + target === "moderator" ? [entryRow({ userId: TARGET_ID })] : [], + ], + ]); + + const app = new OpenAPIHono(); + app.use("*", async (c, next) => { + c.set("admin", { user: VIEWER } as unknown as Context["var"]["admin"]); + c.set("cache", cache); + c.set("db", memory.db as unknown as Context["var"]["db"]); + await next(); + }); + app.openapi(showUserAdminRoute.route, showUserAdminRoute.handler); + + return await app.request(`/${TARGET_ID}`); +}; + +describe("GET /admin/users/{id} - staff flag", () => { + it.each(["moderator", "root via a secondary role", "admin"])( + "reports a target who is %s as staff", + async target => { + const response = await showTarget(target); + + expect(response.status).toBe(200); + expect(await response.json()).toMatchObject({ + id: TARGET_ID, + isStaff: true, + }); + }, + ); + + it("reports a plain member as not staff", async () => { + const response = await showTarget("member"); + + expect(response.status).toBe(200); + expect(await response.json()).toMatchObject({ + id: TARGET_ID, + isStaff: false, + }); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/users/routes/show.route.ts b/packages/vitnode/src/api/modules/admin/users/routes/show.route.ts index 8444b74ab..2023c2965 100644 --- a/packages/vitnode/src/api/modules/admin/users/routes/show.route.ts +++ b/packages/vitnode/src/api/modules/admin/users/routes/show.route.ts @@ -1,12 +1,12 @@ import { z } from "@hono/zod-openapi"; +import { isStaff } from "@/api/lib/check-staff-permission"; import { resolveUserRoles, userRoleSchema } from "@/api/lib/resolve-user-roles"; import { buildRoute } from "@/api/lib/route"; import { resolveUserImagePolicy, zodUserImagePolicy, } from "@/api/lib/user-images"; -import { SessionAdminModel } from "@/api/models/session-admin"; import { UserModel } from "@/api/models/user"; import { CONFIG_PLUGIN } from "@/config"; @@ -42,7 +42,7 @@ export const showUserAdminRoute = buildRoute({ secondaryRoles: z.array(userRoleSchema), birthday: z.date().nullable(), language: z.string(), - isAdmin: z.boolean(), + isStaff: z.boolean(), imagePolicy: zodUserImagePolicy, }), }, @@ -80,12 +80,21 @@ export const showUserAdminRoute = buildRoute({ return c.json({ error: "User not found" }, 404); } - const [roles, isAdmin, imagePolicy] = await Promise.all([ + const [roles, adminStaff, moderatorStaff, imagePolicy] = await Promise.all([ resolveUserRoles(c, user), - new SessionAdminModel(c).checkIfUserIsAdmin(user.id), + isStaff(c, { type: "admin", userId: user.id }), + isStaff(c, { type: "moderator", userId: user.id }), resolveUserImagePolicy(c, user, { ignoreAllow: true }), ]); - return c.json({ ...user, imagePolicy, isAdmin, ...roles }, 200); + return c.json( + { + ...user, + imagePolicy, + isStaff: adminStaff || moderatorStaff, + ...roles, + }, + 200, + ); }, }); diff --git a/packages/vitnode/src/api/modules/admin/users/routes/update.route.test.ts b/packages/vitnode/src/api/modules/admin/users/routes/update.route.test.ts new file mode 100644 index 000000000..26e4ca0b9 --- /dev/null +++ b/packages/vitnode/src/api/modules/admin/users/routes/update.route.test.ts @@ -0,0 +1,244 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it, vi } from "vitest"; + +import type { PermissionsStaffArgs } from "@/api/lib/permission-staff"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; +import { + grantStaffPermissions, + ROOT_STAFF_PERMISSIONS, +} from "@/tests/staff-permissions"; + +import { updateUserAdminRoute } from "./update.route"; + +const ROOT_ROLE = 1; +const EDITOR_ROLE = 2; +const MEMBER_ROLE = 3; +const PLUGINS_ROLE = 9; + +const EDITOR = { email: "editor@example.com", id: 1, roleId: EDITOR_ROLE }; +const TARGET_ID = 7; + +const permission = (name: string, module = "users"): PermissionsStaffArgs => ({ + module, + permission: name, + plugin: "@vitnode/core", +}); + +const CAN_EDIT = permission("can_edit"); +const CAN_EDIT_ADMIN = permission("can_edit_admin"); + +type TargetShape = "member" | "moderator" | "root via a secondary role"; + +const entryRow = (entry: Record) => ({ + permissions: [], + roleId: null, + unrestricted: false, + userId: null, + ...entry, +}); + +const harness = async ({ + editor, + target = "member", +}: { + editor: PermissionsStaffArgs[] | typeof ROOT_STAFF_PERMISSIONS; + target?: TargetShape; +}) => { + const cache = createTestCache(); + await grantStaffPermissions(cache, { + permissions: editor, + userId: EDITOR.id, + }); + + const memory = createMemoryDb([ + [ + core_users, + [ + EDITOR, + { + email: "target@example.com", + id: TARGET_ID, + name: "Target", + nameCode: "target", + roleId: MEMBER_ROLE, + }, + ], + ], + [ + core_users_secondary_roles, + target === "root via a secondary role" + ? [{ roleId: ROOT_ROLE, userId: TARGET_ID }] + : [], + ], + [ + core_roles, + [ + { guest: false, id: ROOT_ROLE, root: true }, + { guest: false, id: EDITOR_ROLE, root: false }, + { guest: false, id: MEMBER_ROLE, root: false }, + { guest: false, id: PLUGINS_ROLE, root: false }, + ], + ], + [ + core_admin_permissions, + [ + entryRow({ + permissions: [CAN_EDIT, CAN_EDIT_ADMIN], + roleId: EDITOR_ROLE, + }), + entryRow({ + permissions: [permission("can_manage", "plugins")], + roleId: PLUGINS_ROLE, + }), + ], + ], + [ + core_moderators_permissions, + target === "moderator" ? [entryRow({ userId: TARGET_ID })] : [], + ], + ]); + + const app = new OpenAPIHono(); + app.use("*", async (c, next) => { + c.set("admin", { user: EDITOR } as unknown as Context["var"]["admin"]); + c.set("cache", cache); + c.set("db", memory.db as unknown as Context["var"]["db"]); + c.set("events", { + emit: vi.fn(async () => Promise.resolve()), + } as unknown as Context["var"]["events"]); + await next(); + }); + app.openapi(updateUserAdminRoute.route, updateUserAdminRoute.handler); + + const patch = async (userId: number, body: Record) => + await app.request(`/${userId}`, { + body: JSON.stringify(body), + headers: { "content-type": "application/json" }, + method: "PATCH", + }); + + const userRow = (userId: number) => + memory.rows(core_users).find(row => row.id === userId); + + const secondaryRoleIdsOf = (userId: number) => + memory + .rows(core_users_secondary_roles) + .filter(row => row.userId === userId) + .map(row => row.roleId); + + return { patch, secondaryRoleIdsOf, userRow }; +}; + +const NEW_EMAIL = { email: "attacker@example.com" }; + +describe("PATCH /admin/users/{id} - staff targets", () => { + it.each(["root via a secondary role", "moderator"])( + "refuses an email change of a target who is %s without users:can_edit_admin", + async target => { + const h = await harness({ editor: [CAN_EDIT], target }); + + const response = await h.patch(TARGET_ID, NEW_EMAIL); + + expect(response.status).toBe(403); + expect(h.userRow(TARGET_ID)?.email).toBe("target@example.com"); + }, + ); + + it.each(["root via a secondary role", "moderator"])( + "changes the email of a target who is %s with users:can_edit_admin", + async target => { + const h = await harness({ editor: [CAN_EDIT, CAN_EDIT_ADMIN], target }); + + const response = await h.patch(TARGET_ID, NEW_EMAIL); + + expect(response.status).toBe(200); + expect(h.userRow(TARGET_ID)?.email).toBe(NEW_EMAIL.email); + }, + ); + + it("lets users:can_edit alone change a member's email", async () => { + const h = await harness({ editor: [CAN_EDIT] }); + + expect((await h.patch(TARGET_ID, NEW_EMAIL)).status).toBe(200); + }); + + it("refuses stripping the secondary roles of a root target without users:can_edit_admin", async () => { + const h = await harness({ + editor: [CAN_EDIT], + target: "root via a secondary role", + }); + + const response = await h.patch(TARGET_ID, { secondaryRoleIds: [] }); + + expect(response.status).toBe(403); + expect(h.secondaryRoleIdsOf(TARGET_ID)).toEqual([ROOT_ROLE]); + }); +}); + +describe("PATCH /admin/users/{id} - privilege ceiling", () => { + const ELEVATED = [CAN_EDIT, CAN_EDIT_ADMIN]; + + it.each([ + ["as the primary role of another user", TARGET_ID, { roleId: ROOT_ROLE }], + [ + "as a secondary role of another user", + TARGET_ID, + { secondaryRoleIds: [ROOT_ROLE] }, + ], + [ + "as a secondary role of themselves", + EDITOR.id, + { secondaryRoleIds: [ROOT_ROLE] }, + ], + ["as the primary role of themselves", EDITOR.id, { roleId: ROOT_ROLE }], + ])( + "refuses a non-root admin assigning the root role %s", + async (_label, userId, body) => { + const h = await harness({ editor: ELEVATED }); + + const response = await h.patch(userId, body); + + expect(response.status).toBe(403); + expect(h.userRow(userId)?.roleId).not.toBe(ROOT_ROLE); + expect(h.secondaryRoleIdsOf(userId)).not.toContain(ROOT_ROLE); + }, + ); + + it("lets a root admin assign the root role", async () => { + const h = await harness({ editor: ROOT_STAFF_PERMISSIONS }); + + const response = await h.patch(TARGET_ID, { + secondaryRoleIds: [ROOT_ROLE], + }); + + expect(response.status).toBe(200); + expect(h.secondaryRoleIdsOf(TARGET_ID)).toEqual([ROOT_ROLE]); + }); + + it("refuses a role carrying an admin permission the editor lacks", async () => { + const h = await harness({ editor: ELEVATED }); + + const response = await h.patch(TARGET_ID, { roleId: PLUGINS_ROLE }); + + expect(response.status).toBe(403); + expect(h.userRow(TARGET_ID)?.roleId).toBe(MEMBER_ROLE); + }); + + it("allows a role whose permissions the editor holds", async () => { + const h = await harness({ editor: ELEVATED }); + + const response = await h.patch(TARGET_ID, { roleId: EDITOR_ROLE }); + + expect(response.status).toBe(200); + expect(h.userRow(TARGET_ID)?.roleId).toBe(EDITOR_ROLE); + }); +}); diff --git a/packages/vitnode/src/api/modules/admin/users/routes/users.route.ts b/packages/vitnode/src/api/modules/admin/users/routes/users.route.ts deleted file mode 100644 index e8646984b..000000000 --- a/packages/vitnode/src/api/modules/admin/users/routes/users.route.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from "@hono/zod-openapi"; - -import { buildRoute } from "@/api/lib/route"; -import { - withPagination, - zodPaginationPageInfo, - zodPaginationQuery, -} from "@/api/lib/with-pagination"; -import { CONFIG_PLUGIN } from "@/config"; -import { core_users } from "@/database/users"; - -export const usersAdminRoute = buildRoute({ - pluginId: CONFIG_PLUGIN.pluginId, - route: { - method: "get", - description: "Get list of all users (Admin only)", - path: "/list", - request: { - query: zodPaginationQuery.extend({ - order: z.enum(["asc", "desc"]).optional(), - orderBy: z.enum(["id", "name", "email", "createdAt"]).optional(), - }), - }, - responses: { - 200: { - content: { - "application/json": { - schema: z.object({ - edges: z.array( - z.object({ - id: z.number(), - name: z.string(), - email: z.string(), - nameCode: z.string(), - createdAt: z.date(), - newsletter: z.boolean(), - avatarColor: z.string(), - emailVerified: z.boolean(), - roleId: z.number(), - birthday: z.date().nullable(), - language: z.string(), - }), - ), - pageInfo: zodPaginationPageInfo, - }), - }, - }, - description: "List of users", - }, - 403: { - description: "Access Denied", - }, - }, - }, - handler: async c => { - const query = c.req.valid("query"); - const data = await withPagination({ - params: { - query, - }, - primaryCursor: core_users.id, - query: async ({ cursorSelection, limit, offset, where, orderBy }) => - await c - .get("db") - .select({ - ...cursorSelection, - id: core_users.id, - name: core_users.name, - email: core_users.email, - nameCode: core_users.nameCode, - createdAt: core_users.createdAt, - newsletter: core_users.newsletter, - avatarColor: core_users.avatarColor, - emailVerified: core_users.emailVerified, - roleId: core_users.roleId, - birthday: core_users.birthday, - language: core_users.language, - }) - .from(core_users) - .where(where) - .orderBy(orderBy) - .limit(limit) - .offset(offset), - table: core_users, - orderBy: { - column: query.orderBy - ? core_users[query.orderBy] - : core_users.createdAt, - order: query.order ?? "desc", - }, - c, - }); - - return c.json(data); - }, -}); diff --git a/packages/vitnode/src/api/modules/users/passkeys/passkeys.test.ts b/packages/vitnode/src/api/modules/users/passkeys/passkeys.test.ts index ad5c6aca9..f7ff87715 100644 --- a/packages/vitnode/src/api/modules/users/passkeys/passkeys.test.ts +++ b/packages/vitnode/src/api/modules/users/passkeys/passkeys.test.ts @@ -2,6 +2,7 @@ import type { Context } from "hono"; import { OpenAPIHono } from "@hono/zod-openapi"; +import { eq } from "drizzle-orm"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { EnvVariablesVitNode } from "@/api/middlewares/global.middleware"; @@ -9,6 +10,10 @@ import type { EnvVariablesVitNode } from "@/api/middlewares/global.middleware"; import { PasskeyModel } from "@/api/models/passkey"; import { SessionModel } from "@/api/models/session"; import { SessionAdminModel } from "@/api/models/session-admin"; +import { core_admin_permissions } from "@/database/admins"; +import { core_roles } from "@/database/roles"; +import { core_users } from "@/database/users"; +import { createMemoryDb } from "@/tests/memory-db"; import { createMemoryPasskeyStore, type MemoryPasskeyAccount, @@ -54,6 +59,7 @@ const AUTHORIZATION: Authorization = { const ALICE = { email: "alice@example.com", id: 1, name: "Alice" }; const BOB = { email: "bob@example.com", id: 2, name: "Bob" }; +const MEMBER_ROLE_ID = 3; type Viewer = typeof ALICE; @@ -98,11 +104,14 @@ const harness = ({ const createAdminSession = vi .spyOn(SessionAdminModel.prototype, "createSessionByUserId") .mockResolvedValue({ token: "admin-token" }); - const staff = new Set(); - vi.spyOn( - SessionAdminModel.prototype, - "checkIfUserIsAdmin", - ).mockImplementation(async userId => Promise.resolve(staff.has(userId))); + const memoryDb = createMemoryDb([ + [ + core_users, + [ALICE, BOB].map(user => ({ ...user, roleId: MEMBER_ROLE_ID })), + ], + [core_roles, [{ id: MEMBER_ROLE_ID, root: false }]], + [core_admin_permissions, []], + ]); let adminViewer: null | Viewer = null; vi.spyOn(SessionAdminModel.prototype, "getSession").mockImplementation( async () => @@ -123,6 +132,7 @@ const harness = ({ authorization: { ...AUTHORIZATION, passkeys, password }, } as EnvVariablesVitNode["core"]); c.set("user", viewer as unknown as Context["var"]["user"]); + c.set("db", memoryDb.db as unknown as Context["var"]["db"]); c.set("events", { emit } as unknown as Context["var"]["events"]); await next(); }); @@ -164,11 +174,18 @@ const harness = ({ disablePasswordSignIn: () => { password = { enabled: false }; }, - grantStaff: (user: Viewer) => { - staff.add(user.id); + grantStaff: async (user: Viewer) => { + await memoryDb.db.insert(core_admin_permissions).values({ + permissions: [], + roleId: null, + unrestricted: false, + userId: user.id, + }); }, - revokeStaff: (user: Viewer) => { - staff.delete(user.id); + revokeStaff: async (user: Viewer) => { + await memoryDb.db + .delete(core_admin_permissions) + .where(eq(core_admin_permissions.userId, user.id)); }, signInToAdminAs: (user: null | Viewer) => { adminViewer = user; @@ -860,7 +877,7 @@ const enrolled = async ({ asStaff = true }: { asStaff?: boolean } = {}) => { const h = harness(); const authenticator = newAuthenticator(); if (asStaff) { - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInToAdminAs(ALICE); } h.signInAs(ALICE); @@ -901,7 +918,7 @@ describe("AdminCP passkey sign-in", () => { it("starts an AdminCP session for a staff member's passkey", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const response = await adminSignIn(h, authenticator); @@ -925,7 +942,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses a staff member whose access was removed after enrolling", async () => { const { authenticator, h } = await enrolled(); - h.revokeStaff(ALICE); + await h.revokeStaff(ALICE); const response = await adminSignIn(h, authenticator); @@ -936,7 +953,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses an assertion made without user verification", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const response = await adminSignIn(h, authenticator, { userVerified: false, @@ -950,7 +967,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses a challenge older than two minutes", async () => { vi.useFakeTimers({ toFake: ["Date"] }); const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const options = await startAdminSignIn(h); const assertion = authenticator.getAssertion({ challenge: options.challenge, @@ -969,7 +986,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses a reused AdminCP challenge", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const options = await startAdminSignIn(h); const cookies = h.cookies(); const assertion = authenticator.getAssertion({ @@ -994,7 +1011,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses a public sign-in challenge presented to the AdminCP", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const options = await startSignIn(h); const assertion = authenticator.getAssertion({ challenge: options.challenge, @@ -1020,7 +1037,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses an AdminCP challenge presented to public sign-in", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const options = await startAdminSignIn(h); const assertion = authenticator.getAssertion({ challenge: options.challenge, @@ -1043,7 +1060,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses a registration challenge presented to the AdminCP", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); h.signInToAdminAs(ALICE); const registration = await startRegistration(h); @@ -1070,7 +1087,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses an assertion from the wrong origin", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const response = await adminSignIn(h, authenticator, { origin: "https://admin.evil.example", @@ -1082,7 +1099,7 @@ describe("AdminCP passkey sign-in", () => { it("refuses an assertion for the wrong RP ID", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const response = await adminSignIn(h, authenticator, { rpId: "evil.example", @@ -1094,7 +1111,7 @@ describe("AdminCP passkey sign-in", () => { it("never turns a public session into an AdminCP session", async () => { const { h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); const withoutChallenge = await h.request( @@ -1108,7 +1125,7 @@ describe("AdminCP passkey sign-in", () => { it("keeps public passkey sign-in public, even for staff", async () => { const { authenticator, h } = await enrolled(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); const response = await signIn(h, authenticator); @@ -1132,7 +1149,7 @@ describe("AdminCP passkey sign-in", () => { describe("staff passkey enrollment", () => { it("asks staff to open the AdminCP before adding a passkey", async () => { const h = harness(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); const response = await h.request("/register/options", { method: "POST" }); @@ -1144,7 +1161,7 @@ describe("staff passkey enrollment", () => { it("refuses an AdminCP session that belongs to someone else", async () => { const h = harness(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); h.signInToAdminAs(BOB); @@ -1155,7 +1172,7 @@ describe("staff passkey enrollment", () => { it("refuses to save the passkey when the AdminCP session ended mid-ceremony", async () => { const h = harness(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); h.signInToAdminAs(ALICE); const options = await startRegistration(h); @@ -1177,7 +1194,7 @@ describe("staff passkey enrollment", () => { it("lets staff with their own AdminCP session add a passkey", async () => { const h = harness(); - h.grantStaff(ALICE); + await h.grantStaff(ALICE); h.signInAs(ALICE); h.signInToAdminAs(ALICE); diff --git a/packages/vitnode/src/api/modules/users/passkeys/routes/admin-sign-in-verify.route.ts b/packages/vitnode/src/api/modules/users/passkeys/routes/admin-sign-in-verify.route.ts index 2d75fe36e..587264729 100644 --- a/packages/vitnode/src/api/modules/users/passkeys/routes/admin-sign-in-verify.route.ts +++ b/packages/vitnode/src/api/modules/users/passkeys/routes/admin-sign-in-verify.route.ts @@ -1,5 +1,6 @@ import { z } from "@hono/zod-openapi"; +import { isStaff } from "@/api/lib/check-staff-permission"; import { buildRoute } from "@/api/lib/route"; import { PasskeyError, PasskeyModel } from "@/api/models/passkey"; import { SessionAdminModel } from "@/api/models/session-admin"; @@ -50,11 +51,10 @@ export const passkeyAdminSignInVerifyRoute = buildRoute({ response, "admin_sign_in", ); - const admin = new SessionAdminModel(c); - if (!(await admin.checkIfUserIsAdmin(userId))) { + if (!(await isStaff(c, { live: true, type: "admin", userId }))) { throw new PasskeyError("not_staff", 403); } - await admin.createSessionByUserId(userId); + await new SessionAdminModel(c).createSessionByUserId(userId); return c.json({ id: userId }, 201); } catch (error) { diff --git a/packages/vitnode/src/api/modules/users/routes/change-password.route.ts b/packages/vitnode/src/api/modules/users/routes/change-password.route.ts index 062ebecd0..539d0963c 100644 --- a/packages/vitnode/src/api/modules/users/routes/change-password.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/change-password.route.ts @@ -5,7 +5,7 @@ import { z } from "zod"; import { assertPasswordSignInEnabled } from "@/api/lib/password-sign-in"; import { buildRoute } from "@/api/lib/route"; import { ForgotPasswordTokenModel, PasswordModel } from "@/api/models/password"; -import { revokeAllSessionsForUser } from "@/api/models/session-revoke"; +import { revokeSessions } from "@/api/models/session-revoke"; import { CONFIG_PLUGIN } from "@/config"; import { core_users, core_users_forgot_password } from "@/database/users"; @@ -92,7 +92,7 @@ export const changePasswordRoute = buildRoute({ // is doing it because the old credential is not trusted any more, and every // session opened with it is exactly as untrusted - including the attacker's, // which would otherwise outlive the reset by up to ninety days. - await revokeAllSessionsForUser(c, userId); + await revokeSessions(c, { userId }); return c.text("Password changed", 201); }, diff --git a/packages/vitnode/src/api/modules/users/routes/devices.route.test.ts b/packages/vitnode/src/api/modules/users/routes/devices.route.test.ts new file mode 100644 index 000000000..bdb90474e --- /dev/null +++ b/packages/vitnode/src/api/modules/users/routes/devices.route.test.ts @@ -0,0 +1,72 @@ +// @vitest-environment node +import { describe, expect, it } from "vitest"; + +import { + createSessionWorld, + fakeSession, + sessionCookies, +} from "@/tests/sessions"; + +import { listDevicesRoute } from "./devices.route"; + +const PHONE = { id: 4, lastSeen: new Date("2026-09-30"), publicId: "phone" }; +const OFFICE = { id: 5, lastSeen: new Date("2026-09-20"), publicId: "office" }; +const LAPTOP = { id: 3, lastSeen: new Date("2026-09-10"), publicId: "laptop" }; +const TABLET = { id: 6, lastSeen: new Date("2026-09-25"), publicId: "tablet" }; + +const onPhone = fakeSession(7, PHONE); +const adminOnlyOnOffice = fakeSession(7, OFFICE, ["admin"]); +const userOnlyOnLaptop = fakeSession(7, LAPTOP, ["user"]); +const someoneElseOnTablet = fakeSession(8, TABLET); + +interface ListedDevice { + isCurrent: boolean; + publicId: string; + sessionKinds: string[]; +} + +const listDevices = async () => { + const { app } = await createSessionWorld({ + sessions: [ + onPhone, + adminOnlyOnOffice, + userOnlyOnLaptop, + someoneElseOnTablet, + ], + }); + app.openapi(listDevicesRoute.route, listDevicesRoute.handler); + + const response = await app.request("/devices", { + headers: { cookie: sessionCookies(onPhone, "user") }, + }); + expect(response.status).toBe(200); + const { devices } = (await response.json()) as { devices: ListedDevice[] }; + + return devices.map(({ isCurrent, publicId, sessionKinds }) => ({ + isCurrent, + publicId, + sessionKinds, + })); +}; + +describe("listing devices", () => { + it("includes a device that holds only an AdminCP session", async () => { + expect(await listDevices()).toContainEqual({ + isCurrent: false, + publicId: OFFICE.publicId, + sessionKinds: ["admin"], + }); + }); + + it("names the session kinds on each device, newest first, and only the user's own", async () => { + expect(await listDevices()).toEqual([ + { + isCurrent: true, + publicId: PHONE.publicId, + sessionKinds: ["user", "admin"], + }, + { isCurrent: false, publicId: OFFICE.publicId, sessionKinds: ["admin"] }, + { isCurrent: false, publicId: LAPTOP.publicId, sessionKinds: ["user"] }, + ]); + }); +}); diff --git a/packages/vitnode/src/api/modules/users/routes/devices.route.ts b/packages/vitnode/src/api/modules/users/routes/devices.route.ts index 4e42482db..10d2c7c60 100644 --- a/packages/vitnode/src/api/modules/users/routes/devices.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/devices.route.ts @@ -1,21 +1,93 @@ -import { and, desc, eq, gt } from "drizzle-orm"; +import type { Context } from "hono"; + +import { and, eq, gt, inArray } from "drizzle-orm"; import { getCookie } from "hono/cookie"; import { HTTPException } from "hono/http-exception"; import { z } from "zod"; import { buildRoute } from "@/api/lib/route"; import { CONFIG_PLUGIN } from "@/config"; +import { core_admin_sessions } from "@/database/admins"; import { core_sessions, core_sessions_known_devices, } from "@/database/sessions"; import { parseUserAgent } from "@/lib/api/parse-user-agent"; +const SESSION_KINDS = ["user", "admin"] as const; +type SessionKind = (typeof SESSION_KINDS)[number]; + +interface ActiveSession { + deviceId: number; + expiresAt: Date; + kind: SessionKind; +} + +interface DeviceSessions { + expiresAt: Date; + kinds: Set; +} + +const activeSessionsOf = async ( + c: Context, + userId: number, +): Promise => { + const db = c.get("db"); + const now = new Date(); + + const [userSessions, adminSessions] = await Promise.all([ + db + .select({ + deviceId: core_sessions.deviceId, + expiresAt: core_sessions.expiresAt, + }) + .from(core_sessions) + .where( + and(eq(core_sessions.userId, userId), gt(core_sessions.expiresAt, now)), + ), + db + .select({ + deviceId: core_admin_sessions.deviceId, + expiresAt: core_admin_sessions.expiresAt, + }) + .from(core_admin_sessions) + .where( + and( + eq(core_admin_sessions.userId, userId), + gt(core_admin_sessions.expiresAt, now), + ), + ), + ]); + + return [ + ...userSessions.map(session => ({ ...session, kind: "user" as const })), + ...adminSessions.map(session => ({ ...session, kind: "admin" as const })), + ]; +}; + +const groupByDevice = ( + sessions: ActiveSession[], +): Map => { + const byDevice = new Map(); + for (const { deviceId, expiresAt, kind } of sessions) { + const existing = byDevice.get(deviceId); + if (!existing) { + byDevice.set(deviceId, { expiresAt, kinds: new Set([kind]) }); + continue; + } + existing.kinds.add(kind); + if (expiresAt > existing.expiresAt) existing.expiresAt = expiresAt; + } + + return byDevice; +}; + export const listDevicesRoute = buildRoute({ pluginId: CONFIG_PLUGIN.pluginId, route: { method: "get", - description: "List the devices the current user is signed in on.", + description: + "List the devices the current user is signed in on, with a session of either kind.", path: "/devices", responses: { 200: { @@ -32,6 +104,7 @@ export const listDevicesRoute = buildRoute({ lastSeen: z.date(), expiresAt: z.date(), isCurrent: z.boolean(), + sessionKinds: z.array(z.enum(SESSION_KINDS)), }), ), }), @@ -39,6 +112,9 @@ export const listDevicesRoute = buildRoute({ }, description: "List of the current user's devices", }, + 401: { + description: "Not signed in", + }, }, }, handler: async c => { @@ -52,44 +128,44 @@ export const listDevicesRoute = buildRoute({ c.get("core").authorization.deviceCookieName, ); + const sessionsByDevice = groupByDevice(await activeSessionsOf(c, user.id)); + if (sessionsByDevice.size === 0) { + return c.json({ devices: [] }); + } + const rows = await c .get("db") .select({ + id: core_sessions_known_devices.id, publicId: core_sessions_known_devices.publicId, ipAddress: core_sessions_known_devices.ipAddress, userAgent: core_sessions_known_devices.userAgent, lastSeen: core_sessions_known_devices.lastSeen, - expiresAt: core_sessions.expiresAt, }) - .from(core_sessions) - .innerJoin( - core_sessions_known_devices, - eq(core_sessions.deviceId, core_sessions_known_devices.id), - ) + .from(core_sessions_known_devices) .where( - and( - eq(core_sessions.userId, user.id), - gt(core_sessions.expiresAt, new Date()), - ), - ) - .orderBy(desc(core_sessions_known_devices.lastSeen)); - - const byPublicId = new Map(); - for (const row of rows) { - const existing = byPublicId.get(row.publicId); - if (!existing || row.expiresAt > existing.expiresAt) { - byPublicId.set(row.publicId, row); - } - } + inArray(core_sessions_known_devices.id, [...sessionsByDevice.keys()]), + ); - const devices = [...byPublicId.values()].map( - ({ userAgent, publicId, ...device }) => ({ - ...device, - publicId, - ...parseUserAgent(userAgent), - isCurrent: publicId === currentPublicId, - }), - ); + const devices = rows + .flatMap(({ id, userAgent, publicId, ...device }) => { + const sessions = sessionsByDevice.get(id); + if (!sessions) return []; + + return [ + { + ...device, + publicId, + ...parseUserAgent(userAgent), + expiresAt: sessions.expiresAt, + isCurrent: publicId === currentPublicId, + sessionKinds: SESSION_KINDS.filter(kind => + sessions.kinds.has(kind), + ), + }, + ]; + }) + .sort((a, b) => b.lastSeen.getTime() - a.lastSeen.getTime()); return c.json({ devices }); }, diff --git a/packages/vitnode/src/api/modules/users/routes/revoke-device.route.ts b/packages/vitnode/src/api/modules/users/routes/revoke-device.route.ts index 2c8a9ebfc..f8512bcca 100644 --- a/packages/vitnode/src/api/modules/users/routes/revoke-device.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/revoke-device.route.ts @@ -1,19 +1,51 @@ +import type { Context } from "hono"; + import { z } from "@hono/zod-openapi"; import { and, eq } from "drizzle-orm"; import { getCookie } from "hono/cookie"; import { HTTPException } from "hono/http-exception"; import { buildRoute } from "@/api/lib/route"; -import { - adminSessionCacheKey, - sessionCacheKey, -} from "@/api/models/session-cache"; +import { revokeSessions } from "@/api/models/session-revoke"; import { CONFIG_PLUGIN } from "@/config"; +import { core_admin_sessions } from "@/database/admins"; import { core_sessions, core_sessions_known_devices, } from "@/database/sessions"; +const hasSessionOn = async ( + c: Context, + { deviceId, userId }: { deviceId: number; userId: number }, +): Promise => { + const db = c.get("db"); + + const [userSessions, adminSessions] = await Promise.all([ + db + .select({ deviceId: core_sessions.deviceId }) + .from(core_sessions) + .where( + and( + eq(core_sessions.userId, userId), + eq(core_sessions.deviceId, deviceId), + ), + ) + .limit(1), + db + .select({ deviceId: core_admin_sessions.deviceId }) + .from(core_admin_sessions) + .where( + and( + eq(core_admin_sessions.userId, userId), + eq(core_admin_sessions.deviceId, deviceId), + ), + ) + .limit(1), + ]); + + return userSessions.length > 0 || adminSessions.length > 0; +}; + export const revokeDeviceRoute = buildRoute({ pluginId: CONFIG_PLUGIN.pluginId, route: { @@ -46,7 +78,7 @@ export const revokeDeviceRoute = buildRoute({ schema: z.object({ error: z.string() }), }, }, - description: "Device not found", + description: "No session of the current user is on that device", }, }, }, @@ -71,29 +103,14 @@ export const revokeDeviceRoute = buildRoute({ .from(core_sessions_known_devices) .where(eq(core_sessions_known_devices.publicId, publicId)); - if (!device) { + if ( + !device || + !(await hasSessionOn(c, { deviceId: device.id, userId: user.id })) + ) { return c.json({ error: "Device not found" }, 404); } - const where = and( - eq(core_sessions.userId, user.id), - eq(core_sessions.deviceId, device.id), - ); - - const sessions = await db - .select({ token: core_sessions.token }) - .from(core_sessions) - .where(where); - - await db.delete(core_sessions).where(where); - - const cache = c.get("cache"); - await cache.deleteSystem( - sessions.flatMap(({ token }) => [ - sessionCacheKey(token, device.id), - adminSessionCacheKey(token, device.id), - ]), - ); + await revokeSessions(c, { deviceId: device.id, userId: user.id }); return c.body(null, 200); }, diff --git a/packages/vitnode/src/api/modules/users/routes/revoke-device.test.ts b/packages/vitnode/src/api/modules/users/routes/revoke-device.test.ts new file mode 100644 index 000000000..bb781886b --- /dev/null +++ b/packages/vitnode/src/api/modules/users/routes/revoke-device.test.ts @@ -0,0 +1,131 @@ +// @vitest-environment node +import { describe, expect, it } from "vitest"; + +import { + createSessionWorld, + fakeSession, + sessionCookies, +} from "@/tests/sessions"; + +import { revokeDeviceRoute } from "./revoke-device.route"; + +const LAPTOP = { id: 3, publicId: "laptop" }; +const PHONE = { id: 4, publicId: "phone" }; + +const onLaptop = fakeSession(7, LAPTOP); +const onPhone = fakeSession(7, PHONE); +const someoneElseOnLaptop = fakeSession(8, LAPTOP); + +const setup = async () => { + const world = await createSessionWorld({ + sessions: [onLaptop, onPhone, someoneElseOnLaptop], + }); + world.app.openapi(revokeDeviceRoute.route, revokeDeviceRoute.handler); + + for (const session of [onLaptop, onPhone, someoneElseOnLaptop]) { + expect(await world.probe(session)).toEqual({ admin: 200, user: 200 }); + } + + const revokeLaptop = async () => + await world.app.request(`/devices/${LAPTOP.publicId}`, { + headers: { cookie: sessionCookies(onPhone, "user") }, + method: "DELETE", + }); + + return { ...world, revokeLaptop }; +}; + +describe("revoking a device", () => { + it("ends the user session and the AdminCP session on it", async () => { + const { revokeLaptop, rowsFor } = await setup(); + + const response = await revokeLaptop(); + + expect(response.status).toBe(200); + expect(rowsFor(onLaptop)).toEqual({ admin: 0, user: 0 }); + }); + + it("drops both cached sessions for that device", async () => { + const { isCached, revokeLaptop } = await setup(); + expect(await isCached(onLaptop)).toEqual({ admin: true, user: true }); + + await revokeLaptop(); + + expect(await isCached(onLaptop)).toEqual({ admin: false, user: false }); + }); + + it("rejects the old AdminCP cookie on the next request", async () => { + const { probe, revokeLaptop } = await setup(); + + await revokeLaptop(); + + expect(await probe(onLaptop)).toEqual({ admin: 401, user: 401 }); + }); + + it("leaves the user's other devices signed in", async () => { + const { isCached, probe, revokeLaptop, rowsFor } = await setup(); + + await revokeLaptop(); + + expect(rowsFor(onPhone)).toEqual({ admin: 1, user: 1 }); + expect(await isCached(onPhone)).toEqual({ admin: true, user: true }); + expect(await probe(onPhone)).toEqual({ admin: 200, user: 200 }); + }); + + it("leaves another user's sessions on the same device alone", async () => { + const { probe, revokeLaptop, rowsFor } = await setup(); + + await revokeLaptop(); + + expect(rowsFor(someoneElseOnLaptop)).toEqual({ admin: 1, user: 1 }); + expect(await probe(someoneElseOnLaptop)).toEqual({ + admin: 200, + user: 200, + }); + }); + + it("ends an AdminCP session on a device with no user session", async () => { + const OFFICE = { id: 5, publicId: "office" }; + const adminOnlyOnOffice = fakeSession(7, OFFICE, ["admin"]); + const { app, probe, rowsFor } = await createSessionWorld({ + sessions: [onPhone, adminOnlyOnOffice], + }); + app.openapi(revokeDeviceRoute.route, revokeDeviceRoute.handler); + expect(await probe(adminOnlyOnOffice)).toEqual({ admin: 200, user: 401 }); + + const response = await app.request(`/devices/${OFFICE.publicId}`, { + headers: { cookie: sessionCookies(onPhone, "user") }, + method: "DELETE", + }); + + expect(response.status).toBe(200); + expect(rowsFor(adminOnlyOnOffice)).toEqual({ admin: 0, user: 0 }); + expect(await probe(adminOnlyOnOffice)).toEqual({ admin: 401, user: 401 }); + }); + + it("answers 404 for another user's device, as for an unknown one, and ends nothing", async () => { + const TABLET = { id: 6, publicId: "tablet" }; + const someoneElseOnTablet = fakeSession(8, TABLET); + const { app, probe, rowsFor } = await createSessionWorld({ + sessions: [onPhone, someoneElseOnTablet], + }); + app.openapi(revokeDeviceRoute.route, revokeDeviceRoute.handler); + const revoke = async (publicId: string) => + await app.request(`/devices/${publicId}`, { + headers: { cookie: sessionCookies(onPhone, "user") }, + method: "DELETE", + }); + + const foreign = await revoke(TABLET.publicId); + const unknown = await revoke("nobody-has-this"); + + expect(foreign.status).toBe(404); + expect(unknown.status).toBe(404); + expect(await foreign.json()).toEqual(await unknown.json()); + expect(rowsFor(someoneElseOnTablet)).toEqual({ admin: 1, user: 1 }); + expect(await probe(someoneElseOnTablet)).toEqual({ + admin: 200, + user: 200, + }); + }); +}); diff --git a/packages/vitnode/src/api/modules/users/routes/session.route.test.ts b/packages/vitnode/src/api/modules/users/routes/session.route.test.ts new file mode 100644 index 000000000..2bd9f70c8 --- /dev/null +++ b/packages/vitnode/src/api/modules/users/routes/session.route.test.ts @@ -0,0 +1,103 @@ +// @vitest-environment node +import type { Context } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; +import { describe, expect, it } from "vitest"; + +import type { Route } from "@/api/lib/route"; + +import { core_admin_permissions } from "@/database/admins"; +import { core_moderators_permissions } from "@/database/moderators"; +import { core_roles } from "@/database/roles"; +import { core_users, core_users_secondary_roles } from "@/database/users"; +import { createTestCache } from "@/tests/cache"; +import { createMemoryDb } from "@/tests/memory-db"; + +import { sessionRoute } from "./session.route"; + +const ROOT_ROLE = 1; +const MEMBER_ROLE = 3; + +const USER = { + email: "user@example.com", + id: 7, + name: "User", + roleId: MEMBER_ROLE, +}; + +type Shape = "member" | "moderator" | "root via a secondary role"; + +const readSession = async (shape: null | Shape) => { + const { db } = createMemoryDb([ + [core_users, [USER]], + [ + core_users_secondary_roles, + shape === "root via a secondary role" + ? [{ roleId: ROOT_ROLE, userId: USER.id }] + : [], + ], + [ + core_roles, + [ + { id: ROOT_ROLE, root: true }, + { id: MEMBER_ROLE, root: false }, + ], + ], + [core_admin_permissions, []], + [ + core_moderators_permissions, + shape === "moderator" + ? [ + { + permissions: [], + roleId: null, + unrestricted: false, + userId: USER.id, + }, + ] + : [], + ], + ]); + + const app = new OpenAPIHono(); + app.use("*", async (c, next) => { + c.set("cache", createTestCache()); + c.set("db", db as unknown as Context["var"]["db"]); + c.set("user", (shape ? USER : null) as unknown as Context["var"]["user"]); + await next(); + }); + const { handler, route }: Route = sessionRoute; + app.openapi(route, handler); + + const response = await app.request("/session"); + + return (await response.json()) as { + user: null | { isAdmin: boolean; isModerator: boolean }; + }; +}; + +describe("GET /users/session", () => { + it("reports a moderator as a moderator, not an admin", async () => { + expect((await readSession("moderator")).user).toMatchObject({ + isAdmin: false, + isModerator: true, + }); + }); + + it("reports root through a secondary role as both", async () => { + expect((await readSession("root via a secondary role")).user).toMatchObject( + { isAdmin: true, isModerator: true }, + ); + }); + + it("reports a member as neither", async () => { + expect((await readSession("member")).user).toMatchObject({ + isAdmin: false, + isModerator: false, + }); + }); + + it("answers with no user when signed out", async () => { + expect(await readSession(null)).toEqual({ user: null }); + }); +}); diff --git a/packages/vitnode/src/api/modules/users/routes/session.route.ts b/packages/vitnode/src/api/modules/users/routes/session.route.ts index 899564a13..4ea5ab18b 100644 --- a/packages/vitnode/src/api/modules/users/routes/session.route.ts +++ b/packages/vitnode/src/api/modules/users/routes/session.route.ts @@ -1,7 +1,7 @@ import { z } from "zod"; +import { isStaff } from "@/api/lib/check-staff-permission"; import { buildRoute } from "@/api/lib/route"; -import { SessionAdminModel } from "@/api/models/session-admin"; import { CONFIG_PLUGIN } from "@/config"; export const sessionRoute = buildRoute({ @@ -47,16 +47,13 @@ export const sessionRoute = buildRoute({ }, handler: async c => { const user = c.get("user"); - const admin = new SessionAdminModel(c); + if (!user) return c.json({ user: null }); - return c.json({ - user: user - ? { - ...user, - isAdmin: await admin.checkIfUserIsAdmin(user.id), - isModerator: false, // TODO: implement moderator role - } - : null, - }); + const [isAdmin, isModerator] = await Promise.all([ + isStaff(c, { type: "admin", userId: user.id }), + isStaff(c, { type: "moderator", userId: user.id }), + ]); + + return c.json({ user: { ...user, isAdmin, isModerator } }); }, }); diff --git a/packages/vitnode/src/locales/en.json b/packages/vitnode/src/locales/en.json index a7070487d..e7e80768e 100644 --- a/packages/vitnode/src/locales/en.json +++ b/packages/vitnode/src/locales/en.json @@ -803,6 +803,8 @@ "last_active": "Last active", "ip_address": "IP address", "session_expires": "Session expires", + "admin_session": "AdminCP", + "admin_session_desc": "Signed in to the AdminCP on this device. Signing it out ends that session too.", "empty": "No active devices.", "revoke": { "action": "Sign out device", diff --git a/packages/vitnode/src/tanstack/admin/users/detail-screen.tsx b/packages/vitnode/src/tanstack/admin/users/detail-screen.tsx index 5b8898eba..5d7b85eb0 100644 --- a/packages/vitnode/src/tanstack/admin/users/detail-screen.tsx +++ b/packages/vitnode/src/tanstack/admin/users/detail-screen.tsx @@ -45,7 +45,7 @@ const AdminUserScreen = ({ adminUserId, id, locale }: AdminUserRouteProps) => { return (
{ await onRemoveImage(userId, kind); toast.success(t(`${kind}.removed`), { diff --git a/packages/vitnode/src/tests/memory-db.ts b/packages/vitnode/src/tests/memory-db.ts new file mode 100644 index 000000000..3ca798475 --- /dev/null +++ b/packages/vitnode/src/tests/memory-db.ts @@ -0,0 +1,1216 @@ +import { + Column, + getColumns, + getColumnTable, + getTableName, + is, + Param, + SQL, + StringChunk, + Table, +} from "drizzle-orm"; + +export type MemoryRow = Record; + +type Scope = Map; + +const scopeOf = (...entries: [Table, MemoryRow | null][]): Scope => + new Map(entries.map(([table, row]) => [getTableName(table), { row, table }])); + +type Node = + | { args: "*" | Node[]; kind: "call"; name: string } + | { column: Column; kind: "column" } + | { + insensitive: boolean; + kind: "like"; + left: Node; + negated: boolean; + right: Node; + } + | { item: Node; kind: "cast"; to: string } + | { item: Node; kind: "isNull"; negated: boolean } + | { item: Node; kind: "not" } + | { items: Node[]; kind: "and" | "or" } + | { kind: "compare"; left: Node; operator: string; right: Node } + | { kind: "in"; left: Node; negated: boolean; options: Node[] } + | { kind: "value"; value: unknown }; + +type Token = + | { column: Column; kind: "column" } + | { kind: "value"; value: unknown } + | { kind: "word"; value: string }; + +interface OrderTerm { + descending: boolean; + node: Node; + nullsFirst: boolean; +} + +interface Join { + on: SQL | undefined; + outer: boolean; + table: Table; +} + +const columnsOf = (table: Table): Record => getColumns(table); + +const sourceOf = (column: Column): string => + getTableName(getColumnTable(column)); + +const unsupported = (what: string): never => { + throw new Error(`memory db cannot evaluate ${what}`); +}; + +const originalNameOf = (table: Table): string => { + const name: unknown = Reflect.get(table, Symbol.for("drizzle:OriginalName")); + if (typeof name !== "string") + return unsupported("a source that is not a table"); + + return name; +}; + +const WORD_PATTERN = + /\s*(>=|<=|<>|!=|::|[(),*=<>]|'(?:[^']|'')*'|"[^"]*"|\d+(?:\.\d+)?|[A-Za-z_][\w]*)/y; + +const tokenizeText = (text: string): Token[] => { + const tokens: Token[] = []; + WORD_PATTERN.lastIndex = 0; + while (WORD_PATTERN.lastIndex < text.length) { + if (/^\s*$/.test(text.slice(WORD_PATTERN.lastIndex))) break; + const start = WORD_PATTERN.lastIndex; + const match = WORD_PATTERN.exec(text); + if (!match?.[1]) unsupported(`the SQL text "${text.slice(start)}"`); + const word = match?.[1] ?? ""; + if (word.startsWith("'")) { + tokens.push({ + kind: "value", + value: word.slice(1, -1).replace(/''/g, "'"), + }); + } else if (word.startsWith('"')) { + unsupported(`the raw identifier ${word}`); + } else if (/^\d/.test(word)) { + tokens.push({ kind: "value", value: Number(word) }); + } else { + tokens.push({ kind: "word", value: word.toLowerCase() }); + } + } + + return tokens; +}; + +const tokenize = (chunk: unknown): Token[] => { + if (is(chunk, SQL)) return chunk.queryChunks.flatMap(tokenize); + if (is(chunk, SQL.Aliased)) return tokenize(chunk.sql); + if (is(chunk, StringChunk)) return tokenizeText(chunk.value.join("")); + if (is(chunk, Column)) return [{ column: chunk, kind: "column" }]; + if (is(chunk, Param)) return [{ kind: "value", value: chunk.value }]; + if (Array.isArray(chunk)) { + return [ + { kind: "word", value: "(" }, + ...chunk.flatMap((item: unknown, index) => [ + ...(index > 0 ? [{ kind: "word", value: "," } as const] : []), + ...tokenize(item), + ]), + { kind: "word", value: ")" }, + ]; + } + if (is(chunk, Table)) unsupported(`a table inside an expression`); + if ( + chunk === null || + ["bigint", "boolean", "number", "string", "undefined"].includes( + typeof chunk, + ) || + chunk instanceof Date + ) { + return [{ kind: "value", value: chunk ?? null }]; + } + if (typeof chunk === "object" && "getSQL" in chunk) { + return unsupported("a subquery"); + } + + return [{ kind: "value", value: chunk }]; +}; + +const COMPARISONS = new Set(["!=", "<", "<=", "<>", "=", ">", ">="]); + +const parseTokens = (tokens: Token[], source: string) => { + let position = 0; + + const peek = (offset = 0): Token | undefined => tokens[position + offset]; + const isWord = (value: string, offset = 0) => { + const token = peek(offset); + + return token?.kind === "word" && token.value === value; + }; + const expect = (value: string) => { + if (!isWord(value)) unsupported(`"${source}" (expected "${value}")`); + position++; + }; + + const parseList = (): Node[] => { + expect("("); + const items: Node[] = []; + while (!isWord(")")) { + items.push(parseOr()); + if (!isWord(",")) break; + position++; + } + expect(")"); + + return items; + }; + + const parsePrimary = (): Node => { + const token = peek(); + if (!token) return unsupported(`"${source}" (unexpected end)`); + position++; + if (token.kind === "column") + return { column: token.column, kind: "column" }; + if (token.kind === "value") return { kind: "value", value: token.value }; + if (token.value === "(") { + const inner = parseOr(); + if (isWord(",")) unsupported(`the row comparison in "${source}"`); + expect(")"); + + return inner; + } + if (token.value === "true") return { kind: "value", value: true }; + if (token.value === "false") return { kind: "value", value: false }; + if (token.value === "null") return { kind: "value", value: null }; + if (isWord("(")) { + position++; + if (isWord("*")) { + position++; + expect(")"); + + return { args: "*", kind: "call", name: token.value }; + } + position--; + + return { args: parseList(), kind: "call", name: token.value }; + } + + return unsupported(`"${token.value}" in "${source}"`); + }; + + const parseCast = (): Node => { + let node = parsePrimary(); + while (isWord("::")) { + position++; + const target = peek(); + if (target?.kind !== "word") return unsupported(`a cast in "${source}"`); + position++; + node = { item: node, kind: "cast", to: target.value }; + } + + return node; + }; + + const parseComparison = (): Node => { + const left = parseCast(); + const token = peek(); + if (token?.kind !== "word") return left; + + if (COMPARISONS.has(token.value)) { + position++; + + return { + kind: "compare", + left, + operator: token.value === "!=" ? "<>" : token.value, + right: parseCast(), + }; + } + if (token.value === "is") { + position++; + const negated = isWord("not"); + if (negated) position++; + expect("null"); + + return { item: left, kind: "isNull", negated }; + } + const negated = token.value === "not"; + const keyword = negated ? peek(1) : token; + if (keyword?.kind !== "word") return left; + if (keyword.value === "in") { + position += negated ? 2 : 1; + + return { kind: "in", left, negated, options: parseList() }; + } + if (keyword.value === "like" || keyword.value === "ilike") { + position += negated ? 2 : 1; + + return { + insensitive: keyword.value === "ilike", + kind: "like", + left, + negated, + right: parseCast(), + }; + } + + return left; + }; + + const parseNot = (): Node => { + if (isWord("not")) { + position++; + + return { item: parseNot(), kind: "not" }; + } + + return parseComparison(); + }; + + const parseJunction = (kind: "and" | "or", parseItem: () => Node): Node => { + const items = [parseItem()]; + while (isWord(kind)) { + position++; + items.push(parseItem()); + } + + return items.length === 1 ? items[0] : { items, kind }; + }; + + const parseAnd = () => parseJunction("and", parseNot); + const parseOr = (): Node => parseJunction("or", parseAnd); + + const parseOrderTerm = (): OrderTerm => { + const node = parseOr(); + let descending = false; + if (isWord("asc") || isWord("desc")) { + descending = isWord("desc"); + position++; + } + let nullsFirst = descending; + if (isWord("nulls")) { + position++; + nullsFirst = isWord("first"); + if (!isWord("first") && !isWord("last")) { + unsupported(`"${source}" (expected first or last)`); + } + position++; + } + + return { descending, node, nullsFirst }; + }; + + const finish = (value: T): T => { + if (position !== tokens.length) { + unsupported(`"${source}" (trailing tokens)`); + } + + return value; + }; + + return { + expression: () => finish(parseOr()), + order: () => { + const terms = [parseOrderTerm()]; + while (isWord(",")) { + position++; + terms.push(parseOrderTerm()); + } + + return finish(terms); + }, + }; +}; + +const render = (chunk: unknown): string => + tokenize(chunk) + .map(token => + token.kind === "column" + ? `${getTableName(getColumnTable(token.column))}.${token.column.name}` + : token.kind === "value" + ? JSON.stringify(token.value) + : token.value, + ) + .join(" "); + +const parseExpression = (chunk: unknown): Node => + parseTokens(tokenize(chunk), render(chunk)).expression(); + +const parseOrder = (chunks: unknown[]): OrderTerm[] => + chunks.flatMap(chunk => parseTokens(tokenize(chunk), render(chunk)).order()); + +const keyOf = (column: Column): string => { + const entry = Object.entries(columnsOf(getColumnTable(column))).find( + ([, candidate]) => candidate.name === column.name, + ); + + return entry ? entry[0] : unsupported(`the column ${column.name}`); +}; + +const comparable = (value: unknown): unknown => + value instanceof Date ? value.getTime() : value; + +const equal = (left: unknown, right: unknown): boolean => { + if (typeof left === "object" || typeof right === "object") { + return JSON.stringify(left) === JSON.stringify(right); + } + + return comparable(left) === comparable(right); +}; + +const textOf = (value: unknown): string => { + if (typeof value === "string") return value; + if (value instanceof Date) return value.toISOString(); + if (["bigint", "boolean", "number"].includes(typeof value)) { + return String(value); + } + + return unsupported(`text of ${JSON.stringify(value)}`); +}; + +const isMissing = (value: unknown): value is null | undefined => + value === null || value === undefined; + +const compare = (left: unknown, operator: string, right: unknown) => { + if (isMissing(left) || isMissing(right)) return null; + if (operator === "=") return equal(left, right); + if (operator === "<>") return !equal(left, right); + const a = comparable(left) as number | string; + const b = comparable(right) as number | string; + if (typeof a !== typeof b) { + return unsupported(`comparing ${typeof a} with ${typeof b}`); + } + if (operator === ">") return a > b; + if (operator === ">=") return a >= b; + if (operator === "<") return a < b; + if (operator === "<=") return a <= b; + + return unsupported(`the operator ${operator}`); +}; + +const likePattern = (pattern: string, insensitive: boolean): RegExp => + new RegExp( + `^${pattern + .replace(/[.+?^${}()|[\]\\]/g, "\\$&") + .replace(/%/g, ".*") + .replace(/_/g, ".")}$`, + insensitive ? "is" : "s", + ); + +const evaluate = ( + node: Node, + scope: Scope, + group: Scope[] | undefined, +): unknown => { + const of = (child: Node) => evaluate(child, scope, group); + + switch (node.kind) { + case "and": { + const values = node.items.map(of); + if (values.includes(false)) return false; + + return values.some(isMissing) ? null : true; + } + case "call": + return call(node, scope, group); + case "cast": { + const value = of(node.item); + if (isMissing(value)) return null; + if (node.to === "text") { + return textOf(value); + } + if (["bigint", "int", "integer", "numeric"].includes(node.to)) { + return Number(value); + } + + return unsupported(`a cast to ${node.to}`); + } + case "column": { + if (!scope.has(sourceOf(node.column))) { + return unsupported( + `${sourceOf(node.column)}.${node.column.name}, which is not in the query`, + ); + } + + return ( + scope.get(sourceOf(node.column))?.row?.[keyOf(node.column)] ?? null + ); + } + case "compare": + return compare(of(node.left), node.operator, of(node.right)); + case "in": { + const left = of(node.left); + if (isMissing(left)) return null; + const options = node.options.map(of); + const found = options.some(option => compare(left, "=", option) === true); + if (found) return !node.negated; + + return options.some(isMissing) ? null : node.negated; + } + case "isNull": + return isMissing(of(node.item)) !== node.negated; + case "like": { + const left = of(node.left); + const right = of(node.right); + if (isMissing(left) || isMissing(right)) return null; + + return ( + likePattern(textOf(right), node.insensitive).test(textOf(left)) !== + node.negated + ); + } + case "not": { + const value = of(node.item); + + return isMissing(value) ? null : !value; + } + case "or": { + const values = node.items.map(of); + if (values.includes(true)) return true; + + return values.some(isMissing) ? null : false; + } + case "value": + return node.value; + } +}; + +const call = ( + node: Extract, + scope: Scope, + group: Scope[] | undefined, +): unknown => { + if (node.name === "count") { + if (!group) return unsupported("count() outside an aggregate query"); + if (node.args === "*") return group.length; + const [argument] = node.args; + if (!argument || node.args.length > 1) return unsupported("count()"); + + return group.filter( + member => !isMissing(evaluate(argument, member, undefined)), + ).length; + } + if (node.args === "*") return unsupported(`${node.name}(*)`); + const args = node.args.map(argument => evaluate(argument, scope, group)); + if (node.name === "now" && args.length === 0) return new Date(); + if (node.name === "lower") { + return isMissing(args[0]) ? null : textOf(args[0]).toLowerCase(); + } + if (node.name === "coalesce") { + return args.find(value => !isMissing(value)) ?? null; + } + + return unsupported(`the function ${node.name}()`); +}; + +const isAggregate = (node: Node): boolean => { + switch (node.kind) { + case "and": + case "or": + return node.items.some(isAggregate); + case "call": + return ( + node.name === "count" || + (node.args !== "*" && node.args.some(isAggregate)) + ); + case "cast": + case "not": + return isAggregate(node.item); + case "compare": + case "like": + return isAggregate(node.left) || isAggregate(node.right); + case "in": + return isAggregate(node.left) || node.options.some(isAggregate); + case "isNull": + return isAggregate(node.item); + default: + return false; + } +}; + +const holds = (condition: SQL | undefined, scope: Scope): boolean => + condition === undefined || + evaluate(parseExpression(condition), scope, undefined) === true; + +const fullRow = (table: Table, row: MemoryRow | null | undefined) => + row + ? Object.fromEntries( + Object.keys(columnsOf(table)).map(key => [key, row[key] ?? null]), + ) + : null; + +type Fields = Record; + +const fieldNodes = new WeakMap(); + +const nodeOf = (field: SQL | SQL.Aliased): Node => { + const cached = fieldNodes.get(field); + if (cached) return cached; + const node = parseExpression(field); + fieldNodes.set(field, node); + + return node; +}; + +const fieldsAggregate = (fields: Fields): boolean => + Object.values(fields).some(field => + is(field, SQL) || is(field, SQL.Aliased) + ? isAggregate(nodeOf(field)) + : !is(field, Column) && + !is(field, Table) && + typeof field === "object" && + field !== null && + fieldsAggregate(field as Fields), + ); + +const project = ( + fields: Fields, + scope: Scope, + group: Scope[] | undefined, +): MemoryRow => + Object.fromEntries( + Object.entries(fields).map(([alias, field]) => { + if (is(field, Column)) { + return [ + alias, + evaluate({ column: field, kind: "column" }, scope, group), + ]; + } + if (is(field, Table)) { + return [alias, fullRow(field, scope.get(getTableName(field))?.row)]; + } + if (is(field, SQL) || is(field, SQL.Aliased)) { + return [alias, evaluate(nodeOf(field), scope, group)]; + } + if (typeof field === "object" && field !== null) { + return [alias, project(field as Fields, scope, group)]; + } + + return unsupported(`the selected field ${alias}`); + }), + ); + +const sortScopes = ( + scopes: Scope[], + terms: OrderTerm[], + valueOf: (node: Node, scope: Scope) => unknown, +): Scope[] => + scopes + .map(scope => ({ + keys: terms.map(term => comparable(valueOf(term.node, scope))), + scope, + })) + .sort((a, b) => { + for (const [index, term] of terms.entries()) { + const left = a.keys[index]; + const right = b.keys[index]; + if (isMissing(left) && isMissing(right)) continue; + if (isMissing(left)) return term.nullsFirst ? -1 : 1; + if (isMissing(right)) return term.nullsFirst ? 1 : -1; + if (left === right) continue; + const ascending = (left as number) < (right as number) ? -1 : 1; + + return term.descending ? -ascending : ascending; + } + + return 0; + }) + .map(({ scope }) => scope); + +const isSerial = (column: Column) => + column.columnType.includes("Serial") || + column.generatedIdentity !== undefined; + +const uniqueViolation = (table: Table, key: string) => + Object.assign( + new Error( + `duplicate key value violates unique constraint on ${getTableName(table)}.${key}`, + ), + { code: "23505" }, + ); + +type ConflictPolicy = + | { action: "nothing"; target: Column[] | undefined } + | { + action: "update"; + set: MemoryRow; + target: Column[]; + where: SQL | undefined; + }; + +class Rollback extends Error { + constructor() { + super("Rollback"); + } +} + +export const createMemoryDb = (seed: [Table, readonly object[]][] = []) => { + const store = new Map( + seed.map(([table, rows]) => [ + originalNameOf(table), + rows.map(row => Object.fromEntries(Object.entries(row))), + ]), + ); + + const rowsOf = (table: Table): MemoryRow[] => { + if (!is(table, Table)) return unsupported("a source that is not a table"); + const name = originalNameOf(table); + const existing = store.get(name); + if (existing) return existing; + const created: MemoryRow[] = []; + store.set(name, created); + + return created; + }; + + type Undo = () => void; + + const nextSerial = (table: Table, key: string): number => + rowsOf(table).reduce( + (highest, row) => + typeof row[key] === "number" ? Math.max(highest, row[key]) : highest, + 0, + ) + 1; + + const defaultOf = (table: Table, key: string, column: Column): unknown => { + if (column.defaultFn) return column.defaultFn(); + if (column.onUpdateFn) return column.onUpdateFn(); + if (column.default !== undefined) { + return is(column.default, SQL) + ? evaluate(parseExpression(column.default), scopeOf(), undefined) + : structuredClone(column.default); + } + if (isSerial(column)) return nextSerial(table, key); + + return null; + }; + + const buildRow = (table: Table, values: MemoryRow): MemoryRow => { + const unknownKey = Object.keys(values).find( + key => !(key in columnsOf(table)), + ); + if (unknownKey) + unsupported(`the column ${unknownKey} on ${getTableName(table)}`); + + return Object.fromEntries( + Object.entries(columnsOf(table)).map(([key, column]) => { + const given = values[key]; + const value = + given === undefined + ? defaultOf(table, key, column) + : is(given, SQL) + ? evaluate(parseExpression(given), scopeOf(), undefined) + : given; + if (isMissing(value) && column.notNull) { + throw Object.assign( + new Error( + `null value in column ${getTableName(table)}.${key} violates not-null constraint`, + ), + { code: "23502" }, + ); + } + + return [key, value]; + }), + ); + }; + + const uniqueKeys = (table: Table): string[] => + Object.entries(columnsOf(table)) + .filter(([, column]) => column.primary || column.isUnique) + .map(([key]) => key); + + const conflictOf = ( + table: Table, + row: MemoryRow, + keys: string[], + ignore?: MemoryRow, + ): MemoryRow | undefined => + rowsOf(table).find( + existing => + existing !== ignore && + keys.length > 0 && + keys.every( + key => !isMissing(row[key]) && equal(existing[key], row[key]), + ), + ); + + const firstUniqueConflict = ( + table: Table, + row: MemoryRow, + ignore?: MemoryRow, + ): string | undefined => + uniqueKeys(table).find(key => conflictOf(table, row, [key], ignore)); + + const applySet = ( + table: Table, + row: MemoryRow, + values: MemoryRow, + extra?: [Table, MemoryRow][], + ): MemoryRow => { + const scope = scopeOf([table, row], ...(extra ?? [])); + const next = { ...row }; + for (const [key, column] of Object.entries(columnsOf(table))) { + const given = values[key]; + if (given !== undefined) { + next[key] = is(given, SQL) + ? evaluate(parseExpression(given), scope, undefined) + : given; + } else if (column.onUpdateFn) { + next[key] = column.onUpdateFn(); + } + } + const unknownKey = Object.keys(values).find( + key => !(key in columnsOf(table)), + ); + if (unknownKey) + unsupported(`the column ${unknownKey} on ${getTableName(table)}`); + + return next; + }; + + const returningOf = ( + table: Table, + rows: MemoryRow[], + fields: Fields | undefined, + ): MemoryRow[] => + rows.map(row => + fields + ? project(fields, scopeOf([table, row]), undefined) + : (fullRow(table, row) ?? {}), + ); + + const thenable = (run: () => T) => ({ + execute: async () => await Promise.resolve().then(run), + then: async ( + onFulfilled?: (value: T) => PromiseLike | R1, + onRejected?: (reason: unknown) => PromiseLike | R2, + ) => await Promise.resolve().then(run).then(onFulfilled, onRejected), + }); + + const locks = new Map>(); + + const acquireLock = async (key: string): Promise<() => void> => { + const previous = locks.get(key) ?? Promise.resolve(); + let release = () => {}; + const held = new Promise(resolve => { + release = resolve; + }); + locks.set( + key, + previous.then(async () => { + await held; + }), + ); + await previous; + + return release; + }; + + const createSession = (undo: undefined | Undo[]) => { + const record = (action: Undo) => { + undo?.push(action); + }; + + const select = (fields?: Fields, distinct = false) => { + let source: Table | undefined; + const joins: Join[] = []; + let condition: SQL | undefined; + let grouping: unknown[] = []; + let ordering: unknown[] = []; + let size = Number.POSITIVE_INFINITY; + let skip = 0; + + const run = (): MemoryRow[] => { + if (!source) return unsupported("a select without from"); + const from = source; + let scopes: Scope[] = rowsOf(from).map(row => scopeOf([from, row])); + for (const join of joins) { + scopes = scopes.flatMap(scope => { + const matched = rowsOf(join.table) + .map(row => new Map([...scope, ...scopeOf([join.table, row])])) + .filter(candidate => holds(join.on, candidate)); + if (matched.length > 0 || !join.outer) return matched; + + return [new Map([...scope, ...scopeOf([join.table, null])])]; + }); + } + scopes = scopes.filter(scope => holds(condition, scope)); + + const groupNodes = grouping.map(parseExpression); + const aggregated = + groupNodes.length > 0 || (fields ? fieldsAggregate(fields) : false); + const orderTerms = parseOrder(ordering); + + if (aggregated) { + if (!fields) return unsupported("an aggregate select without fields"); + const groups = new Map(); + for (const scope of scopes) { + const key = JSON.stringify( + groupNodes.map(node => + comparable(evaluate(node, scope, undefined)), + ), + ); + groups.set(key, [...(groups.get(key) ?? []), scope]); + } + if (groupNodes.length === 0 && groups.size === 0) groups.set("", []); + const representatives = [...groups.values()].map(members => ({ + members, + scope: members[0] ?? scopeOf(), + })); + const byScope = new Map( + representatives.map(entry => [entry.scope, entry.members]), + ); + const sorted = sortScopes( + representatives.map(entry => entry.scope), + orderTerms, + (node, scope) => evaluate(node, scope, byScope.get(scope)), + ); + + return sorted + .map(scope => project(fields, scope, byScope.get(scope))) + .slice(skip, skip + size); + } + + const sorted = sortScopes(scopes, orderTerms, (node, scope) => + evaluate(node, scope, undefined), + ); + const projected = sorted.map(scope => + fields + ? project(fields, scope, undefined) + : joins.length === 0 + ? (fullRow(from, scope.get(getTableName(from))?.row) ?? {}) + : Object.fromEntries( + [...scope].map(([name, { row, table }]) => [ + name, + fullRow(table, row), + ]), + ), + ); + const unique = distinct + ? [ + ...new Map( + projected.map(row => [JSON.stringify(row), row]), + ).values(), + ] + : projected; + + return unique.slice(skip, skip + size); + }; + + const query = { + ...thenable(run), + from: (from: Table) => { + source = from; + + return query; + }, + groupBy: (...columns: unknown[]) => { + grouping = columns; + + return query; + }, + innerJoin: (table: Table, on: SQL | undefined) => { + joins.push({ on, outer: false, table }); + + return query; + }, + leftJoin: (table: Table, on: SQL | undefined) => { + joins.push({ on, outer: true, table }); + + return query; + }, + limit: (limit: number) => { + size = limit; + + return query; + }, + offset: (offset: number) => { + skip = offset; + + return query; + }, + orderBy: (...terms: unknown[]) => { + ordering = terms.filter(term => term !== undefined); + + return query; + }, + where: (where: SQL | undefined) => { + condition = where; + + return query; + }, + }; + + return query; + }; + + const insert = (table: Table) => ({ + values: (values: MemoryRow | MemoryRow[]) => { + let policy: ConflictPolicy | undefined; + let returning: Fields | undefined; + let wantsRows = false; + + const run = (): MemoryRow[] => { + const rows = rowsOf(table); + const affected: MemoryRow[] = []; + for (const value of Array.isArray(values) ? values : [values]) { + const row = buildRow(table, value); + const targetKeys = policy?.target?.map(keyOf); + const conflicting = targetKeys + ? conflictOf(table, row, targetKeys) + : policy + ? uniqueKeys(table) + .map(key => conflictOf(table, row, [key])) + .find(Boolean) + : undefined; + if (conflicting && policy?.action === "nothing") continue; + if (conflicting && policy?.action === "update") { + if (!holds(policy.where, scopeOf([table, conflicting]))) { + continue; + } + const before = { ...conflicting }; + Object.assign( + conflicting, + applySet(table, conflicting, policy.set), + ); + record(() => { + Object.keys(conflicting).forEach(key => { + delete conflicting[key]; + }); + Object.assign(conflicting, before); + }); + affected.push(conflicting); + continue; + } + const violated = firstUniqueConflict(table, row); + if (violated) throw uniqueViolation(table, violated); + rows.push(row); + record(() => { + const index = rows.indexOf(row); + if (index !== -1) rows.splice(index, 1); + }); + affected.push(row); + } + + return wantsRows ? returningOf(table, affected, returning) : []; + }; + + const query = { + ...thenable(run), + onConflictDoNothing: (config?: { target?: Column | Column[] }) => { + policy = { + action: "nothing", + target: + config?.target === undefined + ? undefined + : [config.target].flat(), + }; + + return query; + }, + onConflictDoUpdate: (config: { + set: MemoryRow; + target: Column | Column[]; + targetWhere?: SQL; + where?: SQL; + }) => { + if (config.targetWhere) + unsupported("onConflictDoUpdate targetWhere"); + policy = { + action: "update", + set: config.set, + target: [config.target].flat(), + where: config.where, + }; + + return query; + }, + returning: (fields?: Fields) => { + wantsRows = true; + returning = fields; + + return query; + }, + }; + + return query; + }, + }); + + const update = (table: Table) => ({ + set: (values: MemoryRow) => { + let condition: SQL | undefined; + let returning: Fields | undefined; + let wantsRows = false; + + const run = (): MemoryRow[] => { + const matched = rowsOf(table).filter(row => + holds(condition, scopeOf([table, row])), + ); + const changes = matched.map(row => ({ + next: applySet(table, row, values), + row, + })); + for (const { next, row } of changes) { + const violated = uniqueKeys(table).find( + key => + !equal(next[key], row[key]) && + conflictOf(table, next, [key], row), + ); + if (violated) throw uniqueViolation(table, violated); + } + for (const { next, row } of changes) { + const before = { ...row }; + Object.assign(row, next); + record(() => { + Object.keys(row).forEach(key => { + delete row[key]; + }); + Object.assign(row, before); + }); + } + + return wantsRows ? returningOf(table, matched, returning) : []; + }; + + const query = { + ...thenable(run), + returning: (fields?: Fields) => { + wantsRows = true; + returning = fields; + + return query; + }, + where: (where: SQL | undefined) => { + condition = where; + + return query; + }, + }; + + return query; + }, + }); + + const remove = (table: Table) => { + let condition: SQL | undefined; + let returning: Fields | undefined; + let wantsRows = false; + + const run = (): MemoryRow[] => { + const rows = rowsOf(table); + const removed = rows.filter(row => + holds(condition, scopeOf([table, row])), + ); + const kept = rows.filter(row => !removed.includes(row)); + const before = [...rows]; + rows.splice(0, rows.length, ...kept); + record(() => { + rows.splice(0, rows.length, ...before); + }); + + return wantsRows ? returningOf(table, removed, returning) : []; + }; + + const query = { + ...thenable(run), + returning: (fields?: Fields) => { + wantsRows = true; + returning = fields; + + return query; + }, + where: (where: SQL | undefined) => { + condition = where; + + return query; + }, + }; + + return query; + }; + + return { insert, remove, select, update }; + }; + + const advisoryLockKey = (query: SQL): string | undefined => { + const tokens = tokenize(query); + const [first, second] = tokens; + const named = + first?.kind === "word" && + first.value === "select" && + second?.kind === "word" && + second.value === "pg_advisory_xact_lock"; + if (!named) return undefined; + + return JSON.stringify( + tokens.flatMap(token => (token.kind === "value" ? [token.value] : [])), + ); + }; + + interface Frame { + releases: (() => void)[]; + undo: Undo[]; + } + + const transaction = async ( + run: (tx: unknown) => Promise, + parent: Frame | undefined, + ): Promise => { + const undo: Undo[] = []; + const releases = parent?.releases ?? []; + const tx = { + ...facade(undo), + execute: async (query: SQL) => { + const key = advisoryLockKey(query); + if (key === undefined) return unsupported(`execute "${render(query)}"`); + releases.push(await acquireLock(key)); + + return []; + }, + rollback: () => { + throw new Rollback(); + }, + transaction: async (nested: (inner: unknown) => Promise) => + await transaction(nested, { releases, undo }), + }; + + try { + const result = await run(tx); + parent?.undo.push(...undo); + + return result; + } catch (error) { + for (const action of undo.reverse()) action(); + throw error; + } finally { + if (!parent) for (const release of releases) release(); + } + }; + + const facade = (undo: undefined | Undo[]) => { + const session = createSession(undo); + + return { + delete: session.remove, + insert: session.insert, + select: (fields?: Fields) => session.select(fields), + selectDistinct: (fields?: Fields) => session.select(fields, true), + update: session.update, + }; + }; + + const db = { + ...facade(undefined), + execute: async (query: SQL) => { + if (advisoryLockKey(query) === undefined) { + return unsupported(`execute "${render(query)}"`); + } + + return await Promise.resolve([]); + }, + transaction: async (run: (tx: unknown) => Promise) => + await transaction(run, undefined), + }; + + return { + db, + rows: (table: Table): MemoryRow[] => rowsOf(table).map(row => ({ ...row })), + }; +}; diff --git a/packages/vitnode/src/tests/sessions.ts b/packages/vitnode/src/tests/sessions.ts new file mode 100644 index 000000000..a31019b18 --- /dev/null +++ b/packages/vitnode/src/tests/sessions.ts @@ -0,0 +1,223 @@ +import type { Table } from "drizzle-orm"; +import type { Context, Next } from "hono"; + +import { OpenAPIHono } from "@hono/zod-openapi"; + +import type { + EnvVariablesVitNode, + EnvVitNode, +} from "@/api/middlewares/global.middleware"; + +import { hashSessionToken } from "@/api/lib/session-token"; +import { SessionModel } from "@/api/models/session"; +import { SessionAdminModel } from "@/api/models/session-admin"; +import { + adminSessionCacheKey, + sessionCacheKey, +} from "@/api/models/session-cache"; +import { core_admin_permissions, core_admin_sessions } from "@/database/admins"; +import { + core_sessions, + core_sessions_known_devices, +} from "@/database/sessions"; +import { core_users } from "@/database/users"; + +import { createTestCache } from "./cache"; +import { createMemoryDb, type MemoryRow } from "./memory-db"; + +export const SESSION_AUTHORIZATION = { + adminCookieExpires: 1000 * 60 * 60, + adminCookieName: "vitnode_auth_admin", + cookieDomain: undefined, + cookie_expires: 1000 * 60 * 60 * 24 * 90, + cookieName: "vitnode_auth", + cookieSecure: true, + deviceCookieExpires: 1000 * 60 * 60 * 24 * 365, + deviceCookieName: "vitnode_device", + passkeys: { enabled: false, problems: [] }, + password: { enabled: true }, + ssoAdapters: [], +} satisfies EnvVariablesVitNode["core"]["authorization"]; + +const MEMBER_ROLE_ID = 2; + +export interface FakeDevice { + id: number; + lastSeen?: Date; + publicId: string; +} + +export type FakeSessionKind = "admin" | "user"; + +export interface FakeSession { + adminToken: string; + device: FakeDevice; + kinds: FakeSessionKind[]; + userId: number; + userToken: string; +} + +export const fakeSession = ( + userId: number, + device: FakeDevice, + kinds: FakeSessionKind[] = ["user", "admin"], +): FakeSession => ({ + adminToken: `admin-${userId}-${device.publicId}`, + device, + kinds, + userId, + userToken: `user-${userId}-${device.publicId}`, +}); + +export const sessionCookies = ( + session: FakeSession, + kind: "admin" | "user", +): string => + [ + `${kind === "admin" ? SESSION_AUTHORIZATION.adminCookieName : SESSION_AUTHORIZATION.cookieName}=${kind === "admin" ? session.adminToken : session.userToken}`, + `${SESSION_AUTHORIZATION.deviceCookieName}=${session.device.publicId}`, + ].join("; "); + +export const createSessionWorld = async ({ + extraTables = [], + sessions, +}: { + extraTables?: [Table, readonly object[]][]; + sessions: FakeSession[]; +}) => { + const expiresAt = new Date(Date.now() + 1000 * 60 * 30); + const hashed = await Promise.all( + sessions.map(async session => ({ + ...session, + adminHash: await hashSessionToken(session.adminToken), + userHash: await hashSessionToken(session.userToken), + })), + ); + const devices = [ + ...new Map(sessions.map(({ device }) => [device.id, device])).values(), + ]; + const userIds = [...new Set(sessions.map(({ userId }) => userId))]; + + const { db, rows } = createMemoryDb([ + [ + core_sessions_known_devices, + devices.map(device => ({ + ipAddress: "203.0.113.7", + lastSeen: new Date(0), + userAgent: "node", + ...device, + })), + ], + [ + core_users, + userIds.map(id => ({ + email: `${id}@test.com`, + id, + name: `user-${id}`, + roleId: MEMBER_ROLE_ID, + })), + ], + [ + core_admin_permissions, + userIds.map(userId => ({ + id: userId, + permissions: [], + protected: false, + roleId: null, + unrestricted: false, + userId, + })), + ], + [ + core_sessions, + hashed + .filter(({ kinds }) => kinds.includes("user")) + .map(({ device, userHash, userId }) => ({ + deviceId: device.id, + expiresAt, + token: userHash, + userId, + })), + ], + [ + core_admin_sessions, + hashed + .filter(({ kinds }) => kinds.includes("admin")) + .map(({ adminHash, device, userId }) => ({ + deviceId: device.id, + expiresAt, + token: adminHash, + userId, + })), + ], + ...extraTables, + ]); + const cache = createTestCache(); + + const cacheKeysOf = (session: FakeSession) => { + const entry = hashed.find( + ({ adminToken }) => adminToken === session.adminToken, + ); + if (!entry) throw new Error("unknown session"); + + return { + admin: adminSessionCacheKey(entry.adminHash, session.device.id), + user: sessionCacheKey(entry.userHash, session.device.id), + }; + }; + + const isCached = async (session: FakeSession) => { + const keys = cacheKeysOf(session); + + return { + admin: (await cache.getSystem(keys.admin)) !== null, + user: (await cache.getSystem(keys.user)) !== null, + }; + }; + + const app = new OpenAPIHono(); + app.use("*", async (c: Context, next: Next) => { + c.set("core", { + authorization: SESSION_AUTHORIZATION, + } as unknown as EnvVariablesVitNode["core"]); + c.set("db", db as unknown as EnvVariablesVitNode["db"]); + c.set("cache", cache); + c.set("ipAddress", "203.0.113.7"); + c.set("user", await new SessionModel(c).getUser()); + await next(); + }); + app.get("/probe/user", c => c.body(null, c.get("user") ? 200 : 401)); + app.get("/probe/admin", async c => + c.body( + null, + (await new SessionAdminModel(c).getSession({ extend: false })) + ? 200 + : 401, + ), + ); + + const probe = async (session: FakeSession) => { + const [user, admin] = await Promise.all([ + app.request("/probe/user", { + headers: { cookie: sessionCookies(session, "user") }, + }), + app.request("/probe/admin", { + headers: { cookie: sessionCookies(session, "admin") }, + }), + ]); + + return { admin: admin.status, user: user.status }; + }; + + const rowsFor = (session: FakeSession) => { + const owns = (row: MemoryRow) => + row.userId === session.userId && row.deviceId === session.device.id; + + return { + admin: rows(core_admin_sessions).filter(owns).length, + user: rows(core_sessions).filter(owns).length, + }; + }; + + return { app, cache, isCached, probe, rows, rowsFor }; +}; diff --git a/packages/vitnode/src/tests/staff-permissions.ts b/packages/vitnode/src/tests/staff-permissions.ts index a226c6cb5..137d0bfd8 100644 --- a/packages/vitnode/src/tests/staff-permissions.ts +++ b/packages/vitnode/src/tests/staff-permissions.ts @@ -4,14 +4,16 @@ import type { CacheModel } from "@/api/lib/cache"; import type { PermissionsStaffArgs, PermissionStaffType, + ResolvedStaffPermissionSet, StaffPermissionSet, } from "@/api/lib/permission-staff"; import { writeStaffPermissions } from "@/api/lib/staff-permission-cache"; -export const ROOT_STAFF_PERMISSIONS: StaffPermissionSet = { +export const ROOT_STAFF_PERMISSIONS: ResolvedStaffPermissionSet = { permissions: [], root: true, + staff: true, }; export const grantStaffPermissions = async ( @@ -21,7 +23,8 @@ export const grantStaffPermissions = async ( type = "admin", userId, }: { - permissions: PermissionsStaffArgs[] | StaffPermissionSet; + permissions: + PermissionsStaffArgs[] | (StaffPermissionSet & { staff?: boolean }); type?: PermissionStaffType; userId: number; }, @@ -33,6 +36,8 @@ export const grantStaffPermissions = async ( await writeStaffPermissions( context, { type, userId }, - Array.isArray(permissions) ? { permissions, root: false } : permissions, + Array.isArray(permissions) + ? { permissions, root: false, staff: true } + : { staff: true, ...permissions }, ); }; diff --git a/packages/vitnode/src/views/admin/layouts/sidebar/sidebar-content.tsx b/packages/vitnode/src/views/admin/layouts/sidebar/sidebar-content.tsx index e9f12bb70..b135ef956 100644 --- a/packages/vitnode/src/views/admin/layouts/sidebar/sidebar-content.tsx +++ b/packages/vitnode/src/views/admin/layouts/sidebar/sidebar-content.tsx @@ -15,7 +15,7 @@ export const SidebarAdminContent = ({ children: React.ReactNode; userBar?: React.ReactNode; }) => ( - + { describe("who may edit a user", () => { it("needs can_edit at all", () => { expect( - canEditAdminUser(EMPTY_STAFF_PERMISSION_SET, { isAdmin: false }), + canEditAdminUser(EMPTY_STAFF_PERMISSION_SET, { isStaff: false }), ).toBe(false); expect( - canEditAdminUser(permissionSet("can_edit"), { isAdmin: false }), + canEditAdminUser(permissionSet("can_edit"), { isStaff: false }), ).toBe(true); }); - it("needs can_edit_admin as well when the target is an administrator", () => { - expect(canEditAdminUser(permissionSet("can_edit"), { isAdmin: true })).toBe( + it("needs can_edit_admin as well when the target is staff, admin or moderator", () => { + expect(canEditAdminUser(permissionSet("can_edit"), { isStaff: true })).toBe( false, ); expect( canEditAdminUser(permissionSet("can_edit", "can_edit_admin"), { - isAdmin: true, + isStaff: true, }), ).toBe(true); }); it("does not let can_edit_admin stand in for can_edit", () => { expect( - canEditAdminUser(permissionSet("can_edit_admin"), { isAdmin: false }), + canEditAdminUser(permissionSet("can_edit_admin"), { isStaff: false }), ).toBe(false); }); it("lets root through both gates", () => { expect( - canEditAdminUser({ permissions: [], root: true }, { isAdmin: true }), + canEditAdminUser({ permissions: [], root: true }, { isStaff: true }), ).toBe(true); }); @@ -108,7 +108,7 @@ describe("who may edit a user", () => { ], root: false, }, - { isAdmin: false }, + { isStaff: false }, ), ).toBe(false); }); diff --git a/packages/vitnode/src/views/admin/views/core/users/detail/user-detail-content.test.tsx b/packages/vitnode/src/views/admin/views/core/users/detail/user-detail-content.test.tsx new file mode 100644 index 000000000..1b0b9738d --- /dev/null +++ b/packages/vitnode/src/views/admin/views/core/users/detail/user-detail-content.test.tsx @@ -0,0 +1,149 @@ +import { + createMemoryHistory, + createRootRoute, + createRouter, + RouterProvider, +} from "@tanstack/react-router"; +import { render, screen } from "@testing-library/react"; +import { IntlProvider } from "use-intl"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import type { StaffPermissionSet } from "@/api/lib/permission-staff"; + +import type { AdminUserDetail } from "./user-query"; + +import { UserDetailContent } from "./user-detail-content"; +import { canEditAdminUser } from "./user-query"; + +const permissionSet = (...permissions: string[]): StaffPermissionSet => ({ + permissions: permissions.map(permission => ({ + module: "users", + permission, + plugin: "@vitnode/core", + })), + root: false, +}); + +const MEMBER_ROLE = { color: null, id: 3, name: [] }; + +const userFixture = (isStaff: boolean): AdminUserDetail => ({ + avatarColor: "#123456", + avatarUrl: null, + birthday: null, + coverUrl: null, + createdAt: "2026-01-01T00:00:00.000Z", + email: "moderator@example.com", + emailVerified: true, + id: 7, + imagePolicy: { + avatar: { allowed: true, maxBytes: 1_000_000 }, + cover: { allowed: true, maxBytes: 1_000_000 }, + }, + isStaff, + language: "en", + name: "Moderator", + nameCode: "moderator", + newsletter: false, + role: MEMBER_ROLE, + roleId: MEMBER_ROLE.id, + secondaryRoles: [], +}); + +const mount = async ({ + permissions, + user, +}: { + permissions: StaffPermissionSet; + user: AdminUserDetail; +}) => { + const rootRoute = createRootRoute({ + component: () => ( + + ), + }); + const router = createRouter({ + history: createMemoryHistory({ initialEntries: ["/"] }), + routeTree: rootRoute, + }); + + render( + + + , + ); + + await screen.findByText("admin.user.show.rolesTitle"); +}; + +const editControls = () => [ + screen.queryByRole("button", { name: "admin.user.show.editName" }), + screen.queryByRole("button", { name: "admin.user.show.editEmail" }), + screen.queryByRole("button", { name: "admin.user.show.editRoles" }), +]; + +describe("UserDetailContent edit controls for a staff target", () => { + beforeEach(() => { + vi.stubGlobal( + "ResizeObserver", + class { + disconnect() {} + observe() {} + unobserve() {} + }, + ); + vi.stubGlobal( + "matchMedia", + vi.fn(() => ({ + addEventListener: vi.fn(), + matches: false, + removeEventListener: vi.fn(), + })), + ); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("hides them for a moderator when the viewer lacks users:can_edit_admin", async () => { + await mount({ + permissions: permissionSet("can_edit"), + user: userFixture(true), + }); + + for (const control of editControls()) { + expect(control).toBeNull(); + } + }); + + it("shows them for a moderator when the viewer holds users:can_edit_admin", async () => { + await mount({ + permissions: permissionSet("can_edit", "can_edit_admin"), + user: userFixture(true), + }); + + for (const control of editControls()) { + expect(control).not.toBeNull(); + } + }); + + it("shows them for a member with users:can_edit alone", async () => { + await mount({ + permissions: permissionSet("can_edit"), + user: userFixture(false), + }); + + for (const control of editControls()) { + expect(control).not.toBeNull(); + } + }); +}); diff --git a/packages/vitnode/src/views/admin/views/core/users/detail/user-query.ts b/packages/vitnode/src/views/admin/views/core/users/detail/user-query.ts index 931df5ca0..76c3451d1 100644 --- a/packages/vitnode/src/views/admin/views/core/users/detail/user-query.ts +++ b/packages/vitnode/src/views/admin/views/core/users/detail/user-query.ts @@ -39,8 +39,7 @@ export interface AdminUserDetail { emailVerified: boolean; id: number; imagePolicy: UserImagePolicy; - /** Whether this user holds administrator access, from the staff tables. */ - isAdmin: boolean; + isStaff: boolean; language: string; name: string; nameCode: string; @@ -93,22 +92,10 @@ export const adminUserQueryOptions = ({ staleTime: RECORD_STALE_TIME, }); -/** - * May this administrator edit this user? - * - * Two permissions, and the second one only sometimes: `users:can_edit` is the - * baseline, and editing somebody who is *themselves* an administrator - * additionally needs `users:can_edit_admin`. That is the rule the API enforces - * on write (`assertCanEditAdminTarget`), stated here so the detail screen - * applies the same one. - * - * Pure: the permission set goes in, a boolean comes out. It decides what is - * *shown*; the API decides what is allowed. - */ export const canEditAdminUser = ( permissions: StaffPermissionSet, - { isAdmin }: { isAdmin: boolean }, + { isStaff }: { isStaff: boolean }, ): boolean => hasStaffPermission(permissions, ADMIN_USER_PERMISSIONS.edit) && - (!isAdmin || + (!isStaff || hasStaffPermission(permissions, ADMIN_USER_PERMISSIONS.editAdmin)); diff --git a/packages/vitnode/src/views/auth/settings/devices/device-item.test.tsx b/packages/vitnode/src/views/auth/settings/devices/device-item.test.tsx new file mode 100644 index 000000000..c695fe2e8 --- /dev/null +++ b/packages/vitnode/src/views/auth/settings/devices/device-item.test.tsx @@ -0,0 +1,59 @@ +import { render, screen } from "@testing-library/react"; +import { IntlProvider } from "use-intl"; +import { describe, expect, it, vi } from "vitest"; + +import type { Device } from "./devices-query"; + +import { DevicesContent } from "./devices-content"; + +const ADMIN_BADGE = "core.auth.settings.devices.admin_session"; + +const device = (overrides: Partial): Device => ({ + browser: "Firefox", + deviceType: "desktop", + expiresAt: "2026-12-01T10:00:00.000Z", + ipAddress: "203.0.113.7", + isCurrent: false, + lastSeen: "2026-09-30T10:00:00.000Z", + os: "Linux", + publicId: "office", + sessionKinds: ["user"], + ...overrides, +}); + +const renderDevices = (devices: Device[]) => + render( + + Promise.resolve({ data: true as const }))} + /> + , + ); + +describe("DeviceItem", () => { + it("marks a device holding an AdminCP session", () => { + renderDevices([ + device({ publicId: "office", sessionKinds: ["admin"] }), + device({ publicId: "laptop", sessionKinds: ["user"] }), + ]); + + expect(screen.getAllByText(ADMIN_BADGE)).toHaveLength(1); + }); + + it("offers to sign out a device that holds only an AdminCP session", () => { + renderDevices([device({ sessionKinds: ["admin"] })]); + + expect( + screen.getByRole("button", { + name: "core.auth.settings.devices.revoke.action", + }), + ).toBeTruthy(); + }); + + it("shows no AdminCP mark on a device with only a user session", () => { + renderDevices([device({ sessionKinds: ["user"] })]); + + expect(screen.queryByText(ADMIN_BADGE)).toBeNull(); + }); +}); diff --git a/packages/vitnode/src/views/auth/settings/devices/device-item.tsx b/packages/vitnode/src/views/auth/settings/devices/device-item.tsx index 5fa8cf5b4..93f582f19 100644 --- a/packages/vitnode/src/views/auth/settings/devices/device-item.tsx +++ b/packages/vitnode/src/views/auth/settings/devices/device-item.tsx @@ -3,6 +3,7 @@ import { MonitorIcon, SmartphoneIcon, TabletIcon } from "lucide-react"; import { useTranslations } from "use-intl"; import { DateFormat } from "@/components/date-format"; +import { Badge } from "@/components/ui/badge"; import type { Device } from "./devices-query"; import type { RevokeDevice } from "./devices-revoke"; @@ -66,9 +67,16 @@ export const DeviceItem = ({
- - {t("browser_on_os", { browser: device.browser, os: device.os })} - +
+ + {t("browser_on_os", { browser: device.browser, os: device.os })} + + {device.sessionKinds.includes("admin") ? ( + + {t("admin_session")} + + ) : null} +
{facts.map(({ label, value }) => (
(
{title ? ( -

- {title} -

+

{title}

) : null}
    {children} diff --git a/packages/vitnode/src/views/layouts/theme/header/user/user-header-model.ts b/packages/vitnode/src/views/layouts/theme/header/user/user-header-model.ts index 2c4af0d25..49bfbfa97 100644 --- a/packages/vitnode/src/views/layouts/theme/header/user/user-header-model.ts +++ b/packages/vitnode/src/views/layouts/theme/header/user/user-header-model.ts @@ -53,15 +53,6 @@ export type UserHeaderMenuItemKey = * and sign-out - which is not a link and so is not here - a third that the * component always appends. An empty group is never returned, so the component * can put a separator after every one of them without ever drawing a stray rule. - * - * ## Only `isAdmin` branches - * - * `isModerator` exists in the session response and is hardcoded `false` (see - * `session.route.ts`: `// TODO: implement moderator role`), and the `/mod_cp` - * page it used to link to does not exist in either application. So the item was - * unreachable copy pointing at a 404, and it is deliberately not carried over - - * there is no moderator role to model yet, and a menu that renders one would - * start linking to a missing page the day the API answers `true`. */ export const userHeaderMenu = ( user: UserHeaderUser, diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 46bde21ef..fe6f8ac8f 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -39,32 +39,32 @@ "@hono/zod-openapi": "^1.6.3", "@tanstack/react-form": "^1.33.5", "@vitnode/core": "workspace:*", - "ai": "^7.0.99", + "ai": "^7.0.124", "drizzle-kit": "1.0.0-rc.4", "drizzle-orm": "1.0.0-rc.4", - "hono": "^4.13.7", - "lucide-react": "^1.45.0", + "hono": "^4.13.12", + "lucide-react": "^1.49.0", "react": "^19.3.0", "react-dom": "^19.3.0", - "react-email": "^6.9.5", + "react-email": "^6.11.0", "sonner": "^2.0.8", - "use-intl": "^4.14.4", - "zod": "^4.6.2" + "use-intl": "^4.14.8", + "zod": "^4.6.5" }, "devDependencies": { - "@react-email/ui": "^6.9.5", + "@react-email/ui": "^6.11.0", "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitejs/plugin-react": "^6.1.1", "@vitnode/config": "workspace:*", - "cn": "^0.3.0", - "eslint": "^10.10.0", - "jsdom": "^30.0.1", + "cn": "^0.4.0", + "eslint": "^10.11.0", + "jsdom": "^30.1.1", "postgres": "^3.4.9", - "tsc-alias": "^1.9.5", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3", - "vitest": "^5.0.0" + "vitest": "^5.0.3" } } diff --git a/plugins/example/package.json b/plugins/example/package.json index 09214d177..a7e55dec4 100644 --- a/plugins/example/package.json +++ b/plugins/example/package.json @@ -27,25 +27,25 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "1.0.0-rc.4", "drizzle-orm": "1.0.0-rc.4", - "hono": "^4.13.7", - "lucide-react": "^1.45.0", + "hono": "^4.13.12", + "lucide-react": "^1.49.0", "react": "^19.3.0", "react-dom": "^19.3.0", "sonner": "^2.0.8", - "use-intl": "^4.14.4", - "zod": "^4.6.2" + "use-intl": "^4.14.8", + "zod": "^4.6.5" }, "devDependencies": { "@swc/cli": "^0.8.1", - "@swc/core": "^1.16.2", + "@swc/core": "^1.16.13", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitnode/config": "workspace:*", - "cn": "^0.3.0", - "eslint": "^10.10.0", + "cn": "^0.4.0", + "eslint": "^10.11.0", "postgres": "^3.4.9", - "tsc-alias": "^1.9.5", + "tsc-alias": "^1.9.7", "typescript": "^6.0.3", - "vitest": "^5.0.0" + "vitest": "^5.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0425784a..66bbb32c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,44 +11,44 @@ importers: .: devDependencies: '@types/node': - specifier: ^26.5.1 - version: 26.5.1 + specifier: ^26.6.3 + version: 26.6.3 '@vitnode/config': specifier: workspace:* version: link:packages/config prettier: - specifier: ^3.9.6 - version: 3.9.6 + specifier: ^3.9.9 + version: 3.9.9 prettier-plugin-tailwindcss: specifier: ^0.8.1 - version: 0.8.1(prettier@3.9.6) + version: 0.8.1(prettier@3.9.9) tsx: - specifier: ^4.23.13 - version: 4.23.13 + specifier: ^4.23.15 + version: 4.23.15 turbo: - specifier: ^2.10.12 - version: 2.10.12 + specifier: ^2.11.5 + version: 2.11.5 typescript: specifier: ^6.0.3 version: 6.0.3 zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 apps/api: dependencies: '@ai-sdk/anthropic': - specifier: ^4.0.53 - version: 4.0.53(zod@4.6.2) + specifier: ^4.0.70 + version: 4.0.70(zod@4.6.5) '@ai-sdk/google': - specifier: ^4.0.69 - version: 4.0.69(zod@4.6.2) + specifier: ^4.0.87 + version: 4.0.87(zod@4.6.5) '@hono/zod-openapi': specifier: ^1.6.3 - version: 1.6.3(hono@4.13.7)(zod@4.6.2) + version: 1.6.3(hono@4.13.12)(zod@4.6.5) '@hono/zod-validator': specifier: ^0.9.1 - version: 0.9.1(hono@4.13.7)(zod@4.6.2) + version: 0.9.1(hono@4.13.12)(zod@4.6.5) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -63,10 +63,10 @@ importers: version: 1.0.0-rc.4 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2) + version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5) hono: - specifier: ^4.13.7 - version: 4.13.7 + specifier: ^4.13.12 + version: 4.13.12 react: specifier: ^19.3.0 version: 19.3.0 @@ -74,24 +74,24 @@ importers: specifier: ^19.3.0 version: 19.3.0(react@19.3.0) use-intl: - specifier: ^4.14.4 - version: 4.14.4(react@19.3.0) + specifier: ^4.14.8 + version: 4.14.8(@types/react@19.3.0)(react@19.3.0) ws: - specifier: ^8.21.3 - version: 8.21.3 + specifier: ^8.22.0 + version: 8.22.0 zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 devDependencies: '@hono/node-server': - specifier: ^2.1.1 - version: 2.1.1(hono@4.13.7) + specifier: ^2.1.3 + version: 2.1.3(hono@4.13.12) '@react-email/ui': - specifier: ^6.9.5 - version: 6.9.5(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@types/node': - specifier: ^26.5.1 - version: 26.5.1 + specifier: ^26.6.3 + version: 26.6.3 '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -99,8 +99,8 @@ importers: specifier: ^19.3.0 version: 19.3.0(@types/react@19.3.0) '@types/ws': - specifier: ^8.18.1 - version: 8.18.1 + specifier: ^8.18.2 + version: 8.18.2 '@vitnode/blog': specifier: workspace:* version: link:../../plugins/blog @@ -114,20 +114,20 @@ importers: specifier: workspace:* version: link:../../packages/nodemailer dotenv: - specifier: ^17.4.2 - version: 17.4.2 + specifier: ^18.0.5 + version: 18.0.5 eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) react-email: - specifier: ^6.9.5 - version: 6.9.5(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 tsx: - specifier: ^4.23.13 - version: 4.23.13 + specifier: ^4.23.15 + version: 4.23.15 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -136,34 +136,34 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.6.3 - version: 1.6.3(hono@4.13.7)(zod@4.6.2) + version: 1.6.3(hono@4.13.12)(zod@4.6.5) '@tailwindcss/vite': - specifier: ^4.1.18 - version: 4.3.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^4.3.3 + version: 4.3.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/react-devtools': - specifier: ^0.10.12 - version: 0.10.12(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.15) + specifier: ^0.10.13 + version: 0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.15) '@tanstack/react-form': specifier: ^1.33.5 - version: 1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-query': - specifier: ^5.102.8 - version: 5.102.8(react@19.3.0) + specifier: ^5.104.0 + version: 5.104.0(react@19.3.0) '@tanstack/react-query-devtools': - specifier: ^5.102.8 - version: 5.102.8(@tanstack/react-query@5.102.8(react@19.3.0))(react@19.3.0) + specifier: ^5.104.0 + version: 5.104.0(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0) '@tanstack/react-router': - specifier: ^1.170.35 - version: 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^1.170.41 + version: 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-router-devtools': - specifier: ^1.167.1 - version: 1.167.1(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.29)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-router-ssr-query': specifier: ^1.167.2 - version: 1.167.2(@tanstack/query-core@5.102.8)(@tanstack/react-query@5.102.8(react@19.3.0))(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.29)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.167.2(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.34)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-router-ssr-query': + specifier: ^1.167.3 + version: 1.167.3(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.34)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-start': - specifier: ^1.168.52 - version: 1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^1.168.60 + version: 1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@vitnode/blog': specifier: workspace:* version: link:../../plugins/blog @@ -177,32 +177,32 @@ importers: specifier: workspace:* version: link:../../packages/supabase-storage dotenv: - specifier: ^17.4.2 - version: 17.4.2 + specifier: ^18.0.5 + version: 18.0.5 drizzle-kit: specifier: 1.0.0-rc.4 version: 1.0.0-rc.4 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2) + version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5) fumadocs-core: - specifier: ^16.15.9 - version: 16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2) + specifier: ^16.15.17 + version: 16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5) fumadocs-mdx: - specifier: ^15.4.0 - version: 15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^15.4.5 + version: 15.4.5(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) fumadocs-ui: - specifier: ^16.15.9 - version: 16.15.9(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3) + specifier: ^16.15.17 + version: 16.15.17(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3) hono: - specifier: ^4.13.7 - version: 4.13.7 + specifier: ^4.13.12 + version: 4.13.12 lucide-react: - specifier: ^1.45.0 - version: 1.45.0(react@19.3.0) + specifier: ^1.49.0 + version: 1.49.0(@types/react@19.3.0)(react@19.3.0) motion: - specifier: ^13.2.0 - version: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^13.4.6 + version: 13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) nitro: specifier: 3.0.260903-beta version: 3.0.260903-beta @@ -219,33 +219,33 @@ importers: specifier: ^2.0.8 version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tailwindcss: - specifier: ^4.1.18 + specifier: ^4.3.3 version: 4.3.3 tslib: specifier: ^2.8.1 version: 2.8.1 use-intl: - specifier: ^4.14.4 - version: 4.14.4(react@19.3.0) + specifier: ^4.14.8 + version: 4.14.8(@types/react@19.3.0)(react@19.3.0) zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 devDependencies: '@tanstack/devtools-vite': specifier: ^0.8.5 - version: 0.8.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 0.8.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/eslint-config': specifier: ^0.4.0 - version: 0.4.0(@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + version: 0.4.0(@typescript-eslint/utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) '@tanstack/router-cli': - specifier: ^1.167.35 - version: 1.167.35 + specifier: ^1.167.40 + version: 1.167.40 '@types/mdx': specifier: ^2.0.14 version: 2.0.14 '@types/node': - specifier: ^26.5.1 - version: 26.5.1 + specifier: ^26.6.3 + version: 26.6.3 '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -254,22 +254,22 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.1 - version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@vitnode/config': specifier: workspace:* version: link:../../packages/config cn: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.4.0 + version: 0.4.0 eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) jiti: specifier: ^2.7.0 version: 2.7.0 jsdom: - specifier: ^30.0.1 - version: 30.0.1 + specifier: ^30.1.1 + version: 30.1.1 tw-animate-css: specifier: ^1.4.0 version: 1.4.0 @@ -277,51 +277,51 @@ importers: specifier: ^6.0.2 version: 6.0.3 vite: - specifier: ^8.3.0 - version: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + specifier: ^8.3.1 + version: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) packages/config: dependencies: '@eslint-react/eslint-plugin': - specifier: ^5.19.0 - version: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + specifier: ^5.23.3 + version: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.10.0(jiti@2.7.0)) + version: 10.0.1(eslint@10.11.0(jiti@2.7.0)) '@shadcn/lint': specifier: ^0.2.0 - version: 0.2.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)) + version: 0.2.0(@typescript-eslint/parser@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.10.0(jiti@2.7.0)) + version: 10.1.8(eslint@10.11.0(jiti@2.7.0)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@10.10.0(jiti@2.7.0)) + version: 6.10.2(eslint@10.11.0(jiti@2.7.0)) eslint-plugin-perfectionist: - specifier: ^5.11.0 - version: 5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + specifier: ^5.12.1 + version: 5.12.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.6) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0(jiti@2.7.0)))(eslint@10.11.0(jiti@2.7.0))(prettier@3.9.9) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@10.10.0(jiti@2.7.0)) + version: 7.1.1(eslint@10.11.0(jiti@2.7.0)) eslint-plugin-react-you-might-not-need-an-effect: specifier: ^1.0.2 - version: 1.0.2(eslint@10.10.0(jiti@2.7.0)) + version: 1.0.2(eslint@10.11.0(jiti@2.7.0)) prettier: specifier: ^3.x.x - version: 3.9.6 + version: 3.9.9 prettier-plugin-tailwindcss: specifier: ^0.8.1 - version: 0.8.1(prettier@3.9.6) + version: 0.8.1(prettier@3.9.9) typescript-eslint: - specifier: ^8.70.0 - version: 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.71.0 + version: 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) devDependencies: eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -330,7 +330,7 @@ importers: dependencies: '@inquirer/prompts': specifier: ^8.7.2 - version: 8.7.2(@types/node@26.5.1) + version: 8.7.2(@types/node@26.6.3) commander: specifier: ^15.0.0 version: 15.0.0 @@ -345,8 +345,8 @@ importers: version: 8.0.0 devDependencies: '@types/node': - specifier: ^26.5.1 - version: 26.5.1 + specifier: ^26.6.3 + version: 26.6.3 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 @@ -357,14 +357,14 @@ importers: specifier: workspace:* version: link:../config eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: - specifier: ^5.0.0 - version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^5.0.3 + version: 5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) packages/elasticsearch: dependencies: @@ -374,10 +374,10 @@ importers: devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@vitnode/config': specifier: workspace:* version: link:../config @@ -385,11 +385,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -402,10 +402,10 @@ importers: devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@vitnode/config': specifier: workspace:* version: link:../config @@ -413,11 +413,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -425,18 +425,18 @@ importers: packages/nodemailer: dependencies: nodemailer: - specifier: ^10.0.9 - version: 10.0.9 + specifier: ^10.0.13 + version: 10.0.13 devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@types/nodemailer': - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^8.0.2 + version: 8.0.2 '@vitnode/config': specifier: workspace:* version: link:../config @@ -444,11 +444,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -456,15 +456,15 @@ importers: packages/resend: dependencies: resend: - specifier: ^6.28.0 - version: 6.28.0(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) + specifier: ^6.31.0 + version: 6.31.0(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@vitnode/config': specifier: workspace:* version: link:../config @@ -472,11 +472,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -484,15 +484,15 @@ importers: packages/s3: dependencies: '@aws-sdk/client-s3': - specifier: ^3.1131.0 - version: 3.1131.0 + specifier: ^3.1144.0 + version: 3.1144.0 devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@vitnode/config': specifier: workspace:* version: link:../config @@ -500,11 +500,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -512,15 +512,15 @@ importers: packages/supabase-storage: dependencies: '@supabase/storage-js': - specifier: ^2.116.0 - version: 2.116.0 + specifier: ^2.117.2 + version: 2.117.2 devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@vitnode/config': specifier: workspace:* version: link:../config @@ -528,11 +528,11 @@ importers: specifier: workspace:* version: link:../vitnode eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -559,10 +559,10 @@ importers: version: 0.1.2(@babel/core@7.29.7)(@babel/template@7.29.7)(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3) '@hono/swagger-ui': specifier: ^0.6.1 - version: 0.6.1(hono@4.13.7) + version: 0.6.1(hono@4.13.12) '@inquirer/prompts': specifier: ^8.7.2 - version: 8.7.2(@types/node@26.5.1) + version: 8.7.2(@types/node@26.6.3) '@simplewebauthn/browser': specifier: ^14.0.0 version: 14.0.0 @@ -570,50 +570,50 @@ importers: specifier: ^14.0.3 version: 14.0.3 '@tiptap/extension-audio': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) '@tiptap/extension-drag-handle': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)) '@tiptap/extension-drag-handle-react': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/extension-drag-handle@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)))(@tiptap/pm@3.31.3)(@tiptap/react@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/extension-drag-handle@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)))(@tiptap/pm@3.31.4)(@tiptap/react@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tiptap/extension-emoji': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/suggestion@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(emojibase@17.0.0) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/suggestion@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(emojibase@17.0.0) '@tiptap/extension-list': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) '@tiptap/extension-table': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) '@tiptap/extension-text-align': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) '@tiptap/extension-text-style': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) '@tiptap/extension-typography': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) '@tiptap/extensions': - specifier: ^3.31.3 - version: 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + specifier: ^3.31.4 + version: 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) '@tiptap/pm': - specifier: ^3.31.3 - version: 3.31.3 + specifier: ^3.31.4 + version: 3.31.4 '@tiptap/react': - specifier: ^3.31.3 - version: 3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^3.31.4 + version: 3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tiptap/starter-kit': - specifier: ^3.31.3 - version: 3.31.3 + specifier: ^3.31.4 + version: 3.31.4 '@tiptap/suggestion': - specifier: ^3.31.3 - version: 3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + specifier: ^3.31.4 + version: 3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) ai: - specifier: ^7.0.99 - version: 7.0.99(zod@4.6.2) + specifier: ^7.0.124 + version: 7.0.124(zod@4.6.5) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -621,17 +621,17 @@ importers: specifier: ^1.1.1 version: 1.1.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) cn: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.4.0 + version: 0.4.0 cron-parser: - specifier: ^5.10.0 - version: 5.10.0 + specifier: ^5.10.1 + version: 5.10.1 date-fns: specifier: ^4.4.0 version: 4.4.0 dotenv: - specifier: ^17.4.2 - version: 17.4.2 + specifier: ^18.0.5 + version: 18.0.5 embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.3.0) @@ -642,32 +642,32 @@ importers: specifier: ^2.7.0 version: 2.7.0 motion: - specifier: ^13.2.0 - version: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^13.4.6 + version: 13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) postgres: specifier: ^3.4.9 version: 3.4.9 rate-limiter-flexible: - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.2.1 + version: 11.2.1 react-colorful: specifier: ^5.8.1 version: 5.8.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react-day-picker: - specifier: ^10.0.1 - version: 10.0.1(@types/react@19.3.0)(react@19.3.0) + specifier: ^10.0.2 + version: 10.0.2(@types/react@19.3.0)(react@19.3.0) react-resizable-panels: - specifier: ^4.12.4 - version: 4.12.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^4.14.1 + version: 4.14.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react-scan: specifier: ^0.5.7 - version: 0.5.7(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(esbuild@0.27.7)(eslint@10.10.0(jiti@2.7.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 0.5.7(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(esbuild@0.27.7)(eslint@10.11.0(jiti@2.7.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) recharts: specifier: ^3.10.1 version: 3.10.1(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react-is@17.0.2)(react@19.3.0)(redux@5.0.1) redis: - specifier: ^6.2.1 - version: 6.2.1(@opentelemetry/api@1.9.1) + specifier: ^6.3.0 + version: 6.3.0(@opentelemetry/api@1.9.1) sanitize-html: specifier: ^2.17.7 version: 2.17.7 @@ -675,54 +675,54 @@ importers: specifier: ^4.21.0 version: 4.21.0(typescript@6.0.3) sharp: - specifier: ^0.35.4 - version: 0.35.4(@types/node@26.5.1) + specifier: ^0.35.5 + version: 0.35.5(@types/node@26.6.3) use-debounce: specifier: ^10.1.1 version: 10.1.1(react@19.3.0) use-intl: - specifier: ^4.14.4 - version: 4.14.4(react@19.3.0) + specifier: ^4.14.8 + version: 4.14.8(@types/react@19.3.0)(react@19.3.0) vaul: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) devDependencies: '@hono/zod-openapi': specifier: ^1.6.3 - version: 1.6.3(hono@4.13.7)(zod@4.6.2) + version: 1.6.3(hono@4.13.12)(zod@4.6.5) '@hono/zod-validator': specifier: ^0.9.1 - version: 0.9.1(hono@4.13.7)(zod@4.6.2) + version: 0.9.1(hono@4.13.12)(zod@4.6.5) '@react-email/ui': - specifier: ^6.9.5 - version: 6.9.5(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@tanstack/react-form': specifier: ^1.33.5 - version: 1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-query': - specifier: ^5.102.8 - version: 5.102.8(react@19.3.0) + specifier: ^5.104.0 + version: 5.104.0(react@19.3.0) '@tanstack/react-router': - specifier: ^1.170.35 - version: 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^1.170.41 + version: 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-start': - specifier: ^1.168.52 - version: 1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^1.168.60 + version: 1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@testing-library/dom': - specifier: ^10.4.1 - version: 10.4.1 + specifier: ^10.4.2 + version: 10.4.2 '@testing-library/react': specifier: ^16.3.3 - version: 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@types/node': - specifier: ^26.5.1 - version: 26.5.1 + specifier: ^26.6.3 + version: 26.6.3 '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -730,14 +730,14 @@ importers: specifier: ^19.3.0 version: 19.3.0(@types/react@19.3.0) '@types/sanitize-html': - specifier: ^2.16.1 - version: 2.16.1 + specifier: ^2.16.2 + version: 2.16.2 '@vitejs/plugin-react': specifier: ^6.1.1 - version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@vitest/coverage-v8': - specifier: ^5.0.0 - version: 5.0.0(vitest@5.0.0) + specifier: ^5.0.3 + version: 5.0.3(vitest@5.0.3) '@vitnode/config': specifier: workspace:* version: link:../config @@ -746,19 +746,19 @@ importers: version: 1.0.0-rc.4 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2) + version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5) eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) hono: - specifier: ^4.13.7 - version: 4.13.7 + specifier: ^4.13.12 + version: 4.13.12 jsdom: - specifier: ^30.0.1 - version: 30.0.1 + specifier: ^30.1.1 + version: 30.1.1 lucide-react: - specifier: ^1.45.0 - version: 1.45.0(react@19.3.0) + specifier: ^1.49.0 + version: 1.49.0(@types/react@19.3.0)(react@19.3.0) react: specifier: ^19.3.0 version: 19.3.0 @@ -766,8 +766,8 @@ importers: specifier: ^19.3.0 version: 19.3.0(react@19.3.0) react-email: - specifier: ^6.9.5 - version: 6.9.5(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -775,14 +775,14 @@ importers: specifier: ^4.3.3 version: 4.3.3 tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 tsup: specifier: ^8.5.1 - version: 8.5.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(typescript@6.0.3)(yaml@2.9.1) + version: 8.5.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) tsx: - specifier: ^4.23.13 - version: 4.23.13 + specifier: ^4.23.15 + version: 4.23.15 tw-animate-css: specifier: ^1.4.0 version: 1.4.0 @@ -790,41 +790,41 @@ importers: specifier: ^6.0.3 version: 6.0.3 vite: - specifier: ^8.3.0 - version: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + specifier: ^8.3.1 + version: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) vitest: - specifier: ^5.0.0 - version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^5.0.3 + version: 5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 plugins/blog: dependencies: '@hono/zod-openapi': specifier: ^1.6.3 - version: 1.6.3(hono@4.13.7)(zod@4.6.2) + version: 1.6.3(hono@4.13.12)(zod@4.6.5) '@tanstack/react-form': specifier: ^1.33.5 - version: 1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode ai: - specifier: ^7.0.99 - version: 7.0.99(zod@4.6.2) + specifier: ^7.0.124 + version: 7.0.124(zod@4.6.5) drizzle-kit: specifier: 1.0.0-rc.4 version: 1.0.0-rc.4 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2) + version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5) hono: - specifier: ^4.13.7 - version: 4.13.7 + specifier: ^4.13.12 + version: 4.13.12 lucide-react: - specifier: ^1.45.0 - version: 1.45.0(react@19.3.0) + specifier: ^1.49.0 + version: 1.49.0(@types/react@19.3.0)(react@19.3.0) react: specifier: ^19.3.0 version: 19.3.0 @@ -832,27 +832,27 @@ importers: specifier: ^19.3.0 version: 19.3.0(react@19.3.0) react-email: - specifier: ^6.9.5 - version: 6.9.5(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) sonner: specifier: ^2.0.8 version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) use-intl: - specifier: ^4.14.4 - version: 4.14.4(react@19.3.0) + specifier: ^4.14.8 + version: 4.14.8(@types/react@19.3.0)(react@19.3.0) zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 devDependencies: '@react-email/ui': - specifier: ^6.9.5 - version: 6.9.5(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: ^6.11.0 + version: 6.11.0(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -861,40 +861,40 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.1 - version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + version: 6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@vitnode/config': specifier: workspace:* version: link:../../packages/config cn: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.4.0 + version: 0.4.0 eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) jsdom: - specifier: ^30.0.1 - version: 30.0.1 + specifier: ^30.1.1 + version: 30.1.1 postgres: specifier: ^3.4.9 version: 3.4.9 tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 vitest: - specifier: ^5.0.0 - version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^5.0.3 + version: 5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) plugins/example: dependencies: '@hono/zod-openapi': specifier: ^1.6.3 - version: 1.6.3(hono@4.13.7)(zod@4.6.2) + version: 1.6.3(hono@4.13.12)(zod@4.6.5) '@tanstack/react-form': specifier: ^1.33.5 - version: 1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -903,13 +903,13 @@ importers: version: 1.0.0-rc.4 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2) + version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5) hono: - specifier: ^4.13.7 - version: 4.13.7 + specifier: ^4.13.12 + version: 4.13.12 lucide-react: - specifier: ^1.45.0 - version: 1.45.0(react@19.3.0) + specifier: ^1.49.0 + version: 1.49.0(@types/react@19.3.0)(react@19.3.0) react: specifier: ^19.3.0 version: 19.3.0 @@ -920,18 +920,18 @@ importers: specifier: ^2.0.8 version: 2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) use-intl: - specifier: ^4.14.4 - version: 4.14.4(react@19.3.0) + specifier: ^4.14.8 + version: 4.14.8(@types/react@19.3.0)(react@19.3.0) zod: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.6.5 + version: 4.6.5 devDependencies: '@swc/cli': specifier: ^0.8.1 - version: 0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0) + version: 0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0) '@swc/core': - specifier: ^1.16.2 - version: 1.16.2(@swc/helpers@0.5.23) + specifier: ^1.16.13 + version: 1.16.13(@swc/helpers@0.5.23) '@types/react': specifier: ^19.3.0 version: 19.3.0 @@ -942,61 +942,61 @@ importers: specifier: workspace:* version: link:../../packages/config cn: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.4.0 + version: 0.4.0 eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0) + specifier: ^10.11.0 + version: 10.11.0(jiti@2.7.0) postgres: specifier: ^3.4.9 version: 3.4.9 tsc-alias: - specifier: ^1.9.5 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 typescript: specifier: ^6.0.3 version: 6.0.3 vitest: - specifier: ^5.0.0 - version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + specifier: ^5.0.3 + version: 5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) packages: - '@ai-sdk/anthropic@4.0.53': - resolution: {integrity: sha512-JMxAuCFte6mFOvoaUcig3Dp2LObin0wU2Li8ncsveh7hHKW7cG3g1bFjooxn1paxeT8UUf5XMSjhxtXG9wFLig==} + '@ai-sdk/anthropic@4.0.70': + resolution: {integrity: sha512-uCuMH4CCL3DXOL0mXyyzfV7KSIPc+ka6X7qiq5HT9hkBdMMJF9SLzfSKOshoLHiSc/xSnFYWLHwlBxMMlaITrg==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@4.0.80': - resolution: {integrity: sha512-6t+07o8lSthpKf64Xb1qHWR2bWvJ3Fd2oFvS9fQc45p31bi2OUqan246e/ojAmZpWCiMPjKyQ4TBr4MYytnTiQ==} + '@ai-sdk/gateway@4.0.102': + resolution: {integrity: sha512-kAVldt8D2AVSs7BjBZTRWHcFF71lPH8ouS6/QVlFCnKcUsShjXMdRwW6es5BfxyGewHbXfSirSc8j6efKSkIdA==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@4.0.69': - resolution: {integrity: sha512-clIivD3RQwutykzKQ8CV+BXIA6EX3xcrfJyXXvAni2SlR9JVATSRbu+JFK/j25a330aZ6WiDwbGyD/u951qXOg==} + '@ai-sdk/google@4.0.87': + resolution: {integrity: sha512-s0tWc+QeSce7O2ZLm+VWSRQy16dGfqEcMIUxEWh+LFvXX3h0TLH8jxCQ2H1qhiBgTta+6A97eHPhBlRFu1xy+g==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@5.0.40': - resolution: {integrity: sha512-zsXPwSAQ9mRJ2hvyITaLOYUyuGrBmzFhJXOg4mllGmla1PfNxZcm4GwqMiV2xQaDgcgBMdUGxXkp9xekZZNIkg==} + '@ai-sdk/provider-utils@5.0.53': + resolution: {integrity: sha512-VVe6UDd0y0/B4TfauuKKzcppqvhTmSluwwUVT4WG2/8h7gFbyFm7PM4UGM+ZXe3/RI6bv+Vl1cw/7aiBoQqdxg==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@4.0.14': - resolution: {integrity: sha512-yukP2tbcQQErG5gLCMBGvpvb/rM3D3KlTKG6eKKOdNHLHqtNNDEeBxdYrY/JL+O76B2ig5dXY19H/f1HFSvRiQ==} + '@ai-sdk/provider@4.0.21': + resolution: {integrity: sha512-UpbC9C1oht8dhfKPbVXSLRZS3DI8uk8n5v2uMjBPNIYGsC2kL045ywq7D8Hh9KgnH9rP5W/GxQdYtWScRouqlA==} engines: {node: '>=22'} - '@asamuzakjp/css-color@6.0.7': - resolution: {integrity: sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==} - engines: {node: ^22.13.0 || >=24.0.0} + '@asamuzakjp/css-color@7.1.2': + resolution: {integrity: sha512-99DHAnXDB5z6EEK+9GMpVI7Mw4oxj97dY5bpOzMnjADQWxI8rN6TvTduuFLUhUMlS7/CfVZ06tcZsus6cltnNw==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@asamuzakjp/dom-selector@8.3.2': - resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==} - engines: {node: ^22.13.0 || >=24.0.0} + '@asamuzakjp/dom-selector@9.2.2': + resolution: {integrity: sha512-lSWTBMjAcmu2xn5yEDU7jh6QDV+C8GEKtdJ4pIQhXh26RkKQ7S3FuQlt+zZkUbTdJ4d3XyV1kPI/G0zWXxqaqw==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} '@asteasolutions/zod-to-openapi@9.1.0': resolution: {integrity: sha512-pLMeRgRYS7/vZIgAAkOe2P6+XGTifR1MT9pqDoxZ11EmcJJ+DPmdPqLN8ZZF4U8R9KHCCQCS9c2wtuE8wSrfkw==} @@ -1006,72 +1006,72 @@ packages: '@astrojs/compiler@4.0.0': resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} - '@aws-sdk/checksums@3.1001.0': - resolution: {integrity: sha512-6uTniZc87q+B5eXouGTl+7Tmc482rEeCcvxpsvREP8EfF0gvloRZ41UOA9sbSJlyy8TbqIBXb3kKfKarEArUQA==} + '@aws-sdk/checksums@3.1001.1': + resolution: {integrity: sha512-x12Q17KYlJAd3nKf8LV5LV0vt8sh8/6YfQLGPtrGnQf/tW4jqxPGq5GPpuVitpQYM3eUR4XB7CbxZf751NMbLw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1131.0': - resolution: {integrity: sha512-jMw3q5sYNvWJRngkNwdS3H2WPBcdqhdrOez+7fBUB26fpH/2+TaJcDdlzdjgLTMhFTq2eOyXBSy1T/4A6CL/Lw==} + '@aws-sdk/client-s3@3.1144.0': + resolution: {integrity: sha512-CAicFlKAuCAUEU1tIptCTh6Eikr4rig9CWYwofZdEuJm9i24XNclgCspV4DKXlOY2nK2AMGHRt88oxmwDdNW7w==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.978.0': - resolution: {integrity: sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA==} + '@aws-sdk/core@3.978.1': + resolution: {integrity: sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.71': - resolution: {integrity: sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ==} + '@aws-sdk/credential-provider-env@3.972.72': + resolution: {integrity: sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.73': - resolution: {integrity: sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg==} + '@aws-sdk/credential-provider-http@3.972.74': + resolution: {integrity: sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.973.16': - resolution: {integrity: sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw==} + '@aws-sdk/credential-provider-ini@3.973.17': + resolution: {integrity: sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.78': - resolution: {integrity: sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA==} + '@aws-sdk/credential-provider-login@3.972.79': + resolution: {integrity: sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.83': - resolution: {integrity: sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ==} + '@aws-sdk/credential-provider-node@3.972.84': + resolution: {integrity: sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.71': - resolution: {integrity: sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA==} + '@aws-sdk/credential-provider-process@3.972.72': + resolution: {integrity: sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.973.15': - resolution: {integrity: sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q==} + '@aws-sdk/credential-provider-sso@3.973.16': + resolution: {integrity: sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.77': - resolution: {integrity: sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ==} + '@aws-sdk/credential-provider-web-identity@3.972.78': + resolution: {integrity: sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.76': - resolution: {integrity: sha512-NfnTkVUTBKTBuBgqaapFK9r3YdkKt1b2oRvgLzZq91bwNKh6ZS0S7sEcheguttREaL4iyfs/xQnqD7Z7AsWSsA==} + '@aws-sdk/middleware-sdk-s3@3.972.77': + resolution: {integrity: sha512-E7W2UOeUoc+lg3uIfR/dM7ZwusHwhBQrKMnlkRv4EXRR+C0YtV1pg25xC7GdZIhXH+NAMgZPCbE7o5to2cjFiw==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.45': - resolution: {integrity: sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ==} + '@aws-sdk/nested-clients@3.997.46': + resolution: {integrity: sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.46': - resolution: {integrity: sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==} + '@aws-sdk/signature-v4-multi-region@3.996.47': + resolution: {integrity: sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1129.0': - resolution: {integrity: sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA==} + '@aws-sdk/token-providers@3.1138.0': + resolution: {integrity: sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.974.5': - resolution: {integrity: sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==} + '@aws-sdk/types@3.974.6': + resolution: {integrity: sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==} engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.40': - resolution: {integrity: sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==} + '@aws-sdk/xml-builder@3.972.41': + resolution: {integrity: sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.3.0': @@ -1188,8 +1188,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.29.7': - resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + '@babel/plugin-transform-typescript@7.29.9': + resolution: {integrity: sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1216,10 +1216,6 @@ packages: resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.8': resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} @@ -1268,40 +1264,45 @@ packages: '@cacheable/utils@2.5.0': resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@csstools/color-helpers@6.1.1': - resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} + '@corvu/utils@0.4.2': + resolution: {integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==} + peerDependencies: + solid-js: ^1.8 + + '@csstools/color-helpers@6.1.2': + resolution: {integrity: sha512-grhRy3OKmniaAEKXMjua5z/EODX0MSqBGjunw8+j/3HQjOnahs2AGhvEOIYVUWcU6ScApbhLhVrQTX8XqrMrow==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.3.0': - resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + '@csstools/css-calc@3.4.1': + resolution: {integrity: sha512-EtC7SoN1j6J4E4DCwg5QgbO5TGxgxIA1RXqe+W+qUM+BUcezx9wT+/tiQ/WO2yCX4i5X+Cuf9ciJ22aP4UEwWw==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.1 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-color-parser@4.2.2': - resolution: {integrity: sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==} + '@csstools/css-color-parser@4.2.4': + resolution: {integrity: sha512-DyefytAZ735mX4Dq/WcDAXFtXhaEFvme0ZS9tVEBAc2whxUthXr0R0L2rmEPm59SrMBkGrFzQviBXMs/UtnABQ==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.1 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + '@csstools/css-parser-algorithms@4.0.1': + resolution: {integrity: sha512-ShL8BqPfbKJrJiKFH0xBbN0i7Nrh9HXYRuF+pzyj93R/BL2YAsUxJeqANErzqM+0JGl7vjHp+3OIgd/DL69YIA==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.1.13': - resolution: {integrity: sha512-i9ZylF5QNhmNfPA9l0vHAWK4kPrbIp6g9lKgaiIFsIBz2F/WNB7OLrzlNNcCOm+h42bkaSD2v1PG+IBPHhc3ZA==} + '@csstools/css-syntax-patches-for-csstree@1.1.14': + resolution: {integrity: sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: css-tree: optional: true - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + '@csstools/css-tokenizer@4.0.2': + resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} engines: {node: '>=20.19.0'} '@date-fns/tz@1.5.0': @@ -1342,8 +1343,8 @@ packages: '@dotenvx/primitives@0.8.0': resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} - '@drizzle-team/brocli@0.12.0': - resolution: {integrity: sha512-mlUE+rZ8CatQekLhnaiN91Iemdd+e2gFKooGlnRB3oPTL3VghLfX24dx7HrzMNeC1JrIB/0kpsfyty3f5HNfxQ==} + '@drizzle-team/brocli@0.12.1': + resolution: {integrity: sha512-yHwomvolVafvUXhy5TdiJVkuNCxXn+bKOs2aWiWEQh/5YaV97Oa/abJz3dmx7lxgIUsUlS1Jl4mEfvJPo3YsVw==} '@elastic/elasticsearch@9.5.1': resolution: {integrity: sha512-2ZZqCmgGPjSYn+OphFRYm9g46KVINA0i8fRmlPHJC60RvJeFB6NSHO0nKKOOYhm3WRXyGkLu1xkdXe724fnmnA==} @@ -2013,54 +2014,75 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@5.19.0': - resolution: {integrity: sha512-6d9UY/CVz+zGMi6+aext7HSOVAj2Fa9eL7okBRnjBeMrRhmRAqtbm1oK7J+VlWrmUNLsiNXpyklhq36BsmYddg==} + '@eslint-react/ast@5.23.3': + resolution: {integrity: sha512-Vq06Cq2rxZ8fl5yvFnA8EmY740NRPpj56iZdxtV79rjw+wcej/gSMU5qiZStuBgDdH5+OqtWQ7pSwtUpjEhwug==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/core@5.19.0': - resolution: {integrity: sha512-PFhetWfvG6ZhLiJomkzjKKCLu6DVbKdyeYZ7HE7/rvAvmfsNi9iCGBqxkgXWfWpWEf24KrRUVpS3wLGJpPL8+g==} + '@eslint-react/core@5.23.3': + resolution: {integrity: sha512-eQMrhN/8xe4d5nlHTM/oGN1lrylKKAlWaKNhs4praDXzKBsEkD/xakNMtexLLQcvIAhIWijcyONnvVaNnnloHw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/eslint-plugin@5.19.0': - resolution: {integrity: sha512-SA3+Iz87sH3pq8hFHb+QhYrOpOyzut+k9YCx2WCJsapK3fu7odk73GRXB6J/W5f8tz0J0ARj1r+DsaSdGtF/zw==} + '@eslint-react/eslint-plugin@5.23.3': + resolution: {integrity: sha512-NmBm35wA7mkufZGAkDty0XrOoUuxlUHVlfJdlJ9spZR+C8gJjAoAOJ84hbT1HTaJE1tQ9oaaRphlt1fDXgX3Og==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/eslint@5.19.0': - resolution: {integrity: sha512-wod1Yd/atJbUD36naGirzztZ9w4BAWSxwIxF8/6qT7PaN/Q9r/vTB/T5rmmgvMa3C/hp0yI3uqr4zbO2mRPBOQ==} + '@eslint-react/eslint@5.23.3': + resolution: {integrity: sha512-U8nmfyAZNQk7QqTyhM94/IdD1LFP4XGRDrU6rHuhLZhVuRawbH1nhOvNAVpPLLXgwbZVcKCw7ErqXkW6+oOCRQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/jsx@5.19.0': - resolution: {integrity: sha512-iqauNb+qeNaEbG7VfDj+8taRLJFbEkptzdPx+YnIbyxhCVAnMaB3s/yeVyi4nszja7YwE/FccFInPZ4Qv8fVZw==} + '@eslint-react/jsx@5.23.3': + resolution: {integrity: sha512-FGP/olID5joSPbVABiLWwdAO1qJFukjDmhU9pLGzD0g6W/ggrV6xUuHlyWVfn3itIryrQZcJDk6ApoosxL68ng==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/shared@5.19.0': - resolution: {integrity: sha512-4x56YzT3Gph725Z8x1vMbOYUkOpbqp2v9NuFb9F7GqVmyZq9OxAQPEj5b7o+Fd2C1VIC3mHNCfL3FHVZ1YH8mA==} + '@eslint-react/shared@5.23.3': + resolution: {integrity: sha512-7x73B8OdB23+drDJNWf2efwYvirGgkzfJhfkF2fmdXjNI2iF1O+9xow5sErDv372+zOLamAhC2gybSNtlEwM/Q==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - '@eslint-react/var@5.19.0': - resolution: {integrity: sha512-dRRM/AYqQli1VNijY7n0+q4zUlNCGiOY1wGr1r+c5ajvlv/XwGibhTJjY6zGZWIjL9TUMIbIEH8aOdRaw2iNQg==} + '@eslint-react/var@5.23.3': + resolution: {integrity: sha512-BgNNb7325FW/kZHvZdgeai8mBl+ZwQ7LgTEvU9KBFP5hA0jDJ8Sta8vCI2Kt3fGqWyjYUXhMWrVEiMVhCcqjiA==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true '@eslint/config-array@0.23.5': resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} @@ -2095,8 +2117,8 @@ packages: resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.1': - resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + '@exodus/bytes@1.16.0': + resolution: {integrity: sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -2130,12 +2152,18 @@ packages: '@formatjs/fast-memoize@3.1.7': resolution: {integrity: sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==} - '@formatjs/icu-messageformat-parser@3.5.17': - resolution: {integrity: sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg==} + '@formatjs/icu-messageformat-parser@3.5.18': + resolution: {integrity: sha512-wX1efcL8d7K5QapOTRsP/OLTA/kpwe4LwqWyNxDNg5iRs8i9jJbCyxB5P8jc4KOW5oiLzz2DJr+BRY5xMV9+bA==} + + '@formatjs/icu-messageformat-parser@3.5.20': + resolution: {integrity: sha512-DUzCb2iskGDKvLU7P+nz/rjpmN59luoTRbWHFFNYNnZTxWCKvwPI94rNll99TGZaI6XoTbDF0QGegk21GFrQZQ==} '@formatjs/icu-skeleton-parser@2.1.11': resolution: {integrity: sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==} + '@formatjs/icu-skeleton-parser@2.1.12': + resolution: {integrity: sha512-ca7tZMLpfHX3sUD7hP6gE/qr6Iq89EDd3ZLeRhbsB7r0UD55DGJq+tmFLzrGrnx5StahUevQmQQVtbDRHsfDHA==} + '@fuma-translate/react@1.0.2': resolution: {integrity: sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==} peerDependencies: @@ -2146,22 +2174,22 @@ packages: '@types/react': optional: true - '@fumadocs/tailwind@0.1.1': - resolution: {integrity: sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw==} + '@fumadocs/tailwind@0.1.2': + resolution: {integrity: sha512-VppeXgIRXjZMgpf2qijj1hcfxyeYl1s0ok8k6N3jyjiX64M7sDwnt2zGPd6dbfDybgbBvDw6C6J1e42gB5NzsA==} peerDependencies: tailwindcss: ^4.0.0 peerDependenciesMeta: tailwindcss: optional: true - '@fumari/image-size@0.1.0': - resolution: {integrity: sha512-x2o9u6P8uKUK15B8XgEoRhR3PgLoLSbQKK6FUCd14JzumEw+e8FXZPelij/dZ4VQVMp4r61VD3DcvSo3aEhLAA==} + '@fumari/image-size@0.1.1': + resolution: {integrity: sha512-iaiV2wyzJ4mW358NX4CX3yGit+WjKYzpaQ+rldK9BjL/5jFpeV6ruWnZVq7MEyMn3Gd0DLi8g/79NZAAQaGscw==} '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} - '@hono/node-server@2.1.1': - resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} + '@hono/node-server@2.1.3': + resolution: {integrity: sha512-TA//nWMqPhbfdfneACk6t5a9eqbS9lABEPyKn0/xZTah3H3U2XaVg85rJFl0/Fyit0I552YDHgXGVSf3GwqbUw==} engines: {node: '>=20'} peerDependencies: hono: ^4 @@ -2211,160 +2239,160 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.35.4': - resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.4': - resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.4': - resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} engines: {node: '>=20.9.0'} os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.3': - resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.3': - resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.3': - resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.3': - resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.3': - resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.3': - resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.3': - resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.3': - resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': - resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.3': - resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.4': - resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.4': - resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.4': - resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.4': - resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.4': - resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.4': - resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.4': - resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.4': - resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.4': - resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.4': - resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.4': - resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.4': - resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.4': - resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -2503,6 +2531,9 @@ packages: '@types/node': optional: true + '@internationalized/number@3.6.8': + resolution: {integrity: sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2532,14 +2563,24 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@kobalte/core@0.13.14': + resolution: {integrity: sha512-SBVB1lnvYbYt2x3t7fG0lo5fGLEbHQ6PII3NDPva8vD5e2v53On84ZVQiuIk0XI/55R4GQhden7Yem+R/XR8uQ==} + peerDependencies: + solid-js: ^1.9.8 + + '@kobalte/utils@0.9.2': + resolution: {integrity: sha512-jRVXr+zsVHxzDXRoh+CDeXzvCsFJ6uiHhqqNQ26Cw9ZsZ3D6nqPUBt1gGVtj2ZPmRL3a9Uk1v8D1aJ8/I12Dow==} + peerDependencies: + solid-js: ^1.8.8 + '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@modelcontextprotocol/sdk@1.30.0': - resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + '@modelcontextprotocol/sdk@1.31.0': + resolution: {integrity: sha512-UvTMgnNlnIBO/22ob2RcVGDlcvOslQs8T59+FTGdA0L27a39fdGF/EDETNtDVK4DZGpwomlsYpRdA8UXcVL/pw==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -2548,6 +2589,13 @@ packages: '@cfworker/json-schema': optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} @@ -2661,14 +2709,8 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@napi-rs/wasm-runtime@1.2.3': - resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 @@ -3063,8 +3105,8 @@ packages: '@oxc-project/types@0.148.0': resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} - '@oxc-project/types@0.149.0': - resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==} + '@oxc-project/types@0.152.0': + resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} @@ -3291,56 +3333,56 @@ packages: cpu: [x64] os: [win32] - '@peculiar/asn1-android@2.9.5': - resolution: {integrity: sha512-KnNE4l033gbJ3ZzfYk7fJpSZwhd5xT+dPAnrB8bcwqylHiLN2zjZ0OyFao0LDIOI/ZdXRabV0n3Ww/KvpgZq6w==} + '@peculiar/asn1-android@2.10.0': + resolution: {integrity: sha512-IHKdYL5MRW76DOQCv2HSE/vUMOf2jqH4E7yhtQYe/xx+RxpPiXfkUdhex0N4/s5crsnXCGftRNzy4RJn1s6CZA==} engines: {node: '>=14'} - '@peculiar/asn1-asym-key@2.9.5': - resolution: {integrity: sha512-U3Q2bUWYNVpfk+oOhPl/+OSHxXaBTQBwMf93jJ7oPi/sbmcY5CnARdjGMwLoXT/ggWSryo5t7A7o3/Gfz0U2WA==} + '@peculiar/asn1-asym-key@2.10.0': + resolution: {integrity: sha512-1R8xUTeqcUTSMLFTTCzJyFuKiq3y25EQKs9DezUetJ8qMqbJyxo3XkzykiwwT/Xzlt5/vRzS/sW4M1r+pq1FTg==} engines: {node: '>=14'} - '@peculiar/asn1-cms@2.9.5': - resolution: {integrity: sha512-4Ivz0fsyFofe0bslNsYcGN9+iETdHX4v+BFwIPr+K/BAt61sHXECP63ff9FntU9zcfVQELJFdUG9so44OjUlBQ==} + '@peculiar/asn1-cms@2.10.0': + resolution: {integrity: sha512-CkX0H4NCIOMHOU3rh2xXZywinYZ/EnJlaOlJiGI0e5L4XjFqHf4iH30LMbXWChVppdA9ljbanjtzQFOhDNfTWg==} engines: {node: '>=14'} - '@peculiar/asn1-csr@2.9.5': - resolution: {integrity: sha512-9dO6PcoJeI+1xJ4rG7eINMa6f9Ix/QdRs5UGZ0D7v/R3TzmsbVr5cqAgfYw4xgS9U54ouHYqEz0bIZBbM/UY1g==} + '@peculiar/asn1-csr@2.10.0': + resolution: {integrity: sha512-jTPTr/9rxKM+niQLMF3jiAMb0lWHUhUHIuSOhdGCIfpB4FAQYf9SoiXOgxP8bS/68IB+bj+1OHvVnDVCQfVUZw==} engines: {node: '>=14'} - '@peculiar/asn1-ecc@2.9.5': - resolution: {integrity: sha512-OD+HLlcV7wCL64w0rheX/C0J31DbJce0nf8ulv3UNftQ617JEZE3sQ4cMN6PotXWlJ1M5GQx90G3bywtdKOstw==} + '@peculiar/asn1-ecc@2.10.0': + resolution: {integrity: sha512-GFd3iOjFrWX+QWH2R2dO5QSJyyRGv9CIBKtRlGlPNCvb2RvmCbBDexe91MJgV76c69d998Xsa+CvuQ98seoiPg==} engines: {node: '>=14'} - '@peculiar/asn1-pfx@2.9.5': - resolution: {integrity: sha512-btcH7lbcD4410qnjHvv7F0kEuMNKbX8CFAZSs9CDPWHKzT1byLPHYeR40AnUw9z4CzsijMY0daBFYUvVx75sdA==} + '@peculiar/asn1-pfx@2.10.0': + resolution: {integrity: sha512-1y3QK9ZH1IPleAMmRoJlPS10eGkAWnULETW8zDFNUK1ffqpG7zmDY+kYBMYQgwlcQZ2iitLm2z2EBP0xzRXpaA==} engines: {node: '>=14'} - '@peculiar/asn1-pkcs8@2.9.5': - resolution: {integrity: sha512-c7UghAGQdBfAHL9JdwcJkAc/lDJKNXfCdYXPXlf8BZdD/fVJjJnXKHxX4gyLhkFTvnGhME7caieSgc2ROtqYTQ==} + '@peculiar/asn1-pkcs8@2.10.0': + resolution: {integrity: sha512-Ri+BZT9bnwqlHWmhs7lvWjvJRxKev2hA2+4EbZajgeYWCbR8hyv0znF4DhsFouOhMj2nSDV/iGJ6DMQtwITnCw==} engines: {node: '>=14'} - '@peculiar/asn1-pkcs9@2.9.5': - resolution: {integrity: sha512-4R/zMgLSHbQIZRBwP1KzX6iuNHmW3xFWwu9TS9A00N60fmQqp9DkkqnQFyd0mAYMQTrQefuzQ/yP4U8sOLGUgQ==} + '@peculiar/asn1-pkcs9@2.10.0': + resolution: {integrity: sha512-XIXsbDQFezYk6fudczkuvawkRD4GNpISGCqfYhdkJlvcGF/RFknU+0DDJagOaJqBf+PdPzk4J9oMqDGcvfR9HQ==} engines: {node: '>=14'} - '@peculiar/asn1-rsa@2.9.5': - resolution: {integrity: sha512-kHwBLVMkm9ljlM521ovS7y4z4mr8xuHTdNyyoPlDvckBwFKSgs9HqKBryLBeqHqL2YpIgl+Vspl7kzNGG2phzA==} + '@peculiar/asn1-rsa@2.10.0': + resolution: {integrity: sha512-4Jvmwlh3gZAhNZ4/u7JSyLuce9hofOFZ4o3PYKAccCImGnyaT5CMym/ATgvAvqpOYFNW531oPZvJlEBhJy9VfA==} engines: {node: '>=14'} - '@peculiar/asn1-schema@2.9.5': - resolution: {integrity: sha512-Ez3wLKVjaxdsLcgeWN4OE31QkM7oBOgKuuBJxldRYAkfYw2C+8zJPcSd/SThnbhszsEOlAmoaS5kIIkN29fGKQ==} + '@peculiar/asn1-schema@2.10.0': + resolution: {integrity: sha512-GhokD41lV4gQrrLYm3wCkHfBOnJrnhDMgt4XeMW8gzfE1UdJqIuSwsE+ggf82XBjUXRJylcm+KIGQFa4utIVLw==} engines: {node: '>=14'} - '@peculiar/asn1-x509-attr@2.9.5': - resolution: {integrity: sha512-PlbL1a74RZiry7puPCZ5hdk/puvivxYJPbjadr2i7DBjHCJFEKCfTRPKL3DILeZFtzJjn95J5EBtSc4/TB9/6Q==} + '@peculiar/asn1-x509-attr@2.10.0': + resolution: {integrity: sha512-/85GtKOKmgvuSJNlaFfwGWNdRSZZ+hpF02NyM01XiCdzpaZONiBltDyfluFPvFx966CR+ZHNSG1jniwpy07oGg==} engines: {node: '>=14'} - '@peculiar/asn1-x509-post-quantum@2.9.5': - resolution: {integrity: sha512-CTznDkboSgwRpXSFhta+Pe5cQ12JtojdMrmOZTWYkBSvbW/1R5pflPIHkpSlaILIfGcAaxIVpXq880xCfJYzow==} + '@peculiar/asn1-x509-post-quantum@2.10.0': + resolution: {integrity: sha512-cXKcZ30wKbUkRK5RK4Z3W1imewXvHAB9apEAuIqJ0OOkOQCpJrwLOuN38QlsEXqOI+3gtUv8Kf3UZohUmCbf3w==} engines: {node: '>=14'} - '@peculiar/asn1-x509@2.9.5': - resolution: {integrity: sha512-NP3ecvN6zTDlwCvogIWL7MJN9AZNuskkIbnlhrlkB97Mn2EqirBUQ8GKzsOmdAL3pRvjGu1Uk/a4DNfiZrWxhw==} + '@peculiar/asn1-x509@2.10.0': + resolution: {integrity: sha512-ucNVg8+ANveTpMN3fy9lA2alryONdXc2A4cEG2hMniWbvQt+YOZoe8BI80YYNO8FBcuDY1qbDQ4uQGQVraHxGA==} engines: {node: '>=14'} '@peculiar/utils@2.0.3': @@ -3362,17 +3404,14 @@ packages: '@preact/signals-core@1.14.4': resolution: {integrity: sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==} - '@preact/signals@2.9.4': - resolution: {integrity: sha512-JzAZXcRkmCNf9wVuxNI7UWseu3++Mm0dZ6UFyjFby44CyKIl7Y06oOsW3KA5Nx0L8tpE87OY5pLe0uQ0xcWKrg==} + '@preact/signals@2.11.3': + resolution: {integrity: sha512-mttwFM98G/JiriTgMwU+UWygL6sfVmYEiNcPSKkUnv4PxPpZhmP2ugGC4qi360+ZIHyQ8NY05bfJT3b4RUIGlw==} peerDependencies: preact: '>= 10.25.0 || >=11.0.0-0' '@radix-ui/number@1.1.3': resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} - '@radix-ui/primitive@1.1.6': - resolution: {integrity: sha512-w9hl+724uYEgCGR3bhuRepjBtrNB/6gkhCnAf58Ke+SLbHPPQqVZZB59z60roB+5H+nh3nWTcdJhQdFMEydWmw==} - '@radix-ui/primitive@1.1.7': resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} @@ -3428,15 +3467,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.1.3': - resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-compose-refs@1.1.5': resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} peerDependencies: @@ -3446,15 +3476,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.2.0': - resolution: {integrity: sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-context@1.2.2': resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} peerDependencies: @@ -3464,19 +3485,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.20': - resolution: {integrity: sha512-cngVJcvK0yMvR7wICJpv+1uW3Qw4T7QM5sdbb+oE/lxOdTdvF00oaRpWUjVgmjyXe3J+xh7eZyXZlVF3g2g59g==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-dialog@1.1.23': resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} peerDependencies: @@ -3499,19 +3507,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.16': - resolution: {integrity: sha512-t45h68IjFx0ccBnPJqk0X6ecv69LkCFWd6DNCFQX56mUnVEXZbNOLCH/u9fHlAjFZ1RrFdl8/m4zev7B7NyhXQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-dismissable-layer@1.1.19': resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} peerDependencies: @@ -3525,15 +3520,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.4': - resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-focus-guards@1.1.6': resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} peerDependencies: @@ -3543,19 +3529,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.13': - resolution: {integrity: sha512-dE04aPEuP9rvKKT0d0KjSOtTEYNg6bmCYFsoSJpfC+y91Hic28ZfDCGgv6aJ+2Kw/LBXYipMZpyqVj/OD3Z8Gg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-focus-scope@1.1.16': resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} peerDependencies: @@ -3569,15 +3542,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.2': - resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-id@1.1.4': resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} peerDependencies: @@ -3626,19 +3590,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.14': - resolution: {integrity: sha512-REwjAGPMa3J9oyDE4cuWkZbwnCbbyky66NurquQklXMSDn67cl6oGFx2gO7KZhPtFNbNw9xTWNrti3VIhgluYw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-portal@1.1.17': resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} peerDependencies: @@ -3665,19 +3616,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.8': - resolution: {integrity: sha512-0hhyrQdXMaATgq4ammLG9+iPqsXxzZkgTSIxdrJHdfLnXO4Uo5L7BoO3/Xf0AEaettadGZWGGJMw6ujzQvIpGA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-primitive@2.1.10': resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} peerDependencies: @@ -3691,19 +3629,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.7': - resolution: {integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-roving-focus@1.1.19': resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} peerDependencies: @@ -3730,15 +3655,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.3.0': - resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-slot@1.3.3': resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} peerDependencies: @@ -3761,15 +3677,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.1.2': - resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-callback-ref@1.1.4': resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} peerDependencies: @@ -3779,15 +3686,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.4': - resolution: {integrity: sha512-cx2DixxmSfjCcEoRvDvy1NLd6SWK94XFcEEOZUcharUlXbmahFQGKCfwdKZL2ub34iIwOPOEFVF80xb+yfLYiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-controllable-state@1.2.6': resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} peerDependencies: @@ -3797,15 +3695,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-effect-event@0.0.3': - resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-effect-event@0.0.5': resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} peerDependencies: @@ -3824,15 +3713,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.2': - resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-layout-effect@1.1.4': resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} peerDependencies: @@ -3892,21 +3772,21 @@ packages: react: ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/ui@6.9.5': - resolution: {integrity: sha512-UvE0yeSQCvdBm9BoEgvZ5vBi8abk02GbRE+4RQjjtxozy66D/O1GbUgK9RdB26+7EqQdOxdwkGLq5CMCiRO96A==} + '@react-email/ui@6.11.0': + resolution: {integrity: sha512-6bS3hnXHv4Uq5pLEdcg3c1ntr/0yrWVuTMdi9OJGZecK2LCHF5a+J4eNQ4PuMgpP2FJDYhXIuF22aRe3L1nW3Q==} '@react-grab/cli@0.2.0': resolution: {integrity: sha512-LVfA+j5cFT0Szd958WRD8W/B8ucCtz4ViiveDKWLqAwBkZFW9VRW1ZvwOUhp/M3SmVPtjDaRkW12GvAuTArP+Q==} hasBin: true - '@redis/bloom@6.2.1': - resolution: {integrity: sha512-huQgNLaCIZfQ9SeLn4q9124uOUd8HbZDYHwwUzNcRgHqCHiHKl2dDxMqJCeWh8cMqZAoWuHR8XnWbDMIf+o7ag==} + '@redis/bloom@6.3.0': + resolution: {integrity: sha512-NQ5poYpZr0jv6zazN1cy6JY5kIipKFZ3R9GTL4kOUTX3a9YAfY29U8bsE4lWhVQEM+G4V0BXVC57mubIdDijeA==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.2.1 + '@redis/client': ^6.3.0 - '@redis/client@6.2.1': - resolution: {integrity: sha512-LzxBY7SIBvvJiyCgcaJZZakE3fJrZZ++i24+EDW9fKpCl68D35uJcKFpZZwCfOoG9WZTbyZlMzMeM0gtOAMU9Q==} + '@redis/client@6.3.0': + resolution: {integrity: sha512-fHrjwGCBvAANGi+TuRuwKi83sIOzgHr8eh+Uf48w3fSX7Hhrz174NrWqfJhAC2vnN0d/tfaZpdr6+o6JC3QHwg==} engines: {node: '>= 20.0.0'} peerDependencies: '@node-rs/xxhash': ^1.1.0 @@ -3917,26 +3797,26 @@ packages: '@opentelemetry/api': optional: true - '@redis/json@6.2.1': - resolution: {integrity: sha512-AFIUJ8Gj0DaaSBHYuSt8+O0oYWM+50OK1c0OmodB7XERIA8+BbyV3O4v76f9iccWasd1/7qjfZTpuzexUaZtrQ==} + '@redis/json@6.3.0': + resolution: {integrity: sha512-yt6vRfPBXtW/3qm53cF81TSQpLMjWdW4/2E9WQ2GgbvsKkuCKCFQIcMiKlil1ZMnezK+IQuS795xKU5psbaegw==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.2.1 + '@redis/client': ^6.3.0 - '@redis/search@6.2.1': - resolution: {integrity: sha512-2vfOAOyYFE7UUw3sBBlkqqruBtOUS4HRY5MtW4hp83llrwvtrTE4r22CEqXddlV+54zkLxBE4nmsIJ/dpezQrQ==} + '@redis/search@6.3.0': + resolution: {integrity: sha512-RPXAZmKjZZG7Tm7m1w9keFdXzbL91PiSHQBfQRe9xwW40jNsTRbG0FwhIz4QlHPU4gKDAsCy8IQHj4yZl4H9rw==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.2.1 + '@redis/client': ^6.3.0 - '@redis/time-series@6.2.1': - resolution: {integrity: sha512-kiYniph04dJOole+L359B6C9E+jYS2uDP7hca6Onj0xF38ZIpyxARO0Iq0W4ZRn1e8Q6vqW00QFZVSMRA/2Ijw==} + '@redis/time-series@6.3.0': + resolution: {integrity: sha512-+fJOB8mN1z5WRakCJNh5lVdz1KqvHGSOistsKeitD24QsCtPwyRQXWC0iq6T/i/ubLE/YcguZqPm8F598MKk4A==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.2.1 + '@redis/client': ^6.3.0 - '@reduxjs/toolkit@2.12.0': - resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} + '@reduxjs/toolkit@2.13.0': + resolution: {integrity: sha512-f6jwVRfwW30+tnllz4YcsHHpPYYOE7abcHkyUCovD+P7DyhdAI5prz2Fh/8TLhakjpN+7aIEion1s5L/tvlYlA==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 || ^19 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 @@ -3946,98 +3826,98 @@ packages: react-redux: optional: true - '@rolldown/binding-android-arm-eabi@1.2.8': - resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==} + '@rolldown/binding-android-arm-eabi@1.2.12': + resolution: {integrity: sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.8': - resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==} + '@rolldown/binding-android-arm64@1.2.12': + resolution: {integrity: sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.8': - resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==} + '@rolldown/binding-darwin-arm64@1.2.12': + resolution: {integrity: sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.8': - resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==} + '@rolldown/binding-darwin-x64@1.2.12': + resolution: {integrity: sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.8': - resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==} + '@rolldown/binding-freebsd-x64@1.2.12': + resolution: {integrity: sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.8': - resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': + resolution: {integrity: sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.8': - resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==} + '@rolldown/binding-linux-arm64-gnu@1.2.12': + resolution: {integrity: sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.8': - resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==} + '@rolldown/binding-linux-arm64-musl@1.2.12': + resolution: {integrity: sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.8': - resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==} + '@rolldown/binding-linux-ppc64-gnu@1.2.12': + resolution: {integrity: sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.8': - resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.12': + resolution: {integrity: sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.8': - resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==} + '@rolldown/binding-linux-x64-gnu@1.2.12': + resolution: {integrity: sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.8': - resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==} + '@rolldown/binding-linux-x64-musl@1.2.12': + resolution: {integrity: sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.8': - resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==} + '@rolldown/binding-openharmony-arm64@1.2.12': + resolution: {integrity: sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.8': - resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==} + '@rolldown/binding-win32-arm64-msvc@1.2.12': + resolution: {integrity: sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.8': - resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==} + '@rolldown/binding-win32-x64-msvc@1.2.12': + resolution: {integrity: sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4054,141 +3934,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + '@rollup/rollup-android-arm-eabi@4.63.5': + resolution: {integrity: sha512-J25QJU+B78T4FhhBsNpLJyVWOi31mwtpcMwywHmOKH65Q9IWGA81gPj+dnwlhU8wktVriYE+tFAaQgrnJRzAZg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + '@rollup/rollup-android-arm64@4.63.5': + resolution: {integrity: sha512-LDopB3zuZM5Ux9TT2luNEBJW/tYbGU2g1d+VpKk6I+gSKDb+/7sYE6M225gRQt4RbMX6MSwMsVR/phdjVUgRLg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + '@rollup/rollup-darwin-arm64@4.63.5': + resolution: {integrity: sha512-wlJEERGfeuHeBavCL2qVnNacOK43NDoZM4sjkeRPymd04OAE9T1zBqDJgmZ+CIsPTYKwdzpUC8vmOw84dwY4Tg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + '@rollup/rollup-darwin-x64@4.63.5': + resolution: {integrity: sha512-4nJJGg5jbo2wwPP4JP+LfEBA3bvP8rU9CLuhp7jWvq9sxEyhjQFTFdrqi+/dHEin/pd8jpT0vcehIpnZtmEdcQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + '@rollup/rollup-freebsd-arm64@4.63.5': + resolution: {integrity: sha512-DrZbyCDF1hneuO6jRbvZ2D7+PIBM6yIwYnJpg2vIk58T+wuFpiaGZrfUr59lDWw45bg+IrpTGLPiNi/Fk4w3Cg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + '@rollup/rollup-freebsd-x64@4.63.5': + resolution: {integrity: sha512-gqfUVMJMB3mehqywxp6hTBFfgtMQykZY19+cfiaYP0toIJLb/1DZRJHVkQQGP13W4TAwfZDWeg1qBcheTRioXQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + '@rollup/rollup-linux-arm-gnueabihf@4.63.5': + resolution: {integrity: sha512-CFmhpvAwzSaWMlN3VN7UtmoTihlZNzoP0juQib5TQRnYUyDV8dXeWOp29sobWAT6gXl/hQgAClLlEiYozQG3OQ==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + '@rollup/rollup-linux-arm-musleabihf@4.63.5': + resolution: {integrity: sha512-Uc9H8eXCOayV6JLTH5bXKMId6qbhNHa818/BgYjm4jrlq3vZquC9cqyvHBw17xy5Mnj5f+I3gFK5JcEf3hSqrw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + '@rollup/rollup-linux-arm64-gnu@4.63.5': + resolution: {integrity: sha512-VcPr/szv/1BFw112Kt//fxulXt/JPqzzidU84iW68L2DdjnOO8QFUv2zTSYBEPHD6movBD4z+bbr5y60GYM7Jw==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + '@rollup/rollup-linux-arm64-musl@4.63.5': + resolution: {integrity: sha512-BnxtJ5/91BrIHYIkGrmjz/lbMhqEHt1dPFqIxIFR+jPn0xVc/oUSCtIT089zfp5ufwGDlYz2UC+Fe1SRBpYFbQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + '@rollup/rollup-linux-loong64-gnu@4.63.5': + resolution: {integrity: sha512-LrYcHZwF+fAMNKHYTOQ5osWM4AZF7YF6D+XtsjDyEvljtt11twc+zHVXBLNEjxVSUnKYsOhvVz4Z213eW02COQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + '@rollup/rollup-linux-loong64-musl@4.63.5': + resolution: {integrity: sha512-nj7QKQePAAUpCpJHtg0pR0W/b92A9NO17JS3BAQmHDn/yhmkir2p8llrKY9TOhleKIaSzy1JhxS3T9FVld6coA==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + '@rollup/rollup-linux-ppc64-gnu@4.63.5': + resolution: {integrity: sha512-5ylkX6dWMeBKge9nTU+Rxfb+ZfaCIJ9lRqIFaK0eAMcWp7OJbYnLveLgXmm0VrvuLKb8qIK+mHyH0qu88RM+iA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.62.2': - resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + '@rollup/rollup-linux-ppc64-musl@4.63.5': + resolution: {integrity: sha512-oHK4ZHYFDKjZviK34I+NwgfbGxgI7ztrNxj2hPTSSNFgeq1a/lEd7dHV2fdGAuTH4Iym3RHJg+vAbWaWG4B7Zg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + '@rollup/rollup-linux-riscv64-gnu@4.63.5': + resolution: {integrity: sha512-UcetmHZ6XOXuUByiKZyQmb55ZPr0LABr3Ec/HB9wKZn6CEAFWZkE+hsJErJ9hbPBC7nI0dKuELx7CoV6IM7TMg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.62.2': - resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + '@rollup/rollup-linux-riscv64-musl@4.63.5': + resolution: {integrity: sha512-C5CmDPQBtvjVo8cgQsBs+w6WB0JLkiixhgi6hVLV11hERWdn/p0XcPU2OUcZzac9BPOFq7SbaHFa8r3SWEysCQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.62.2': - resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + '@rollup/rollup-linux-s390x-gnu@4.63.5': + resolution: {integrity: sha512-lHVQHJFKsuuxLMi3MQO9XVL8Tje3JR82CzB+QDKC5NWBcsIWuwsn9uIM5e3lBhI+fF1/s63qnyYqsg65+8rV/w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + '@rollup/rollup-linux-x64-gnu@4.63.5': + resolution: {integrity: sha512-3W9bTFcQNJn71cSJVM9RKIiZOy8DO/XLDii8Uv/Pm6WKqDRj7JV3ZfuXIEfyuy5LXpIzAbB/1M4Ukp9GKNa7nA==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.62.2': - resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + '@rollup/rollup-linux-x64-musl@4.63.5': + resolution: {integrity: sha512-VDC7rRJlee/scpki96GZ27Omf6yU87s1YXwVTpjE5841faVlDYYT565rgfmoR1U0sqL7z5ivQSDjcsF6VRXyBA==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.62.2': - resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + '@rollup/rollup-openbsd-x64@4.63.5': + resolution: {integrity: sha512-z86Ok2p4pTdv5xqCKZsTooO7yBEiaJR/HzU3Wx8RmWsPoLppnMKROhJusQob8B3IE1ghC343kUW9rC2r+Wf3ig==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.62.2': - resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + '@rollup/rollup-openharmony-arm64@4.63.5': + resolution: {integrity: sha512-IzQmj+xXwQFGhMAMKMQVXkMwMZN3TqkJgAE0nSsqvVwWWciP4AIPMmWRqOQ2GfX7TUDZr+xqGFcBS36CRPGw0g==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.62.2': - resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + '@rollup/rollup-win32-arm64-msvc@4.63.5': + resolution: {integrity: sha512-F6qpTaPc9bwBH85kjy0/BLmLSW1uv7AoOXCoRIkg2arlgCYlWYcAbiMkvZuAcaWk9TpCRG//okznLAqLGshkMw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.62.2': - resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + '@rollup/rollup-win32-ia32-msvc@4.63.5': + resolution: {integrity: sha512-igoDsTFhhwECBeGbUuLeIk7t8Y1apa+cs6mDWpx2EZ0ch7oEQgzHbFUXN9euoHekCAQzXdXApAGkV6jznS7tWw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.62.2': - resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + '@rollup/rollup-win32-x64-gnu@4.63.5': + resolution: {integrity: sha512-U3teMeMbXFmaM5D+OTJpsOXd+wV/qftIeYF9kBKL4v73641qyJmoXFtA28DQLsnmlyayEsTe72xpLHrArq6vHw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.62.2': - resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + '@rollup/rollup-win32-x64-msvc@4.63.5': + resolution: {integrity: sha512-ypfC34F3RKXvCXBglGqGMsUSMKlgwd1HX9AOAlx9RoZZ6GaI42YHVeKpzg3JG+wpBUJYTG+NNZhqbDWL8tBZkw==} cpu: [x64] os: [win32] @@ -4205,12 +4085,12 @@ packages: resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} engines: {node: '>=14'} - '@sentry/core@10.74.0': - resolution: {integrity: sha512-u9rY8vcZfktccwm6LznfCZlqP5C9A+p76r4/pFS1grqpuTO0m21Cl8rosnlESrDGP/Xd9tfr91rWYk0jPH8jeQ==} + '@sentry/core@10.75.3': + resolution: {integrity: sha512-QHgzobetM4UgEVbyqx9WPJzRq0YzyNg2CeeoM1Bf84ivYJXXiiVWxjzc0RHk3c0DHY5/6O6nJqos1xVL55dgZA==} engines: {node: '>=18'} - '@sentry/node-core@10.74.0': - resolution: {integrity: sha512-btgZXcGmkOGgojbxHo/gfGiyqYpzC9E8zVR78Q3MtM6Xnemk9gwJiQlhNmEX/FM+C36WBRPZrdcZcnMaJhbfJw==} + '@sentry/node-core@10.75.3': + resolution: {integrity: sha512-nm3scqhE9Dx/ngE6q2hJW8Jvk+dVTjCm/KXC3CXH+0eBCzEuANH79qMwkmwMp5ixX+snlEOczA+ZCY+B4HfWQg==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -4230,20 +4110,20 @@ packages: '@opentelemetry/sdk-trace-base': optional: true - '@sentry/node@10.74.0': - resolution: {integrity: sha512-u1wsarTOWHn9CCev81Da5T4IQHZgdcosXRfX2+4DMII/lVJMBYesKixTQuMwXexjVG2+pkf16zTmgjZDa+75jA==} + '@sentry/node@10.75.3': + resolution: {integrity: sha512-VK/uoDOwMll/Q+WRBvqhvQMI/3YFitcoMLExP41XH1azC0fqmm8sJdzWGXgvddt/A9cnCb01N/+U0B3ARLX1tg==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.74.0': - resolution: {integrity: sha512-ua5mt0NDBfye+/ACKjAw9Ad2i+y42lOLvhxXZepZXjszblMz80MEsIZflMB7uLZUCTNH7MbZN8tlzCy8KsJKmQ==} + '@sentry/opentelemetry@10.75.3': + resolution: {integrity: sha512-Ux2eXgS4NkmT9nj1/guV+j4Dwx9WTZSBO+/WMRmfektEgt05u5nuHuKhSGN8maQ72m8HmEx360vcn8Hd/dh5WA==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@sentry/server-utils@10.74.0': - resolution: {integrity: sha512-AHmPIGE8yVRyywpZRhAkm/H0cHTgsQSPhFZFbaeQLcYHFE/eOP9bAMh8Nj/Apr7WMagFXYHd04tR/63BxtLgKw==} + '@sentry/server-utils@10.75.3': + resolution: {integrity: sha512-PG3a+3GxurYYipLykRM3qezWjkIBYuqBjn8EuXzzlG6mpucMVtU8SRgr3EB0wdVaj1Pz+mhz+MLh8CGnLfKhCQ==} engines: {node: '>=18'} '@shadcn/lint@0.2.0': @@ -4312,8 +4192,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@smithy/core@3.34.1': - resolution: {integrity: sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw==} + '@smithy/core@3.35.0': + resolution: {integrity: sha512-zRMhfkByhT2snNdr1si24vJitU6Cr9ix2MikUfWmkAgp4jrNP0GcKSP5YvwQ+TlI8AZXER5QOGJn3JsVtSD9/A==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.5.2': @@ -4328,12 +4208,12 @@ packages: resolution: {integrity: sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.7.3': - resolution: {integrity: sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==} + '@smithy/signature-v4@5.7.4': + resolution: {integrity: sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.18.0': - resolution: {integrity: sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==} + '@smithy/types@4.19.0': + resolution: {integrity: sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==} engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': @@ -4349,6 +4229,31 @@ packages: peerDependencies: solid-js: ^1.6.12 + '@solid-primitives/keyed@1.5.3': + resolution: {integrity: sha512-zNadtyYBhJSOjXtogkGHmRxjGdz9KHc8sGGVAGlUABkE8BED2tbIZoxkwSqzOwde8OcUEH0bb5DLZUWIMvyBSA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/map@0.4.13': + resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/media@2.3.6': + resolution: {integrity: sha512-pk49gPOq/UMRUJ+pTSrOfBiR8xJjRYHXIf1iR/jSnyQ/KroU+ZXhkZzavC7hvfp2vJeOTW5k2/HN0r3Q1VJ7Pw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/props@3.2.4': + resolution: {integrity: sha512-MXXdvi2TSB6d+0N6ueA/HP1j/Kh9SEc4WdF1ZDMLwPagxW6pIHHSS9xbRO0RjqSVpNP4j0nxCWT1hx3CkJNhNA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/refs@1.1.4': + resolution: {integrity: sha512-bLjwIs6ZPu8NQnuw04sU3Zc8qKSpbc0umUU/O4SHf6oWOdO4+dHY8vb1T7C4b/Tg103+9WGr6sEE0+NFlbaB/A==} + peerDependencies: + solid-js: ^1.6.12 + '@solid-primitives/resize-observer@2.2.0': resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} peerDependencies: @@ -4364,6 +4269,21 @@ packages: peerDependencies: solid-js: ^1.6.12 + '@solid-primitives/storage@1.3.11': + resolution: {integrity: sha512-PpQWR3TaTxHIJFbI9ZssYTM4Aa67g1vJIgps4TPhcXzHqqomrPAIveFC2FG7SDQoi9YQia8FVBjigELziJpfIg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/transition-group@1.1.2': + resolution: {integrity: sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/trigger@1.2.4': + resolution: {integrity: sha512-Ju0e+ZOD7hpOp7nptJimvDSZHWFvIvF9iBWMvuwt30smX7c5wmB8Kmc0AdDuv0wOTi06PQ1J5IrP1WJbH2yUBQ==} + peerDependencies: + solid-js: ^1.6.12 + '@solid-primitives/utils@6.4.1': resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} peerDependencies: @@ -4384,8 +4304,8 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 - '@supabase/storage-js@2.116.0': - resolution: {integrity: sha512-6/3hR6vccBP6oGM5B6RfbwZcTCKmQOodd/ZWQdsw8yJsU5zO/a//oBL6yLnmgxcjnHSrelW8rsO7hL5DPybyUQ==} + '@supabase/storage-js@2.117.2': + resolution: {integrity: sha512-8gAJoVaxZa/War2kFRfJMxGk4M190Q7lJ70BofwGlRxU/u9pIodd6XyTvmXkxOKXWuIYtkDaYPZrIAUt1T/7FQ==} engines: {node: '>=22.0.0'} '@swc/cli@0.8.1': @@ -4399,86 +4319,86 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.16.2': - resolution: {integrity: sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA==} + '@swc/core-darwin-arm64@1.16.13': + resolution: {integrity: sha512-JrMH2h7ohd4mOIneNRx/diqTmCDSdWfp9uOdQ8VJ2V2CA7jOJ1jWb+qp8RoZLqgiVmwDDC7eySKB1kbvZ+jVXQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.16.2': - resolution: {integrity: sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA==} + '@swc/core-darwin-x64@1.16.13': + resolution: {integrity: sha512-HauZMRxpOImRxgY6GXjw5gbD8ts2NcPZuLMM8htY8Mic7j1Izt/lxkXrKYUwqyU56YLwQZ4dHRT+6jFHkztcag==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.16.2': - resolution: {integrity: sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA==} + '@swc/core-linux-arm-gnueabihf@1.16.13': + resolution: {integrity: sha512-tUSojGIythnHJKrElDM9OvuhBnK+FF39eM9iIBgj9kdfbAm6PhAM7dKbaSDcnX2gOLG2slkasjD0Z8m/YUlzOA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.16.2': - resolution: {integrity: sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q==} + '@swc/core-linux-arm64-gnu@1.16.13': + resolution: {integrity: sha512-qS3bk/ezRrLXGn1b764S/EG3/oKj6uRhnTNRAALpnuu8d9I0YwSiUkQghnX7lOH9X/yRr+qrFI3R0wAruO47Tg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.16.2': - resolution: {integrity: sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw==} + '@swc/core-linux-arm64-musl@1.16.13': + resolution: {integrity: sha512-aeoYoG6fQsOS3mFOuTKvnJo1aaaxYNI0aRRlhdHaGP4q1YQx4XOc5Hkd35IFduWCBG3eZl3fPTjRuYvxpl7eTA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.16.2': - resolution: {integrity: sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w==} + '@swc/core-linux-ppc64-gnu@1.16.13': + resolution: {integrity: sha512-eEFoueZXWZ2S1lsqL8Ve2C8RjhzH9+Ktj8U4IGTUQL6CNG04+VhQiYQWJOf5xfVBU6I+PbH80yvsYegqZOOSZQ==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.16.2': - resolution: {integrity: sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg==} + '@swc/core-linux-s390x-gnu@1.16.13': + resolution: {integrity: sha512-K0q1ReVXL3d5bzBgZxS+yJq5q2xRjg4k2XXGj9yiCEpE5ZqJGQ4Gtk1sRrk8W2lo3KY0DCJD3Myt6x2SMvGArQ==} engines: {node: '>=10'} cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.16.2': - resolution: {integrity: sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg==} + '@swc/core-linux-x64-gnu@1.16.13': + resolution: {integrity: sha512-Qvpihw30irhIjy2f91BR1pamcJBCgf8hmr9XWenztAX1YLkneRkkTB/PFGWQubhaBqQhY2uZKViMj/xV61uMBQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.16.2': - resolution: {integrity: sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ==} + '@swc/core-linux-x64-musl@1.16.13': + resolution: {integrity: sha512-iCGxHbh3Cq5vqRvCPlw3XkkDz4RlkPSyQwfFKbOKTMj5tiEuojY/rLmf4BMfI9Z8yPJTf9VB07t3NbKInoC97g==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.16.2': - resolution: {integrity: sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ==} + '@swc/core-win32-arm64-msvc@1.16.13': + resolution: {integrity: sha512-iOabn6cd+hg3cnoKlAC8j3Yufv8nQHBVU5OIDX8dCPA95PjAZ0B0TlDn9sWivk8ezo/cLJux7p9n0B9vRej+1Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.16.2': - resolution: {integrity: sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q==} + '@swc/core-win32-ia32-msvc@1.16.13': + resolution: {integrity: sha512-+1b/3xBNuVbpnJIZUCAaSdscOPYRWq85eohKx44y/3qbPp56UMiCJWBiWtyr7K5F1nf1JENXm2IBSEJaLgWq6Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.16.2': - resolution: {integrity: sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ==} + '@swc/core-win32-x64-msvc@1.16.13': + resolution: {integrity: sha512-6kEJhYshk7OVoVIWryiHqjCNuwZeOlPTS6et+bKV/WhtHs8fLA01wyTLrQGi+4ultgRe/o0M4b25K/KKdvl0dQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.16.2': - resolution: {integrity: sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw==} + '@swc/core@1.16.13': + resolution: {integrity: sha512-k4uUsIMS0IwOKVsrQs48IZK75O4roV3FnuJEdL7ES+DFESftdgvz73QBqN3VUAbUmUr78We4tzG0kgYj36M22Q==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -4624,8 +4544,8 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@tanstack/devtools@0.14.2': - resolution: {integrity: sha512-8FVVmDU+x3iEwrl5rtbIhud8gwp9eSXPlhs36SCV59yAtXmheFFvLqLAUXpfIU79sZVBg3LLTy2VlTIXaWbaBw==} + '@tanstack/devtools@0.15.0': + resolution: {integrity: sha512-KyS7Qi82Eq9yG8C+uae3ikAPb+D5rfzVhvOOjXVAHZ/64s6TWJlDWpREw1FrHIYZaI7paErpsExSSKlF5BKA/A==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -4640,22 +4560,26 @@ packages: '@tanstack/form-core@1.33.5': resolution: {integrity: sha512-3dfx9MBP0aq5sXKteikG629X9oviptrQj0IFRk9YGcb+lB7Kv5x8S17oOSk1wUWgjQZ4xVJEMbKwOAODymocgA==} - '@tanstack/history@1.162.3': - resolution: {integrity: sha512-zZTDxZxdDxZudHXGp42d221R/sEKoQPbZsW2ezpdWknHpOmJVLyiljW21pdWtKXfMnLq+Kg5VJpVBwOe18+ZzQ==} + '@tanstack/history@1.162.4': + resolution: {integrity: sha512-utTS5L2OkeYUzXGohL1Z8sefu1GLNOJcxe8Hd6iIdc/Xo1K1nDB2JEp4iSFhvYh33xKC9V91TxrS8qfrpoKobQ==} engines: {node: '>=20.19'} + '@tanstack/match-sorter-utils@9.1.2': + resolution: {integrity: sha512-aPkUQctDzpXLSWhlx7jUDi3mInsI18xcnrK1hvIyIa88ab1ax88cACr7xU+BKMCGB4NZYNwh4SoNSEbv3RY2NA==} + engines: {node: '>=20'} + '@tanstack/pacer-lite@0.1.1': resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} - '@tanstack/query-core@5.102.8': - resolution: {integrity: sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==} + '@tanstack/query-core@5.104.0': + resolution: {integrity: sha512-JrC2r/JQlXt7khBSdUpsgxNvybzOg+aITa+ARRMlP2AFo93Y8vIqz077rp+e61mJetSZ0T6AJbwW1JHer1vrPQ==} - '@tanstack/query-devtools@5.102.8': - resolution: {integrity: sha512-ZgeMKuF5d/zOE+tgWm3cSbD6Zcbr6IugVsnbHzUcSismqLZDSUPBKM6ILUxExgwe6rPAOox2x5bA5T+PSOQG0Q==} + '@tanstack/query-devtools@5.104.0': + resolution: {integrity: sha512-snKyFLVFC5LuNoyUTpyqCD2Z8cRlCWrAeO3xub0nGi81IMz8YAUWq2Z+XdpGSGT7bCxqVdOHUjyiA3CtDuBjfQ==} - '@tanstack/react-devtools@0.10.12': - resolution: {integrity: sha512-dgoz7TFm97Izo/D34z91PD0h+ufk+eBmoN9OgRHJlj/c7Ol5xpIP7bqLBNByjgt5paRE2eSu5AQHV92Ul+G6iw==} + '@tanstack/react-devtools@0.10.13': + resolution: {integrity: sha512-r0cdB/14+st2Vxl/1Bodlyq4VC8pf9SykLQDYbGHDc1+V146WQo5B3KlYLkfyxD9Q/6+9NPRQHZyl8fvZVMdRA==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -4672,55 +4596,56 @@ packages: '@tanstack/react-start': optional: true - '@tanstack/react-query-devtools@5.102.8': - resolution: {integrity: sha512-QKb7A44BZOU7nxsGA4gFN1fofjYovar5O0T83Ff4Y+2eRq09RGFrAzzutVdF/6/emfSaMDohp6e759BjB3fxEw==} + '@tanstack/react-query-devtools@5.104.0': + resolution: {integrity: sha512-E3AfuGqrdyaamuRV3u8RFWQlkZxk7OQa9MJ3XLF9SEHFRHyTUnlHcAQ0hEpDYxNsNFKYrheiRpDKlYaG4vkt7g==} peerDependencies: - '@tanstack/react-query': ^5.102.8 + '@tanstack/react-query': ^5.104.0 + '@types/react': ^18 || ^19 react: ^18 || ^19 - '@tanstack/react-query@5.102.8': - resolution: {integrity: sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==} + '@tanstack/react-query@5.104.0': + resolution: {integrity: sha512-e1TZmDCQnWIfiDVryIHeA6Idj+Lfx1hORLOhXS/l5wcgvtVD4yYqbTDl378sGQKIi2cSgb0TEMC9cKK8GGoJEw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.167.1': - resolution: {integrity: sha512-pjfGrmjj4d7naEPM7oshqFfwBoxDPNo/UxltlHH5ePbHsJ+plBhd+JaAewm1ueYOjZ0js9hckjWWDYXpCrSfKw==} + '@tanstack/react-router-devtools@1.167.2': + resolution: {integrity: sha512-VuoqB7OhDUrBa4WOFSKiAQ8xI8sJpeZdo9sYE1hQa89iMuVFUQu1iWE4iCiQhB+6TYOZDZ9e+iHKxYjop4ZVYw==} engines: {node: '>=20.19'} peerDependencies: - '@tanstack/react-router': ^1.170.19 - '@tanstack/router-core': ^1.171.16 + '@tanstack/react-router': ^1.170.36 + '@tanstack/router-core': ^1.171.30 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: '@tanstack/router-core': optional: true - '@tanstack/react-router-ssr-query@1.167.2': - resolution: {integrity: sha512-yRvy0VJ00R8huPuquk+qyYQGMpYRc/G33mc6/yZ4f7LaBZz9h/VbACjmLzhm/+6u5WSmUt6ouJJZnI1/5Npfag==} + '@tanstack/react-router-ssr-query@1.167.3': + resolution: {integrity: sha512-HA0pxuPuhU+rwoe+z1Xcbytuoo6ZbcROpgNgNSm38s3/hGLmgzOBLzDg+Vyx6ex26QilnPbZ+5Ypet5mImm9bQ==} engines: {node: '>=20.19'} peerDependencies: '@tanstack/query-core': '>=5.102.0' '@tanstack/react-query': '>=5.102.0' - '@tanstack/react-router': '>=1.127.0' + '@tanstack/react-router': '>=1.170.33' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.170.35': - resolution: {integrity: sha512-MiqKL692aSOFsbtEts5eFjfCixxrej+ko+gA2Y85gmWdxolgtfcBPOdJ6tMSi/zFePqwwPLo+CVSUWu/qXu8LQ==} + '@tanstack/react-router@1.170.41': + resolution: {integrity: sha512-Mpvw8Wm5MGDbTqI8Yc9flLKxbOHwoWocv0H2aGKcgw2a017oK5nZWqa954P+DrUx/8fI98YNywnHP5XcD3tQ9w==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.33': - resolution: {integrity: sha512-cGA5rm0vCq6afh/yZgO0AT7Gdn02V+7NLVRUMuyHOilcLN7FPNmIO9Ndyr48cq4hxwPV2OIYdYNC6KdHCUKIKA==} + '@tanstack/react-start-client@1.168.39': + resolution: {integrity: sha512-Uby0uo37JlQgUKHU0snDwH9nYiEeAjm9+7pUOFgycU/UszEILC2SO2DSCoNnCMuHKj9z+4URKzBYIP2exT9+wg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.51': - resolution: {integrity: sha512-wsZcglJr30uJjNpmTev5SFQT6kF8IAuxykC0jNCwtka8VODJUEy5vamyT3isKmDG8iy3TFxSbH6MUjg8GFF6rw==} + '@tanstack/react-start-rsc@0.1.59': + resolution: {integrity: sha512-M2Lqxkk5C1zQncQs5paqX+/OLdOht51pg6D84YfLMrNsjhU/nzb6wd92MIja0mi5i23+L+fxLLjQYR2DObjBlw==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' @@ -4736,15 +4661,15 @@ packages: react-server-dom-rspack: optional: true - '@tanstack/react-start-server@1.167.40': - resolution: {integrity: sha512-AjXjDrdknkJMXSiJb379fg7z4TcDyoPEDtG0cWKXEPPwgh3t0ZuxpJf1Ot8yNcM5wOmVAQV5EYngUZrurrS2CQ==} + '@tanstack/react-start-server@1.167.46': + resolution: {integrity: sha512-K7z8xBOEdp8u5CZCxWrbS0tFtk5XZGMdhssLeZlRZKlLDbX7BKLdMtJ7th5sR6QVt9MTUAg3LcoqvJMPSFF+lg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.168.52': - resolution: {integrity: sha512-Z+QmjoAtNyWDKLrjtgcrnTuKdnhomLm5LUxGcyVOYRELeaaGJ1b2aexxjt5hy8rguwOJp/2tnSjlLHAQ6Feihw==} + '@tanstack/react-start@1.168.60': + resolution: {integrity: sha512-WMOM0Xlh2lPbVlbjYM6uOxOpiaWRPvODm/dwkLsGKq5tjyHOHZmKckJgwlrZl7OQUqFlOZHYj8bKUTgoeg8cUQ==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -4760,47 +4685,47 @@ packages: vite: optional: true - '@tanstack/react-store@0.11.1': - resolution: {integrity: sha512-HaIGKI3YLmjBYIvy5DFDY23oNaYZIsTZfngey07Uh5iLVJgM3bIGCnZeOFOqzjFld9JHWcaHJnasD/bKoGKwJQ==} + '@tanstack/react-store@0.11.2': + resolution: {integrity: sha512-oj5O5DmiMWE+ih+SioX2ayC1kbK7d3fpLx0B75fPJr9nY3zU+hoW010yr64qXsY/9fyiLVE2bn5mGNV3owm8RQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-virtual@3.14.10': - resolution: {integrity: sha512-SRyoUbdFMRHuYXMijV5H4ZarQWpXkj3iANq8OFre+pybeVap8ZJjZ3Nz9bVjx4d8PfobVUQUdKyyyHYk3E+djw==} + '@tanstack/react-virtual@3.14.13': + resolution: {integrity: sha512-JbDTAwtzZ99aOeCrAfW5EsE5KSq5RWh6Af2dtFwyLIIk48Ja7vm6n4axu/43T3vfjFnEGJalxJ1wyYjSQD6bSg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-cli@1.167.35': - resolution: {integrity: sha512-ciAWfn1f45iCXkdKr9dZb6xNiRj8D7CmP6ZRjOBjARkzO8uGuGBWh2UiRIiQ57docyx3+jP9DslaG5y6pEF0SA==} + '@tanstack/router-cli@1.167.40': + resolution: {integrity: sha512-KKX9hedstsc0eEKfUAwrwy7CLNXdSxjiBBq0uojnjMnOnraRXP9Nf+x6/ZsAultxHp7NhWfYddO8VdT0zAtUDg==} engines: {node: '>=20.19'} hasBin: true - '@tanstack/router-core@1.171.29': - resolution: {integrity: sha512-tBXJrU4rDl+UsfTvP/WM1pcQ+fXk4rb2uuK/FMw29JNHEkFdEbptA0yvk8vkNjooTF7DAiTUrZMf2H4X7eGt4g==} + '@tanstack/router-core@1.171.34': + resolution: {integrity: sha512-X+19pGuuLVPvvAvPYw9v/+ktRk5cCll8AtfpBpOhDRmVgUMrfqze0467xtq8YRVVs/mmo5rVtWn/7Tp32RDBKw==} engines: {node: '>=20.19'} - '@tanstack/router-devtools-core@1.168.1': - resolution: {integrity: sha512-qr4voa4cpSMwQvS3867xkU3AB3MtJbTuovKIy+btjJ/Faju6er9w0nDylmD+005Mk/3YKw9/iueZJl2JAB7JOA==} + '@tanstack/router-devtools-core@1.168.2': + resolution: {integrity: sha512-pCCdQ5M/NUeWdiAbPmjyfcNdls6G4vaVlIQbPf1IqZk1FLYFr00aQvi578yUuWFBNM2KNS2QcwM1uPucbtGf5Q==} engines: {node: '>=20.19'} peerDependencies: - '@tanstack/router-core': ^1.171.16 + '@tanstack/router-core': ^1.171.30 csstype: ^3.0.10 peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.167.35': - resolution: {integrity: sha512-1Bfvhon3+4khnB1E1+p9ub5diTzSZ782FiHipGX5wyAPOKdR5dQ1L2XGuZ2BCJQCynhQNYSW2CVJ5DvRHVixlw==} + '@tanstack/router-generator@1.167.40': + resolution: {integrity: sha512-WkEueqEvsBBudzO0fx1nWfOmRNW8OAvBoVABTGls9bAWzjdC+KDGHvjCNrvn88ofs1F6gqL8aWnzKCbxW3dCyQ==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.168.37': - resolution: {integrity: sha512-LO+HAUnFGuC/s2zz6I7ZlSiFroq5obhNNJrkvn7+ALakXfMdo8sOvSqhdHgFh+3Em5rTpd+HVBgbSqLWsgXnTw==} + '@tanstack/router-plugin@1.168.42': + resolution: {integrity: sha512-vAR5WXJh/ErseEWQftDhsJcr2c++ucRQ6FbqN3ygMO44+ZxxRfW3sIpZmddHROVSmBk8jc6MrwjTPNjVhd62Vw==} engines: {node: '>=20.19'} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.34 + '@tanstack/react-router': ^1.170.41 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' @@ -4816,27 +4741,27 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.169.2': - resolution: {integrity: sha512-7pO65Aiq/1+aS3Mb6vSGtIjzQ/YGv9JTfBbn2EYlHcZnJ4s4ZGCeTPI847geB1RfJqVhfwxM8bZgGM51mYkolg==} + '@tanstack/router-ssr-query-core@1.169.3': + resolution: {integrity: sha512-0EE3mFa753mExMJEfWhZMi+EKViSLmZHoiYADZJzr5+2S/T4T12soHg8fMn67jCvDwL2dpd1mE7aL/XXzDPfhA==} engines: {node: '>=20.19'} peerDependencies: '@tanstack/query-core': '>=5.102.0' - '@tanstack/router-core': '>=1.127.0' + '@tanstack/router-core': '>=1.171.28' '@tanstack/router-utils@1.162.3': resolution: {integrity: sha512-Icb0xGuG1+54IV0WMLRcc3ErTx2HeJWyPG661FkQ8UT6guoBq1FJjFRqlG/JS0xi4mFFkBhvwO7tbLa32f3yxA==} engines: {node: '>=20.19'} - '@tanstack/start-client-core@1.170.29': - resolution: {integrity: sha512-iFvGfrPQ6cNz58/vKndp0xH7XOWtnEE2t4i72PEURyk9CqHqt3/p4xJz8SSlF3IbNtco5zwlgDFm+lmdBkavmw==} + '@tanstack/start-client-core@1.170.34': + resolution: {integrity: sha512-LfwZSbau2MLLZ/uPAoO+NC9fK3J66c0wLhnNQqIa+Goqw7bXPjkHwlsjY7evlUz1AnyhhQ1Qab95v+VmP0TZ9A==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.162.0': resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.42': - resolution: {integrity: sha512-GP7J8BXRpSQnfqjbsVOqb7HnV19zovEIuxqBGzqfdswxV8g8waY9RaJ5lNgqEYesl5oNVrhT4fEnLMqR0nSAfg==} + '@tanstack/start-plugin-core@1.171.49': + resolution: {integrity: sha512-HPOb7LnMc71k38cd5uvMybPPUU/Q/56KvSqQzSWz7cps1ZDFXaxUM6EFaFHLCdgTWqGexNGDdRE+sUVPVBM4Xg==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -4847,26 +4772,26 @@ packages: vite: optional: true - '@tanstack/start-server-core@1.169.34': - resolution: {integrity: sha512-PcklLTiXADE7bY3J9YBde5J9YQVxI35MWZoFR6A5VOHjMRa4XX5VouOfNq+s3Wb0t5VjhcKCcpfpSqhjRmbPaA==} + '@tanstack/start-server-core@1.169.39': + resolution: {integrity: sha512-pqqkxhXY46nuFSYt6TsMGyABiplUzHFHndKAlRRGC0fWDrJCH1koWxVMoxySa51ZETV79f/z73b5UZ1jfIkXwQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.167.31': - resolution: {integrity: sha512-OeehwY3ktOyLMzGF808nk9QDep+Qk/HgWxayE84gfFcycGI4nZ2A4scU0SEo/G7gnba6Sb2DEBI579j2tUOYmQ==} + '@tanstack/start-storage-context@1.167.36': + resolution: {integrity: sha512-x+xCXK2GtFzY6NbXqAg8YpU6cwAjDfMeYSNzxfGzntpjbwBRHHrXeC/kYUnBBQCV7wK4kJ8vBBQGP0OyYTasUg==} engines: {node: '>=22.12.0'} - '@tanstack/store@0.11.1': - resolution: {integrity: sha512-mzTOBhypOuDJAy/D8n2MfUZ1HFkXnmSETviRyhqEC8LUE7/IZQExOTxMANj3KjTofYTkFNpBY67qaVrT41YccA==} + '@tanstack/store@0.11.2': + resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==} - '@tanstack/virtual-core@3.17.8': - resolution: {integrity: sha512-BfEvehNpOT75r5Ksc5xW6NZuXujTfb7nlSEyVu4XHG3gdxNg1KqXruWbDewXOUaUYIo4oRbSfkjIajz4MAT8tA==} + '@tanstack/virtual-core@3.17.11': + resolution: {integrity: sha512-+ILjvtHup6Y2hzQ6YzwMgX1Q+oQpxEGOXCEsCNaPoIP0VxMbizIBTmYTDtkerkIQS8/CbP1BRuyt8V/8BCsy1g==} '@tanstack/virtual-file-routes@1.162.0': resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} engines: {node: '>=20.19'} - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + '@testing-library/dom@10.4.2': + resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} engines: {node: '>=18'} '@testing-library/react@16.3.3': @@ -4884,227 +4809,227 @@ packages: '@types/react-dom': optional: true - '@tiptap/core@3.31.3': - resolution: {integrity: sha512-Cz50pvciQrxdSxgTkHOVz0uD0Yl/8Xt0QatGD6ILm47jW8EzyHR9RkUGs/D5IqzXKuVPntfw1ttaT926vXfiRg==} + '@tiptap/core@3.31.4': + resolution: {integrity: sha512-cIVUQYBycighzsk6GbmCef8ZiEDVxoT5EuAe4xg2q9dNkDqCXVqI4YGr9aavCQEiAS4uHiRwqvcsPqJHipFDfg==} peerDependencies: - '@tiptap/pm': 3.31.3 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-audio@3.31.3': - resolution: {integrity: sha512-ebkcG4s1j4AQJozXaW+FQuoHCP0B2KysJd8GYJyFeIXt6IT7f40+AyVGqD9//CjdmjEbU4JlmLCzB3J+mZJKUw==} + '@tiptap/extension-audio@3.31.4': + resolution: {integrity: sha512-99sFHIhAQEHwZ01HTGGVUw3BAEzieG17kHmrnbYv6u2eZ4bA2VbJhF9VNMCbLsB4X8g30BdZngMVc02XYIQQvA==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-blockquote@3.31.3': - resolution: {integrity: sha512-fyY2XMbyDDDfOTQ1Qdrnqa1qwC9DWE4n7AfE0EKQI0G8MfLV8RaDlLDcOZDJ9JbMPY7/Gx7EjyK4NKxSW9n2hQ==} + '@tiptap/extension-blockquote@3.31.4': + resolution: {integrity: sha512-FHnbvCIW0eDKgUUFjmvEB0ax9YUBW7/Unm+38qpuQROvU872yRqhnDtycKT9IKk46jNdjM4A4fAGUbge10CrAA==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-bold@3.31.3': - resolution: {integrity: sha512-dIuYhKk8TitKU/FeDpoTeWZhU42YgDN5npgWNjAmMmRktPdoxnH3/wGSiwXlqZgJWjehN7kPWDePWpJeAImGpQ==} + '@tiptap/extension-bold@3.31.4': + resolution: {integrity: sha512-QX1xoXvO0gz6uVsoLegumqQ4MJXL7lcUDQZ4J7la7LBqiIh4efrCmp2EXbhpr37M/YQL7w8q3g7H/VovSh7xIg==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-bubble-menu@3.31.3': - resolution: {integrity: sha512-EV6ZnwKc++2OM/OcD54n8s1B7C9LP7GKAtdEPwu0t3BYJf3sG8Ueoinf7SgGPO9oMPg96GneOkDNm1urMV167g==} + '@tiptap/extension-bubble-menu@3.31.4': + resolution: {integrity: sha512-Ml/yswuys+3QkOMajfXyAGlUKCxEbT3dMyF8vHwQ5mDk9MDm+dqp10It5CrDBkUT/KkVTa6AJI3kb0TXZJZiAA==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-bullet-list@3.31.3': - resolution: {integrity: sha512-qEyyoPapPef4LO8XKaN83bxtaNzkJ4kFn/IxLnEKd4BJ3Mvi4MH2yJYlyDqwFnMoev4pMA1zBHRAt/C0THRmZw==} + '@tiptap/extension-bullet-list@3.31.4': + resolution: {integrity: sha512-gHn1RDR4olCnmKpH+G9x+f8R+iKPNVdLlvbFkIpR/stjabZi7fB4Rr5GiHWsulbtxAjdQrNjnVeNdGM4rBxApw==} peerDependencies: - '@tiptap/extension-list': 3.31.3 + '@tiptap/extension-list': 3.31.4 - '@tiptap/extension-code-block@3.31.3': - resolution: {integrity: sha512-nvknt4FhyJQjYcvxptmeUlFsIAc8ibua3E5BN4Pim374/9RWepH4cdE9X0/qUTtguHElLx0iKtSIY3rW2qGTFA==} + '@tiptap/extension-code-block@3.31.4': + resolution: {integrity: sha512-su/B/cfQ1HpiHl6JfJ6wa+RVEptiYsV4dCntE8XQNj2dUcII4y6w6PQbbswOoDrU79uXHsAvpy44215rghG4LA==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-code@3.31.3': - resolution: {integrity: sha512-SzxOqchrD2AcN3uT67PjKmRFEMOU3vNNiwNaamZJUbZrI6Hmy+bvdHJrc3jrIddyyCrAtsnAfRI0cmorW1jGfg==} + '@tiptap/extension-code@3.31.4': + resolution: {integrity: sha512-pzi8GNDs5J1DEoO1HNYiJ5WZpgOZzlc/2VIa77mMpEuD4hZxuK0BQzlF/O6Ps/O5P1lGJT4xS0Yowpzb9mD9RA==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-collaboration@3.31.3': - resolution: {integrity: sha512-JAwOXjeeDYghrPcK57dtvxwn06zcz50mxSSk4PaSdLxM8tkw8+udx+51ewqKKd3WlFof4zyMwUEbO/DGaUdEvw==} + '@tiptap/extension-collaboration@3.31.4': + resolution: {integrity: sha512-vIGuBU2oV1jIr0zGPdWc1qFo4NrzObktC06s8Z0zYCb59hm3lfnYzw0w4R2i/BYjjoKRgpiDVYweGAQHuLT7Vw==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 '@tiptap/y-tiptap': ^3.0.7 yjs: ^13 - '@tiptap/extension-document@3.31.3': - resolution: {integrity: sha512-EexgmqnyDNyGlISxo7SMrp5MygpJYmqD+0cY5jB6L1U6L4CpKKRWUt8OO1sWzEHDE1+TTvwt+WIFoIWAziOtEA==} + '@tiptap/extension-document@3.31.4': + resolution: {integrity: sha512-vT20u62RWR+BLIyNJ54e24MPUY4zm8VF7tcgJnxQXi7BgVJWcNMtMWWDIkPJ4JNXwfoIznKh3jzYsaYmbCJgQQ==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-drag-handle-react@3.31.3': - resolution: {integrity: sha512-Ri0sRSvKmOkXDgLlw6bSOC5aAv+TCyjZkRcrP0YnJ9AFq3CFOyNhpiWFim7GASU9O+o6CcDpekm+01aTTuO7rw==} + '@tiptap/extension-drag-handle-react@3.31.4': + resolution: {integrity: sha512-H2vV05ymcfsoN3czDlb4SGTbtGwvYHXwHCQ6fF3qmVgFt5O6cOQZo3ruxeBUAoRJRxyiYoiKnd1LvKgQaMaWFQ==} peerDependencies: - '@tiptap/extension-drag-handle': 3.31.3 - '@tiptap/pm': 3.31.3 - '@tiptap/react': 3.31.3 + '@tiptap/extension-drag-handle': 3.31.4 + '@tiptap/pm': 3.31.4 + '@tiptap/react': 3.31.4 react: ^16.8 || ^17 || ^18 || ^19 react-dom: ^16.8 || ^17 || ^18 || ^19 - '@tiptap/extension-drag-handle@3.31.3': - resolution: {integrity: sha512-2WOcg5wbGTJNlzLzdaw0IQgbzObjs2k55ZYZito3WRsMKZ3BPJK8pj5GOYKnJ7dm6VlKrpP7WmNq3HGpxe5GOA==} + '@tiptap/extension-drag-handle@3.31.4': + resolution: {integrity: sha512-UiHZNmr3fU/YeZxVyMyFTbb/ougIGSX0q3BkiCE0l1JPARhfYEsT6oULP6IC3tV8qnZHxiAZBSLlwRuJH0vuAw==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/extension-collaboration': 3.31.3 - '@tiptap/extension-node-range': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/extension-collaboration': 3.31.4 + '@tiptap/extension-node-range': 3.31.4 + '@tiptap/pm': 3.31.4 '@tiptap/y-tiptap': ^3.0.7 - '@tiptap/extension-dropcursor@3.31.3': - resolution: {integrity: sha512-NWomSfu5CSC7VacnMSDzKT8qm66SzMfZwVPEtwY5bPpRTJgTiT1rNK0neDrrzfMN27MfylGyKWWf7Q5Qf8w/fg==} + '@tiptap/extension-dropcursor@3.31.4': + resolution: {integrity: sha512-5TbCPCC4RL+QT1NYHjXCYDBHBtVqYOFvFEnk3v98lvXCM2PNL13ofXUfJPuykAVy1OdTAx4DlZOQAD9WKy/IdQ==} peerDependencies: - '@tiptap/extensions': 3.31.3 + '@tiptap/extensions': 3.31.4 - '@tiptap/extension-emoji@3.31.3': - resolution: {integrity: sha512-qEtgbYifQ4ehbcn+e4WIxpaxKG/JaliaZ/J9bF4PETzg/EDocn6HDWVeTd50mEwTRyRZSTk+Ghb3IJj4RIvTjw==} + '@tiptap/extension-emoji@3.31.4': + resolution: {integrity: sha512-5kLYE0O8QsFLu5lfS2wsP0KPFmQtlveVa39bmw71qrJ6obzcSwy8sOE2B1ypuSRsqq5HaJfIZaARoXJGiyTEhw==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 - '@tiptap/suggestion': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 + '@tiptap/suggestion': 3.31.4 - '@tiptap/extension-floating-menu@3.31.3': - resolution: {integrity: sha512-rd4VJ9PGSP9Eop8ZTEwaLZcMzMXLuJKe3hUNf58rq+zANpwM+9fI+vB7g9MAc3eXwUNDxNDVACFIL2oeBqpQ3A==} + '@tiptap/extension-floating-menu@3.31.4': + resolution: {integrity: sha512-pKzulkDmolpVt7IP9FSPsC5pKbXQ5pyeqkaAYr8cyOVW+KUObpPRIzAuXvEso8PCjWgwJ1f2qyishOEMw8MbfQ==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-gapcursor@3.31.3': - resolution: {integrity: sha512-EBXKb1FrVStsNYCcRGtd9jmzveCvR+eqgg1rVqoONrqFK6U7bga6LN+1dMKroP1kliDVgveYkP3vRYxqw+rFqg==} + '@tiptap/extension-gapcursor@3.31.4': + resolution: {integrity: sha512-hBogUAepQH6IQUhaePhPWzQ1Oeu+yqlJVMKO06Eue5m36uRy1PZZAQ780pCGT0SC4R5MH2td1N8EUQ7bupQdDA==} peerDependencies: - '@tiptap/extensions': 3.31.3 + '@tiptap/extensions': 3.31.4 - '@tiptap/extension-hard-break@3.31.3': - resolution: {integrity: sha512-QAdCvNO4+yW9ATwsrej11NTkDYFqPLIEQr3ARNrKOK1qaiS7A0fia2SEukb/hrkP3A6mbozhoQt2r2RGUf/DpQ==} + '@tiptap/extension-hard-break@3.31.4': + resolution: {integrity: sha512-oLNajLyUvRMg1qtzFgKGduygTlpaHFB9PU+M+pUWdA4sa1bRnxS2Y++Ao4lHYopJ7nxatLndrYoCIHkotqkPDQ==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-heading@3.31.3': - resolution: {integrity: sha512-rk5VHMAeQcg06SLauN6EGdD2jc0O2qY8QkZYPd0LxNvLblw2BxBx+lxUQSYwLAT9Ie5914gKIK2YbRyO2Ts3ig==} + '@tiptap/extension-heading@3.31.4': + resolution: {integrity: sha512-KqlSeLathpdxCc3kVHBCA/RkHvb+V7u5vgiSEu1Cv3L70r7F19COMGODav/k1AGYBgEXKL6lM9cy8cloE5/28g==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-horizontal-rule@3.31.3': - resolution: {integrity: sha512-YnHGy2KShRwvCseAmmxl9VP7R0qaj8QMp3DA6DJWZqp7r5gLGvDkAqhedxqqefqsE4Y43hjkBdjtB9Ce78LkIw==} + '@tiptap/extension-horizontal-rule@3.31.4': + resolution: {integrity: sha512-ws0Kh8kfHL7ESILSXj0HJAXs8G10ewlW1sedXKm8dm0op9L8il+xl8bEJVoqG/jMf77900Fc2CaQldcCGRpF1g==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-italic@3.31.3': - resolution: {integrity: sha512-ibGvdvAPyfxBMUVNRI43eb9h2/Jka1MRG5GtnGqbcCX/2+Y/y0EOfFrPQPkuYphiWQYyu9+FzPKMB/pjuaLuKQ==} + '@tiptap/extension-italic@3.31.4': + resolution: {integrity: sha512-pftTQBPYZocNDAj/u6OyDIp7YxmN0+N895cQPogJQ6qMHdLiRhzgawiEewJkniyN1w8k3Wx/Etp8pTKrxaOOBQ==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-link@3.31.3': - resolution: {integrity: sha512-986wOQzTL9Zr5lf84LCLpm+YOms8A0K39/8DVoqRfebqcOe0/eq4bnztmAlfabOd+kJY92g3AgZERFUx/w+dcw==} + '@tiptap/extension-link@3.31.4': + resolution: {integrity: sha512-LLxW3qfeL9gvDdMPVdxYFYZ0zZSjsoIDhOqjJ5U2UfaK3U2iwkKTBgV2qT+FWf3uUHmBRjBZ08q3dRPmWBAD5g==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-list-item@3.31.3': - resolution: {integrity: sha512-4QlKOriJJMvg95QJTEsy9BUYPBQ6UvJyb8WURRwdUtQUkkqb8h32lg/eyQUv2FzW9IT1AdUyNZfVaxH64kRfQA==} + '@tiptap/extension-list-item@3.31.4': + resolution: {integrity: sha512-ao8XAPvhOrtGFILs+fKtOM91omDSpUC8X19m44gbaq5xJDVpIMZ0rP+NAVUS72G7LskhcHa0bu/Pm022bUVjVw==} peerDependencies: - '@tiptap/extension-list': 3.31.3 + '@tiptap/extension-list': 3.31.4 - '@tiptap/extension-list-keymap@3.31.3': - resolution: {integrity: sha512-If8UOEdDZbPJU6iYTvLtH6DOp2KBy6BKxg9UELL1AevVetGHEF/7lW8hP50Gn1tHMVpPRqmhSzVrJRpEJJgb/Q==} + '@tiptap/extension-list-keymap@3.31.4': + resolution: {integrity: sha512-etdkl/YnYfwtALDxecJ+4WYgJAez1fn1vzzZqJklZBpgqiZtny3NxpvWS7/JhsltNG84Wo/oovpfJgVmzhddrw==} peerDependencies: - '@tiptap/extension-list': 3.31.3 + '@tiptap/extension-list': 3.31.4 - '@tiptap/extension-list@3.31.3': - resolution: {integrity: sha512-LoveGnC0FVdCV4jUNBaG1ZA+KWE07+adzV3kGy6uUYFcJEjbVUHTnPDrBOob3IwOSO3sCwIkvQb6EVYeXn/4yg==} + '@tiptap/extension-list@3.31.4': + resolution: {integrity: sha512-Wd4YRYxOdf+TtF33/QsRo1RK1CecVxjYGjUBIKNGHAywfh8tghgV4YOUCiV1iJqYt2IBs+RWlIqTmdIPzBrd4A==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-node-range@3.31.3': - resolution: {integrity: sha512-8/CKctvTNmzkPkqC9wxVY4TVhOax5WkqiImkvMb3Qv+OJgKC0pTlAhSS+ks3YYTbbmJuCYvHef3QuGiwRnu9gw==} + '@tiptap/extension-node-range@3.31.4': + resolution: {integrity: sha512-PctcI8ru/69CoOtWNtDt6HHxqIvX1zqzK7Zlt+mehdMCXOXLedHBvh4SwuqP19X/Vdzdm+OH8bHlnT+MGd0liw==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-ordered-list@3.31.3': - resolution: {integrity: sha512-mp3g11NgA/PYu8rj7J7Ez3l4qBy6WfTSmHIG4PZvEGG5w2oUAIkgb9DU7nPPzjmeme27oazFYZw+AtZA0+u4tw==} + '@tiptap/extension-ordered-list@3.31.4': + resolution: {integrity: sha512-UNWyF+Dhm08znszIMnT8Y2kJ1lvtiCvUGs1aG7m9cPHxDa7VycWnOqdtXWkc+6xRLNiC0zgWCFWgLLHduV8pRQ==} peerDependencies: - '@tiptap/extension-list': 3.31.3 + '@tiptap/extension-list': 3.31.4 - '@tiptap/extension-paragraph@3.31.3': - resolution: {integrity: sha512-+iPku7wJfy5hbNDNLX8dveFtYVsZMmh7vztjuq8hT3mipSC4IByDehDbU8fzUCjfXiEzmI7mQn7c8LGmHULuzA==} + '@tiptap/extension-paragraph@3.31.4': + resolution: {integrity: sha512-WZlBgw+XVKXerRlmEsoQ7x1PwSU+dh3X+b70+ViZsLebdfsmmYBIaNDrvIGwG9UQr5eLnddJnZplMSTI2YKs+g==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-strike@3.31.3': - resolution: {integrity: sha512-G29bhKttYwcKHT+BI6emWVFol3RO/gUXxQVcmr/iT8LXXy7j8J6HFUnsKM+Kg5YlP1rxMRgsa65dbrQVahZi0A==} + '@tiptap/extension-strike@3.31.4': + resolution: {integrity: sha512-4MBr63TJIMqxCjE+gAPdlY1IdELgvbAP516K3Ntn/BkcpEbEoPMEYVz+XTxULyHQEuARDO6jsXPPxRXpA74jaw==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-table@3.31.3': - resolution: {integrity: sha512-7cnVPHhdiGGeauYqca6JVyPLTqZbqFEEk9nn2e2E8+fBo6zVtV07AktJBqth/XEzjZxcUmGxjoeuWYAisWjUHg==} + '@tiptap/extension-table@3.31.4': + resolution: {integrity: sha512-ai7DLwg/xmhlUas3LgWaPQdPlZ8StliY6Dn+iUH6eyZ/TQqRDY/oeIsKWaHpXq22T5M5dMlZPTg172ZdtwKswQ==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-text-align@3.31.3': - resolution: {integrity: sha512-26BJ7c28EyvHzJovNpuenKiIgfRI4KsT/OjBB00y58MyZ0kRXc6dwZVclw8y66clupKTLTWYCDUsy0P/xHj+cA==} + '@tiptap/extension-text-align@3.31.4': + resolution: {integrity: sha512-Z8x/x2N4BiFwu7+UfJABT/OQbwZPUHbmvAH6Fo5lefgeIlTwAXFBzz4x7Eeed7iJAcXUzOnyd6bmkhK36gYJ2g==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-text-style@3.31.3': - resolution: {integrity: sha512-wgjWWrjZwRZHiaDTQPX2am1y/4ePgRgGWF/2MOfSb7g4d5229p4aVtbT1JT7wu9z8OC482pEqcTlhdvgftvW7A==} + '@tiptap/extension-text-style@3.31.4': + resolution: {integrity: sha512-djeemliEWmqs3cJrUyMG+17HbjHyf6D/0NkIHl/RkVHYOCX1AYMZ7r+XLefApSNBCAx/aFh1hJzaMlnGbnTaAw==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-text@3.31.3': - resolution: {integrity: sha512-gdsWtF+taeaCu6V+5Ct10fGo0ACUy1GnYtbb+mcathBt8OqbT+Ws60p/yEmKesBDz2Hn+B5IcWy6+2BBZl5ZTg==} + '@tiptap/extension-text@3.31.4': + resolution: {integrity: sha512-WL2ZRpFksgQcXJN05/UQH09YCH9LlhdLrSEcviASvEH/aAfsKiJlDrouN8PET+YAWK/F5xFc5/Q1z0xj+I23jw==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-typography@3.31.3': - resolution: {integrity: sha512-Ec2bsAR63dmiLD/5ph8ky3ptHWrBethbPG3a6p2FuB1VJ8LtlocCsDaXR5TvjZkUx2YQIaS2A+yzT5v7cumLgg==} + '@tiptap/extension-typography@3.31.4': + resolution: {integrity: sha512-PMbQCGxF2Hv3EPPq5AgBjjNsnbLhsPDiajb2AeMWZhDWt1l3qdVE6px9AaKxfKCsIqivYihfKWU8lxIzfV6HJQ==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extension-underline@3.31.3': - resolution: {integrity: sha512-HghdJaOwRqYzsAxqSyNyb+IWyOMcdCl8IoiBETA9BZCJAqdXzFLcuWp7CqCqJPam9dgkWosSoHqTCAO4nTBfpw==} + '@tiptap/extension-underline@3.31.4': + resolution: {integrity: sha512-0iFGPIqmqGkCrOFh1OPo7Dzv5s86dVN3bZaugsz0jK04otkb8bn04ZDKP2/6Wq+lcK0M9DfJ0QqfW5hC2nBZxQ==} peerDependencies: - '@tiptap/core': 3.31.3 + '@tiptap/core': 3.31.4 - '@tiptap/extensions@3.31.3': - resolution: {integrity: sha512-8sJNPGGUe8f3aDojcOW5cfVL7I5NrBbE0UWxG08qoi9Tea6qWbvQJsCR9tsrOapr/DaLr3kpbGZ9s1gEEfcNcA==} + '@tiptap/extensions@3.31.4': + resolution: {integrity: sha512-nIupIne/sHpV2Kw1M4MOmr4+G454KI8BXM5+LWKOU2EpzfALZWVSy7koF9lVRna4Zp5Gv8hfg5Z8kvmrYQvhkw==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 - '@tiptap/pm@3.31.3': - resolution: {integrity: sha512-sZime0SWsz/k62W2WvHx5Ig7G2h7kVhrrmnqy+wEgIHfDwEfOlelRjaWCiBCFlF7dxGUntJusCh9FxlLhni0Ag==} + '@tiptap/pm@3.31.4': + resolution: {integrity: sha512-x7dwth79cQp4QGae66/RJqMDJQv0+n7b7dD7cyFQBWqzPFLJxN/4paHY4qbWedZjNLhRyIOAD9a5q4AYM1zmPA==} - '@tiptap/react@3.31.3': - resolution: {integrity: sha512-QiwQqvaLFLm5EMFu5tg7nAgXJxCUiUTLD8EsK+TqVV5P4bqOoMOCM39khbhXTJyahCuYpiFWx5YOSDtC/JiPtg==} + '@tiptap/react@3.31.4': + resolution: {integrity: sha512-mBvvXgdPhMinT1NPfwHvFK1dFdMXHVWMSeNn0IPj7/zV0XBmOnASkEOwoIvl8NluKYEtpZBE1yA+6pN2enLa5g==} peerDependencies: - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.31.3': - resolution: {integrity: sha512-WKof9RewdmGHvWJ1wn0/HVNG2mV+HOgVRyJkKekuM9fgr6BZAAH/xZsWE1eon+94JnQ+KtK2ThydXQM/qc6b2A==} + '@tiptap/starter-kit@3.31.4': + resolution: {integrity: sha512-u7HIJ9vK6kFe4S4J2CIcDLrhRZzoTMSyU0XxjQ6lUNF7pWW3rMi//pvi8RcsZmxGjyb8CpXAqYgNl7f9WyaUeA==} - '@tiptap/suggestion@3.31.3': - resolution: {integrity: sha512-z1OQ/Yx6seMZehi1AcmNkyJ8qkHQzybArmCyRdmreS4YL9C4bPMBe5lbMfFsArYs+KD5JyHwps5j7J/YE5BIuw==} + '@tiptap/suggestion@3.31.4': + resolution: {integrity: sha512-J9WWMQDAzZOlF9VSdLohpxgrwlB1NscqvNhOPoS3WjwrzQqLj+FAvcchfJQcnybF5mYOtftFZexpOzOt1MqjUA==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.31.3 - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4 + '@tiptap/pm': 3.31.4 '@tiptap/y-tiptap@3.0.9': resolution: {integrity: sha512-7/El8NQ8R5V5MkdrOUdfj9IgZacpt0H071xNimX7B0AnYiWiKefQnMKd41neQYzo2MOXbWdN3iZ+7Z7BruzOSA==} @@ -5126,38 +5051,38 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - '@turbo/darwin-64@2.10.12': - resolution: {integrity: sha512-9nKgKoF6ZOUsM+or0OtNf+TTJSfGvDNP7ZFv/ZGWVwOSCkumyctQiTeHwB4UNljHTnC41AqylgbunLDHoccNrA==} + '@turbo/darwin-64@2.11.5': + resolution: {integrity: sha512-KdY4y7BBjIisl+jAkb3FFaRjClGqHyaeHCcVcCT8LBzFFwUu6thgfxyRZAx0uL4KoxLmH+iOan8UhVf/aDDcaA==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.10.12': - resolution: {integrity: sha512-H4Elb1jqTZVeIC9bbcNwjSzemZ6RegoTOVHeuV5Osirt2Z8UguTyisMEkvZjPVZgMeN9J4ERZBFad40tFnkb7w==} + '@turbo/darwin-arm64@2.11.5': + resolution: {integrity: sha512-ToZDGi2u410+TfRtC/O1/LpujGgvNJoRBZnwVXob7oO0+3OSlwIO3zofXKUvwQvlba7a8ZXPyCZwufjAXd7f0w==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.10.12': - resolution: {integrity: sha512-lr7KIotukvjZwEXiFSYAeOH3BWzjFVBbSzTbv0fuGFsNukYyH0+g1hB5ecqnJkgkYU+KHEMG1edOhnjiKON1wQ==} + '@turbo/linux-64@2.11.5': + resolution: {integrity: sha512-Ub2d/nAbdWLaSytcEaPp1wm/YuIvHEIqNrCRMI/UgOGyFdOhgxm8VyWPAJilQWRYxYVrqEUoy2K5S5K8SG50rA==} cpu: [x64] os: [android, linux] - '@turbo/linux-arm64@2.10.12': - resolution: {integrity: sha512-f0pZDTtvzB5SuNwuXBaKbZHUCMCukgc8nMlHEuvLmj91Fzec+MEbr3cAvGNor5htEDqZnO6Lxt9N/GPI/77oGA==} + '@turbo/linux-arm64@2.11.5': + resolution: {integrity: sha512-JQjmGxp724Wuft9FAxPMtmBur1CEdUyxJ+FVoIvKkgj63rXHl9PYCWrsU2tMjVi609XTQ3M8vZD9Yc9qVAVYrw==} cpu: [arm64] os: [android, linux] - '@turbo/windows-64@2.10.12': - resolution: {integrity: sha512-SDOueJRjS/QcykWf2KCRtTLmIl5YMKsLbXkXQGhDwcTXvKXZiS5ih5lBl/gkwZIpYFjqA/rAlfMzlAFcVHNe0g==} + '@turbo/windows-64@2.11.5': + resolution: {integrity: sha512-AFkbPmXNd8XgCi/66YEHR2bVl3gtusXyDihTIVEPAuSB+7ulLmJePvz1unWPVKLHdbCTTIdKq2mpJ1B1e3lJXw==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.10.12': - resolution: {integrity: sha512-0i0mVUa4kKk+/B3RwEwPMf9CB+T7ul56hn5FFHNA4VUNTOoLBEd6aNf3FaKfCatDNZ6cicCEf6if9QUTVyzzcA==} + '@turbo/windows-arm64@2.11.5': + resolution: {integrity: sha512-52ziXYP3snGOxjv19xA3WL1WDKv9Q6uDAa/7EKIR5j4hocMlYURkrOHbJ2ZZI+VfPU5MwKpcGeRfHxHJu7Y/Pw==} cpu: [arm64] os: [win32] - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -5228,14 +5153,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@25.9.6': - resolution: {integrity: sha512-JR6Q/PV5DKFvjrGFVqQJdeG0qvsqQQLDa3TzFrqVwhqRXqwNaxPo2KYCtCQXpOdIulCouKwT7a6in9nFthBAzw==} + '@types/node@25.9.8': + resolution: {integrity: sha512-VfMrScDmMhUJQmd5hArdQnFvK0OIeD36uN2Va1FcpYaLB/BgkgM8Ulc50XtYISPMz7APJ30+N0T5EM0jlcdfRw==} - '@types/node@26.5.1': - resolution: {integrity: sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==} + '@types/node@26.6.3': + resolution: {integrity: sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==} - '@types/nodemailer@8.0.1': - resolution: {integrity: sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==} + '@types/nodemailer@8.0.2': + resolution: {integrity: sha512-c7M5ox8p0nEOfbJ2E9Qcmt8/QCu/VzsiAhzBiZbvky2PhKZDHpKB3sQHBM5MEZNkCfBOaS6S9//AGPRTNB7IaA==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} @@ -5248,8 +5173,8 @@ packages: '@types/react@19.3.0': resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} - '@types/sanitize-html@2.16.1': - resolution: {integrity: sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA==} + '@types/sanitize-html@2.16.2': + resolution: {integrity: sha512-kuAbgDCFv418flrp3z4o/4ufLA/5ovmXRH0L419iZCPGO7w00znjeDI5Wy/KZWNIBpDQc7hucCK+J5almB6FyA==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -5263,125 +5188,66 @@ packages: '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/ws@8.18.2': + resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==} - '@typescript-eslint/eslint-plugin@8.65.0': - resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + '@typescript-eslint/eslint-plugin@8.71.0': + resolution: {integrity: sha512-pqcS9c1HxZTHt7End4nXqd0s5lJrrFzrgCkKFJrsbUnaL6M3+6oBFZaslg6Gjsl3argl2DDRFROnXARaZ2e4Nw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.65.0 + '@typescript-eslint/parser': ^8.71.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/eslint-plugin@8.70.0': - resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} + '@typescript-eslint/parser@8.71.0': + resolution: {integrity: sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.70.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.65.0': - resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + '@typescript-eslint/project-service@8.71.0': + resolution: {integrity: sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.70.0': - resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} + '@typescript-eslint/scope-manager@8.71.0': + resolution: {integrity: sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.65.0': - resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + '@typescript-eslint/tsconfig-utils@8.71.0': + resolution: {integrity: sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.70.0': - resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.65.0': - resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.70.0': - resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.65.0': - resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.70.0': - resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.65.0': - resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + '@typescript-eslint/type-utils@8.71.0': + resolution: {integrity: sha512-i8uO1qbdxeKgRnS5sCRt6On3/nfo2d2DwQe3Yvjx543zLy7r8ySqRuPPiIIXAhS03U0v5NfAFx+rUgxFzKKwNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.70.0': - resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} + '@typescript-eslint/types@8.71.0': + resolution: {integrity: sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.65.0': - resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.70.0': - resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.65.0': - resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/typescript-estree@8.70.0': - resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.65.0': - resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + '@typescript-eslint/typescript-estree@8.71.0': + resolution: {integrity: sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.70.0': - resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} + '@typescript-eslint/utils@8.71.0': + resolution: {integrity: sha512-pKR/tEMVrXZG23UFKUn5BQf3zfmfk7KQceI2cGzywZ5nxM5Eu3hEJU1utjWzydtzBbcJAQhHN8iPCxobHpPcZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.65.0': - resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.70.0': - resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} + '@typescript-eslint/visitor-keys@8.71.0': + resolution: {integrity: sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.4.0': @@ -5527,25 +5393,25 @@ packages: oxc-transform-react: optional: true - '@vitest/coverage-v8@5.0.0': - resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==} + '@vitest/coverage-v8@5.0.3': + resolution: {integrity: sha512-+klsyz7BvT1vCU28Zkfzms1Ia78XD0V41U3FUtRaa3S+vOr/EXvK1O6BvVD7l1RzEjm6SONR2aybOvDDf9u0mQ==} peerDependencies: - '@vitest/browser': 5.0.0 - vitest: 5.0.0 + '@vitest/browser': 5.0.3 + vitest: 5.0.3 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/istanbul-lib-coverage@1.0.1': - resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} + '@vitest/istanbul-lib-coverage@1.0.2': + resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==} engines: {node: '>=22'} - '@vitest/istanbul-lib-report@1.0.1': - resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} + '@vitest/istanbul-lib-report@1.0.2': + resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} engines: {node: '>=22'} - '@vitest/mocker@5.0.0': - resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} + '@vitest/mocker@5.0.3': + resolution: {integrity: sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5555,8 +5421,8 @@ packages: vite: optional: true - '@vitest/spy@5.0.0': - resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==} + '@vitest/spy@5.0.3': + resolution: {integrity: sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==} '@workflow/serde@4.1.0': resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} @@ -5569,12 +5435,12 @@ packages: resolution: {integrity: sha512-Y/b0YJoCDda6DCFj8ikks06GrEWDsz/3vdgGLeectV9p+YJc76YugRjtqFdd2KTf2rnEPjalL2hcXP+x2KcSLQ==} engines: {node: '>=20'} - '@xhmikosr/bin-wrapper@14.5.0': - resolution: {integrity: sha512-qzNWA0+YUbN3lVz79b2WK+X3QbR8+hmd6nMTAko1F/1jAeK7VbpK7TcfkYU4dL8iaLNNGYL94WsTewwH17jMTQ==} + '@xhmikosr/bin-wrapper@14.5.1': + resolution: {integrity: sha512-UZUuTYWxeAbTIiRKKEAmV3csoE36B3CGFZrYYn87+bSEBTyJ32p5gx5Gmj5HOgyOtioFUypbOZ1V5M/l/VoePw==} engines: {node: '>=20'} - '@xhmikosr/decompress-tar@9.0.1': - resolution: {integrity: sha512-4AkVR1SoqTxYY22IRRYKDeLirPIDGqMqYsqgjKYuwhgRcBb+yDP4t5Xph33UCzL/nahK/aADmlMEjTNstbX7kw==} + '@xhmikosr/decompress-tar@9.0.2': + resolution: {integrity: sha512-8nPZ6lZ3ExhsSxi/X/PMB3K+Vtsuxk43HowxYpxw4AsCHTYqFBXwC8B3Y+M/meaUOGOVm+2tFNUAfWGRjBt+Ww==} engines: {node: '>=20'} '@xhmikosr/decompress-tarbz2@9.0.2': @@ -5589,86 +5455,86 @@ packages: resolution: {integrity: sha512-2MS94QnmXQwjkKN8WyFiu1sU7J3rcWJcMze4kRYsX7tN+CXpUGECgkh4YSOhujpkWPuVlFudIziJHO/TxOqkQQ==} engines: {node: '>=20'} - '@xhmikosr/decompress@11.1.3': - resolution: {integrity: sha512-NiyhJq6z7ERsYghcnXZUI6ooDXgZtoB+G9eUsYhfSM4VLp2rKx9UxhKI1NEf1PqosrNPxG3bnSsr2UBVbNurlg==} + '@xhmikosr/decompress@11.1.4': + resolution: {integrity: sha512-ZbYL7SAfY37/TMpopqBR3mQiuQ76kI/RNpN4q82YHSw/UxktZNy8P4wgiKPSrTImMAWRaUG8UK1pgEa56YdLaw==} engines: {node: '>=20'} - '@xhmikosr/downloader@16.3.0': - resolution: {integrity: sha512-DF6qHkozD2SiE6yOUOUk8JWpLEPwT4vKZRsDeOZX6ekKDUO/LyeauxOO+H8j3AuRT23YWIx+7Thv7f5SoPS3lQ==} + '@xhmikosr/downloader@16.3.1': + resolution: {integrity: sha512-M67dvznaFbsvoqhGT4FsHWysaXXQ8386OViGZm0WOyQS3apW9p16WgvHp9nWj2vfKQAR2ZdqIBPNCHSM5rKSCg==} engines: {node: '>=20'} '@xhmikosr/os-filter-obj@4.1.0': resolution: {integrity: sha512-y5ArHvQ7BVule/+L9yE2nYMhceiJhgsqo58lOfnisQ7bg+Kjfmkgr7JBuVFiTkl+ErdShpp829QstZQyLugl8g==} engines: {node: '>=20'} - '@yuku-analyzer/binding-android-arm64@0.9.3': - resolution: {integrity: sha512-6dOwkawiJYtUUBchfjrFo7poz460Yg+aQNgr4lHUPZ2fNW+llpMEZkbznTq25BEmmiBGPJr+L15dzTvR8zP4vQ==} + '@yuku-analyzer/binding-android-arm64@0.10.2': + resolution: {integrity: sha512-xt4Vy3RTBw1NfszBlf4A0Rr6ZjA/th2Pj9XlWFLQHW9A1qOCtxNCoIWSzn/INtnZLMB4jO2gWdEtSaHUtK73wA==} cpu: [arm64] os: [android] - '@yuku-analyzer/binding-darwin-arm64@0.9.3': - resolution: {integrity: sha512-DTRoWK7AqNfshN+DcCS/s4n86br0ZusISeXLZWWNuvnZ3b9LCVXdWRVPlnMpEwsmSH3c3QSwL7MAOPyEHMe+FA==} + '@yuku-analyzer/binding-darwin-arm64@0.10.2': + resolution: {integrity: sha512-ftokSqvYXZxfmA/bfIbp8c1BJ8QxNax371kUOQNFyvR5hmtKqQyTqSKtMk+WaixHM3w4tKj/JdyY+ud1bGamXA==} cpu: [arm64] os: [darwin] - '@yuku-analyzer/binding-darwin-x64@0.9.3': - resolution: {integrity: sha512-EWzaR0/AL3ikZfUiADG1SmbB+wF7GGhXFKhMWm3RbOTf+ATyEW7Fa9nsjo1K70pWEeVZHRm9MU4iq7LIUEEgfg==} + '@yuku-analyzer/binding-darwin-x64@0.10.2': + resolution: {integrity: sha512-yUrmmhmF5R4Xmbfo8gUxJKr3YbvbLcE2JvLhDLzFJkMN29/fGm6K3dZX6YpNecfgBDnQ+VywGp8K9xjRaBFZ3Q==} cpu: [x64] os: [darwin] - '@yuku-analyzer/binding-freebsd-x64@0.9.3': - resolution: {integrity: sha512-Ao4/v+ppzIFVs2SldvBM2hc9NsijXNsKc1xUY+d+Nv20HrjRdm96HtrkIViw7zI5i6Ca77jkd8VbhWE8E4kgyg==} + '@yuku-analyzer/binding-freebsd-x64@0.10.2': + resolution: {integrity: sha512-cy9+KvVoK5Xad3Vs5pLwAeZf3JC/1y0XJElgv1q6g7W7g/n52FRjedpYmQiJeMZdnhJiAshq7Vz/Xj3jC5Ns2Q==} cpu: [x64] os: [freebsd] - '@yuku-analyzer/binding-linux-arm-gnu@0.9.3': - resolution: {integrity: sha512-EZc2H6bAyl4u3z48Jtqf4Un1657TpOkBWEmSdPCY1tHCO4YUFaNAz4dPA93yWgo5t38oRQT9UoXlwse/4aLtxw==} + '@yuku-analyzer/binding-linux-arm-gnu@0.10.2': + resolution: {integrity: sha512-AgVZ6VCV2XP4yHCwyv78KLV76gcu2neiEF2+RBTPQN7sqYY+bLvMxphGPmfG+9qk5Uf1PJAhZYIUnMGVbbRCZw==} cpu: [arm] os: [linux] libc: [glibc] - '@yuku-analyzer/binding-linux-arm-musl@0.9.3': - resolution: {integrity: sha512-pKny3wEa2Xl4kPoqNU8fO5NCzcp9VgMAkLpN3GZ5TOkdz23ppuzUqddlhad43/9puxfckX5aZqfxML/1vGoxBw==} + '@yuku-analyzer/binding-linux-arm-musl@0.10.2': + resolution: {integrity: sha512-5qAj2GjoSN6+HuH75+g5r40CFhWmMvH0K8VKWmPfQyOgA/LonoDMr5H5O5feJwzdnfdCytPDAh1RAf7/SSg7dg==} cpu: [arm] os: [linux] libc: [musl] - '@yuku-analyzer/binding-linux-arm64-gnu@0.9.3': - resolution: {integrity: sha512-bfpsIupfbX7N4ueSjo3Zm+Mob0q7MjrZX+INMGcPjNnXBcyKjkzrTotkqbEbwgfiNKhqyDVjynwsh64xsv5IPg==} + '@yuku-analyzer/binding-linux-arm64-gnu@0.10.2': + resolution: {integrity: sha512-eJvQ4Ja5oPf/HOjmBkCLYyhOHUkL7U+iMAN8sX44x8exBBpPRyqnhEgTsuU73HzxPLrGPdRhybFnAE63Omib/Q==} cpu: [arm64] os: [linux] libc: [glibc] - '@yuku-analyzer/binding-linux-arm64-musl@0.9.3': - resolution: {integrity: sha512-Q+AAUrrsgYgHb0/Wrm+HnSKN7xOpkC+6Y2812dZw5/rrSX7+qjRjJ+3uNnCZlkHpH3Hy7WXbLIa/IncP4bcHQA==} + '@yuku-analyzer/binding-linux-arm64-musl@0.10.2': + resolution: {integrity: sha512-TppF2j194mOQ/kBXvNr9u5TYO+eR9r8ieg4lTIEyJIVYHAR9GWeB0oFHLcJiLXVa3qUJGzE4bmzSntCW5ylA7A==} cpu: [arm64] os: [linux] libc: [musl] - '@yuku-analyzer/binding-linux-x64-gnu@0.9.3': - resolution: {integrity: sha512-ZQyjmSDRHTkDlddrzmIG1/nMUYDZC21XUguzQ4qvSWtfq6CsfJvIDFBPfJ03YDNQ+wR0px9Ly/xAa8VC0p9rHQ==} + '@yuku-analyzer/binding-linux-x64-gnu@0.10.2': + resolution: {integrity: sha512-03xu6ocJuwhm1a/JKmrHiaJUO1Oj86rABsm4FAl8AvfewfW/9idIUmPiFxZfb6RfiIONegebsTGJhFx0NbBNpA==} cpu: [x64] os: [linux] libc: [glibc] - '@yuku-analyzer/binding-linux-x64-musl@0.9.3': - resolution: {integrity: sha512-EIYzThB5pI3BiZHFNYyY8nMQ38z9l8/kT8uYvfYVpZ9TNEC0YgqX95MH61l9RILCYFDx+DbLoGajGY55JFvb6Q==} + '@yuku-analyzer/binding-linux-x64-musl@0.10.2': + resolution: {integrity: sha512-f7W2sAWWQN8x8YB0RRxIche7mLImH7lDgzUy9+B69cM2I6VFJ4a5+0pgAuMLROPOqimaxFPdXqLdDE/vpgGltg==} cpu: [x64] os: [linux] libc: [musl] - '@yuku-analyzer/binding-win32-arm64@0.9.3': - resolution: {integrity: sha512-KF+Ho3jtjikfPYJ76NL1KiPYwF+0UjnsASX0k461BZ1Er4pRQG39o8WvsngLT+fDg6JxB3v5J+ScDrto29RVnA==} + '@yuku-analyzer/binding-win32-arm64@0.10.2': + resolution: {integrity: sha512-f534qNc5YaJI29e1oryxEnxPkp7WCYJ1j7ChSec8pQNlYqTm8Tao7hij7NxRF+9BuxzeZCZ+WsbaAfLlklR0Eg==} cpu: [arm64] os: [win32] - '@yuku-analyzer/binding-win32-x64@0.9.3': - resolution: {integrity: sha512-4pdUfYVYPf05vyygvWiXsiI/tdPqn5bBiHs7c1TBIm3Kx7/w5pq++myNQ/8CUH/Proz+1kHtCr/lDJF9k67fqg==} + '@yuku-analyzer/binding-win32-x64@0.10.2': + resolution: {integrity: sha512-sKHkmLK8BsindMfyIThoN0bWC5uqSJEVNaLRD/ifA99mtb0UDin1ZCg4WYSVQAmM4k2iOTl4UZx/p3zcBiBgYw==} cpu: [x64] os: [win32] - '@yuku-toolchain/types@0.9.3': - resolution: {integrity: sha512-rFE+5P4g2wxko5C85MugJOlVjBHEQq87dIkhLkniLXLp63PEtgaFjD954i5HXlfnyzLxPcZHsSOVDVgmo1HToA==} + '@yuku-toolchain/types@0.10.2': + resolution: {integrity: sha512-sSeo4SSSToiS+sSD+bwn/s94EEcaLJ7tG5LCp8gFYC1G5VzxzX7fqB6m9RU1yMD8KTpu6zdU/I1NlQf8hVBJ9Q==} accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -5683,11 +5549,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} @@ -5701,8 +5562,8 @@ packages: resolution: {integrity: sha512-7NRMZ/ZDz2vHevQTgJsocBFpakB1/Wx5ip19YSJuj4VOXpraWztTerViNtdSyARKZT9e2yVwUUB5JXXCE7mNrA==} hasBin: true - ai@7.0.99: - resolution: {integrity: sha512-Ov+3j/nSajaVH5hO8C94wN9wisG5tAJ8HWsLV9d/+nlzrRGUh3oYO3Kp1fRyUNWjAWLSpGLHLPaHCdfxb307Vg==} + ai@7.0.124: + resolution: {integrity: sha512-FdzSxCXE+tlkD9texj2EO8QvJvCHoqWjdOTM3EWL6CBDtJXMe0/aYul9e31Q+P7zABmRAXrc3+XFSrmawqQOcA==} engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -5737,8 +5598,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.3.0: - resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -5749,8 +5610,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansis@4.3.1: - resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + ansis@4.4.0: + resolution: {integrity: sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==} engines: {node: '>=14'} any-promise@1.3.0: @@ -5782,8 +5643,8 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + array-includes@3.2.0: + resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -5817,8 +5678,8 @@ packages: resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} engines: {node: '>=4'} - ast-v8-to-istanbul@1.0.6: - resolution: {integrity: sha512-fvpl29helSO2w/z7utIbrkNXILdrLwDwAMH2I/zPKlGf5244+gf+B4cyS1sANcrPY2h+hWCGSgC8N61s/+AF9A==} + ast-v8-to-istanbul@1.0.7: + resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} @@ -5839,16 +5700,16 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.12.1: - resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} engines: {node: '>=4'} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - b4a@1.8.1: - resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + b4a@1.9.0: + resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -5871,8 +5732,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - bare-events@2.9.1: - resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + bare-events@2.9.2: + resolution: {integrity: sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==} peerDependencies: bare-abort-controller: '*' peerDependenciesMeta: @@ -5882,12 +5743,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - baseline-browser-mapping@2.11.22: - resolution: {integrity: sha512-pWc4w51fBFd7mav43/zKRC+RI6f4yfzQoVlfvE8dECePyfkn1bzLp01Fj0QACcyCZyFhiEMyD2qScfKRWgWibA==} + baseline-browser-mapping@2.11.26: + resolution: {integrity: sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -5916,9 +5773,6 @@ packages: peerDependencies: react: '>=17.0.1' - birecord@0.1.2: - resolution: {integrity: sha512-5PAPTTmMpMEb+GuMb5DebfBkipRGyIW9+gtwEBSoDA9xkhHILm04+hZQ702pMksu3d8YAuGkmgTzQWcKqTPScA==} - body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} @@ -5926,30 +5780,30 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@1.1.16: - resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} - brace-expansion@2.1.2: - resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.9: - resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==} + browserslist@4.29.3: + resolution: {integrity: sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + bundle-name@4.1.1: + resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} engines: {node: '>=18'} bundle-require@5.1.0: @@ -5997,8 +5851,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001810: - resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} + caniuse-lite@1.0.30001814: + resolution: {integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -6078,10 +5932,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: @@ -6093,13 +5943,18 @@ packages: engines: {node: '>=20'} hasBin: true - cn@0.3.0: - resolution: {integrity: sha512-qRoU0ARrZD3Bbj1wKFftEKxPjSnzTEdFkf22NVhW+zU9D/wajhoP+qUZ5DChhhSOBCH1onV12hrmGqfu1+5Z2Q==} + cn@0.3.2: + resolution: {integrity: sha512-RKzY5Edavc8B2Ka6tjJecKFC4nm0p7lADY72xzICmiJSf4TkaxWXt0fHsib2P2G4FkFyXfSDi9oDtIBuCZvY2g==} engines: {node: '>=20'} hasBin: true - cn@0.3.2: - resolution: {integrity: sha512-RKzY5Edavc8B2Ka6tjJecKFC4nm0p7lADY72xzICmiJSf4TkaxWXt0fHsib2P2G4FkFyXfSDi9oDtIBuCZvY2g==} + cn@0.3.3: + resolution: {integrity: sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw==} + engines: {node: '>=20'} + hasBin: true + + cn@0.4.0: + resolution: {integrity: sha512-qOAeUhPwPzBxx6jaeQdo646XIKliKHc2j1ZF7Ngb1o0pJZKH5gq8FkA0aVdUdPFUDXNXyUCXpCtoJISo6dhizg==} engines: {node: '>=20'} hasBin: true @@ -6151,8 +6006,8 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - comment-parser@1.4.8: - resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} + comment-parser@1.4.9: + resolution: {integrity: sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==} engines: {node: '>= 12.0.0'} compare-versions@6.1.1: @@ -6216,6 +6071,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + copy-anything@4.1.5: + resolution: {integrity: sha512-vePst2VLTSqPglW7Q98VwFpGiGpOHTyXIo81MO5VyLecA5zMbZw/P/V1vmwD1jksa2iJpn/YkDrJ3XhTfzUyhQ==} + engines: {node: '>=18'} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -6229,8 +6088,8 @@ packages: typescript: optional: true - cron-parser@5.10.0: - resolution: {integrity: sha512-izNAxJyRWUP8ljBoDSub5WyrVOUlT4SLGShswE7eoRBpp6QUsSycYxLBMJlbshgPBMcPT/nrfgjNY2918ayv2A==} + cron-parser@5.10.1: + resolution: {integrity: sha512-pKRrRagItwk9rGIStcUyMxFX34x56zoX3KDf9HJ4ttwkXIK1qxK63EvXvEDmlxI9AdPJ+Y7TEKRftRlW5eSS7A==} engines: {node: '>=18'} cross-spawn@7.0.6: @@ -6472,6 +6331,11 @@ packages: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dotenv@18.0.5: + resolution: {integrity: sha512-aBrGvt6KhjxbEnatqMWOMidftwsrCiCvqh1yNIGB9QyF0J+VcWkKDMsvYOEm7ZS82oiV+BT1sTOtIlAmUlTpwQ==} + engines: {node: '>=12'} + hasBin: true + drizzle-kit@1.0.0-rc.4: resolution: {integrity: sha512-KZCpjRyu+oYHLj/UJogfFlOkWhHVkaEI2EOT1U3NDVXUzLoTyPjqwFxwOrlQxsY6jzRyxcz4EacqboGfhEeYrA==} hasBin: true @@ -6629,8 +6493,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.427: - resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==} + electron-to-chromium@1.5.443: + resolution: {integrity: sha512-TDJG36L9A3CWWwZ97HKaE+Iz1sW80pNp6sAU0owzCIV3Zc9eVyRqZK8Vz6NKuMIU8WjP0pIkoqCa0VRf/yFD0Q==} embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} @@ -6674,12 +6538,12 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.10: - resolution: {integrity: sha512-9/lX2bdlizlCXMHRMOIm03VBQHQYC7VvydcxtTAUJRxNW1QzM/2PMFSmr6h/lCiMHcyCP6abK+t9Q+j4vekk8Q==} + engine.io@6.6.11: + resolution: {integrity: sha512-z34mGpLoY/82ZbkX1LqGMIaf3wjVMPL6gVC681QDqnmzJ26synI8qAE32P+a7UazmpJZ8UGrFIeAavgRfXzYrg==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.24.3: - resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} + enhanced-resolve@5.26.0: + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -6694,10 +6558,6 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - entities@8.1.0: resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} engines: {node: '>=20.19.0'} @@ -6710,8 +6570,8 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - env-runner@0.2.1: - resolution: {integrity: sha512-2iDP2DfheAMMAKeXBggEuFmpSq+1Xs6wQoHba1g65pZFXlC3VHD1O6/tgVzS6GQLv+P2koPKZPKgKhXkigNBdg==} + env-runner@0.2.3: + resolution: {integrity: sha512-S8EFBKyznRwPVwayK187cYjvnpgC92xy+q0BIF++V965pfjMVVRbQ/HoTYGA/1EHmZ7E68k6Heq+4WnvVhOL5w==} hasBin: true error-ex@1.3.4: @@ -6851,11 +6711,14 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-perfectionist@5.11.0: - resolution: {integrity: sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==} + eslint-plugin-perfectionist@5.12.1: + resolution: {integrity: sha512-krdSE7Dz+TCtcVr2+rfNhlOIFFBJcUdoRvjaN7JQnsaVnxJw+BZh9wMkY3MSLCJat+yW+UPTQLKS82Epc7MGZA==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true eslint-plugin-prettier@5.5.6: resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} @@ -6871,12 +6734,15 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-dom@5.19.0: - resolution: {integrity: sha512-QxWdjdPxQUI3SSMYR7WyrLew7pQzlOn5P3R5raWh2PiyavaBUbkfJhSJ307l1AaJOVLy5JeIB2Rl4bivwHAOIQ==} + eslint-plugin-react-dom@5.23.3: + resolution: {integrity: sha512-kRJkm/X2Qp53PBIq8dM7RqyyEk4+n7606rz71VL04wZ6deIZKAK3sJs+2FZfdKgHO/JlUb3NcOQ/0baig+oREw==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true eslint-plugin-react-hooks@7.1.1: resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} @@ -6884,40 +6750,55 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 - eslint-plugin-react-jsx@5.19.0: - resolution: {integrity: sha512-Upvpe50vpPi5jWvLqtBXoZEwaCz1pzszzoukK7qf0g1A6ZJ+XDJhi3yKmPQWBlp9c4GOwzwPuXGU5C2e8cHMbQ==} + eslint-plugin-react-jsx@5.23.3: + resolution: {integrity: sha512-189rze+yDs9Poco5CEuBQIdKnePECR+jfdNcDiaRCR9DvVwl1W3YLXjsdwjf+9E1jyamMQHLJNFxrF2rUZ0rFQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - eslint-plugin-react-naming-convention@5.19.0: - resolution: {integrity: sha512-H9ko2t+KYPBDOfr29D5hDAT6CXucHJKGQscI+/ndSmkBl9K/KaGWdhFiCzQPi5S2YwPkjrcuaSXIp/n8+PA5GA==} + eslint-plugin-react-naming-convention@5.23.3: + resolution: {integrity: sha512-KaycnZqXcuR7NBZbej6N1ZMG9TEVUjFFVHVKD8Vr/8NkGMBcCNHEnwQkmmVM285fU0C4iHadvA5aeV+LoiRV/Q==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - eslint-plugin-react-rsc@5.19.0: - resolution: {integrity: sha512-XdfkB2XRS0b1WBkuxnRsWmhivNaBOLAIohBqWQItQycuket6wVliqSY+Q1NcTst4PdJ1bYzLuMgSXYsgwJMV7Q==} + eslint-plugin-react-rsc@5.23.3: + resolution: {integrity: sha512-FRiAnzjW5eWCTAbNEHHIkvAccnvqfJaiA9oWjHcDM5ERSOdIzcYVMRj1bJxPOtQiGwrhQzrnatzUe5l+wrxu8A==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - eslint-plugin-react-web-api@5.19.0: - resolution: {integrity: sha512-wCNdYVHgdLmCikLicH6kfO6EE1SKzi63FlhLLGMGzzEAyvudvyfKI0+ZXDkFyjolvKXLQW6Thb8EeAFbHTZksw==} + eslint-plugin-react-web-api@5.23.3: + resolution: {integrity: sha512-u+YJRTDLJe8ZO6MUnU8QOfzU1zU+6FvWE7JsS65h/NwiPVyoKbpI13cV27xbH83AeM0FZBeGT4MFxTLJUTWBaQ==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true - eslint-plugin-react-x@5.19.0: - resolution: {integrity: sha512-HoweOyYhar8G2QEukOctSaK87Y3AzB3bn4ES+0VVhcNOOqBFphRaWqcvoNN8JE+5AKOhhpuzjVKY6DnGPCcAMw==} + eslint-plugin-react-x@5.23.3: + resolution: {integrity: sha512-rsFbzgZ1FWkR3QmoBpj/+rzeHrouC7/Fsj3jrHRIiQFXt71RGpGlxUtbOUbR9zdfPVuGNU3WC59wtHPlisALHg==} engines: {node: '>=22.0.0'} peerDependencies: eslint: '*' typescript: '*' + peerDependenciesMeta: + eslint: + optional: true eslint-plugin-react-you-might-not-need-an-effect@1.0.2: resolution: {integrity: sha512-HgYol2zhH3KbnW9Q4FY/FcIINbsYVL6rwQESChqBC2s9SLWtw1wg05+J7SCrr3BfQpNY2ReYhf8xjpd2JhKJOQ==} @@ -6941,8 +6822,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.10.0: - resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} + eslint@10.11.0: + resolution: {integrity: sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -7071,8 +6952,8 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-equals@5.4.2: - resolution: {integrity: sha512-Ywe6jodPTWOTL9/k0bV7gdfP8twKL5Y8I8CZ933fAY5gBekICZSUQTbyH6ut2NZCNyB05mSUwAuEqdEIaOOlDQ==} + fast-equals@5.4.3: + resolution: {integrity: sha512-8unmvA0qrfpFWBYUate9BTGtQdKHWBYt+KdAIkag7Vvxe7wz8Q2nJg7fLMC0bJqe0bjP31kca7Ckaawrs4Istg==} engines: {node: '>=6.0.0'} fast-fifo@1.3.2: @@ -7097,8 +6978,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.7: - resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -7129,12 +7010,12 @@ packages: resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} engines: {node: '>=20'} - filename-reserved-regex@4.0.0: - resolution: {integrity: sha512-9ZT504KxEQDamsOogZImAWGEN24R1uFAxU3ZS4AZqn2ooidmN68Olh7n4/RcA4lLatZztjA0ZSuxeLHVoCc8JA==} + filename-reserved-regex@4.0.1: + resolution: {integrity: sha512-qUet2faQFKvtvVUsEf7wCrTURwxBOIZpspsLHGifw9QCWk55ITE2FrG8XhfQqG/uxMA1xEGFVQbL+Yfm0O94+Q==} engines: {node: '>=20'} - filenamify@7.0.2: - resolution: {integrity: sha512-fz10TUqSZ1lG7ftW1KnRotJzMD8YRb6kaAQKpZJBLvqXXfFgIEpuazy1w2lK3zhMiBSdH/uF9LFlv5smJ2Jl1w==} + filenamify@7.0.3: + resolution: {integrity: sha512-Pf0dwHrWs1GcIK15ps304fmxp2AOcfNR6vOIMvCPEy6ZztKYxzRQHlOuPVWo2HRjbCLHaRTY+kD8n3RbQ0A/fw==} engines: {node: '>=20'} fill-range@7.1.1: @@ -7181,8 +7062,8 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - framer-motion@13.2.0: - resolution: {integrity: sha512-9E33ebgMaO33w1nN/jEdW8z3/GO483fMi4rqbMG9rt83XgW9QLKRe4NcmJ8s+fQ3O34++UHrIQwlIWGIWTITjA==} + framer-motion@13.4.6: + resolution: {integrity: sha512-TwKWt2CC8rjhARzwV00TZIh04ipumSAqyKM/JZmS+urdncSHg6wTF/mfj/Fd6Oi2W01TZSWsiA3uxXDrXZtKyw==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -7196,8 +7077,8 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-extra@11.4.0: - resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + fs-extra@11.4.1: + resolution: {integrity: sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==} engines: {node: '>=14.14'} fsevents@2.3.2: @@ -7210,8 +7091,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.15.9: - resolution: {integrity: sha512-aefFBU1e9w+pX23qpM2QT9g99hhGYe7fV1H19A8ozcyU9DqW0iBL3kH9/c6wMKOnVd643xaY8JzMdSiVA7XKIA==} + fumadocs-core@16.15.17: + resolution: {integrity: sha512-Pexn60R+S5F33UccW9WoLN+LHAOIraA/VvQt1xAXmfLxitx5rIPR7B9M+5mrqECnuSPltoX843NZ//Z5j/HAOg==} peerDependencies: '@mdx-js/mdx': '*' '@mixedbread/sdk': 0.x.x @@ -7272,8 +7153,8 @@ packages: zod: optional: true - fumadocs-mdx@15.4.0: - resolution: {integrity: sha512-bJCQfsckKUQ4x2pyz8OdASEAARVMB49kOej7njaJ3t+tYsP1HnwkmqiO8e/jdQHcv6JH3XkXWidTho3ZC/WBcA==} + fumadocs-mdx@15.4.5: + resolution: {integrity: sha512-r8gzaqleN+YXgPIbkYSZ05zr89dsr67/64Ar/00Uu7dRWTIHzbgmN1nC0lB8RFNeWnrL41bOTJilhLM4PAsrbw==} hasBin: true peerDependencies: '@fumadocs/satteri': 0.x.x @@ -7309,12 +7190,12 @@ packages: vite: optional: true - fumadocs-ui@16.15.9: - resolution: {integrity: sha512-enwf49j9VzJLKD9Lkr2nQJiHMIMCk8on5MzlTE63KawdW5gPJh8t8qYTFhPtAcg5xSTdfP8I0Dbdr5B3Qtmk2g==} + fumadocs-ui@16.15.17: + resolution: {integrity: sha512-Q0Tzfte6Bzz8JCVU0yMISWjEpoTzGKfdeG8WoRxktdv30JblQ+G8n87MG11auMh6Li0CuO5oPqH5otyQ2mQ5Yw==} peerDependencies: '@types/mdx': '*' '@types/react': '*' - fumadocs-core: 16.15.9 + fumadocs-core: 16.15.17 next: 16.x.x react: ^19.2.0 react-dom: ^19.2.0 @@ -7358,8 +7239,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -7394,9 +7275,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} @@ -7423,8 +7301,8 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globals@17.11.0: - resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} + globals@17.12.0: + resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} engines: {node: '>=18'} globalthis@1.0.4: @@ -7464,8 +7342,8 @@ packages: crossws: optional: true - h3@2.0.1-rc.31: - resolution: {integrity: sha512-AG7qZzF99a0BSYoXT3evJgIhwSIUKow7R+hwkLRZS06WJ9nbSb7QXUDgs1ByBjp6svTvl++N/GKA7I9YPz9cQQ==} + h3@2.0.1-rc.32: + resolution: {integrity: sha512-Epg1E85L8yIKd9UeAQAVdm6QVrnHbppMsQ641EjpNi4c0IlAg+PJlwp4Xw03Z1loRXPQaH9k64gJT5qDELqm+g==} engines: {node: '>=20.11.1'} hasBin: true peerDependencies: @@ -7537,12 +7415,12 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.13.7: - resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} + hono@4.13.12: + resolution: {integrity: sha512-6E2QDAc9Ick9Sq77ZrGS/dk2WUYni91aufTw6LJKpV7w8kW5/GxVUc650FOADOmlwg3K+f7Pun6XlV+pYmW6gw==} engines: {node: '>=16.9.0'} - hookable@6.1.1: - resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -7554,9 +7432,9 @@ packages: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-encoding-sniffer@7.0.0: + resolution: {integrity: sha512-UikN5yr7xsCDAq87Or5or0PAlD3HJJOKVzM05az588WnpDJ4Ux7a2A53Qi6gofGg2/EtvF/H4hCi/TXfCW4Y6w==} + engines: {node: ^22.13.0 || >=24.0.0} html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} @@ -7568,9 +7446,6 @@ packages: html5parser@3.0.0: resolution: {integrity: sha512-iNpSopa+4YHX50UOk825tBy7MghmXHo/ZpLskBYN0kAr1xhH8GlIMk5bLRXcZlfP3AnLUcSuFMu8C4MdOUxA8A==} - htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - htmlparser2@12.0.0: resolution: {integrity: sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==} engines: {node: '>=20.19.0'} @@ -7612,8 +7487,8 @@ packages: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} - icu-minify@4.14.4: - resolution: {integrity: sha512-pjDoO7XstE5obIDsMeDEpsSm7tdi/azbsGotEc9ktxMrGAugM7aISXyvVzdMOpdNSybX0SIMpOmpMmD/87UWOQ==} + icu-minify@4.14.8: + resolution: {integrity: sha512-X5V4ndHznoo+ti99jMi2vbolCHKGulfWbL9fUTp2uKptKPVc+wNhzw5kwbFkq45zqzC/7zcGLfdPEklKei358g==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7622,12 +7497,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} - engines: {node: '>= 4'} - - ignore@7.0.9: - resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} + ignore@7.0.11: + resolution: {integrity: sha512-YChdK5txDjwGUvgR7oCJcLGkwi3LDh8Zx8tS7ndYciLEg/oOCL26VUBSUEtgS7EjiybcBqFxh5j0rAdDX7/bbg==} engines: {node: '>= 4'} immer@11.1.18: @@ -7637,8 +7508,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@3.5.1: - resolution: {integrity: sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ==} + import-in-the-middle@3.5.2: + resolution: {integrity: sha512-WseIA/4o56+GYO3RmlOPvejYi771OFeJEeK/ejROsr9bdjW+E5NXTOD1Di8TL40Qgg3JJX9aa97Hf8iiSVIKZw==} engines: {node: '>=18'} imurmurhash@0.1.4: @@ -7668,11 +7539,11 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - intl-messageformat@11.2.14: - resolution: {integrity: sha512-9f2VD1HFuxUvMw0RxsaP8WmMns6JRTnsNB/zghTFrp11ZktiXWwVDeZBPQchBKEmo+Gx/ZhxI7Qht7YglFD4PA==} + intl-messageformat@11.2.15: + resolution: {integrity: sha512-W4VNytsXyWgW5lvVchmsb9xgA5rSKqoflu3/IQ9UCtB0z4R+Bx9MoEkwFT/+30RCl/KzUoH0QGGe9lppF5SuvQ==} - ip-address@10.7.0: - resolution: {integrity: sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==} + ip-address@10.7.2: + resolution: {integrity: sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -7953,8 +7824,8 @@ packages: jsbi@4.3.2: resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==} - jsdom@30.0.1: - resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} + jsdom@30.1.1: + resolution: {integrity: sha512-FahmoPK5vbPc+jxV1iErMHmAZypCZ942NHF4+qqaWAuvaKKTBZxawnmAtrbGWLU7MtlxfqIP0qw6aSI+aWGtLg==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} peerDependencies: canvas: ^3.2.3 @@ -8041,8 +7912,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lib0@0.2.117: - resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + lib0@0.2.119: + resolution: {integrity: sha512-vh+TiejVy8Xm+hCdnRfn9BthGNvNUZdEXltNjVZL3TzRIKP3s1lnQh8pWd/Q0wCgY0FPAGVVjFF4ZiHUV3LFgA==} engines: {node: '>=16'} hasBin: true @@ -8231,17 +8102,21 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@1.45.0: - resolution: {integrity: sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==} + lucide-react@1.49.0: + resolution: {integrity: sha512-ApfaNM4/7jBrVopqLJ84Jz8TMQ1Q1JeZ1PmKh25aeS3E1FTVcMkSh1bEQB7dfzdIrwXRP8p3z4AJjTIHHb5IIA==} peerDependencies: + '@types/react': '*' react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} @@ -8254,11 +8129,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@1.2.3: - resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} - - magic-string@1.3.1: - resolution: {integrity: sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==} + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} magicast@0.5.5: resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} @@ -8295,8 +8167,8 @@ packages: mdast-util-gfm-footnote@2.1.0: resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + mdast-util-gfm-strikethrough@2.0.1: + resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==} mdast-util-gfm-table@2.0.0: resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} @@ -8325,8 +8197,8 @@ packages: mdast-util-to-hast@13.2.1: resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-markdown@2.1.3: + resolution: {integrity: sha512-wgyJtgUkUcdU7zci7uuwc/tzoAhm0TswWhaXuvnWolqug+8jY7bgNkBBL0dYBnHgc/tHL7lCzRdPsdUxUKKBqw==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} @@ -8349,8 +8221,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -8397,8 +8269,8 @@ packages: micromark-factory-mdx-expression@2.0.3: resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} @@ -8424,6 +8296,9 @@ packages: micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} @@ -8448,11 +8323,11 @@ packages: micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -8518,14 +8393,14 @@ packages: module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - motion-dom@13.2.0: - resolution: {integrity: sha512-N6gdSoWRDk0Rh/fVtlqUtLs+fEN3ELFZI3cn3IQE9Mnf3E+Mh8wjO6MstzCOPFh4Yf0L1as5m2eUyYWj8ylVSQ==} + motion-dom@13.4.5: + resolution: {integrity: sha512-p63p2Doq+US/O5wADauIPUVx0/eONHMLPzsudBM9XMWRuBQLXogdxH0vwIA8WYQZw864pyzoV723xoDqakwWTg==} - motion-utils@13.0.0: - resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==} + motion-utils@13.3.0: + resolution: {integrity: sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg==} - motion@13.2.0: - resolution: {integrity: sha512-4Hrb5vD6HhjFstLUiCmWvtpsw+WTpP4R+QXfSDYZBz7+uxE/LrRg3aV0ReJxHrTRffHhbIE6svEqnotngXvesQ==} + motion@13.4.6: + resolution: {integrity: sha512-zDXi6lIdyhda6wZlTsv9QgT2ed6UExAfRegtl/akQmZb5iaeLlArXr9Gmo/hx3iTx2y4R7tmdb9k9koFQmV+NQ==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -8617,12 +8492,12 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} - node-releases@2.0.55: - resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} + node-releases@2.0.57: + resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} engines: {node: '>=18'} - nodemailer@10.0.9: - resolution: {integrity: sha512-BF0qcyplCwp+jMk6HCjFykBz/YhhZSsxrARhOldLwFWH+8kGjQsd2WIMIZhqEuyXRoGFi0ONbDeWDMDoL8MhLw==} + nodemailer@10.0.13: + resolution: {integrity: sha512-SzG86OlvcW/NNhUFC6uROMwRTL4n7MswfQqC/T8mhkmnY1YVa23zUEMYi4ijSeXSl9GLz9ZeTJDUatEDuY5FeQ==} engines: {node: '>=20.0.0'} normalize-path@3.0.0: @@ -8714,8 +8589,8 @@ packages: oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - open@11.0.3: - resolution: {integrity: sha512-b3souUgU0VaAvMmzA4+9cRgrOgMdE0vc9H9VhQ0FYnjjcyZ8R/f9DiwMU9V8rl+vjf05On9UJhbgb06fsTs87Q==} + open@11.0.4: + resolution: {integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==} engines: {node: '>=20'} open@8.4.2: @@ -8884,10 +8759,6 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} - engines: {node: '>=12'} - picomatch@4.0.7: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} @@ -8900,8 +8771,8 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - piscina@4.9.3: - resolution: {integrity: sha512-3e3ka9QCE8RJ5I9uszdAADZnkcYi21cqmF3gxox3u884N72qpFHCsIVhHt8cEQ9t3Auq/NqoiCEuhxlxxQuDWA==} + piscina@4.9.4: + resolution: {integrity: sha512-RyBDr2VheQ8ZfH3N8SzQZHztqVyOtadTwLnUYof6gdj5161/eu2wNhCbGl5GHnNKDpnkicJYpKtL2J+y/gk6XA==} pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} @@ -8937,8 +8808,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postal-mime@2.7.5: - resolution: {integrity: sha512-GNEXKvWFQnbgO5NlrGzVa0FmWzBZ24PersAWErttSg1Hjpf0ATxTwS5DOMGaOpTG6bUh5cTr7xi0jAD942wCJA==} + postal-mime@2.7.6: + resolution: {integrity: sha512-UUlyE2KlxmvwMGq060onF/VWU3zD6dVW31FwokQ5v26jWd35fbs2MoTFzh+jXnPwAyV2MULMKXcBInGOl5TO6Q==} postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} @@ -8974,16 +8845,12 @@ packages: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} - powershell-utils@0.2.1: resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} engines: {node: '>=20'} - preact@10.29.7: - resolution: {integrity: sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==} + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} peerDependencies: preact-render-to-string: '>=5' peerDependenciesMeta: @@ -9053,8 +8920,8 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.9.6: - resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} engines: {node: '>=14'} hasBin: true @@ -9077,20 +8944,20 @@ packages: property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} - prosemirror-changeset@2.4.2: - resolution: {integrity: sha512-ViYrjMSg3YFiXwIhKaluu+/mi3Yrxt6AR8ri14ulTaGcZtXO1CThl7A2gv79qx5fQnOw8woKwyBU2u+9PVCm3w==} + prosemirror-changeset@2.4.4: + resolution: {integrity: sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA==} prosemirror-commands@1.7.2: resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} - prosemirror-dropcursor@1.8.3: - resolution: {integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==} + prosemirror-dropcursor@1.8.4: + resolution: {integrity: sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg==} prosemirror-gapcursor@1.4.1: resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.5.1: + resolution: {integrity: sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA==} prosemirror-inputrules@1.5.1: resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} @@ -9098,8 +8965,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-model@1.25.11: - resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} + prosemirror-model@1.25.12: + resolution: {integrity: sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -9113,11 +8980,14 @@ packages: prosemirror-transform@1.12.1: resolution: {integrity: sha512-t4F5615FycnCqsX7ShTUs8+jfnwcf46kuFRvSl/3qFx2QTZ4DjgowesLHQXcFP7G//TjesqZG3WtgL7vdyVJyA==} - prosemirror-view@1.42.3: - resolution: {integrity: sha512-oTN7EtH+CpwxU9NrwEYWd0UZ4JUx7l048l5A2Xppm4p/60isZYLnth9QVQmC3VRIvdrIWCxwZSd+Uz791G31/w==} + prosemirror-transform@1.12.2: + resolution: {integrity: sha512-PE/aY0HEY4zczvmqrilgkUK/WautF0chvMqkmM/iN5/aPHvwrCWaQZjS6CIZp+K84YrvPFqrL+YArrfJX8xX7g==} + + prosemirror-view@1.42.6: + resolution: {integrity: sha512-3g25f6hKV2bBxo3puH3EcYWmmVNSH0iWmNsMVT7sugDSpA025jgpOLarcDWr39SdzPjYMaiYtRdNtXialPSjEQ==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} engines: {node: '>= 0.10'} punycode@2.3.1: @@ -9154,8 +9024,8 @@ packages: resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} - rate-limiter-flexible@11.2.0: - resolution: {integrity: sha512-L0eIK+BmFMi6NcvmtEg7RSswOFKi9MMD5RhBIypFfOve+G6Jl1Xbb8qEHgK3uRzNtkOFYF0L9f7P4rSf2PnUVw==} + rate-limiter-flexible@11.2.1: + resolution: {integrity: sha512-JAaz01HZ893zAw+Hx5MdM1z3lLAkyVvNpqR+GNp0k3kjuQB8gY91fXhf5C0osWs+A7iKgFv585qzwmjS3aBHlA==} raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} @@ -9167,8 +9037,8 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - react-day-picker@10.0.1: - resolution: {integrity: sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==} + react-day-picker@10.0.2: + resolution: {integrity: sha512-QetiKtZWE9Uaw/pM/SYNv6WPYOTRnSJ2puL0GgwkmUFMIwiY0dtjH1W4B7DOVXVNQM0ZOClGpH/heOfBSzWeiA==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8.0' @@ -9187,9 +9057,9 @@ packages: peerDependencies: react: ^19.3.0 - react-email@6.9.5: - resolution: {integrity: sha512-XkUFa4S3XGbVQegdGSvkShsEOn/j9t3yL5MXRf5A2l4K+RzXNPK2TZLOgI/bXfWu2WRyKWb9aVDtfLLuyBMi2A==} - engines: {node: '>=20.0.0'} + react-email@6.11.0: + resolution: {integrity: sha512-u0NBK+ypniH+snmYa1BQTCvqPTounU9OczXH+j2BLUoMrNkk5/d5qq5Droral87f2B7eClsDp0pF0Y4taWERbg==} + engines: {node: '>=20.19.0'} hasBin: true peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -9239,8 +9109,8 @@ packages: '@types/react': optional: true - react-resizable-panels@4.12.4: - resolution: {integrity: sha512-SOsSj4e9U7vxL15MbgTfl35IO4vxSW4Xb0b1gtJVbRPWv7FOezcgOA00Mi0jP8XqC3y7jOQxpsGs/9zLKHPitA==} + react-resizable-panels@4.14.1: + resolution: {integrity: sha512-OB1bXDNTLcGgTTbaX6Dn5efZhlMboSnkfr1w4xpsJTHPEbRJpACBhXpgRCXozgPO1ztgFeZRUe5J3mFNCVKm5g==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -9308,8 +9178,8 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - redis@6.2.1: - resolution: {integrity: sha512-Z9VHtgYs48PiQC77X9O2Er8Hj4T+5BtFjT91/vi5Is1D04N72cA946ZslM1ImJw8ZctFBZWAVjM7S5wJNeHMpg==} + redis@6.3.0: + resolution: {integrity: sha512-XFQbPie1lGpKeUZ8ySYY43yLnQy/iIQtHNvIr/1XdaABpb96rUSdm3Mfl+98FEVbv9ZJIzINMno5s0Nh8E5LEw==} engines: {node: '>= 20.0.0'} redux-thunk@3.1.0: @@ -9364,6 +9234,9 @@ packages: remark@15.0.1: resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9382,8 +9255,8 @@ packages: reselect@5.3.0: resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==} - resend@6.28.0: - resolution: {integrity: sha512-xhRMQDZRjvJQ+sWJA3wFaoeVe5CpTxJJAfHnnULX8vifjj4QQLCLRn/AfnMZ4YmVhpFkuiX4LKxZCcj54l67Yw==} + resend@6.31.0: + resolution: {integrity: sha512-E9Ekrm888UKKCIY61UmDkgRVd2Q9OwihimgStrWJ4olNsjFYM25F4X8QbzrLuZz6W9iS7eLMS7MLbRBNqnlI/Q==} engines: {node: '>=20'} peerDependencies: '@react-email/render': '*' @@ -9417,13 +9290,13 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.2.8: - resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} + rolldown@1.2.12: + resolution: {integrity: sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.62.2: - resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + rollup@4.63.5: + resolution: {integrity: sha512-KRWwmNLlPw5M7HcdYfm15oBv9n9LPtjzpzCIxS/phwqvPyxHSoKX6Y2YU3pxSPfy0CLquVgsx/j/hBi6OvH1Nw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -9513,8 +9386,8 @@ packages: peerDependencies: seroval: ^1.0 - seroval-plugins@1.6.7: - resolution: {integrity: sha512-4Nk35ttD3DTDJW4hgw5StsVAPeU6qnDFnULAouw6tQ7oLTV/ICXrWpsXo2EE52eSP2joUMazbVf52mFEcADqRw==} + seroval-plugins@1.6.8: + resolution: {integrity: sha512-N7mWAMydj89EnYTHtRpS3LBrAz3J9O6oVrqpuXuvlAHfAUG8WEKqtbAd7SBiJNY5NfCAFhSdyAh7wI4Shjqy4g==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -9523,8 +9396,8 @@ packages: resolution: {integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==} engines: {node: '>=10'} - seroval@1.6.7: - resolution: {integrity: sha512-AeDcLh0yO2SFm9W71essgnSzLV9DI8ZH0x0knXn2DMnUZj728mpLbxjlbB6IqKCmqh8JA3cEqRyGoNkt584JcQ==} + seroval@1.6.8: + resolution: {integrity: sha512-HlSgSAkTk4EqHcje1ptJjfZi1YDv5KbhVJ/d3P7T/nAXua2VmDu+AKDX5VTdFfZf48nDkWB2TKYt0DrCSa+3wg==} engines: {node: '>=10'} serve-static@2.2.1: @@ -9551,8 +9424,8 @@ packages: engines: {node: '>=20.18.1'} hasBin: true - sharp@0.35.4: - resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} engines: {node: '>=20.9.0'} peerDependencies: '@types/node': '*' @@ -9568,8 +9441,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.10.0: - resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + shell-quote@1.11.0: + resolution: {integrity: sha512-JdxDPD0DBTyu08pq0kPC0xSNet/qsU07qT6IsX1AS8oO2ICNRY4ldNa8OAI6PuwAH8tG3lxEhbqmyp4Dw4036g==} engines: {node: '>= 0.4'} shiki@4.4.3: @@ -9592,9 +9465,6 @@ packages: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -9624,8 +9494,8 @@ packages: resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} engines: {node: '>=10.0.0'} - socket.io@4.8.3: - resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} + socket.io@4.8.4: + resolution: {integrity: sha512-9ZV9zg8vN8hO3Y25DhR7nUkJ1VDnBhq5O/JrXhFT9s6+F0gqytSASTHVfCFc2mJXaTfARroErplXlzFWwETZqQ==} engines: {node: '>=10.2.0'} socks@2.8.10: @@ -9635,6 +9505,22 @@ packages: solid-js@1.9.15: resolution: {integrity: sha512-EeiY2xfpZJqPLjXspVEKjAII4yv8NyG//NxZ3IpOFHdUNnnTyL0uJOeS9LWGvA7cFCz5y94cjFwYlmw5Luncsg==} + solid-presence@0.2.0: + resolution: {integrity: sha512-YM92o+jvpzX3XGaD4rLYmq/Kc2ZVh47GSCLEufHBFQQIurvZTs8SoGJxO8BJGNDxBKdcS8F3dYhW1SDXp4BNjA==} + peerDependencies: + solid-js: ^1.8 + + solid-prevent-scroll@0.1.11: + resolution: {integrity: sha512-2PComVCDHaQN/5t7ogEqUYeHasritZKXZ8Sb/VLkl0Web8o9YhEwOo8LSujJEahvMlYCNyKt0zRJeHldOAeWZg==} + peerDependencies: + solid-js: ^1.8 + + solid-transition-group@0.2.3: + resolution: {integrity: sha512-iB72c9N5Kz9ykRqIXl0lQohOau4t0dhel9kjwFvx81UZJbVwaChMuBuyhiZmK24b8aKEK0w3uFM96ZxzcyZGdg==} + engines: {node: '>=18.0.0', pnpm: '>=8.6.0'} + peerDependencies: + solid-js: ^1.6.12 + sonner@2.0.8: resolution: {integrity: sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==} peerDependencies: @@ -9653,8 +9539,8 @@ packages: resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} engines: {node: '>=0.10.0'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map@0.6.1: @@ -9673,8 +9559,8 @@ packages: engines: {node: '>=20.16.0'} hasBin: true - srvx@1.0.4: - resolution: {integrity: sha512-eZmYaxUfZSo7/8m8UdsHRJNmTLSCTPPom9d7a60vMmuVeZvwhbvflRR+00/CxTCjMOFa5+H8tgBeNDVZ+w7AAQ==} + srvx@1.0.5: + resolution: {integrity: sha512-KvSKRpgPG/oaq3cyT614OQ2bAa7DynuGamivCZeoZzIUULOdbQz6wUtnnVuC4+DCx2Zglzo8v5gBYmWIWYhDxA==} engines: {node: '>=20.16.0'} hasBin: true @@ -9682,18 +9568,15 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + standardwebhooks@1.1.1: + resolution: {integrity: sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==} statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} @@ -9707,8 +9590,8 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamx@2.28.0: - resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} string-ts@2.3.1: resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==} @@ -9721,8 +9604,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.2: - resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} engines: {node: '>=20'} string.prototype.includes@2.0.1: @@ -9813,8 +9696,9 @@ packages: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} @@ -9824,8 +9708,8 @@ packages: resolution: {integrity: sha512-0OJWD12D7XX3KUg1DYkMaTTjSTo2k/mhIYI3HlBlceXSMcJhW/1qO735fPKS5prcyjvn57Ub151vvASYXpQrEw==} engines: {node: '>=18'} - systeminformation@5.33.10: - resolution: {integrity: sha512-/NXbMVASt2UbSVgmWto4aBTIAeuYY7zOELpZybmNxqpsrbo5uYHpuEPf5nkyrPng0uG5YOb+Yv6s0FyKY4mDQg==} + systeminformation@5.33.15: + resolution: {integrity: sha512-s5RloL0F7xhN0ZjfHtLGnbf7EW74EI0N8NFL+1xR7Oxz9QA33obNZsl7lyfnJOhN04E/kGFPoJPlvY7TZ5fzmw==} engines: {node: '>=10.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -9834,8 +9718,8 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwind-merge@3.6.0: - resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + tailwind-merge@3.7.0: + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} tailwindcss@4.3.3: resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} @@ -9867,17 +9751,13 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@6.1.4: - resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + tinybench@6.2.0: + resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} engines: {node: '>=20.0.0'} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.3.0: - resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} - engines: {node: '>=18'} - tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} @@ -9886,15 +9766,15 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} - tldts-core@7.4.12: - resolution: {integrity: sha512-nYNzS2WRf4QJmjzFFgAxLOBjyBxAGRbCy9PVBPaglcYyYajh40VBn+v5Ngr96ZMc7oM0+aCJdtQnNejvdBnXMQ==} + tldts-core@7.4.16: + resolution: {integrity: sha512-MDolfaSJtlSK5Y0A1xl3277ekubZwobpBjugknDizI9O5Rm60a1m8k4ICK+MRsCDzPygT81mp3BBf5RKDlFRfA==} - tldts@7.4.12: - resolution: {integrity: sha512-WylhSDKVeYnWXL3a+vKTaOxjnOeEGw938hImY8zoRWJjRRK/Jp1K+IihBzIONpUmW4e3WmXT6q5FW6vlESVZCA==} + tldts@7.4.16: + resolution: {integrity: sha512-QwBER5KMR86IIjpIiO7H/Z3IMJPsZ1A6RKPAqzTTgOyUQUSt9FdnKcqhTaJmkY6HVrgouZHZR0ncK5QxvmnQeg==} hasBin: true to-regex-range@5.0.1: @@ -9947,8 +9827,8 @@ packages: ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} - tsc-alias@1.9.5: - resolution: {integrity: sha512-B2M3D2Fsb8dPT04Jc52R2Erp9u7QUjXpjb648dvKb0esKVmo0CC28KFe98sFkjmnY36D+PFqnAE/UDbHGbV+mA==} + tsc-alias@1.9.7: + resolution: {integrity: sha512-nGOOLMkaociegx2Y9J1lnbqrledf1EfSq3Ds4H4CLySG5RyD58KrR4ahFIAgpeMVJz4BIhJND3ETt02o9zKQAw==} engines: {node: '>=16.20.2'} hasBin: true @@ -9981,8 +9861,8 @@ packages: typescript: optional: true - tsx@4.23.13: - resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} hasBin: true @@ -9990,8 +9870,8 @@ packages: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} - turbo@2.10.12: - resolution: {integrity: sha512-AswgMPnpOoaVZHrrSBejETzEbuIA69OVGwfkHwfrY0A23VjWXBANzgq9+OymWOHAIArB7D1+1z498WY8fGg1Jw==} + turbo@2.11.5: + resolution: {integrity: sha512-qLXheqz3TUvJpHIV6MUBwkNkvwKxMVG/QsimyiKT9DfNWPHJ294G/i5nDaH+fbHJt3UH7orubNNxAqYkbUNGAQ==} hasBin: true tw-animate-css@1.4.0: @@ -10005,8 +9885,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.9.0: - resolution: {integrity: sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==} + type-fest@5.10.0: + resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} engines: {node: '>=20'} type-is@2.1.0: @@ -10021,23 +9901,16 @@ packages: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + typed-array-byte-offset@1.0.5: + resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==} engines: {node: '>= 0.4'} typed-array-length@1.0.8: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.65.0: - resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - typescript-eslint@8.70.0: - resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} + typescript-eslint@8.71.0: + resolution: {integrity: sha512-fBdHYiqQ14RW6mOMXD14Svn82ZsCYAoQSzGRzyEjR59S5A2Krh/l7fGTOQ7iCr8gGy/mHVXtEF7s5fgjEdV0Pw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -10056,8 +9929,8 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - uint8array-extras@1.5.0: - resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + uint8array-extras@1.6.0: + resolution: {integrity: sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==} engines: {node: '>=18'} unbox-primitive@1.1.0: @@ -10073,12 +9946,12 @@ packages: undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@7.29.1: - resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} + undici@7.30.0: + resolution: {integrity: sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==} engines: {node: '>=20.18.1'} - undici@8.10.2: - resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==} + undici@8.11.2: + resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} engines: {node: '>=22.19.0'} unenv@2.0.0-rc.24: @@ -10127,11 +10000,12 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@3.3.0: - resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@farmfe/core': '*' + '@rsbuild/core': '*' '@rspack/core': '*' bun-types-no-globals: '*' esbuild: '*' @@ -10143,6 +10017,8 @@ packages: peerDependenciesMeta: '@farmfe/core': optional: true + '@rsbuild/core': + optional: true '@rspack/core': optional: true bun-types-no-globals: @@ -10191,10 +10067,14 @@ packages: peerDependencies: react: '*' - use-intl@4.14.4: - resolution: {integrity: sha512-V5hyjHe9q/lB1FrTc8s/9P+OiE1R0WS3G2BPTyMOVx4m2MsJd5ORoGtfwe8ciMXxxs676SfbP3agRngBQcn02w==} + use-intl@4.14.8: + resolution: {integrity: sha512-i12Qzqt+yAVfqf0RPtFbCClJAG9dZrJuL1VU/b7zvg/13LSKzoT63+fVZpig+SGplclG7fFK8a6nxtFwoGZEDQ==} peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} @@ -10244,8 +10124,8 @@ packages: victory-vendor@37.3.6: resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - vite@8.3.0: - resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==} + vite@8.3.1: + resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -10295,20 +10175,20 @@ packages: vite: optional: true - vitest@5.0.0: - resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==} + vitest@5.0.3: + resolution: {integrity: sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.0 - '@vitest/browser-preview': 5.0.0 + '@vitest/browser-playwright': 5.0.3 + '@vitest/browser-preview': 5.0.3 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.0 - '@vitest/coverage-v8': 5.0.0 - '@vitest/ui': 5.0.0 + '@vitest/coverage-istanbul': 5.0.3 + '@vitest/coverage-v8': 5.0.3 + '@vitest/ui': 5.0.3 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 @@ -10345,9 +10225,9 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@6.0.0: + resolution: {integrity: sha512-4Nsy8K5Tr6SPDH9jhKJOHf7ChDrc1zufZTVSF7x72hwuEXBqxqk9G6cK+K2NRUtB3iELRJqjXb4JPDMBjMTl2Q==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -10370,8 +10250,8 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - whatwg-url@17.1.1: - resolution: {integrity: sha512-ohjk1mdUebJVadRt3bAhQhx8lSnISq+GDttK79LFl8EHQkAPvzwctoasC4hs8tBt6kLAncBWWyq1N52qEfKvDw==} + whatwg-url@17.1.2: + resolution: {integrity: sha512-TEZA+Zqxin7Jjsm2cjRohCmen5awh+hT6Zi3VZdqZlNRk7zvOI/9WpBFg/DWlA56bWnzwm6DuB8NS0EsxQH9uQ==} engines: {node: ^22.14.0 || >=24.0.0} when-exit@2.1.5: @@ -10389,8 +10269,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.22: - resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + which-typed-array@1.1.24: + resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==} engines: {node: '>= 0.4'} which@2.0.2: @@ -10403,9 +10283,9 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true word-wrap@1.2.5: @@ -10431,8 +10311,20 @@ packages: utf-8-validate: optional: true - wsl-utils@1.0.0: - resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@1.0.1: + resolution: {integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==} engines: {node: '>=20'} xml-name-validator@5.0.0: @@ -10459,11 +10351,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.9.1: resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} engines: {node: '>= 14.6'} @@ -10500,14 +10387,14 @@ packages: yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - yuku-analyzer@0.9.3: - resolution: {integrity: sha512-2xSREErroEF8boH7XyKfVO5hbjP6PCIYYnLR2Abg6PGJaFVbETLucmbzIebBOHeyY4GO6VXzloTuhUldR/zyew==} + yuku-analyzer@0.10.2: + resolution: {integrity: sha512-UBRcDcZtIn14g88loZUZ123d6MOkc2hMTawUle5MkuWboowM90KbWHN3Zz+HfuS06sw935ygecBpcJlXHB/pOA==} - yuku-ast@0.9.3: - resolution: {integrity: sha512-Kt0PXlPCXdKF1fWFTl7N3DaxsVk6DHF8VAXHJMkwPtJnWYgbx20pYgGSweuC/86mIM7k1NUITQ4JffgOLUWTCw==} + yuku-ast@0.10.2: + resolution: {integrity: sha512-UnG9mA6giglCvSErft2/40TVFX750Sj1xgwddPLpG7J7rlr/P1wPADg9G2RK+d/1tNLtRVoLdMMOMVBB9561TQ==} - zbsearch@4.0.0: - resolution: {integrity: sha512-gm4zfO31n2ZdruTTRQoWVWO4Q2+zrDt2GlrvIc+5JulRQNAm4IanCxER82vQ7Ug96FYkGqWUJBXFe1kGAcDWaQ==} + zbsearch@4.0.1: + resolution: {integrity: sha512-lmnEEnb93QQcNv7qARDr7jBVPxYdZbZ9XdZ0dbZ0qaOvGne4jJMW4fjwPfVaUKQXv3FNWvGbDwRDgyaSb1pc8w==} engines: {node: '>= 20.0.0'} zod-to-json-schema@3.25.2: @@ -10524,229 +10411,229 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.6.2: - resolution: {integrity: sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/anthropic@4.0.53(zod@4.6.2)': + '@ai-sdk/anthropic@4.0.70(zod@4.6.5)': dependencies: - '@ai-sdk/provider': 4.0.14 - '@ai-sdk/provider-utils': 5.0.40(zod@4.6.2) - zod: 4.6.2 + '@ai-sdk/provider': 4.0.21 + '@ai-sdk/provider-utils': 5.0.53(zod@4.6.5) + zod: 4.6.5 - '@ai-sdk/gateway@4.0.80(zod@4.6.2)': + '@ai-sdk/gateway@4.0.102(zod@4.6.5)': dependencies: - '@ai-sdk/provider': 4.0.14 - '@ai-sdk/provider-utils': 5.0.40(zod@4.6.2) + '@ai-sdk/provider': 4.0.21 + '@ai-sdk/provider-utils': 5.0.53(zod@4.6.5) '@vercel/oidc': 3.2.0 - zod: 4.6.2 + zod: 4.6.5 - '@ai-sdk/google@4.0.69(zod@4.6.2)': + '@ai-sdk/google@4.0.87(zod@4.6.5)': dependencies: - '@ai-sdk/provider': 4.0.14 - '@ai-sdk/provider-utils': 5.0.40(zod@4.6.2) - zod: 4.6.2 + '@ai-sdk/provider': 4.0.21 + '@ai-sdk/provider-utils': 5.0.53(zod@4.6.5) + zod: 4.6.5 - '@ai-sdk/provider-utils@5.0.40(zod@4.6.2)': + '@ai-sdk/provider-utils@5.0.53(zod@4.6.5)': dependencies: - '@ai-sdk/provider': 4.0.14 + '@ai-sdk/provider': 4.0.21 '@standard-schema/spec': 1.1.0 '@workflow/serde': 4.1.0 eventsource-parser: 3.1.1 - undici: 7.29.1 - zod: 4.6.2 + undici: 7.30.0 + zod: 4.6.5 - '@ai-sdk/provider@4.0.14': + '@ai-sdk/provider@4.0.21': dependencies: json-schema: 0.4.0 - '@asamuzakjp/css-color@6.0.7': + '@asamuzakjp/css-color@7.1.2': dependencies: - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.5.2 + '@csstools/css-calc': 3.4.1(@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-color-parser': 4.2.4(@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.1(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 + lru-cache: 11.5.3 - '@asamuzakjp/dom-selector@8.3.2': + '@asamuzakjp/dom-selector@9.2.2': dependencies: bidi-js: 1.1.0 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.2 + lru-cache: 11.5.3 - '@asteasolutions/zod-to-openapi@9.1.0(zod@4.6.2)': + '@asteasolutions/zod-to-openapi@9.1.0(zod@4.6.5)': dependencies: openapi3-ts: 4.6.1 - zod: 4.6.2 + zod: 4.6.5 '@astrojs/compiler@4.0.0': {} - '@aws-sdk/checksums@3.1001.0': + '@aws-sdk/checksums@3.1001.1': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1131.0': + '@aws-sdk/client-s3@3.1144.0': dependencies: - '@aws-sdk/checksums': 3.1001.0 - '@aws-sdk/core': 3.978.0 - '@aws-sdk/credential-provider-node': 3.972.83 - '@aws-sdk/middleware-sdk-s3': 3.972.76 - '@aws-sdk/signature-v4-multi-region': 3.996.46 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 + '@aws-sdk/checksums': 3.1001.1 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/credential-provider-node': 3.972.84 + '@aws-sdk/middleware-sdk-s3': 3.972.77 + '@aws-sdk/signature-v4-multi-region': 3.996.47 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 '@smithy/fetch-http-handler': 5.8.0 '@smithy/node-http-handler': 4.12.1 - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/core@3.978.0': + '@aws-sdk/core@3.978.1': dependencies: - '@aws-sdk/types': 3.974.5 - '@aws-sdk/xml-builder': 3.972.40 + '@aws-sdk/types': 3.974.6 + '@aws-sdk/xml-builder': 3.972.41 '@aws/lambda-invoke-store': 0.3.0 - '@smithy/core': 3.34.1 - '@smithy/signature-v4': 5.7.3 - '@smithy/types': 4.18.0 + '@smithy/core': 3.35.0 + '@smithy/signature-v4': 5.7.4 + '@smithy/types': 4.19.0 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.71': + '@aws-sdk/credential-provider-env@3.972.72': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.73': + '@aws-sdk/credential-provider-http@3.972.74': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 '@smithy/fetch-http-handler': 5.8.0 '@smithy/node-http-handler': 4.12.1 - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.973.16': - dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/credential-provider-env': 3.972.71 - '@aws-sdk/credential-provider-http': 3.972.73 - '@aws-sdk/credential-provider-login': 3.972.78 - '@aws-sdk/credential-provider-process': 3.972.71 - '@aws-sdk/credential-provider-sso': 3.973.15 - '@aws-sdk/credential-provider-web-identity': 3.972.77 - '@aws-sdk/nested-clients': 3.997.45 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 + '@aws-sdk/credential-provider-ini@3.973.17': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/credential-provider-env': 3.972.72 + '@aws-sdk/credential-provider-http': 3.972.74 + '@aws-sdk/credential-provider-login': 3.972.79 + '@aws-sdk/credential-provider-process': 3.972.72 + '@aws-sdk/credential-provider-sso': 3.973.16 + '@aws-sdk/credential-provider-web-identity': 3.972.78 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 '@smithy/credential-provider-imds': 4.5.2 - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-login@3.972.78': + '@aws-sdk/credential-provider-login@3.972.79': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/nested-clients': 3.997.45 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.83': + '@aws-sdk/credential-provider-node@3.972.84': dependencies: - '@aws-sdk/credential-provider-env': 3.972.71 - '@aws-sdk/credential-provider-http': 3.972.73 - '@aws-sdk/credential-provider-ini': 3.973.16 - '@aws-sdk/credential-provider-process': 3.972.71 - '@aws-sdk/credential-provider-sso': 3.973.15 - '@aws-sdk/credential-provider-web-identity': 3.972.77 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 + '@aws-sdk/credential-provider-env': 3.972.72 + '@aws-sdk/credential-provider-http': 3.972.74 + '@aws-sdk/credential-provider-ini': 3.973.17 + '@aws-sdk/credential-provider-process': 3.972.72 + '@aws-sdk/credential-provider-sso': 3.973.16 + '@aws-sdk/credential-provider-web-identity': 3.972.78 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 '@smithy/credential-provider-imds': 4.5.2 - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.71': + '@aws-sdk/credential-provider-process@3.972.72': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.973.15': + '@aws-sdk/credential-provider-sso@3.973.16': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/nested-clients': 3.997.45 - '@aws-sdk/token-providers': 3.1129.0 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/token-providers': 3.1138.0 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.77': + '@aws-sdk/credential-provider-web-identity@3.972.78': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/nested-clients': 3.997.45 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.76': + '@aws-sdk/middleware-sdk-s3@3.972.77': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/signature-v4-multi-region': 3.996.46 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/signature-v4-multi-region': 3.996.47 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.45': + '@aws-sdk/nested-clients@3.997.46': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/signature-v4-multi-region': 3.996.46 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/signature-v4-multi-region': 3.996.47 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 '@smithy/fetch-http-handler': 5.8.0 '@smithy/node-http-handler': 4.12.1 - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.46': + '@aws-sdk/signature-v4-multi-region@3.996.47': dependencies: - '@aws-sdk/types': 3.974.5 - '@smithy/signature-v4': 5.7.3 - '@smithy/types': 4.18.0 + '@aws-sdk/types': 3.974.6 + '@smithy/signature-v4': 5.7.4 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1129.0': + '@aws-sdk/token-providers@3.1138.0': dependencies: - '@aws-sdk/core': 3.978.0 - '@aws-sdk/nested-clients': 3.997.45 - '@aws-sdk/types': 3.974.5 - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/types@3.974.5': + '@aws-sdk/types@3.974.6': dependencies: - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.40': + '@aws-sdk/xml-builder@3.972.41': dependencies: - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 '@aws/lambda-invoke-store@0.3.0': {} @@ -10795,7 +10682,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.9 + browserslist: 4.29.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -10896,7 +10783,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.9(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 @@ -10914,7 +10801,7 @@ snapshots: '@babel/helper-validator-option': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -10950,11 +10837,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 @@ -11005,29 +10887,34 @@ snapshots: hashery: 1.5.1 keyv: 5.6.0 - '@csstools/color-helpers@6.1.1': {} + '@corvu/utils@0.4.2(solid-js@1.9.15)': + dependencies: + '@floating-ui/dom': 1.8.0 + solid-js: 1.9.15 + + '@csstools/color-helpers@6.1.2': {} - '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.4.1(@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 4.0.1(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-color-parser@4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.2.4(@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/color-helpers': 6.1.1 - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/color-helpers': 6.1.2 + '@csstools/css-calc': 3.4.1(@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.1(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-parser-algorithms@4.0.1(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-syntax-patches-for-csstree@1.1.13(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.14(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 - '@csstools/css-tokenizer@4.0.0': {} + '@csstools/css-tokenizer@4.0.2': {} '@date-fns/tz@1.5.0': {} @@ -11077,14 +10964,14 @@ snapshots: object-treeify: 1.1.33 open: 8.4.2 picomatch: 4.0.7 - systeminformation: 5.33.10 - undici: 7.29.1 + systeminformation: 5.33.15 + undici: 7.30.0 which: 4.0.0 yocto-spinner: 1.2.2 '@dotenvx/primitives@0.8.0': {} - '@drizzle-team/brocli@0.12.0': {} + '@drizzle-team/brocli@0.12.1': {} '@elastic/elasticsearch@9.5.1(apache-arrow@21.2.0)': dependencies: @@ -11104,7 +10991,7 @@ snapshots: ms: 2.1.3 secure-json-parse: 4.1.0 tslib: 2.8.1 - undici: 7.29.1 + undici: 7.30.0 transitivePeerDependencies: - supports-color @@ -11457,96 +11344,100 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0(jiti@2.7.0))': dependencies: - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/ast@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) - string-ts: 2.3.1 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/core@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/core@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/eslint-plugin@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint-plugin@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) - eslint-plugin-react-dom: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-jsx: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-naming-convention: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-rsc: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-web-api: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-react-x: 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-dom: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-jsx: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-naming-convention: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-rsc: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-web-api: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-x: 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/eslint@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/eslint@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/jsx@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/jsx@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) - ts-pattern: 5.9.0 + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/shared@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/shared@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 - zod: 4.6.2 + zod: 4.6.5 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - '@eslint-react/var@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@eslint-react/var@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.71.0 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color @@ -11570,9 +11461,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.10.0(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.11.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -11581,17 +11472,17 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.1': {} + '@exodus/bytes@1.16.0': {} '@ferrucc-io/emoji-picker@0.1.2(@babel/core@7.29.7)(@babel/template@7.29.7)(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3)': dependencies: - '@tanstack/react-virtual': 3.14.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-virtual': 3.14.13(react-dom@19.3.0(react@19.3.0))(react@19.3.0) clsx: 2.1.1 jotai: 2.20.3(@babel/core@7.29.7)(@babel/template@7.29.7)(@types/react@19.3.0)(react@19.3.0) node-emoji: 2.2.0 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - tailwind-merge: 3.6.0 + tailwind-merge: 3.7.0 tailwindcss: 4.3.3 unicode-emoji-json: 0.8.0 transitivePeerDependencies: @@ -11618,12 +11509,18 @@ snapshots: '@formatjs/fast-memoize@3.1.7': {} - '@formatjs/icu-messageformat-parser@3.5.17': + '@formatjs/icu-messageformat-parser@3.5.18': dependencies: '@formatjs/icu-skeleton-parser': 2.1.11 + '@formatjs/icu-messageformat-parser@3.5.20': + dependencies: + '@formatjs/icu-skeleton-parser': 2.1.12 + '@formatjs/icu-skeleton-parser@2.1.11': {} + '@formatjs/icu-skeleton-parser@2.1.12': {} + '@fuma-translate/react@1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: react: 19.3.0 @@ -11631,34 +11528,34 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@fumadocs/tailwind@0.1.1(tailwindcss@4.3.3)': + '@fumadocs/tailwind@0.1.2(tailwindcss@4.3.3)': optionalDependencies: tailwindcss: 4.3.3 - '@fumari/image-size@0.1.0': {} + '@fumari/image-size@0.1.1': {} '@hexagon/base64@1.1.28': {} - '@hono/node-server@2.1.1(hono@4.13.7)': + '@hono/node-server@2.1.3(hono@4.13.12)': dependencies: - hono: 4.13.7 + hono: 4.13.12 - '@hono/swagger-ui@0.6.1(hono@4.13.7)': + '@hono/swagger-ui@0.6.1(hono@4.13.12)': dependencies: - hono: 4.13.7 + hono: 4.13.12 - '@hono/zod-openapi@1.6.3(hono@4.13.7)(zod@4.6.2)': + '@hono/zod-openapi@1.6.3(hono@4.13.12)(zod@4.6.5)': dependencies: - '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.6.2) - '@hono/zod-validator': 0.9.1(hono@4.13.7)(zod@4.6.2) - hono: 4.13.7 + '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.6.5) + '@hono/zod-validator': 0.9.1(hono@4.13.12)(zod@4.6.5) + hono: 4.13.12 openapi3-ts: 4.6.1 - zod: 4.6.2 + zod: 4.6.5 - '@hono/zod-validator@0.9.1(hono@4.13.7)(zod@4.6.2)': + '@hono/zod-validator@0.9.1(hono@4.13.12)(zod@4.6.5)': dependencies: - hono: 4.13.7 - zod: 4.6.2 + hono: 4.13.12 + zod: 4.6.5 '@humanfs/core@0.19.2': dependencies: @@ -11680,228 +11577,232 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.35.4': + '@img/sharp-darwin-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.3 + '@img/sharp-libvips-darwin-arm64': 1.3.4 optional: true - '@img/sharp-darwin-x64@0.35.4': + '@img/sharp-darwin-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.3 + '@img/sharp-libvips-darwin-x64': 1.3.4 optional: true - '@img/sharp-freebsd-wasm32@0.35.4': + '@img/sharp-freebsd-wasm32@0.35.5': dependencies: - '@img/sharp-wasm32': 0.35.4 + '@img/sharp-wasm32': 0.35.5 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.3': + '@img/sharp-libvips-darwin-arm64@1.3.4': optional: true - '@img/sharp-libvips-darwin-x64@1.3.3': + '@img/sharp-libvips-darwin-x64@1.3.4': optional: true - '@img/sharp-libvips-linux-arm64@1.3.3': + '@img/sharp-libvips-linux-arm64@1.3.4': optional: true - '@img/sharp-libvips-linux-arm@1.3.3': + '@img/sharp-libvips-linux-arm@1.3.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.3': + '@img/sharp-libvips-linux-ppc64@1.3.4': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.3': + '@img/sharp-libvips-linux-riscv64@1.3.4': optional: true - '@img/sharp-libvips-linux-s390x@1.3.3': + '@img/sharp-libvips-linux-s390x@1.3.4': optional: true - '@img/sharp-libvips-linux-x64@1.3.3': + '@img/sharp-libvips-linux-x64@1.3.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.3': + '@img/sharp-libvips-linuxmusl-x64@1.3.4': optional: true - '@img/sharp-linux-arm64@0.35.4': + '@img/sharp-linux-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.3 + '@img/sharp-libvips-linux-arm64': 1.3.4 optional: true - '@img/sharp-linux-arm@0.35.4': + '@img/sharp-linux-arm@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.3 + '@img/sharp-libvips-linux-arm': 1.3.4 optional: true - '@img/sharp-linux-ppc64@0.35.4': + '@img/sharp-linux-ppc64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.3 + '@img/sharp-libvips-linux-ppc64': 1.3.4 optional: true - '@img/sharp-linux-riscv64@0.35.4': + '@img/sharp-linux-riscv64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.3 + '@img/sharp-libvips-linux-riscv64': 1.3.4 optional: true - '@img/sharp-linux-s390x@0.35.4': + '@img/sharp-linux-s390x@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.3 + '@img/sharp-libvips-linux-s390x': 1.3.4 optional: true - '@img/sharp-linux-x64@0.35.4': + '@img/sharp-linux-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.3 + '@img/sharp-libvips-linux-x64': 1.3.4 optional: true - '@img/sharp-linuxmusl-arm64@0.35.4': + '@img/sharp-linuxmusl-arm64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 optional: true - '@img/sharp-linuxmusl-x64@0.35.4': + '@img/sharp-linuxmusl-x64@0.35.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 optional: true - '@img/sharp-wasm32@0.35.4': + '@img/sharp-wasm32@0.35.5': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.4': + '@img/sharp-webcontainers-wasm32@0.35.5': dependencies: - '@img/sharp-wasm32': 0.35.4 + '@img/sharp-wasm32': 0.35.5 optional: true - '@img/sharp-win32-arm64@0.35.4': + '@img/sharp-win32-arm64@0.35.5': optional: true - '@img/sharp-win32-ia32@0.35.4': + '@img/sharp-win32-ia32@0.35.5': optional: true - '@img/sharp-win32-x64@0.35.4': + '@img/sharp-win32-x64@0.35.5': optional: true '@inquirer/ansi@2.0.8': {} - '@inquirer/checkbox@5.2.5(@types/node@26.5.1)': + '@inquirer/checkbox@5.2.5(@types/node@26.6.3)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/confirm@6.3.2(@types/node@26.5.1)': + '@inquirer/confirm@6.3.2(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/core@12.0.3(@types/node@26.5.1)': + '@inquirer/core@12.0.3(@types/node@26.6.3)': dependencies: '@inquirer/ansi': 2.0.8 '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/type': 4.1.1(@types/node@26.6.3) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/editor@5.3.3(@types/node@26.5.1)': + '@inquirer/editor@5.3.3(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/external-editor': 3.0.5(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/external-editor': 3.0.5(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/expand@5.1.5(@types/node@26.5.1)': + '@inquirer/expand@5.1.5(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/external-editor@3.0.5(@types/node@26.5.1)': + '@inquirer/external-editor@3.0.5(@types/node@26.6.3)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 '@inquirer/figures@2.0.9': {} - '@inquirer/input@5.1.6(@types/node@26.5.1)': + '@inquirer/input@5.1.6(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/number@4.2.3(@types/node@26.5.1)': + '@inquirer/number@4.2.3(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/password@5.2.2(@types/node@26.5.1)': + '@inquirer/password@5.2.2(@types/node@26.6.3)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 - - '@inquirer/prompts@8.7.2(@types/node@26.5.1)': - dependencies: - '@inquirer/checkbox': 5.2.5(@types/node@26.5.1) - '@inquirer/confirm': 6.3.2(@types/node@26.5.1) - '@inquirer/editor': 5.3.3(@types/node@26.5.1) - '@inquirer/expand': 5.1.5(@types/node@26.5.1) - '@inquirer/input': 5.1.6(@types/node@26.5.1) - '@inquirer/number': 4.2.3(@types/node@26.5.1) - '@inquirer/password': 5.2.2(@types/node@26.5.1) - '@inquirer/rawlist': 5.3.5(@types/node@26.5.1) - '@inquirer/search': 4.3.3(@types/node@26.5.1) - '@inquirer/select': 5.2.5(@types/node@26.5.1) + '@types/node': 26.6.3 + + '@inquirer/prompts@8.7.2(@types/node@26.6.3)': + dependencies: + '@inquirer/checkbox': 5.2.5(@types/node@26.6.3) + '@inquirer/confirm': 6.3.2(@types/node@26.6.3) + '@inquirer/editor': 5.3.3(@types/node@26.6.3) + '@inquirer/expand': 5.1.5(@types/node@26.6.3) + '@inquirer/input': 5.1.6(@types/node@26.6.3) + '@inquirer/number': 4.2.3(@types/node@26.6.3) + '@inquirer/password': 5.2.2(@types/node@26.6.3) + '@inquirer/rawlist': 5.3.5(@types/node@26.6.3) + '@inquirer/search': 4.3.3(@types/node@26.6.3) + '@inquirer/select': 5.2.5(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/rawlist@5.3.5(@types/node@26.5.1)': + '@inquirer/rawlist@5.3.5(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/search@4.3.3(@types/node@26.5.1)': + '@inquirer/search@4.3.3(@types/node@26.6.3)': dependencies: - '@inquirer/core': 12.0.3(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/select@5.2.5(@types/node@26.5.1)': + '@inquirer/select@5.2.5(@types/node@26.6.3)': dependencies: '@inquirer/ansi': 2.0.8 - '@inquirer/core': 12.0.3(@types/node@26.5.1) + '@inquirer/core': 12.0.3(@types/node@26.6.3) '@inquirer/figures': 2.0.9 - '@inquirer/type': 4.1.1(@types/node@26.5.1) + '@inquirer/type': 4.1.1(@types/node@26.6.3) optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 - '@inquirer/type@4.1.1(@types/node@26.5.1)': + '@inquirer/type@4.1.1(@types/node@26.6.3)': optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 + + '@internationalized/number@3.6.8': + dependencies: + '@swc/helpers': 0.5.23 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -11934,6 +11835,28 @@ snapshots: '@keyv/serialize@1.1.1': {} + '@kobalte/core@0.13.14(solid-js@1.9.15)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@internationalized/number': 3.6.8 + '@kobalte/utils': 0.9.2(solid-js@1.9.15) + '@solid-primitives/props': 3.2.4(solid-js@1.9.15) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.15) + solid-js: 1.9.15 + solid-presence: 0.2.0(solid-js@1.9.15) + solid-prevent-scroll: 0.1.11(solid-js@1.9.15) + + '@kobalte/utils@0.9.2(solid-js@1.9.15)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) + '@solid-primitives/keyed': 1.5.3(solid-js@1.9.15) + '@solid-primitives/map': 0.4.13(solid-js@1.9.15) + '@solid-primitives/media': 2.3.6(solid-js@1.9.15) + '@solid-primitives/props': 3.2.4(solid-js@1.9.15) + '@solid-primitives/refs': 1.1.4(solid-js@1.9.15) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + '@levischuck/tiny-cbor@0.2.11': {} '@mdx-js/mdx@3.1.1': @@ -11966,9 +11889,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.31.0(zod@3.25.76)': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.7) + '@hono/node-server': 2.1.3(hono@4.13.12) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -11978,7 +11901,7 @@ snapshots: eventsource-parser: 3.1.1 express: 5.2.1 express-rate-limit: 8.7.0(express@5.2.1) - hono: 4.13.7 + hono: 4.13.12 jose: 6.2.12 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -11988,6 +11911,9 @@ snapshots: transitivePeerDependencies: - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -12060,25 +11986,25 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.3 + '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.3 - '@tybys/wasm-util': 0.10.3 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@tybys/wasm-util': 0.10.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 optional: true '@neodrag/core@3.0.0-next.11': {} @@ -12158,7 +12084,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.220.0 - import-in-the-middle: 3.5.1 + import-in-the-middle: 3.5.2 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color @@ -12284,7 +12210,7 @@ snapshots: '@oxc-parser/binding-wasm32-wasi@0.120.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12312,7 +12238,7 @@ snapshots: '@oxc-project/types@0.148.0': {} - '@oxc-project/types@0.149.0': {} + '@oxc-project/types@0.152.0': {} '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true @@ -12366,7 +12292,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': @@ -12432,100 +12358,100 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.81.0': optional: true - '@peculiar/asn1-android@2.9.5': + '@peculiar/asn1-android@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-asym-key@2.9.5': + '@peculiar/asn1-asym-key@2.10.0': dependencies: - '@peculiar/asn1-pkcs8': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-pkcs8': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-cms@2.9.5': + '@peculiar/asn1-cms@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 - '@peculiar/asn1-x509-attr': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 + '@peculiar/asn1-x509-attr': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-csr@2.9.5': + '@peculiar/asn1-csr@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.9.5': + '@peculiar/asn1-ecc@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.9.5': + '@peculiar/asn1-pfx@2.10.0': dependencies: - '@peculiar/asn1-cms': 2.9.5 - '@peculiar/asn1-pkcs8': 2.9.5 - '@peculiar/asn1-rsa': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-cms': 2.10.0 + '@peculiar/asn1-pkcs8': 2.10.0 + '@peculiar/asn1-rsa': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.9.5': + '@peculiar/asn1-pkcs8@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.9.5': + '@peculiar/asn1-pkcs9@2.10.0': dependencies: - '@peculiar/asn1-cms': 2.9.5 - '@peculiar/asn1-pfx': 2.9.5 - '@peculiar/asn1-pkcs8': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 - '@peculiar/asn1-x509-attr': 2.9.5 + '@peculiar/asn1-cms': 2.10.0 + '@peculiar/asn1-pfx': 2.10.0 + '@peculiar/asn1-pkcs8': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 + '@peculiar/asn1-x509-attr': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.9.5': + '@peculiar/asn1-rsa@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-schema@2.9.5': + '@peculiar/asn1-schema@2.10.0': dependencies: '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.9.5': + '@peculiar/asn1-x509-attr@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-post-quantum@2.9.5': + '@peculiar/asn1-x509-post-quantum@2.10.0': dependencies: - '@peculiar/asn1-asym-key': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 + '@peculiar/asn1-asym-key': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509@2.9.5': + '@peculiar/asn1-x509@2.10.0': dependencies: - '@peculiar/asn1-schema': 2.9.5 + '@peculiar/asn1-schema': 2.10.0 '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 @@ -12536,14 +12462,14 @@ snapshots: '@peculiar/x509@2.1.0': dependencies: - '@peculiar/asn1-cms': 2.9.5 - '@peculiar/asn1-csr': 2.9.5 - '@peculiar/asn1-ecc': 2.9.5 - '@peculiar/asn1-pkcs9': 2.9.5 - '@peculiar/asn1-rsa': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 - '@peculiar/asn1-x509-post-quantum': 2.9.5 + '@peculiar/asn1-cms': 2.10.0 + '@peculiar/asn1-csr': 2.10.0 + '@peculiar/asn1-ecc': 2.10.0 + '@peculiar/asn1-pkcs9': 2.10.0 + '@peculiar/asn1-rsa': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 + '@peculiar/asn1-x509-post-quantum': 2.10.0 pvtsutils: 1.3.6 tslib: 2.8.1 tsyringe: 4.10.0 @@ -12557,15 +12483,13 @@ snapshots: '@preact/signals-core@1.14.4': {} - '@preact/signals@2.9.4(preact@10.29.7)': + '@preact/signals@2.11.3(preact@10.29.8)': dependencies: '@preact/signals-core': 1.14.4 - preact: 10.29.7 + preact: 10.29.8 '@radix-ui/number@1.1.3': {} - '@radix-ui/primitive@1.1.6': {} - '@radix-ui/primitive@1.1.7': {} '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': @@ -12622,53 +12546,18 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-compose-refs@1.1.3(@types/react@19.3.0)(react@19.3.0)': - dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-compose-refs@1.1.5(@types/react@19.3.0)(react@19.3.0)': dependencies: react: 19.3.0 optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-context@1.2.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-context@1.2.2(@types/react@19.3.0)(react@19.3.0)': dependencies: react: 19.3.0 optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-dialog@1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@radix-ui/primitive': 1.1.6 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-context': 1.2.0(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-dismissable-layer': 1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-focus-scope': 1.1.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-id': 1.1.2(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-portal': 1.1.14(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-presence': 1.1.8(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-slot': 1.3.0(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-use-controllable-state': 1.2.4(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - aria-hidden: 1.2.6 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 @@ -12698,54 +12587,24 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-dismissable-layer@1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@radix-ui/primitive': 1.1.6 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - - '@radix-ui/react-focus-guards@1.1.4(@types/react@19.3.0)(react@19.3.0)': - dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - - '@radix-ui/react-focus-guards@1.1.6(@types/react@19.3.0)(react@19.3.0)': - dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.3.0)(react@19.3.0) react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) optionalDependencies: '@types/react': 19.3.0 + '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-focus-scope@1.1.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.3.0)(react@19.3.0) react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) optionalDependencies: '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: @@ -12758,13 +12617,6 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-id@1.1.2(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-id@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) @@ -12835,16 +12687,6 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-portal@1.1.14(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -12864,15 +12706,6 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-presence@1.1.8(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) @@ -12882,15 +12715,6 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@radix-ui/react-slot': 1.3.0(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 @@ -12927,13 +12751,6 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-slot@1.3.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-slot@1.3.3(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) @@ -12957,27 +12774,12 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.3.0)(react@19.3.0)': - dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: react: 19.3.0 optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-use-controllable-state@1.2.4(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@radix-ui/primitive': 1.1.6 - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/primitive': 1.1.7 @@ -12987,13 +12789,6 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.3.0)(react@19.3.0) - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.3.0)(react@19.3.0)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.3.0)(react@19.3.0) @@ -13007,12 +12802,6 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.3.0)(react@19.3.0)': - dependencies: - react: 19.3.0 - optionalDependencies: - '@types/react': 19.3.0 - '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.3.0)(react@19.3.0)': dependencies: react: 19.3.0 @@ -13055,14 +12844,15 @@ snapshots: entities: 4.5.0 html-to-text: 9.0.5 html5parser: 3.0.0 - prettier: 3.9.6 + prettier: 3.9.9 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@react-email/ui@6.9.5(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@react-email/ui@6.11.0(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: esbuild: 0.28.1 - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + jiti: 2.6.1 + next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -13078,36 +12868,34 @@ snapshots: dependencies: agent-install: 0.0.6 commander: 14.0.3 - ignore: 7.0.9 + ignore: 7.0.11 ora: 9.4.1 package-manager-detector: 1.8.0 picocolors: 1.1.1 prompts: 2.4.2 tinyexec: 1.3.1 - '@redis/bloom@6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1))': + '@redis/bloom@6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) + '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) - '@redis/client@6.2.1(@opentelemetry/api@1.9.1)': - dependencies: - cluster-key-slot: 1.1.2 + '@redis/client@6.3.0(@opentelemetry/api@1.9.1)': optionalDependencies: '@opentelemetry/api': 1.9.1 - '@redis/json@6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1))': + '@redis/json@6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) + '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) - '@redis/search@6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1))': + '@redis/search@6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) + '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) - '@redis/time-series@6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1))': + '@redis/time-series@6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) + '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0)': + '@reduxjs/toolkit@2.13.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -13119,134 +12907,134 @@ snapshots: react: 19.3.0 react-redux: 9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1) - '@rolldown/binding-android-arm-eabi@1.2.8': + '@rolldown/binding-android-arm-eabi@1.2.12': optional: true - '@rolldown/binding-android-arm64@1.2.8': + '@rolldown/binding-android-arm64@1.2.12': optional: true - '@rolldown/binding-darwin-arm64@1.2.8': + '@rolldown/binding-darwin-arm64@1.2.12': optional: true - '@rolldown/binding-darwin-x64@1.2.8': + '@rolldown/binding-darwin-x64@1.2.12': optional: true - '@rolldown/binding-freebsd-x64@1.2.8': + '@rolldown/binding-freebsd-x64@1.2.12': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + '@rolldown/binding-linux-arm-gnueabihf@1.2.12': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.8': + '@rolldown/binding-linux-arm64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.8': + '@rolldown/binding-linux-arm64-musl@1.2.12': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.8': + '@rolldown/binding-linux-ppc64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.8': + '@rolldown/binding-linux-s390x-gnu@1.2.12': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.8': + '@rolldown/binding-linux-x64-gnu@1.2.12': optional: true - '@rolldown/binding-linux-x64-musl@1.2.8': + '@rolldown/binding-linux-x64-musl@1.2.12': optional: true - '@rolldown/binding-openharmony-arm64@1.2.8': + '@rolldown/binding-openharmony-arm64@1.2.12': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.8': + '@rolldown/binding-win32-arm64-msvc@1.2.12': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.8': + '@rolldown/binding-win32-x64-msvc@1.2.12': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/pluginutils@5.4.0(rollup@4.62.2)': + '@rollup/pluginutils@5.4.0(rollup@4.63.5)': dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.7 optionalDependencies: - rollup: 4.62.2 + rollup: 4.63.5 - '@rollup/rollup-android-arm-eabi@4.62.2': + '@rollup/rollup-android-arm-eabi@4.63.5': optional: true - '@rollup/rollup-android-arm64@4.62.2': + '@rollup/rollup-android-arm64@4.63.5': optional: true - '@rollup/rollup-darwin-arm64@4.62.2': + '@rollup/rollup-darwin-arm64@4.63.5': optional: true - '@rollup/rollup-darwin-x64@4.62.2': + '@rollup/rollup-darwin-x64@4.63.5': optional: true - '@rollup/rollup-freebsd-arm64@4.62.2': + '@rollup/rollup-freebsd-arm64@4.63.5': optional: true - '@rollup/rollup-freebsd-x64@4.62.2': + '@rollup/rollup-freebsd-x64@4.63.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + '@rollup/rollup-linux-arm-gnueabihf@4.63.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.62.2': + '@rollup/rollup-linux-arm-musleabihf@4.63.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.62.2': + '@rollup/rollup-linux-arm64-gnu@4.63.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.62.2': + '@rollup/rollup-linux-arm64-musl@4.63.5': optional: true - '@rollup/rollup-linux-loong64-gnu@4.62.2': + '@rollup/rollup-linux-loong64-gnu@4.63.5': optional: true - '@rollup/rollup-linux-loong64-musl@4.62.2': + '@rollup/rollup-linux-loong64-musl@4.63.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.62.2': + '@rollup/rollup-linux-ppc64-gnu@4.63.5': optional: true - '@rollup/rollup-linux-ppc64-musl@4.62.2': + '@rollup/rollup-linux-ppc64-musl@4.63.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.62.2': + '@rollup/rollup-linux-riscv64-gnu@4.63.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.62.2': + '@rollup/rollup-linux-riscv64-musl@4.63.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.62.2': + '@rollup/rollup-linux-s390x-gnu@4.63.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.62.2': + '@rollup/rollup-linux-x64-gnu@4.63.5': optional: true - '@rollup/rollup-linux-x64-musl@4.62.2': + '@rollup/rollup-linux-x64-musl@4.63.5': optional: true - '@rollup/rollup-openbsd-x64@4.62.2': + '@rollup/rollup-openbsd-x64@4.63.5': optional: true - '@rollup/rollup-openharmony-arm64@4.62.2': + '@rollup/rollup-openharmony-arm64@4.63.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.62.2': + '@rollup/rollup-win32-arm64-msvc@4.63.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.62.2': + '@rollup/rollup-win32-ia32-msvc@4.63.5': optional: true - '@rollup/rollup-win32-x64-gnu@4.62.2': + '@rollup/rollup-win32-x64-gnu@4.63.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.62.2': + '@rollup/rollup-win32-x64-msvc@4.63.5': optional: true '@schummar/icu-type-parser@1.21.5': {} @@ -13260,58 +13048,58 @@ snapshots: '@sentry/conventions@0.16.0': {} - '@sentry/core@10.74.0': + '@sentry/core@10.75.3': dependencies: '@sentry/conventions': 0.16.0 - '@sentry/node-core@10.74.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': + '@sentry/node-core@10.75.3(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': dependencies: '@sentry/conventions': 0.16.0 - '@sentry/core': 10.74.0 - '@sentry/opentelemetry': 10.74.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) - import-in-the-middle: 3.5.1 + '@sentry/core': 10.75.3 + '@sentry/opentelemetry': 10.75.3(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) + import-in-the-middle: 3.5.2 optionalDependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.74.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))': + '@sentry/node@10.75.3(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@sentry/conventions': 0.16.0 - '@sentry/core': 10.74.0 - '@sentry/node-core': 10.74.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) - '@sentry/opentelemetry': 10.74.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) - '@sentry/server-utils': 10.74.0 - import-in-the-middle: 3.5.1 + '@sentry/core': 10.75.3 + '@sentry/node-core': 10.75.3(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) + '@sentry/opentelemetry': 10.75.3(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) + '@sentry/server-utils': 10.75.3 + import-in-the-middle: 3.5.2 transitivePeerDependencies: - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/opentelemetry@10.74.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': + '@sentry/opentelemetry@10.75.3(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@sentry/conventions': 0.16.0 - '@sentry/core': 10.74.0 + '@sentry/core': 10.75.3 - '@sentry/server-utils@10.74.0': + '@sentry/server-utils@10.75.3': dependencies: '@sentry/conventions': 0.16.0 - '@sentry/core': 10.74.0 + '@sentry/core': 10.75.3 - '@shadcn/lint@0.2.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))': + '@shadcn/lint@0.2.0(@typescript-eslint/parser@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))': dependencies: '@eslint/core': 0.17.0 cn: 0.3.2 optionalDependencies: - '@typescript-eslint/parser': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@typescript-eslint/parser': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) oxc-parser: 0.148.0 '@shaderfrog/glsl-parser@7.0.1': {} @@ -13362,12 +13150,12 @@ snapshots: dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.11 - '@peculiar/asn1-android': 2.9.5 - '@peculiar/asn1-ecc': 2.9.5 - '@peculiar/asn1-rsa': 2.9.5 - '@peculiar/asn1-schema': 2.9.5 - '@peculiar/asn1-x509': 2.9.5 - '@peculiar/asn1-x509-post-quantum': 2.9.5 + '@peculiar/asn1-android': 2.10.0 + '@peculiar/asn1-ecc': 2.10.0 + '@peculiar/asn1-rsa': 2.10.0 + '@peculiar/asn1-schema': 2.10.0 + '@peculiar/asn1-x509': 2.10.0 + '@peculiar/asn1-x509-post-quantum': 2.10.0 '@peculiar/x509': 2.1.0 reflect-metadata: 0.2.2 @@ -13377,36 +13165,36 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/core@3.34.1': + '@smithy/core@3.35.0': dependencies: - '@smithy/types': 4.18.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 '@smithy/credential-provider-imds@4.5.2': dependencies: - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 '@smithy/fetch-http-handler@5.8.0': dependencies: - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 '@smithy/node-http-handler@4.12.1': dependencies: - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/signature-v4@5.7.3': + '@smithy/signature-v4@5.7.4': dependencies: - '@smithy/core': 3.34.1 - '@smithy/types': 4.18.0 + '@smithy/core': 3.35.0 + '@smithy/types': 4.19.0 tslib: 2.8.1 - '@smithy/types@4.18.0': + '@smithy/types@4.19.0': dependencies: tslib: 2.8.1 @@ -13424,6 +13212,33 @@ snapshots: '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) solid-js: 1.9.15 + '@solid-primitives/keyed@1.5.3(solid-js@1.9.15)': + dependencies: + solid-js: 1.9.15 + + '@solid-primitives/map@0.4.13(solid-js@1.9.15)': + dependencies: + '@solid-primitives/trigger': 1.2.4(solid-js@1.9.15) + solid-js: 1.9.15 + + '@solid-primitives/media@2.3.6(solid-js@1.9.15)': + dependencies: + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.15) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.15) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + + '@solid-primitives/props@3.2.4(solid-js@1.9.15)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + + '@solid-primitives/refs@1.1.4(solid-js@1.9.15)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.15)': dependencies: '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.15) @@ -13442,6 +13257,20 @@ snapshots: '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) solid-js: 1.9.15 + '@solid-primitives/storage@1.3.11(solid-js@1.9.15)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + + '@solid-primitives/transition-group@1.1.2(solid-js@1.9.15)': + dependencies: + solid-js: 1.9.15 + + '@solid-primitives/trigger@1.2.4(solid-js@1.9.15)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.15) + solid-js: 1.9.15 + '@solid-primitives/utils@6.4.1(solid-js@1.9.15)': dependencies: solid-js: 1.9.15 @@ -13452,29 +13281,29 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.10.0(jiti@2.7.0))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.11.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) - '@typescript-eslint/types': 8.65.0 - eslint: 10.10.0(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.71.0 + eslint: 10.11.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.5 + picomatch: 4.0.7 - '@supabase/storage-js@2.116.0': + '@supabase/storage-js@2.117.2': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@swc/cli@0.8.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(chokidar@5.0.0)': + '@swc/cli@0.8.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(chokidar@5.0.0)': dependencies: - '@swc/core': 1.16.2(@swc/helpers@0.5.23) + '@swc/core': 1.16.13(@swc/helpers@0.5.23) '@swc/counter': 0.1.3 - '@xhmikosr/bin-wrapper': 14.5.0 + '@xhmikosr/bin-wrapper': 14.5.1 commander: 8.3.0 minimatch: 9.0.9 - piscina: 4.9.3 + piscina: 4.9.4 semver: 7.8.5 slash: 3.0.0 source-map: 0.7.6 @@ -13486,59 +13315,59 @@ snapshots: - react-native-b4a - supports-color - '@swc/core-darwin-arm64@1.16.2': + '@swc/core-darwin-arm64@1.16.13': optional: true - '@swc/core-darwin-x64@1.16.2': + '@swc/core-darwin-x64@1.16.13': optional: true - '@swc/core-linux-arm-gnueabihf@1.16.2': + '@swc/core-linux-arm-gnueabihf@1.16.13': optional: true - '@swc/core-linux-arm64-gnu@1.16.2': + '@swc/core-linux-arm64-gnu@1.16.13': optional: true - '@swc/core-linux-arm64-musl@1.16.2': + '@swc/core-linux-arm64-musl@1.16.13': optional: true - '@swc/core-linux-ppc64-gnu@1.16.2': + '@swc/core-linux-ppc64-gnu@1.16.13': optional: true - '@swc/core-linux-s390x-gnu@1.16.2': + '@swc/core-linux-s390x-gnu@1.16.13': optional: true - '@swc/core-linux-x64-gnu@1.16.2': + '@swc/core-linux-x64-gnu@1.16.13': optional: true - '@swc/core-linux-x64-musl@1.16.2': + '@swc/core-linux-x64-musl@1.16.13': optional: true - '@swc/core-win32-arm64-msvc@1.16.2': + '@swc/core-win32-arm64-msvc@1.16.13': optional: true - '@swc/core-win32-ia32-msvc@1.16.2': + '@swc/core-win32-ia32-msvc@1.16.13': optional: true - '@swc/core-win32-x64-msvc@1.16.2': + '@swc/core-win32-x64-msvc@1.16.13': optional: true - '@swc/core@1.16.2(@swc/helpers@0.5.23)': + '@swc/core@1.16.13(@swc/helpers@0.5.23)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.28 optionalDependencies: - '@swc/core-darwin-arm64': 1.16.2 - '@swc/core-darwin-x64': 1.16.2 - '@swc/core-linux-arm-gnueabihf': 1.16.2 - '@swc/core-linux-arm64-gnu': 1.16.2 - '@swc/core-linux-arm64-musl': 1.16.2 - '@swc/core-linux-ppc64-gnu': 1.16.2 - '@swc/core-linux-s390x-gnu': 1.16.2 - '@swc/core-linux-x64-gnu': 1.16.2 - '@swc/core-linux-x64-musl': 1.16.2 - '@swc/core-win32-arm64-msvc': 1.16.2 - '@swc/core-win32-ia32-msvc': 1.16.2 - '@swc/core-win32-x64-msvc': 1.16.2 + '@swc/core-darwin-arm64': 1.16.13 + '@swc/core-darwin-x64': 1.16.13 + '@swc/core-linux-arm-gnueabihf': 1.16.13 + '@swc/core-linux-arm64-gnu': 1.16.13 + '@swc/core-linux-arm64-musl': 1.16.13 + '@swc/core-linux-ppc64-gnu': 1.16.13 + '@swc/core-linux-s390x-gnu': 1.16.13 + '@swc/core-linux-x64-gnu': 1.16.13 + '@swc/core-linux-x64-musl': 1.16.13 + '@swc/core-win32-arm64-msvc': 1.16.13 + '@swc/core-win32-ia32-msvc': 1.16.13 + '@swc/core-win32-x64-msvc': 1.16.13 '@swc/helpers': 0.5.23 '@swc/counter@0.1.3': {} @@ -13554,11 +13383,11 @@ snapshots: '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.24.3 + enhanced-resolve: 5.26.0 jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 - source-map-js: 1.2.1 + source-map-js: 1.2.2 tailwindcss: 4.3.3 '@tailwindcss/oxide-android-arm64@4.3.3': @@ -13612,12 +13441,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tailwindcss/vite@4.3.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) '@tanstack/devtools-bundler-core@0.1.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)': dependencies: @@ -13640,7 +13469,7 @@ snapshots: '@tanstack/devtools-event-bus@0.4.3': dependencies: - ws: 8.21.3 + ws: 8.22.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13658,20 +13487,20 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.8.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/devtools-vite@0.8.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@tanstack/devtools-bundler-core': 0.1.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) '@tanstack/devtools-client': 0.0.8 '@tanstack/devtools-event-bus': 0.4.3 chalk: 5.6.2 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - bufferutil - utf-8-validate - '@tanstack/devtools@0.14.2(csstype@3.2.3)(solid-js@1.9.15)': + '@tanstack/devtools@0.15.0(csstype@3.2.3)(solid-js@1.9.15)': dependencies: '@neodrag/core': 3.0.0-next.11 '@neodrag/solid': 3.0.0-next.11(@neodrag/core@3.0.0-next.11)(solid-js@1.9.15) @@ -13689,16 +13518,16 @@ snapshots: - csstype - utf-8-validate - '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint/js': 10.0.1(eslint@10.10.0(jiti@2.7.0)) - '@stylistic/eslint-plugin': 5.10.0(eslint@10.10.0(jiti@2.7.0)) - eslint: 10.10.0(jiti@2.7.0) - eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)) - eslint-plugin-n: 17.24.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - globals: 17.11.0 - typescript-eslint: 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - vue-eslint-parser: 10.4.1(eslint@10.10.0(jiti@2.7.0)) + '@eslint/js': 10.0.1(eslint@10.11.0(jiti@2.7.0)) + '@stylistic/eslint-plugin': 5.10.0(eslint@10.11.0(jiti@2.7.0)) + eslint: 10.11.0(jiti@2.7.0) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)) + eslint-plugin-n: 17.24.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + globals: 17.12.0 + typescript-eslint: 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + vue-eslint-parser: 10.4.1(eslint@10.11.0(jiti@2.7.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -13709,19 +13538,37 @@ snapshots: dependencies: '@tanstack/devtools-event-client': 0.4.4 '@tanstack/pacer-lite': 0.1.1 - '@tanstack/store': 0.11.1 + '@tanstack/store': 0.11.2 + + '@tanstack/history@1.162.4': {} - '@tanstack/history@1.162.3': {} + '@tanstack/match-sorter-utils@9.1.2': + dependencies: + remove-accents: 0.5.0 '@tanstack/pacer-lite@0.1.1': {} - '@tanstack/query-core@5.102.8': {} + '@tanstack/query-core@5.104.0': {} - '@tanstack/query-devtools@5.102.8': {} + '@tanstack/query-devtools@5.104.0(csstype@3.2.3)': + dependencies: + '@kobalte/core': 0.13.14(solid-js@1.9.15) + '@solid-primitives/keyed': 1.5.3(solid-js@1.9.15) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.15) + '@solid-primitives/storage': 1.3.11(solid-js@1.9.15) + '@tanstack/match-sorter-utils': 9.1.2 + '@tanstack/query-core': 5.104.0 + clsx: 2.1.1 + goober: 2.1.19(csstype@3.2.3) + solid-js: 1.9.15 + solid-transition-group: 0.2.3(solid-js@1.9.15) + superjson: 2.2.6 + transitivePeerDependencies: + - csstype - '@tanstack/react-devtools@0.10.12(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.15)': + '@tanstack/react-devtools@0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.15)': dependencies: - '@tanstack/devtools': 0.14.2(csstype@3.2.3)(solid-js@1.9.15) + '@tanstack/devtools': 0.15.0(csstype@3.2.3)(solid-js@1.9.15) '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) react: 19.3.0 @@ -13732,85 +13579,88 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-form@1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-form@1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/form-core': 1.33.5 - '@tanstack/react-store': 0.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-store': 0.11.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 optionalDependencies: - '@tanstack/react-start': 1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@tanstack/react-start': 1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - react-dom - '@tanstack/react-form@1.33.5(@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-form@1.33.5(@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/form-core': 1.33.5 - '@tanstack/react-store': 0.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-store': 0.11.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 optionalDependencies: - '@tanstack/react-start': 1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@tanstack/react-start': 1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - react-dom - '@tanstack/react-query-devtools@5.102.8(@tanstack/react-query@5.102.8(react@19.3.0))(react@19.3.0)': + '@tanstack/react-query-devtools@5.104.0(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0)': dependencies: - '@tanstack/query-devtools': 5.102.8 - '@tanstack/react-query': 5.102.8(react@19.3.0) + '@tanstack/query-devtools': 5.104.0(csstype@3.2.3) + '@tanstack/react-query': 5.104.0(react@19.3.0) + '@types/react': 19.3.0 react: 19.3.0 + transitivePeerDependencies: + - csstype - '@tanstack/react-query@5.102.8(react@19.3.0)': + '@tanstack/react-query@5.104.0(react@19.3.0)': dependencies: - '@tanstack/query-core': 5.102.8 + '@tanstack/query-core': 5.104.0 react: 19.3.0 - '@tanstack/react-router-devtools@1.167.1(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.29)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-router-devtools@1.167.2(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.34)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-devtools-core': 1.168.1(@tanstack/router-core@1.171.29)(csstype@3.2.3) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-devtools-core': 1.168.2(@tanstack/router-core@1.171.34)(csstype@3.2.3) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) optionalDependencies: - '@tanstack/router-core': 1.171.29 + '@tanstack/router-core': 1.171.34 transitivePeerDependencies: - csstype - '@tanstack/react-router-ssr-query@1.167.2(@tanstack/query-core@5.102.8)(@tanstack/react-query@5.102.8(react@19.3.0))(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.29)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-router-ssr-query@1.167.3(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.34)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/query-core': 5.102.8 - '@tanstack/react-query': 5.102.8(react@19.3.0) - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-ssr-query-core': 1.169.2(@tanstack/query-core@5.102.8)(@tanstack/router-core@1.171.29) + '@tanstack/query-core': 5.104.0 + '@tanstack/react-query': 5.104.0(react@19.3.0) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-ssr-query-core': 1.169.3(@tanstack/query-core@5.104.0)(@tanstack/router-core@1.171.34) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/history': 1.162.3 - '@tanstack/react-store': 0.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-core': 1.171.29 + '@tanstack/history': 1.162.4 + '@tanstack/react-store': 0.11.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-core': 1.171.34 isbot: 5.2.2 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/react-start-client@1.168.33(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-start-client@1.168.39(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-core': 1.171.29 - '@tanstack/start-client-core': 1.170.29 + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-core': 1.171.34 + '@tanstack/start-client-core': 1.170.34 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/react-start-rsc@0.1.51(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/react-start-rsc@0.1.59(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-core': 1.171.29 + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-core': 1.171.34 '@tanstack/router-utils': 1.162.3 - '@tanstack/start-client-core': 1.170.29 + '@tanstack/start-client-core': 1.170.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/start-storage-context': 1.167.31 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/start-storage-context': 1.167.36 pathe: 2.0.3 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) @@ -13828,15 +13678,15 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-rsc@0.1.51(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/react-start-rsc@0.1.59(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-core': 1.171.29 + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-core': 1.171.34 '@tanstack/router-utils': 1.162.3 - '@tanstack/start-client-core': 1.170.29 + '@tanstack/start-client-core': 1.170.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/start-storage-context': 1.167.31 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/start-storage-context': 1.167.36 pathe: 2.0.3 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) @@ -13854,31 +13704,31 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.167.40(crossws@0.4.12(srvx@1.0.4))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-start-server@1.167.46(crossws@0.4.12(srvx@1.0.5))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-core': 1.171.29 - '@tanstack/start-server-core': 1.169.34(crossws@0.4.12(srvx@1.0.4)) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/router-core': 1.171.34 + '@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.5)) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-client': 1.168.33(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-rsc': 0.1.51(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/react-start-server': 1.167.40(crossws@0.4.12(srvx@1.0.4))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-start-client': 1.168.39(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-start-rsc': 0.1.59(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/react-start-server': 1.167.46(crossws@0.4.12(srvx@1.0.5))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/router-utils': 1.162.3 - '@tanstack/start-client-core': 1.170.29 - '@tanstack/start-plugin-core': 1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/start-server-core': 1.169.34(crossws@0.4.12(srvx@1.0.4)) + '@tanstack/start-client-core': 1.170.34 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.5)) pathe: 2.0.3 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -13893,21 +13743,21 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start@1.168.52(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-client': 1.168.33(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-rsc': 0.1.51(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/react-start-server': 1.167.40(crossws@0.4.12(srvx@1.0.4))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-start-client': 1.168.39(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-start-rsc': 0.1.59(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/react-start-server': 1.167.46(crossws@0.4.12(srvx@1.0.5))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/router-utils': 1.162.3 - '@tanstack/start-client-core': 1.170.29 - '@tanstack/start-plugin-core': 1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - '@tanstack/start-server-core': 1.169.34(crossws@0.4.12(srvx@1.0.4)) + '@tanstack/start-client-core': 1.170.34 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + '@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.5)) pathe: 2.0.3 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -13922,69 +13772,69 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-store@0.11.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-store@0.11.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/store': 0.11.1 + '@tanstack/store': 0.11.2 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) use-sync-external-store: 1.7.0(react@19.3.0) - '@tanstack/react-virtual@3.14.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-virtual@3.14.13(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/virtual-core': 3.17.8 + '@tanstack/virtual-core': 3.17.11 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/router-cli@1.167.35': + '@tanstack/router-cli@1.167.40': dependencies: - '@tanstack/router-generator': 1.167.35 + '@tanstack/router-generator': 1.167.40 chokidar: 5.0.0 yargs: 17.7.3 transitivePeerDependencies: - supports-color - '@tanstack/router-core@1.171.29': + '@tanstack/router-core@1.171.34': dependencies: - '@tanstack/history': 1.162.3 + '@tanstack/history': 1.162.4 cookie-es: 3.1.1 - seroval: 1.6.7 - seroval-plugins: 1.6.7(seroval@1.6.7) + seroval: 1.6.8 + seroval-plugins: 1.6.8(seroval@1.6.8) - '@tanstack/router-devtools-core@1.168.1(@tanstack/router-core@1.171.29)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.168.2(@tanstack/router-core@1.171.34)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.171.29 + '@tanstack/router-core': 1.171.34 clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.167.35': + '@tanstack/router-generator@1.167.40': dependencies: '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.29 + '@tanstack/router-core': 1.171.34 '@tanstack/router-utils': 1.162.3 '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 magic-string: 0.30.21 - prettier: 3.9.6 - zod: 4.6.2 + prettier: 3.9.9 + zod: 4.6.5 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.37(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.29 - '@tanstack/router-generator': 1.167.35 + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 '@tanstack/router-utils': 1.162.3 chokidar: 5.0.0 - unplugin: 3.3.0(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - zod: 4.6.2 + unplugin: 3.4.0(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + zod: 4.6.5 optionalDependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -13995,20 +13845,20 @@ snapshots: - supports-color - unloader - '@tanstack/router-plugin@1.168.37(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.29 - '@tanstack/router-generator': 1.167.35 + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 '@tanstack/router-utils': 1.162.3 chokidar: 5.0.0 - unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) - zod: 4.6.2 + unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + zod: 4.6.5 optionalDependencies: - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -14019,17 +13869,17 @@ snapshots: - supports-color - unloader - '@tanstack/router-ssr-query-core@1.169.2(@tanstack/query-core@5.102.8)(@tanstack/router-core@1.171.29)': + '@tanstack/router-ssr-query-core@1.169.3(@tanstack/query-core@5.104.0)(@tanstack/router-core@1.171.34)': dependencies: - '@tanstack/query-core': 5.102.8 - '@tanstack/router-core': 1.171.29 + '@tanstack/query-core': 5.104.0 + '@tanstack/router-core': 1.171.34 '@tanstack/router-utils@1.162.3': dependencies: '@babel/generator': 7.29.8 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - ansis: 4.3.1 + ansis: 4.4.0 babel-dead-code-elimination: 1.0.12 diff: 8.0.4 pathe: 2.0.3 @@ -14037,40 +13887,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.170.29': + '@tanstack/start-client-core@1.170.34': dependencies: - '@tanstack/router-core': 1.171.29 + '@tanstack/router-core': 1.171.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-storage-context': 1.167.31 - seroval: 1.6.7 + '@tanstack/start-storage-context': 1.167.36 + seroval: 1.6.8 '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 - '@tanstack/router-core': 1.171.29 - '@tanstack/router-generator': 1.167.35 - '@tanstack/router-plugin': 1.168.37(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 + '@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/router-utils': 1.162.3 - '@tanstack/start-server-core': 1.169.34(crossws@0.4.12(srvx@1.0.4)) + '@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.5)) exsolve: 1.1.1 lightningcss: 1.33.0 pathe: 2.0.3 picomatch: 4.0.7 - seroval: 1.6.7 + seroval: 1.6.8 source-map: 0.7.6 srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + vitefu: 1.1.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) xmlbuilder2: 4.0.3 - zod: 4.6.2 + zod: 4.6.5 optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -14085,31 +13935,31 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.171.42(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.4))(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(crossws@0.4.12(srvx@1.0.5))(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 - '@tanstack/router-core': 1.171.29 - '@tanstack/router-generator': 1.167.35 - '@tanstack/router-plugin': 1.168.37(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 + '@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@tanstack/router-utils': 1.162.3 - '@tanstack/start-server-core': 1.169.34(crossws@0.4.12(srvx@1.0.4)) + '@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.5)) exsolve: 1.1.1 lightningcss: 1.33.0 pathe: 2.0.3 picomatch: 4.0.7 - seroval: 1.6.7 + seroval: 1.6.8 source-map: 0.7.6 srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + vitefu: 1.1.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) xmlbuilder2: 4.0.3 - zod: 4.6.2 + zod: 4.6.5 optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -14124,29 +13974,29 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.169.34(crossws@0.4.12(srvx@1.0.4))': + '@tanstack/start-server-core@1.169.39(crossws@0.4.12(srvx@1.0.5))': dependencies: - '@tanstack/history': 1.162.3 - '@tanstack/router-core': 1.171.29 - '@tanstack/start-client-core': 1.170.29 - '@tanstack/start-storage-context': 1.167.31 + '@tanstack/history': 1.162.4 + '@tanstack/router-core': 1.171.34 + '@tanstack/start-client-core': 1.170.34 + '@tanstack/start-storage-context': 1.167.36 fetchdts: 0.1.7 - h3-v2: h3@2.0.1-rc.20(crossws@0.4.12(srvx@1.0.4)) - seroval: 1.6.7 + h3-v2: h3@2.0.1-rc.20(crossws@0.4.12(srvx@1.0.5)) + seroval: 1.6.8 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.167.31': + '@tanstack/start-storage-context@1.167.36': dependencies: - '@tanstack/router-core': 1.171.29 + '@tanstack/router-core': 1.171.34 - '@tanstack/store@0.11.1': {} + '@tanstack/store@0.11.2': {} - '@tanstack/virtual-core@3.17.8': {} + '@tanstack/virtual-core@3.17.11': {} '@tanstack/virtual-file-routes@1.162.0': {} - '@testing-library/dom@10.4.1': + '@testing-library/dom@10.4.2': dependencies: '@babel/code-frame': 7.29.7 '@babel/runtime': 7.29.7 @@ -14157,263 +14007,263 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@testing-library/react@16.3.3(@testing-library/dom@10.4.2)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@babel/runtime': 7.29.7 - '@testing-library/dom': 10.4.1 + '@testing-library/dom': 10.4.2 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) optionalDependencies: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@tiptap/core@3.31.3(@tiptap/pm@3.31.3)': + '@tiptap/core@3.31.4(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/pm': 3.31.3 + '@tiptap/pm': 3.31.4 - '@tiptap/extension-audio@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-audio@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-blockquote@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-blockquote@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-bold@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-bold@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-bubble-menu@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-bubble-menu@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: '@floating-ui/dom': 1.8.0 - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 optional: true - '@tiptap/extension-bullet-list@3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-bullet-list@3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extension-list': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extension-list': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-code-block@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-code-block@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-code@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-code@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32)': + '@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 - '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 + '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32) yjs: 13.6.32 - '@tiptap/extension-document@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-document@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-drag-handle-react@3.31.3(@tiptap/extension-drag-handle@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)))(@tiptap/pm@3.31.3)(@tiptap/react@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tiptap/extension-drag-handle-react@3.31.4(@tiptap/extension-drag-handle@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)))(@tiptap/pm@3.31.4)(@tiptap/react@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tiptap/extension-drag-handle': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)) - '@tiptap/pm': 3.31.3 - '@tiptap/react': 3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tiptap/extension-drag-handle': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)) + '@tiptap/pm': 3.31.4 + '@tiptap/react': 3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tiptap/extension-drag-handle@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/extension-collaboration@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))': + '@tiptap/extension-drag-handle@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/extension-collaboration@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32))(@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))': dependencies: '@floating-ui/dom': 1.8.0 - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/extension-collaboration': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32) - '@tiptap/extension-node-range': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 - '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/extension-collaboration': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32))(yjs@13.6.32) + '@tiptap/extension-node-range': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 + '@tiptap/y-tiptap': 3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32) - '@tiptap/extension-dropcursor@3.31.3(@tiptap/extensions@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-dropcursor@3.31.4(@tiptap/extensions@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extensions': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extensions': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-emoji@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@tiptap/suggestion@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))(emojibase@17.0.0)': + '@tiptap/extension-emoji@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@tiptap/suggestion@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))(emojibase@17.0.0)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 - '@tiptap/suggestion': 3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 + '@tiptap/suggestion': 3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) emoji-regex: 10.6.0 emojibase-data: 17.0.0(emojibase@17.0.0) is-emoji-supported: 0.0.5 transitivePeerDependencies: - emojibase - '@tiptap/extension-floating-menu@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-floating-menu@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: '@floating-ui/dom': 1.8.0 - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 optional: true - '@tiptap/extension-gapcursor@3.31.3(@tiptap/extensions@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-gapcursor@3.31.4(@tiptap/extensions@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extensions': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extensions': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-hard-break@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-hard-break@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-heading@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-heading@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-horizontal-rule@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-horizontal-rule@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-italic@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-italic@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-link@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-link@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 linkifyjs: 4.3.3 - '@tiptap/extension-list-item@3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-list-item@3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extension-list': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extension-list': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-list-keymap@3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-list-keymap@3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extension-list': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extension-list': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-node-range@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-node-range@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-ordered-list@3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3))': + '@tiptap/extension-ordered-list@3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/extension-list': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extension-list': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) - '@tiptap/extension-paragraph@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-paragraph@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-strike@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-strike@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-table@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extension-table@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/extension-text-align@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-text-align@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-text-style@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-text-style@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-text@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-text@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-typography@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-typography@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extension-underline@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))': + '@tiptap/extension-underline@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) - '@tiptap/extensions@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/extensions@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/pm@3.31.3': + '@tiptap/pm@3.31.4': dependencies: - prosemirror-changeset: 2.4.2 + prosemirror-changeset: 2.4.4 prosemirror-commands: 1.7.2 - prosemirror-dropcursor: 1.8.3 + prosemirror-dropcursor: 1.8.4 prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 + prosemirror-history: 1.5.1 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 - '@tiptap/react@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tiptap/react@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) '@types/use-sync-external-store': 0.0.6 - fast-equals: 5.4.2 + fast-equals: 5.4.3 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) use-sync-external-store: 1.7.0(react@19.3.0) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-floating-menu': 3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) + '@tiptap/extension-bubble-menu': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-floating-menu': 3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.31.3': - dependencies: - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/extension-blockquote': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-bold': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-bullet-list': 3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-code': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-code-block': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-document': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-dropcursor': 3.31.3(@tiptap/extensions@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-gapcursor': 3.31.3(@tiptap/extensions@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-hard-break': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-heading': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-horizontal-rule': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-italic': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-link': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-list': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/extension-list-item': 3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-list-keymap': 3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-ordered-list': 3.31.3(@tiptap/extension-list@3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)) - '@tiptap/extension-paragraph': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-strike': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-text': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extension-underline': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3)) - '@tiptap/extensions': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 - - '@tiptap/suggestion@3.31.3(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)': + '@tiptap/starter-kit@3.31.4': + dependencies: + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/extension-blockquote': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-bold': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-bullet-list': 3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-code': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-code-block': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-document': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-dropcursor': 3.31.4(@tiptap/extensions@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-gapcursor': 3.31.4(@tiptap/extensions@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-hard-break': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-heading': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-horizontal-rule': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-italic': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-link': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-list': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/extension-list-item': 3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-list-keymap': 3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-ordered-list': 3.31.4(@tiptap/extension-list@3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)) + '@tiptap/extension-paragraph': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-strike': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-text': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extension-underline': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4)) + '@tiptap/extensions': 3.31.4(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 + + '@tiptap/suggestion@3.31.4(@floating-ui/dom@1.8.0)(@tiptap/core@3.31.4(@tiptap/pm@3.31.4))(@tiptap/pm@3.31.4)': dependencies: '@floating-ui/dom': 1.8.0 - '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) - '@tiptap/pm': 3.31.3 + '@tiptap/core': 3.31.4(@tiptap/pm@3.31.4) + '@tiptap/pm': 3.31.4 - '@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.11)(prosemirror-state@1.4.4)(prosemirror-view@1.42.3)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)': + '@tiptap/y-tiptap@3.0.9(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.6)(y-protocols@1.0.7(yjs@13.6.32))(yjs@13.6.32)': dependencies: - lib0: 0.2.117 - prosemirror-model: 1.25.11 + lib0: 0.2.119 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 y-protocols: 1.0.7(yjs@13.6.32) yjs: 13.6.32 @@ -14432,25 +14282,25 @@ snapshots: minimatch: 10.2.6 path-browserify: 1.0.1 - '@turbo/darwin-64@2.10.12': + '@turbo/darwin-64@2.11.5': optional: true - '@turbo/darwin-arm64@2.10.12': + '@turbo/darwin-arm64@2.11.5': optional: true - '@turbo/linux-64@2.10.12': + '@turbo/linux-64@2.11.5': optional: true - '@turbo/linux-arm64@2.10.12': + '@turbo/linux-arm64@2.11.5': optional: true - '@turbo/windows-64@2.10.12': + '@turbo/windows-64@2.11.5': optional: true - '@turbo/windows-arm64@2.10.12': + '@turbo/windows-arm64@2.11.5': optional: true - '@tybys/wasm-util@0.10.3': + '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 optional: true @@ -14464,7 +14314,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 '@types/d3-array@3.2.2': {} @@ -14520,22 +14370,22 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@25.9.6': + '@types/node@25.9.8': dependencies: undici-types: 7.24.6 optional: true - '@types/node@26.5.1': + '@types/node@26.6.3': dependencies: undici-types: 8.9.0 - '@types/nodemailer@8.0.1': + '@types/nodemailer@8.0.2': dependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 '@types/prompts@2.4.9': dependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 kleur: 3.0.3 '@types/react-dom@19.3.0(@types/react@19.3.0)': @@ -14546,9 +14396,9 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/sanitize-html@2.16.1': + '@types/sanitize-html@2.16.2': dependencies: - htmlparser2: 10.1.0 + htmlparser2: 12.0.0 '@types/unist@2.0.11': {} @@ -14558,151 +14408,76 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} - '@types/ws@8.18.1': - dependencies: - '@types/node': 26.5.1 - - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@types/ws@8.18.2': dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.10.0(jiti@2.7.0) - ignore: 7.0.6 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color + '@types/node': 26.6.3 - '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.70.0 - eslint: 10.10.0(jiti@2.7.0) - ignore: 7.0.9 + '@typescript-eslint/parser': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.71.0 + '@typescript-eslint/type-utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.71.0 + eslint: 10.11.0(jiti@2.7.0) + ignore: 7.0.11 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.70.0 - debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)': + '@typescript-eslint/parser@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/scope-manager': 8.71.0 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.71.0 debug: 4.4.3 + eslint: 10.11.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.70.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.71.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 - - '@typescript-eslint/scope-manager@8.70.0': - dependencies: - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/visitor-keys': 8.70.0 - - '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - - '@typescript-eslint/tsconfig-utils@8.70.0(typescript@6.0.3)': + '@typescript-eslint/scope-manager@8.71.0': dependencies: - typescript: 6.0.3 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/visitor-keys': 8.71.0 - '@typescript-eslint/type-utils@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.71.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.65.0': {} - - '@typescript-eslint/types@8.70.0': {} - - '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3 - minimatch: 10.2.6 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.71.0': {} - '@typescript-eslint/typescript-estree@8.70.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.71.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.70.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/visitor-keys': 8.70.0 + '@typescript-eslint/project-service': 8.71.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/visitor-keys': 8.71.0 debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 @@ -14712,36 +14487,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.71.0 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.70.0': + '@typescript-eslint/visitor-keys@8.71.0': dependencies: - '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/types': 8.71.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.4.0': {} @@ -14804,7 +14563,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': @@ -14818,57 +14577,57 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-react@6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@vitejs/plugin-react@6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) optionalDependencies: babel-plugin-react-compiler: 1.0.0 - '@vitejs/plugin-react@6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@vitejs/plugin-react@6.1.1(babel-plugin-react-compiler@1.0.0)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) optionalDependencies: babel-plugin-react-compiler: 1.0.0 - '@vitest/coverage-v8@5.0.0(vitest@5.0.0)': + '@vitest/coverage-v8@5.0.3(vitest@5.0.3)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/istanbul-lib-coverage': 1.0.1 - '@vitest/istanbul-lib-report': 1.0.1 - ast-v8-to-istanbul: 1.0.6 + '@vitest/istanbul-lib-coverage': 1.0.2 + '@vitest/istanbul-lib-report': 1.0.2 + ast-v8-to-istanbul: 1.0.7 magicast: 0.5.5 obug: 2.2.1 - std-env: 4.2.0 - tinyrainbow: 3.1.1 - vitest: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + std-env: 4.3.0 + tinyrainbow: 3.2.0 + vitest: 5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) - '@vitest/istanbul-lib-coverage@1.0.1': {} + '@vitest/istanbul-lib-coverage@1.0.2': {} - '@vitest/istanbul-lib-report@1.0.1': + '@vitest/istanbul-lib-report@1.0.2': dependencies: - '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@5.0.0(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@vitest/mocker@5.0.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.0 + '@vitest/spy': 5.0.3 estree-walker: 3.0.3 - magic-string: 1.3.1 + magic-string: 1.4.2 optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - '@vitest/mocker@5.0.0(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1))': + '@vitest/mocker@5.0.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.0 + '@vitest/spy': 5.0.3 estree-walker: 3.0.3 - magic-string: 1.3.1 + magic-string: 1.4.2 optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - '@vitest/spy@5.0.0': {} + '@vitest/spy@5.0.3': {} '@workflow/serde@4.1.0': {} @@ -14883,10 +14642,10 @@ snapshots: execa: 9.6.1 isexe: 4.0.0 - '@xhmikosr/bin-wrapper@14.5.0': + '@xhmikosr/bin-wrapper@14.5.1': dependencies: '@xhmikosr/bin-check': 8.2.2 - '@xhmikosr/downloader': 16.3.0 + '@xhmikosr/downloader': 16.3.1 '@xhmikosr/os-filter-obj': 4.1.0 binary-version-check: 6.1.0 transitivePeerDependencies: @@ -14894,7 +14653,7 @@ snapshots: - react-native-b4a - supports-color - '@xhmikosr/decompress-tar@9.0.1': + '@xhmikosr/decompress-tar@9.0.2': dependencies: file-type: 21.3.4 is-stream: 4.0.1 @@ -14906,7 +14665,7 @@ snapshots: '@xhmikosr/decompress-tarbz2@9.0.2': dependencies: - '@xhmikosr/decompress-tar': 9.0.1 + '@xhmikosr/decompress-tar': 9.0.2 file-type: 21.3.4 is-stream: 4.0.1 seek-bzip: 2.0.0 @@ -14918,7 +14677,7 @@ snapshots: '@xhmikosr/decompress-targz@9.0.1': dependencies: - '@xhmikosr/decompress-tar': 9.0.1 + '@xhmikosr/decompress-tar': 9.0.2 file-type: 21.3.4 is-stream: 4.0.1 transitivePeerDependencies: @@ -14934,9 +14693,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@xhmikosr/decompress@11.1.3': + '@xhmikosr/decompress@11.1.4': dependencies: - '@xhmikosr/decompress-tar': 9.0.1 + '@xhmikosr/decompress-tar': 9.0.2 '@xhmikosr/decompress-tarbz2': 9.0.2 '@xhmikosr/decompress-targz': 9.0.1 '@xhmikosr/decompress-unzip': 8.2.1 @@ -14947,14 +14706,14 @@ snapshots: - react-native-b4a - supports-color - '@xhmikosr/downloader@16.3.0': + '@xhmikosr/downloader@16.3.1': dependencies: '@xhmikosr/archive-type': 8.1.0 - '@xhmikosr/decompress': 11.1.3 + '@xhmikosr/decompress': 11.1.4 content-disposition: 2.0.1 ext-name: 5.0.0 file-type: 21.3.4 - filenamify: 7.0.2 + filenamify: 7.0.3 got: 14.6.6 transitivePeerDependencies: - bare-abort-controller @@ -14965,43 +14724,43 @@ snapshots: dependencies: system-architecture: 1.0.0 - '@yuku-analyzer/binding-android-arm64@0.9.3': + '@yuku-analyzer/binding-android-arm64@0.10.2': optional: true - '@yuku-analyzer/binding-darwin-arm64@0.9.3': + '@yuku-analyzer/binding-darwin-arm64@0.10.2': optional: true - '@yuku-analyzer/binding-darwin-x64@0.9.3': + '@yuku-analyzer/binding-darwin-x64@0.10.2': optional: true - '@yuku-analyzer/binding-freebsd-x64@0.9.3': + '@yuku-analyzer/binding-freebsd-x64@0.10.2': optional: true - '@yuku-analyzer/binding-linux-arm-gnu@0.9.3': + '@yuku-analyzer/binding-linux-arm-gnu@0.10.2': optional: true - '@yuku-analyzer/binding-linux-arm-musl@0.9.3': + '@yuku-analyzer/binding-linux-arm-musl@0.10.2': optional: true - '@yuku-analyzer/binding-linux-arm64-gnu@0.9.3': + '@yuku-analyzer/binding-linux-arm64-gnu@0.10.2': optional: true - '@yuku-analyzer/binding-linux-arm64-musl@0.9.3': + '@yuku-analyzer/binding-linux-arm64-musl@0.10.2': optional: true - '@yuku-analyzer/binding-linux-x64-gnu@0.9.3': + '@yuku-analyzer/binding-linux-x64-gnu@0.10.2': optional: true - '@yuku-analyzer/binding-linux-x64-musl@0.9.3': + '@yuku-analyzer/binding-linux-x64-musl@0.10.2': optional: true - '@yuku-analyzer/binding-win32-arm64@0.9.3': + '@yuku-analyzer/binding-win32-arm64@0.10.2': optional: true - '@yuku-analyzer/binding-win32-x64@0.9.3': + '@yuku-analyzer/binding-win32-x64@0.10.2': optional: true - '@yuku-toolchain/types@0.9.3': {} + '@yuku-toolchain/types@0.10.2': {} accepts@1.3.8: dependencies: @@ -15013,16 +14772,10 @@ snapshots: mime-types: 3.0.2 negotiator: 1.1.0 - acorn-jsx@5.3.2(acorn@8.17.0): - dependencies: - acorn: 8.17.0 - acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 - acorn@8.17.0: {} - acorn@8.18.0: {} agent-install@0.0.5: @@ -15043,12 +14796,12 @@ snapshots: prompts: 2.4.2 yaml: 2.9.1 - ai@7.0.99(zod@4.6.2): + ai@7.0.124(zod@4.6.5): dependencies: - '@ai-sdk/gateway': 4.0.80(zod@4.6.2) - '@ai-sdk/provider': 4.0.14 - '@ai-sdk/provider-utils': 5.0.40(zod@4.6.2) - zod: 4.6.2 + '@ai-sdk/gateway': 4.0.102(zod@4.6.5) + '@ai-sdk/provider': 4.0.21 + '@ai-sdk/provider-utils': 5.0.53(zod@4.6.5) + zod: 4.6.5 ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: @@ -15068,7 +14821,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.7 + fast-uri: 3.1.8 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -15076,7 +14829,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.3.0: {} + ansi-regex@6.4.0: {} ansi-styles@4.3.0: dependencies: @@ -15084,7 +14837,7 @@ snapshots: ansi-styles@5.2.0: {} - ansis@4.3.1: {} + ansis@4.4.0: {} any-promise@1.3.0: {} @@ -15095,7 +14848,7 @@ snapshots: apache-arrow@21.2.0: dependencies: - '@types/node': 25.9.6 + '@types/node': 25.9.8 flatbuffers: 25.9.23 json-with-bigint: 3.5.12 tslib: 2.8.1 @@ -15118,14 +14871,14 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.9: + array-includes@3.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 + es-shim-unscopables: 1.1.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -15169,7 +14922,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@1.0.6: + ast-v8-to-istanbul@1.0.7: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -15190,11 +14943,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.12.1: {} + axe-core@4.13.0: {} axobject-query@4.1.0: {} - b4a@1.8.1: {} + b4a@1.9.0: {} babel-dead-code-elimination@1.0.12: dependencies: @@ -15216,13 +14969,11 @@ snapshots: balanced-match@4.0.4: {} - bare-events@2.9.1: {} + bare-events@2.9.2: {} base64-js@1.5.1: {} - base64id@2.0.0: {} - - baseline-browser-mapping@2.11.22: {} + baseline-browser-mapping@2.11.26: {} bidi-js@1.1.0: dependencies: @@ -15249,8 +15000,6 @@ snapshots: dependencies: react: 19.3.0 - birecord@0.1.2: {} - body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -15267,16 +15016,16 @@ snapshots: bowser@2.14.1: {} - brace-expansion@1.1.16: + brace-expansion@1.1.21: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.2: + brace-expansion@2.1.7: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.9: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 @@ -15284,20 +15033,20 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.9: + browserslist@4.29.3: dependencies: - baseline-browser-mapping: 2.11.22 - caniuse-lite: 1.0.30001810 - electron-to-chromium: 1.5.427 - node-releases: 2.0.55 - update-browserslist-db: 1.3.3(browserslist@4.28.9) + baseline-browser-mapping: 2.11.26 + caniuse-lite: 1.0.30001814 + electron-to-chromium: 1.5.443 + node-releases: 2.0.57 + update-browserslist-db: 1.3.3(browserslist@4.29.3) buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-name@4.1.0: + bundle-name@4.1.1: dependencies: run-applescript: 7.1.0 @@ -15351,7 +15100,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001810: {} + caniuse-lite@1.0.30001814: {} ccount@2.0.1: {} @@ -15419,14 +15168,12 @@ snapshots: clsx@2.1.1: {} - cluster-key-slot@1.1.2: {} - cmdk@1.1.1(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-dialog': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@radix-ui/react-id': 1.1.2(@types/react@19.3.0)(react@19.3.0) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.3.0)(react@19.3.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: @@ -15435,10 +15182,12 @@ snapshots: cn@0.2.6: {} - cn@0.3.0: {} - cn@0.3.2: {} + cn@0.3.3: {} + + cn@0.4.0: {} + code-block-writer@13.0.3: {} collapse-white-space@2.1.0: {} @@ -15467,7 +15216,7 @@ snapshots: commander@9.5.0: {} - comment-parser@1.4.8: {} + comment-parser@1.4.9: {} compare-versions@6.1.1: {} @@ -15498,7 +15247,7 @@ snapshots: env-paths: 3.0.0 json-schema-typed: 8.0.2 semver: 7.8.5 - uint8array-extras: 1.5.0 + uint8array-extras: 1.6.0 confbox@0.1.8: {} @@ -15524,6 +15273,8 @@ snapshots: cookie@0.7.2: {} + copy-anything@4.1.5: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -15538,7 +15289,7 @@ snapshots: optionalDependencies: typescript: 6.0.3 - cron-parser@5.10.0: + cron-parser@5.10.1: dependencies: luxon: 3.7.2 @@ -15548,14 +15299,14 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.4.12(srvx@1.0.4): + crossws@0.4.12(srvx@1.0.5): optionalDependencies: - srvx: 1.0.4 + srvx: 1.0.5 css-tree@3.2.1: dependencies: mdn-data: 2.27.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 cssesc@3.0.0: {} @@ -15668,7 +15419,7 @@ snapshots: default-browser@5.5.1: dependencies: - bundle-name: 4.1.0 + bundle-name: 4.1.1 default-browser-id: 5.0.1 define-data-property@1.1.4: @@ -15745,7 +15496,7 @@ snapshots: dot-prop@10.2.0: dependencies: - type-fest: 5.9.0 + type-fest: 5.10.0 dot-prop@6.0.1: dependencies: @@ -15753,19 +15504,21 @@ snapshots: dotenv@17.4.2: {} + dotenv@18.0.5: {} + drizzle-kit@1.0.0-rc.4: dependencies: - '@drizzle-team/brocli': 0.12.0 + '@drizzle-team/brocli': 0.12.1 '@js-temporal/polyfill': 0.5.1 esbuild: 0.25.12 - get-tsconfig: 4.14.0 + get-tsconfig: 4.14.3 jiti: 2.7.0 - drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.2): + drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(postgres@3.4.9)(zod@4.6.5): optionalDependencies: '@opentelemetry/api': 1.9.1 postgres: 3.4.9 - zod: 4.6.2 + zod: 4.6.5 dunder-proto@1.0.1: dependencies: @@ -15775,7 +15528,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.427: {} + electron-to-chromium@1.5.443: {} embla-carousel-react@8.6.0(react@19.3.0): dependencies: @@ -15807,11 +15560,11 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.10: + engine.io@6.6.11: dependencies: '@types/cors': 2.8.19 - '@types/node': 26.5.1 - '@types/ws': 8.18.1 + '@types/node': 26.6.3 + '@types/ws': 8.18.2 accepts: 1.3.8 cookie: 0.7.2 cors: 2.8.6 @@ -15823,7 +15576,7 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.24.3: + enhanced-resolve@5.26.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -15837,20 +15590,18 @@ snapshots: entities@6.0.1: {} - entities@7.0.1: {} - entities@8.1.0: {} env-paths@2.2.1: {} env-paths@3.0.0: {} - env-runner@0.2.1: + env-runner@0.2.3: dependencies: - crossws: 0.4.12(srvx@1.0.4) + crossws: 0.4.12(srvx@1.0.5) exsolve: 1.1.1 httpxy: 0.5.5 - srvx: 1.0.4 + srvx: 1.0.5 error-ex@1.3.4: dependencies: @@ -15915,10 +15666,10 @@ snapshots: string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 + typed-array-byte-offset: 1.0.5 typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.22 + which-typed-array: 1.1.24 es-define-property@1.0.1: {} @@ -16092,14 +15843,14 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.10.0(jiti@2.7.0)): + eslint-compat-utils@0.5.1(eslint@10.11.0(jiti@2.7.0)): dependencies: - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) semver: 7.8.5 - eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)): + eslint-config-prettier@10.1.8(eslint@10.11.0(jiti@2.7.0)): dependencies: - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) eslint-import-context@0.1.9(unrs-resolver@1.12.2): dependencies: @@ -16108,19 +15859,19 @@ snapshots: optionalDependencies: unrs-resolver: 1.12.2 - eslint-plugin-es-x@7.8.0(eslint@10.10.0(jiti@2.7.0)): + eslint-plugin-es-x@7.8.0(eslint@10.11.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - eslint: 10.10.0(jiti@2.7.0) - eslint-compat-utils: 0.5.1(eslint@10.10.0(jiti@2.7.0)) + eslint: 10.11.0(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@10.11.0(jiti@2.7.0)) - eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0)): dependencies: - '@typescript-eslint/types': 8.65.0 - comment-parser: 1.4.8 + '@typescript-eslint/types': 8.71.0 + comment-parser: 1.4.9 debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 minimatch: 10.2.6 @@ -16128,21 +15879,21 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@10.10.0(jiti@2.7.0)): + eslint-plugin-jsx-a11y@6.10.2(eslint@10.11.0(jiti@2.7.0)): dependencies: aria-query: 5.3.2 - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.12.1 + axe-core: 4.13.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -16151,12 +15902,12 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-n@17.24.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-n@17.24.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) - enhanced-resolve: 5.24.3 - eslint: 10.10.0(jiti@2.7.0) - eslint-plugin-es-x: 7.8.0(eslint@10.10.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + enhanced-resolve: 5.26.0 + eslint: 10.11.0(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@10.11.0(jiti@2.7.0)) get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 @@ -16166,133 +15917,140 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-perfectionist@5.12.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) natural-orderby: 5.0.0 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.6): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0(jiti@2.7.0)))(eslint@10.11.0(jiti@2.7.0))(prettier@3.9.9): dependencies: - eslint: 10.10.0(jiti@2.7.0) - prettier: 3.9.6 + eslint: 10.11.0(jiti@2.7.0) + prettier: 3.9.9 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.10.0(jiti@2.7.0)) + eslint-config-prettier: 10.1.8(eslint@10.11.0(jiti@2.7.0)) - eslint-plugin-react-dom@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-dom@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 - eslint: 10.10.0(jiti@2.7.0) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.1.1(eslint@10.10.0(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@10.11.0(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.8 - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) hermes-parser: 0.25.1 - zod: 4.6.2 - zod-validation-error: 4.0.2(zod@4.6.2) + zod: 4.6.5 + zod-validation-error: 4.0.2(zod@4.6.5) transitivePeerDependencies: - supports-color - eslint-plugin-react-jsx@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-jsx@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-naming-convention@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-rsc@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-react-rsc@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): - dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - birecord: 0.1.2 - eslint: 10.10.0(jiti@2.7.0) + eslint-plugin-react-web-api@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-x@5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): - dependencies: - '@eslint-react/ast': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/core': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/eslint': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/jsx': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/shared': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@eslint-react/var': 5.19.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-react-x@5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/core': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/eslint': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/jsx': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/shared': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint-react/var': 5.23.3(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.71.0 + '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) compare-versions: 6.1.1 - eslint: 10.10.0(jiti@2.7.0) string-ts: 2.3.1 ts-api-utils: 2.5.0(typescript@6.0.3) ts-pattern: 5.9.0 typescript: 6.0.3 + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) transitivePeerDependencies: - supports-color - eslint-plugin-react-you-might-not-need-an-effect@1.0.2(eslint@10.10.0(jiti@2.7.0)): + eslint-plugin-react-you-might-not-need-an-effect@1.0.2(eslint@10.11.0(jiti@2.7.0)): dependencies: - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) globals: 16.5.0 eslint-scope@9.1.2: @@ -16308,9 +16066,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.10.0(jiti@2.7.0): + eslint@10.11.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 @@ -16347,8 +16105,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: @@ -16416,7 +16174,7 @@ snapshots: events-universal@1.0.1: dependencies: - bare-events: 2.9.1 + bare-events: 2.9.2 transitivePeerDependencies: - bare-abort-controller @@ -16471,7 +16229,7 @@ snapshots: dependencies: debug: 4.4.3 express: 5.2.1 - ip-address: 10.7.0 + ip-address: 10.7.2 transitivePeerDependencies: - supports-color @@ -16496,7 +16254,7 @@ snapshots: on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 - proxy-addr: 2.0.7 + proxy-addr: 2.0.8 qs: 6.16.0 range-parser: 1.3.0 router: 2.2.0 @@ -16525,7 +16283,7 @@ snapshots: fast-diff@1.3.0: {} - fast-equals@5.4.2: {} + fast-equals@5.4.3: {} fast-fifo@1.3.2: {} @@ -16549,7 +16307,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.7: {} + fast-uri@3.1.8: {} fast-wrap-ansi@0.2.2: dependencies: @@ -16578,15 +16336,15 @@ snapshots: '@tokenizer/inflate': 0.4.1 strtok3: 10.3.5 token-types: 6.1.2 - uint8array-extras: 1.5.0 + uint8array-extras: 1.6.0 transitivePeerDependencies: - supports-color - filename-reserved-regex@4.0.0: {} + filename-reserved-regex@4.0.1: {} - filenamify@7.0.2: + filenamify@7.0.3: dependencies: - filename-reserved-regex: 4.0.0 + filename-reserved-regex: 4.0.1 fill-range@7.1.1: dependencies: @@ -16621,7 +16379,7 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.2 - rollup: 4.62.2 + rollup: 4.63.5 flat-cache@6.1.23: dependencies: @@ -16642,10 +16400,10 @@ snapshots: forwarded@0.2.0: {} - framer-motion@13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + framer-motion@13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - motion-dom: 13.2.0 - motion-utils: 13.0.0 + motion-dom: 13.4.5 + motion-utils: 13.3.0 tslib: 2.8.1 optionalDependencies: react: 19.3.0 @@ -16653,7 +16411,7 @@ snapshots: fresh@2.0.0: {} - fs-extra@11.4.0: + fs-extra@11.4.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -16665,15 +16423,15 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2): + fumadocs-core@16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5): dependencies: - '@fumari/image-size': 0.1.0 + '@fumari/image-size': 0.1.1 estree-util-value-to-estree: 3.5.0 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 mdast-util-mdx: 3.0.0 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 npm-to-yarn: 3.2.0 remark: 15.0.1 remark-gfm: 4.0.1 @@ -16685,32 +16443,32 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 yaml: 2.9.1 - zbsearch: 4.0.0 + zbsearch: 4.0.1 optionalDependencies: '@mdx-js/mdx': 3.1.1 - '@tanstack/react-router': 1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-router': 1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/react': 19.3.0 - lucide-react: 1.45.0(react@19.3.0) - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + lucide-react: 1.49.0(@types/react@19.3.0)(react@19.3.0) + next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - zod: 4.6.2 + zod: 4.6.5 transitivePeerDependencies: - supports-color - fumadocs-mdx@15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + fumadocs-mdx@15.4.5(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.3.0)(fumadocs-core@16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.2 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2) + fumadocs-core: 16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5) github-slugger: 2.0.0 - magic-string: 1.2.3 + magic-string: 1.4.2 mdast-util-mdx: 3.0.0 picocolors: 1.1.1 picomatch: 4.0.7 @@ -16720,24 +16478,24 @@ snapshots: unist-util-remove-position: 5.0.0 unist-util-visit: 5.1.0 vfile: 6.0.3 - yaml: 2.9.0 - yuku-analyzer: 0.9.3 - zod: 4.6.2 + yaml: 2.9.1 + yuku-analyzer: 0.10.2 + zod: 4.6.5 optionalDependencies: '@types/mdast': 4.0.4 '@types/mdx': 2.0.14 '@types/react': 19.3.0 - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 - rolldown: 1.2.8 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + rolldown: 1.2.12 + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - supports-color - fumadocs-ui@16.15.9(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3): + fumadocs-ui@16.15.17(@types/mdx@2.0.14)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(fumadocs-core@16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(tailwindcss@4.3.3): dependencies: '@fuma-translate/react': 1.0.2(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@fumadocs/tailwind': 0.1.1(tailwindcss@4.3.3) + '@fumadocs/tailwind': 0.1.2(tailwindcss@4.3.3) '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -16749,10 +16507,10 @@ snapshots: '@radix-ui/react-slot': 1.3.3(@types/react@19.3.0)(react@19.3.0) '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) class-variance-authority: 0.7.1 - cn: 0.2.6 - fumadocs-core: 16.15.9(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.35(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.45.0(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.2) - lucide-react: 1.45.0(react@19.3.0) - motion: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + cn: 0.3.3 + fumadocs-core: 16.15.17(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.41(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.3.0)(lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(zod@4.6.5) + lucide-react: 1.49.0(@types/react@19.3.0)(react@19.3.0) + motion: 13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) next-themes: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) @@ -16764,7 +16522,7 @@ snapshots: optionalDependencies: '@types/mdx': 2.0.14 '@types/react': 19.3.0 - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) transitivePeerDependencies: - '@types/react-dom' - tailwindcss @@ -16795,7 +16553,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} + get-east-asian-width@1.7.0: {} get-intrinsic@1.3.0: dependencies: @@ -16834,10 +16592,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -16862,7 +16616,7 @@ snapshots: globals@16.5.0: {} - globals@17.11.0: {} + globals@17.12.0: {} globalthis@1.0.4: dependencies: @@ -16903,19 +16657,19 @@ snapshots: graceful-fs@4.2.11: {} - h3@2.0.1-rc.20(crossws@0.4.12(srvx@1.0.4)): + h3@2.0.1-rc.20(crossws@0.4.12(srvx@1.0.5)): dependencies: rou3: 0.8.1 srvx: 0.11.22 optionalDependencies: - crossws: 0.4.12(srvx@1.0.4) + crossws: 0.4.12(srvx@1.0.5) - h3@2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))(ocache@0.3.0): + h3@2.0.1-rc.32(crossws@0.4.12(srvx@1.0.5))(ocache@0.3.0): dependencies: rou3: 0.9.2 - srvx: 1.0.4 + srvx: 1.0.5 optionalDependencies: - crossws: 0.4.12(srvx@1.0.4) + crossws: 0.4.12(srvx@1.0.5) ocache: 0.3.0 has-bigints@1.1.0: {} @@ -17056,9 +16810,9 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.13.7: {} + hono@4.13.12: {} - hookable@6.1.1: {} + hookable@6.1.2: {} hookified@1.15.1: {} @@ -17066,9 +16820,9 @@ snapshots: hpagent@1.2.0: {} - html-encoding-sniffer@6.0.0: + html-encoding-sniffer@7.0.0: dependencies: - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.16.0 transitivePeerDependencies: - '@noble/hashes' @@ -17084,13 +16838,6 @@ snapshots: html5parser@3.0.0: {} - htmlparser2@10.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 - htmlparser2@12.0.0: dependencies: domelementtype: 3.0.0 @@ -17134,17 +16881,15 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icu-minify@4.14.4: + icu-minify@4.14.8: dependencies: - '@formatjs/icu-messageformat-parser': 3.5.17 + '@formatjs/icu-messageformat-parser': 3.5.20 ieee754@1.2.1: {} ignore@5.3.2: {} - ignore@7.0.6: {} - - ignore@7.0.9: {} + ignore@7.0.11: {} immer@11.1.18: {} @@ -17153,7 +16898,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@3.5.1: + import-in-the-middle@3.5.2: dependencies: cjs-module-lexer: 2.2.1 es-module-lexer: 3.0.2 @@ -17182,12 +16927,12 @@ snapshots: internmap@2.0.3: {} - intl-messageformat@11.2.14: + intl-messageformat@11.2.15: dependencies: '@formatjs/fast-memoize': 3.1.7 - '@formatjs/icu-messageformat-parser': 3.5.17 + '@formatjs/icu-messageformat-parser': 3.5.18 - ip-address@10.7.0: {} + ip-address@10.7.2: {} ipaddr.js@1.9.1: {} @@ -17341,7 +17086,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.22 + which-typed-array: 1.1.24 is-unicode-supported@1.3.0: {} @@ -17403,28 +17148,27 @@ snapshots: jsbi@4.3.2: {} - jsdom@30.0.1: + jsdom@30.1.1: dependencies: - '@asamuzakjp/css-color': 6.0.7 - '@asamuzakjp/dom-selector': 8.3.2 + '@asamuzakjp/css-color': 7.1.2 + '@asamuzakjp/dom-selector': 9.2.2 '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.13(css-tree@3.2.1) - '@exodus/bytes': 1.15.1 + '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1) + '@exodus/bytes': 1.16.0 css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 + html-encoding-sniffer: 7.0.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.2 + lru-cache: 11.5.3 parse5: 8.0.1 saxes: 6.0.0 - symbol-tree: 3.2.4 tough-cookie: 6.0.2 - undici: 8.10.2 - w3c-xmlserializer: 5.0.0 + undici: 8.11.2 + w3c-xmlserializer: 6.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 - whatwg-url: 17.1.1 + whatwg-url: 17.1.2 xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' @@ -17460,7 +17204,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.9 + array-includes: 3.2.0 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -17484,7 +17228,7 @@ snapshots: launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.10.0 + shell-quote: 1.11.0 launder@1.7.1: dependencies: @@ -17497,7 +17241,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lib0@0.2.117: + lib0@0.2.119: dependencies: isomorphic.js: 0.2.5 @@ -17630,15 +17374,17 @@ snapshots: lowercase-keys@3.0.0: {} - lru-cache@11.5.2: {} + lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@1.45.0(react@19.3.0): + lucide-react@1.49.0(@types/react@19.3.0)(react@19.3.0): dependencies: react: 19.3.0 + optionalDependencies: + '@types/react': 19.3.0 luxon@3.7.2: {} @@ -17648,11 +17394,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 - magic-string@1.2.3: - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - - magic-string@1.3.1: + magic-string@1.4.2: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -17660,7 +17402,7 @@ snapshots: dependencies: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - source-map-js: 1.2.1 + source-map-js: 1.2.2 make-asynchronous@1.1.0: dependencies: @@ -17690,12 +17432,12 @@ snapshots: decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.3 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -17713,16 +17455,16 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.1: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17732,7 +17474,7 @@ snapshots: devlop: 1.1.0 markdown-table: 3.0.4 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17741,7 +17483,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17750,10 +17492,10 @@ snapshots: mdast-util-from-markdown: 2.0.3 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.1 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17764,7 +17506,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17777,7 +17519,7 @@ snapshots: ccount: 2.0.1 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 @@ -17791,7 +17533,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17802,7 +17544,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 transitivePeerDependencies: - supports-color @@ -17823,15 +17565,17 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 - mdast-util-to-markdown@2.1.2: + mdast-util-to-markdown@2.1.3: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 unist-util-visit: 5.1.0 zwitch: 2.0.4 @@ -17849,42 +17593,43 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.3: + micromark-core-commonmark@2.0.4: dependencies: decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-factory-title: 2.0.1 micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-strikethrough@2.1.0: dependencies: @@ -17893,27 +17638,27 @@ snapshots: micromark-util-classify-character: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-table@2.1.2: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-gfm@3.0.0: dependencies: @@ -17924,18 +17669,18 @@ snapshots: micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-mdx-expression@3.0.1: dependencies: '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-mdx-jsx@3.0.2: dependencies: @@ -17943,26 +17688,26 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 vfile-message: 4.0.3 micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.9 devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 + micromark-core-commonmark: 2.0.4 micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -17975,56 +17720,56 @@ snapshots: micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-factory-mdx-expression@2.0.3: dependencies: '@types/estree': 1.0.9 devlop: 1.1.0 - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.3 - micromark-factory-space@2.0.1: + micromark-factory-space@2.1.0: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.1 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-chunked@2.0.1: dependencies: @@ -18034,12 +17779,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -18052,6 +17797,10 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 + micromark-util-edit-map@1.0.0: + dependencies: + micromark-util-types: 2.0.3 + micromark-util-encode@2.0.1: {} micromark-util-events-to-acorn@2.0.3: @@ -18061,7 +17810,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 vfile-message: 4.0.3 micromark-util-html-tag-name@2.0.1: {} @@ -18072,7 +17821,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -18085,31 +17834,32 @@ snapshots: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.2: {} + micromark-util-types@2.0.3: {} - micromark@4.0.2: + micromark@4.0.3: dependencies: '@types/debug': 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 micromark-util-combine-extensions: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 micromark-util-encode: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 transitivePeerDependencies: - supports-color @@ -18142,15 +17892,15 @@ snapshots: minimatch@10.2.6: dependencies: - brace-expansion: 5.0.9 + brace-expansion: 5.0.12 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.16 + brace-expansion: 1.1.21 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.2 + brace-expansion: 2.1.7 minimist@1.2.8: {} @@ -18158,22 +17908,22 @@ snapshots: mlly@1.8.2: dependencies: - acorn: 8.17.0 + acorn: 8.18.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.4 module-details-from-path@1.0.4: {} - motion-dom@13.2.0: + motion-dom@13.4.5: dependencies: - motion-utils: 13.0.0 + motion-utils: 13.3.0 - motion-utils@13.0.0: {} + motion-utils@13.3.0: {} - motion@13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + motion@13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - framer-motion: 13.2.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + framer-motion: 13.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) tslib: 2.8.1 optionalDependencies: react: 19.3.0 @@ -18210,12 +17960,12 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.5.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(@types/node@26.6.3)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@next/env': 16.3.3 '@swc/helpers': 0.5.23 - baseline-browser-mapping: 2.11.22 - caniuse-lite: 1.0.30001810 + baseline-browser-mapping: 2.11.26 + caniuse-lite: 1.0.30001814 postcss: 8.5.23 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) @@ -18232,7 +17982,7 @@ snapshots: '@opentelemetry/api': 1.9.1 '@playwright/test': 1.61.1 babel-plugin-react-compiler: 1.0.0 - sharp: 0.35.4(@types/node@26.5.1) + sharp: 0.35.5(@types/node@26.6.3) transitivePeerDependencies: - '@babel/core' - '@types/node' @@ -18243,16 +17993,16 @@ snapshots: nitro@3.0.260903-beta: dependencies: consola: 3.4.2 - crossws: 0.4.12(srvx@1.0.4) + crossws: 0.4.12(srvx@1.0.5) db0: 0.4.1 - env-runner: 0.2.1 - h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))(ocache@0.3.0) - hookable: 6.1.1 + env-runner: 0.2.3 + h3: 2.0.1-rc.32(crossws@0.4.12(srvx@1.0.5))(ocache@0.3.0) + hookable: 6.1.2 nf3: 0.3.24 ocache: 0.3.0 - rolldown: 1.2.8 + rolldown: 1.2.12 rou3: 0.9.2 - srvx: 1.0.4 + srvx: 1.0.5 unenv: 2.0.0-rc.24 unstorage: 2.0.0-alpha.10 @@ -18265,9 +18015,9 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-releases@2.0.55: {} + node-releases@2.0.57: {} - nodemailer@10.0.9: {} + nodemailer@10.0.13: {} normalize-path@3.0.0: {} @@ -18357,14 +18107,14 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@11.0.3: + open@11.0.4: dependencies: default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-in-ssh: 1.0.0 is-inside-container: 1.0.0 powershell-utils: 0.2.1 - wsl-utils: 1.0.0 + wsl-utils: 1.0.1 open@8.4.2: dependencies: @@ -18406,7 +18156,7 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.2 + string-width: 8.3.0 orderedmap@2.1.1: {} @@ -18494,7 +18244,7 @@ snapshots: oxlint-plugin-react-doctor@0.9.14: dependencies: '@shaderfrog/glsl-parser': 7.0.1 - '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/types': 8.71.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 lightningcss: 1.33.0 @@ -18602,7 +18352,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.2 + lru-cache: 11.5.3 minipass: 7.1.3 path-to-regexp@8.4.2: {} @@ -18619,15 +18369,13 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.5: {} - picomatch@4.0.7: {} picospinner@3.1.2: {} pirates@4.0.7: {} - piscina@4.9.3: + piscina@4.9.4: optionalDependencies: '@napi-rs/nice': 1.1.1 @@ -18661,15 +18409,15 @@ snapshots: possible-typed-array-names@1.1.0: {} - postal-mime@2.7.5: {} + postal-mime@2.7.6: {} - postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(yaml@2.9.1): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.7.0 postcss: 8.5.28 - tsx: 4.23.13 + tsx: 4.23.15 yaml: 2.9.1 postcss-selector-parser@7.1.6: @@ -18681,21 +18429,19 @@ snapshots: dependencies: nanoid: 3.3.19 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 postcss@8.5.28: dependencies: nanoid: 3.3.19 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 postgres@3.4.9: {} - powershell-utils@0.1.0: {} - powershell-utils@0.2.1: {} - preact@10.29.7: {} + preact@10.29.8: {} prelude-ls@1.2.1: {} @@ -18703,11 +18449,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-tailwindcss@0.8.1(prettier@3.9.6): + prettier-plugin-tailwindcss@0.8.1(prettier@3.9.9): dependencies: - prettier: 3.9.6 + prettier: 3.9.9 - prettier@3.9.6: {} + prettier@3.9.9: {} pretty-format@27.5.1: dependencies: @@ -18728,81 +18474,85 @@ snapshots: property-information@7.2.0: {} - prosemirror-changeset@2.4.2: + prosemirror-changeset@2.4.4: dependencies: - prosemirror-transform: 1.12.1 + prosemirror-transform: 1.12.2 prosemirror-commands@1.7.2: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 + prosemirror-transform: 1.12.2 - prosemirror-dropcursor@1.8.3: + prosemirror-dropcursor@1.8.4: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.3 + prosemirror-view: 1.42.6 - prosemirror-history@1.5.0: + prosemirror-history@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 + prosemirror-transform: 1.12.2 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-model@1.25.11: + prosemirror-model@1.25.12: dependencies: orderedmap: 2.1.1 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 + prosemirror-transform: 1.12.2 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.11 - prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-model: 1.25.12 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 - prosemirror-view: 1.42.3 + prosemirror-transform: 1.12.2 + prosemirror-view: 1.42.6 prosemirror-transform@1.12.1: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 - prosemirror-view@1.42.3: + prosemirror-transform@1.12.2: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 + + prosemirror-view@1.42.6: + dependencies: + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.1 + prosemirror-transform: 1.12.2 - proxy-addr@2.0.7: + proxy-addr@2.0.8: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 @@ -18832,7 +18582,7 @@ snapshots: range-parser@1.3.0: {} - rate-limiter-flexible@11.2.0: {} + rate-limiter-flexible@11.2.1: {} raw-body@3.0.2: dependencies: @@ -18846,7 +18596,7 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - react-day-picker@10.0.1(@types/react@19.3.0)(react@19.3.0): + react-day-picker@10.0.2(@types/react@19.3.0)(react@19.3.0): dependencies: '@date-fns/tz': 1.5.0 date-fns: 4.4.0 @@ -18854,15 +18604,15 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - react-doctor@0.9.14(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(eslint@10.10.0(jiti@2.7.0))(react@19.3.0): + react-doctor@0.9.14(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(eslint@10.11.0(jiti@2.7.0))(react@19.3.0): dependencies: '@astrojs/compiler': 4.0.0 - '@sentry/node': 10.74.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) + '@sentry/node': 10.75.3(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) agent-install: 0.0.5 bippy: 0.6.1(react@19.3.0) conf: 15.1.0 confbox: 0.2.4 - eslint-plugin-react-hooks: 7.1.1(eslint@10.10.0(jiti@2.7.0)) + eslint-plugin-react-hooks: 7.1.1(eslint@10.11.0(jiti@2.7.0)) is-unicode-supported: 2.1.0 jiti: 2.7.0 magicast: 0.5.5 @@ -18889,12 +18639,12 @@ snapshots: react: 19.3.0 scheduler: 0.28.0 - react-email@6.9.5(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + react-email@6.11.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: '@babel/parser': 7.29.2 '@babel/traverse': 7.29.0 '@react-email/render': 2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - chokidar: 4.0.3 + chokidar: 5.0.0 commander: 13.1.0 conf: 15.1.0 css-tree: 3.2.1 @@ -18912,7 +18662,7 @@ snapshots: prompts: 2.4.2 react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - socket.io: 4.8.3 + socket.io: 4.8.4 tailwindcss: 4.3.3 tsconfig-paths: 4.2.0 transitivePeerDependencies: @@ -18957,33 +18707,34 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - react-resizable-panels@4.12.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + react-resizable-panels@4.14.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - react-scan@0.5.7(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(esbuild@0.27.7)(eslint@10.10.0(jiti@2.7.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + react-scan@0.5.7(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(esbuild@0.27.7)(eslint@10.11.0(jiti@2.7.0))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@babel/core': 7.29.7 - '@babel/types': 7.29.7 - '@preact/signals': 2.9.4(preact@10.29.7) - '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + '@babel/types': 7.29.8 + '@preact/signals': 2.11.3(preact@10.29.8) + '@rollup/pluginutils': 5.4.0(rollup@4.63.5) bippy: 0.5.43(react@19.3.0) commander: 14.0.3 picocolors: 1.1.1 - preact: 10.29.7 + preact: 10.29.8 prompts: 2.4.2 react: 19.3.0 - react-doctor: 0.9.14(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(eslint@10.10.0(jiti@2.7.0))(react@19.3.0) + react-doctor: 0.9.14(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(eslint@10.11.0(jiti@2.7.0))(react@19.3.0) react-dom: 19.3.0(react@19.3.0) react-grab: 0.2.0(react@19.3.0) optionalDependencies: esbuild: 0.27.7 - unplugin: 3.3.0(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + unplugin: 3.4.0(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - '@farmfe/core' - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' + - '@rsbuild/core' - '@rspack/core' - bun-types-no-globals - eslint @@ -19025,7 +18776,7 @@ snapshots: recharts@3.10.1(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react-is@17.0.2)(react@19.3.0)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0) + '@reduxjs/toolkit': 2.13.0(react-redux@9.3.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.52.0 @@ -19072,13 +18823,13 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - redis@6.2.1(@opentelemetry/api@1.9.1): + redis@6.3.0(@opentelemetry/api@1.9.1): dependencies: - '@redis/bloom': 6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1)) - '@redis/client': 6.2.1(@opentelemetry/api@1.9.1) - '@redis/json': 6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1)) - '@redis/search': 6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1)) - '@redis/time-series': 6.2.1(@redis/client@6.2.1(@opentelemetry/api@1.9.1)) + '@redis/bloom': 6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1)) + '@redis/client': 6.3.0(@opentelemetry/api@1.9.1) + '@redis/json': 6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1)) + '@redis/search': 6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1)) + '@redis/time-series': 6.3.0(@redis/client@6.3.0(@opentelemetry/api@1.9.1)) transitivePeerDependencies: - '@node-rs/xxhash' - '@opentelemetry/api' @@ -19157,7 +18908,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.3 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.3 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -19173,7 +18924,7 @@ snapshots: remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.3 unified: 11.0.5 remark@15.0.1: @@ -19185,6 +18936,8 @@ snapshots: transitivePeerDependencies: - supports-color + remove-accents@0.5.0: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -19200,10 +18953,10 @@ snapshots: reselect@5.3.0: {} - resend@6.28.0(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)): + resend@6.31.0(@react-email/render@2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)): dependencies: - postal-mime: 2.7.5 - standardwebhooks: 1.0.0 + postal-mime: 2.7.6 + standardwebhooks: 1.1.1 optionalDependencies: '@react-email/render': 2.1.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -19226,56 +18979,57 @@ snapshots: reusify@1.1.0: {} - rolldown@1.2.8: + rolldown@1.2.12: dependencies: - '@oxc-project/types': 0.149.0 + '@oxc-project/types': 0.152.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.8 - '@rolldown/binding-android-arm64': 1.2.8 - '@rolldown/binding-darwin-arm64': 1.2.8 - '@rolldown/binding-darwin-x64': 1.2.8 - '@rolldown/binding-freebsd-x64': 1.2.8 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.8 - '@rolldown/binding-linux-arm64-gnu': 1.2.8 - '@rolldown/binding-linux-arm64-musl': 1.2.8 - '@rolldown/binding-linux-ppc64-gnu': 1.2.8 - '@rolldown/binding-linux-s390x-gnu': 1.2.8 - '@rolldown/binding-linux-x64-gnu': 1.2.8 - '@rolldown/binding-linux-x64-musl': 1.2.8 - '@rolldown/binding-openharmony-arm64': 1.2.8 - '@rolldown/binding-win32-arm64-msvc': 1.2.8 - '@rolldown/binding-win32-x64-msvc': 1.2.8 - - rollup@4.62.2: + '@rolldown/binding-android-arm-eabi': 1.2.12 + '@rolldown/binding-android-arm64': 1.2.12 + '@rolldown/binding-darwin-arm64': 1.2.12 + '@rolldown/binding-darwin-x64': 1.2.12 + '@rolldown/binding-freebsd-x64': 1.2.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.12 + '@rolldown/binding-linux-arm64-gnu': 1.2.12 + '@rolldown/binding-linux-arm64-musl': 1.2.12 + '@rolldown/binding-linux-ppc64-gnu': 1.2.12 + '@rolldown/binding-linux-s390x-gnu': 1.2.12 + '@rolldown/binding-linux-x64-gnu': 1.2.12 + '@rolldown/binding-linux-x64-musl': 1.2.12 + '@rolldown/binding-openharmony-arm64': 1.2.12 + '@rolldown/binding-win32-arm64-msvc': 1.2.12 + '@rolldown/binding-win32-x64-msvc': 1.2.12 + + rollup@4.63.5: dependencies: '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.62.2 - '@rollup/rollup-android-arm64': 4.62.2 - '@rollup/rollup-darwin-arm64': 4.62.2 - '@rollup/rollup-darwin-x64': 4.62.2 - '@rollup/rollup-freebsd-arm64': 4.62.2 - '@rollup/rollup-freebsd-x64': 4.62.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 - '@rollup/rollup-linux-arm-musleabihf': 4.62.2 - '@rollup/rollup-linux-arm64-gnu': 4.62.2 - '@rollup/rollup-linux-arm64-musl': 4.62.2 - '@rollup/rollup-linux-loong64-gnu': 4.62.2 - '@rollup/rollup-linux-loong64-musl': 4.62.2 - '@rollup/rollup-linux-ppc64-gnu': 4.62.2 - '@rollup/rollup-linux-ppc64-musl': 4.62.2 - '@rollup/rollup-linux-riscv64-gnu': 4.62.2 - '@rollup/rollup-linux-riscv64-musl': 4.62.2 - '@rollup/rollup-linux-s390x-gnu': 4.62.2 - '@rollup/rollup-linux-x64-gnu': 4.62.2 - '@rollup/rollup-linux-x64-musl': 4.62.2 - '@rollup/rollup-openbsd-x64': 4.62.2 - '@rollup/rollup-openharmony-arm64': 4.62.2 - '@rollup/rollup-win32-arm64-msvc': 4.62.2 - '@rollup/rollup-win32-ia32-msvc': 4.62.2 - '@rollup/rollup-win32-x64-gnu': 4.62.2 - '@rollup/rollup-win32-x64-msvc': 4.62.2 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.5 + '@rollup/rollup-android-arm64': 4.63.5 + '@rollup/rollup-darwin-arm64': 4.63.5 + '@rollup/rollup-darwin-x64': 4.63.5 + '@rollup/rollup-freebsd-arm64': 4.63.5 + '@rollup/rollup-freebsd-x64': 4.63.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.5 + '@rollup/rollup-linux-arm-musleabihf': 4.63.5 + '@rollup/rollup-linux-arm64-gnu': 4.63.5 + '@rollup/rollup-linux-arm64-musl': 4.63.5 + '@rollup/rollup-linux-loong64-gnu': 4.63.5 + '@rollup/rollup-linux-loong64-musl': 4.63.5 + '@rollup/rollup-linux-ppc64-gnu': 4.63.5 + '@rollup/rollup-linux-ppc64-musl': 4.63.5 + '@rollup/rollup-linux-riscv64-gnu': 4.63.5 + '@rollup/rollup-linux-riscv64-musl': 4.63.5 + '@rollup/rollup-linux-s390x-gnu': 4.63.5 + '@rollup/rollup-linux-x64-gnu': 4.63.5 + '@rollup/rollup-linux-x64-musl': 4.63.5 + '@rollup/rollup-openbsd-x64': 4.63.5 + '@rollup/rollup-openharmony-arm64': 4.63.5 + '@rollup/rollup-win32-arm64-msvc': 4.63.5 + '@rollup/rollup-win32-ia32-msvc': 4.63.5 + '@rollup/rollup-win32-x64-gnu': 4.63.5 + '@rollup/rollup-win32-x64-msvc': 4.63.5 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -19381,13 +19135,13 @@ snapshots: dependencies: seroval: 1.5.6 - seroval-plugins@1.6.7(seroval@1.6.7): + seroval-plugins@1.6.8(seroval@1.6.8): dependencies: - seroval: 1.6.7 + seroval: 1.6.8 seroval@1.5.6: {} - seroval@1.6.7: {} + seroval@1.6.8: {} serve-static@2.2.1: dependencies: @@ -19426,12 +19180,12 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.8 - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@dotenvx/dotenvx': 1.75.1 - '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.31.0(zod@3.25.76) '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.28.9 + browserslist: 4.29.3 cn: 0.2.6 commander: 14.0.3 cosmiconfig: 9.0.2(typescript@6.0.3) @@ -19440,10 +19194,10 @@ snapshots: diff: 8.0.4 execa: 9.6.1 fast-glob: 3.3.3 - fs-extra: 11.4.0 + fs-extra: 11.4.1 fuzzysort: 3.1.0 kleur: 4.1.5 - open: 11.0.3 + open: 11.0.4 ora: 8.2.0 postcss: 8.5.28 postcss-selector-parser: 7.1.6 @@ -19453,7 +19207,7 @@ snapshots: stringify-object: 5.0.0 ts-morph: 26.0.0 tsconfig-paths: 4.2.0 - undici: 7.29.1 + undici: 7.30.0 validate-npm-package-name: 7.0.2 zod: 3.25.76 zod-to-json-schema: 3.25.2(zod@3.25.76) @@ -19463,38 +19217,38 @@ snapshots: - supports-color - typescript - sharp@0.35.4(@types/node@26.5.1): + sharp@0.35.5(@types/node@26.6.3): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.4 - '@img/sharp-darwin-x64': 0.35.4 - '@img/sharp-freebsd-wasm32': 0.35.4 - '@img/sharp-libvips-darwin-arm64': 1.3.3 - '@img/sharp-libvips-darwin-x64': 1.3.3 - '@img/sharp-libvips-linux-arm': 1.3.3 - '@img/sharp-libvips-linux-arm64': 1.3.3 - '@img/sharp-libvips-linux-ppc64': 1.3.3 - '@img/sharp-libvips-linux-riscv64': 1.3.3 - '@img/sharp-libvips-linux-s390x': 1.3.3 - '@img/sharp-libvips-linux-x64': 1.3.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 - '@img/sharp-linux-arm': 0.35.4 - '@img/sharp-linux-arm64': 0.35.4 - '@img/sharp-linux-ppc64': 0.35.4 - '@img/sharp-linux-riscv64': 0.35.4 - '@img/sharp-linux-s390x': 0.35.4 - '@img/sharp-linux-x64': 0.35.4 - '@img/sharp-linuxmusl-arm64': 0.35.4 - '@img/sharp-linuxmusl-x64': 0.35.4 - '@img/sharp-webcontainers-wasm32': 0.35.4 - '@img/sharp-win32-arm64': 0.35.4 - '@img/sharp-win32-ia32': 0.35.4 - '@img/sharp-win32-x64': 0.35.4 - '@types/node': 26.5.1 + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 26.6.3 shebang-command@2.0.0: dependencies: @@ -19502,7 +19256,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.10.0: {} + shell-quote@1.11.0: {} shiki@4.4.3: dependencies: @@ -19543,8 +19297,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -19575,13 +19327,12 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.8.3: + socket.io@4.8.4: dependencies: accepts: 1.3.8 - base64id: 2.0.0 cors: 2.8.6 debug: 4.4.3 - engine.io: 6.6.10 + engine.io: 6.6.11 socket.io-adapter: 2.5.8 socket.io-parser: 4.2.7 transitivePeerDependencies: @@ -19591,7 +19342,7 @@ snapshots: socks@2.8.10: dependencies: - ip-address: 10.7.0 + ip-address: 10.7.2 smart-buffer: 4.2.0 solid-js@1.9.15: @@ -19600,6 +19351,22 @@ snapshots: seroval: 1.5.6 seroval-plugins: 1.5.6(seroval@1.5.6) + solid-presence@0.2.0(solid-js@1.9.15): + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.15) + solid-js: 1.9.15 + + solid-prevent-scroll@0.1.11(solid-js@1.9.15): + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.15) + solid-js: 1.9.15 + + solid-transition-group@0.2.3(solid-js@1.9.15): + dependencies: + '@solid-primitives/refs': 1.1.4(solid-js@1.9.15) + '@solid-primitives/transition-group': 1.1.2(solid-js@1.9.15) + solid-js: 1.9.15 + sonner@2.0.8(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: react: 19.3.0 @@ -19615,7 +19382,7 @@ snapshots: dependencies: is-plain-obj: 1.1.0 - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map@0.6.1: {} @@ -19625,20 +19392,18 @@ snapshots: srvx@0.11.22: {} - srvx@1.0.4: {} + srvx@1.0.5: {} stable-hash-x@0.2.0: {} - stackback@0.0.2: {} - - standardwebhooks@1.0.0: + standardwebhooks@1.1.1: dependencies: '@stablelib/base64': 1.0.1 fast-sha256: 1.3.0 statuses@2.0.2: {} - std-env@4.2.0: {} + std-env@4.3.0: {} stdin-discarder@0.2.2: {} @@ -19649,7 +19414,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamx@2.28.0: + streamx@2.28.1: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -19669,12 +19434,12 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string-width@8.2.2: + string-width@8.3.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 string.prototype.includes@2.0.1: @@ -19724,7 +19489,7 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.3.0 + ansi-regex: 6.4.0 strip-bom@3.0.0: {} @@ -19780,7 +19545,9 @@ snapshots: make-asynchronous: 1.1.0 time-span: 5.1.0 - symbol-tree@3.2.4: {} + superjson@2.2.6: + dependencies: + copy-anything: 4.1.5 synckit@0.11.13: dependencies: @@ -19788,11 +19555,11 @@ snapshots: system-architecture@1.0.0: {} - systeminformation@5.33.10: {} + systeminformation@5.33.15: {} tagged-tag@1.0.0: {} - tailwind-merge@3.6.0: {} + tailwind-merge@3.7.0: {} tailwindcss@4.3.3: {} @@ -19800,16 +19567,16 @@ snapshots: tar-stream@3.1.7: dependencies: - b4a: 1.8.1 + b4a: 1.9.0 fast-fifo: 1.3.2 - streamx: 2.28.0 + streamx: 2.28.1 transitivePeerDependencies: - bare-abort-controller - react-native-b4a text-decoder@1.2.7: dependencies: - b4a: 1.8.1 + b4a: 1.9.0 transitivePeerDependencies: - react-native-b4a @@ -19829,12 +19596,10 @@ snapshots: tiny-invariant@1.3.3: {} - tinybench@6.1.4: {} + tinybench@6.2.0: {} tinyexec@0.3.2: {} - tinyexec@1.3.0: {} - tinyexec@1.3.1: {} tinyglobby@0.2.17: @@ -19842,13 +19607,13 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinyrainbow@3.1.1: {} + tinyrainbow@3.2.0: {} - tldts-core@7.4.12: {} + tldts-core@7.4.16: {} - tldts@7.4.12: + tldts@7.4.16: dependencies: - tldts-core: 7.4.12 + tldts-core: 7.4.16 to-regex-range@5.0.1: dependencies: @@ -19864,7 +19629,7 @@ snapshots: tough-cookie@6.0.2: dependencies: - tldts: 7.4.12 + tldts: 7.4.16 tr46@6.0.0: dependencies: @@ -19894,7 +19659,7 @@ snapshots: ts-pattern@5.9.0: {} - tsc-alias@1.9.5: + tsc-alias@1.9.7: dependencies: chokidar: 3.6.0 commander: 9.5.0 @@ -19914,7 +19679,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@swc/core@1.16.2(@swc/helpers@0.5.23))(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(typescript@6.0.3)(yaml@2.9.1): + tsup@8.5.1(@swc/core@1.16.13(@swc/helpers@0.5.23))(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -19925,16 +19690,16 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(yaml@2.9.1) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1) resolve-from: 5.0.0 - rollup: 4.62.2 + rollup: 4.63.5 source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.16.2(@swc/helpers@0.5.23) + '@swc/core': 1.16.13(@swc/helpers@0.5.23) postcss: 8.5.28 typescript: 6.0.3 transitivePeerDependencies: @@ -19943,7 +19708,7 @@ snapshots: - tsx - yaml - tsx@4.23.13: + tsx@4.23.15: dependencies: esbuild: 0.28.2 optionalDependencies: @@ -19953,14 +19718,14 @@ snapshots: dependencies: tslib: 1.14.1 - turbo@2.10.12: + turbo@2.11.5: optionalDependencies: - '@turbo/darwin-64': 2.10.12 - '@turbo/darwin-arm64': 2.10.12 - '@turbo/linux-64': 2.10.12 - '@turbo/linux-arm64': 2.10.12 - '@turbo/windows-64': 2.10.12 - '@turbo/windows-arm64': 2.10.12 + '@turbo/darwin-64': 2.11.5 + '@turbo/darwin-arm64': 2.11.5 + '@turbo/linux-64': 2.11.5 + '@turbo/linux-arm64': 2.11.5 + '@turbo/windows-64': 2.11.5 + '@turbo/windows-arm64': 2.11.5 tw-animate-css@1.4.0: {} @@ -19970,7 +19735,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.9.0: + type-fest@5.10.0: dependencies: tagged-tag: 1.0.0 @@ -19994,13 +19759,12 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.4: + typed-array-byte-offset@1.0.5: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 - has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 @@ -20013,24 +19777,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - typescript-eslint@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.70.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -20041,7 +19794,7 @@ snapshots: ufo@1.6.4: {} - uint8array-extras@1.5.0: {} + uint8array-extras@1.6.0: {} unbox-primitive@1.1.0: dependencies: @@ -20060,9 +19813,9 @@ snapshots: undici-types@8.9.0: {} - undici@7.29.1: {} + undici@7.30.0: {} - undici@8.10.2: {} + undici@8.11.2: {} unenv@2.0.0-rc.24: dependencies: @@ -20120,27 +19873,27 @@ snapshots: unpipe@1.0.0: {} - unplugin@3.3.0(esbuild@0.27.7)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + unplugin@3.4.0(esbuild@0.27.7)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 optionalDependencies: esbuild: 0.27.7 - rolldown: 1.2.8 - rollup: 4.62.2 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + rolldown: 1.2.12 + rollup: 4.63.5 + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.8)(rollup@4.62.2)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + unplugin@3.4.0(esbuild@0.28.2)(rolldown@1.2.12)(rollup@4.63.5)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 optionalDependencies: esbuild: 0.28.2 - rolldown: 1.2.8 - rollup: 4.62.2 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + rolldown: 1.2.12 + rollup: 4.63.5 + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) unrs-resolver@1.12.2: dependencies: @@ -20171,9 +19924,9 @@ snapshots: unstorage@2.0.0-alpha.10: {} - update-browserslist-db@1.3.3(browserslist@4.28.9): + update-browserslist-db@1.3.3(browserslist@4.29.3): dependencies: - browserslist: 4.28.9 + browserslist: 4.29.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -20192,13 +19945,15 @@ snapshots: dependencies: react: 19.3.0 - use-intl@4.14.4(react@19.3.0): + use-intl@4.14.8(@types/react@19.3.0)(react@19.3.0): dependencies: '@formatjs/fast-memoize': 3.1.7 '@schummar/icu-type-parser': 1.21.5 - icu-minify: 4.14.4 - intl-messageformat: 11.2.14 + icu-minify: 4.14.8 + intl-messageformat: 11.2.15 react: 19.3.0 + optionalDependencies: + '@types/react': 19.3.0 use-sidecar@1.1.3(@types/react@19.3.0)(react@19.3.0): dependencies: @@ -20222,7 +19977,7 @@ snapshots: vaul@1.1.2(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0): dependencies: - '@radix-ui/react-dialog': 1.1.20(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: @@ -20261,96 +20016,96 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1): + vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.28 - rolldown: 1.2.8 + rolldown: 1.2.12 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 esbuild: 0.27.7 fsevents: 2.3.3 jiti: 2.7.0 - tsx: 4.23.13 + tsx: 4.23.15 yaml: 2.9.1 - vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1): + vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.28 - rolldown: 1.2.8 + rolldown: 1.2.12 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.5.1 + '@types/node': 26.6.3 esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 - tsx: 4.23.13 + tsx: 4.23.15 yaml: 2.9.1 - vitefu@1.1.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + vitefu@1.1.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - vitefu@1.1.3(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + vitefu@1.1.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): optionalDependencies: - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + vitest@5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.0(vite@8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@vitest/mocker': 5.0.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 1.3.1 + magic-string: 1.4.2 obug: 2.2.1 picomatch: 4.0.7 - std-env: 4.2.0 - tinybench: 6.1.4 - tinyexec: 1.3.0 + std-env: 4.3.0 + tinybench: 6.2.0 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) - why-is-node-running: 2.3.0 + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + why-is-node-running: 3.2.1 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 26.5.1 - '@vitest/coverage-v8': 5.0.0(vitest@5.0.0) - jsdom: 30.0.1 + '@types/node': 26.6.3 + '@vitest/coverage-v8': 5.0.3(vitest@5.0.3) + jsdom: 30.1.1 transitivePeerDependencies: - msw - vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.5.1)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)): + vitest@5.0.3(@opentelemetry/api@1.9.1)(@types/node@26.6.3)(@vitest/coverage-v8@5.0.3)(jsdom@30.1.1)(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.0(vite@8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1)) + '@vitest/mocker': 5.0.3(vite@8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 1.3.1 + magic-string: 1.4.2 obug: 2.2.1 picomatch: 4.0.7 - std-env: 4.2.0 - tinybench: 6.1.4 - tinyexec: 1.3.0 + std-env: 4.3.0 + tinybench: 6.2.0 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.0(@types/node@26.5.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.1) - why-is-node-running: 2.3.0 + vite: 8.3.1(@types/node@26.6.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + why-is-node-running: 3.2.1 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 26.5.1 - '@vitest/coverage-v8': 5.0.0(vitest@5.0.0) - jsdom: 30.0.1 + '@types/node': 26.6.3 + '@vitest/coverage-v8': 5.0.3(vitest@5.0.3) + jsdom: 30.1.1 transitivePeerDependencies: - msw - vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0)): + vue-eslint-parser@10.4.1(eslint@10.11.0(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 10.10.0(jiti@2.7.0) + eslint: 10.11.0(jiti@2.7.0) eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 espree: 11.2.0 @@ -20361,7 +20116,7 @@ snapshots: w3c-keyname@2.2.8: {} - w3c-xmlserializer@5.0.0: + w3c-xmlserializer@6.0.0: dependencies: xml-name-validator: 5.0.0 @@ -20377,15 +20132,15 @@ snapshots: whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.16.0 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: - '@noble/hashes' - whatwg-url@17.1.1: + whatwg-url@17.1.2: dependencies: - '@exodus/bytes': 1.15.1 + '@exodus/bytes': 1.16.0 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -20415,7 +20170,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.22 + which-typed-array: 1.1.24 which-collection@1.0.2: dependencies: @@ -20424,7 +20179,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.22: + which-typed-array@1.1.24: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -20442,10 +20197,7 @@ snapshots: dependencies: isexe: 3.1.5 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + why-is-node-running@3.2.1: {} word-wrap@1.2.5: {} @@ -20459,10 +20211,12 @@ snapshots: ws@8.21.3: {} - wsl-utils@1.0.0: + ws@8.22.0: {} + + wsl-utils@1.0.1: dependencies: is-wsl: 3.1.1 - powershell-utils: 0.1.0 + powershell-utils: 0.2.1 xml-name-validator@5.0.0: {} @@ -20477,15 +20231,13 @@ snapshots: y-protocols@1.0.7(yjs@13.6.32): dependencies: - lib0: 0.2.117 + lib0: 0.2.119 yjs: 13.6.32 y18n@5.0.8: {} yallist@3.1.1: {} - yaml@2.9.0: {} - yaml@2.9.1: {} yargs-parser@21.1.1: {} @@ -20506,7 +20258,7 @@ snapshots: yjs@13.6.32: dependencies: - lib0: 0.2.117 + lib0: 0.2.119 yocto-queue@0.1.0: {} @@ -20518,40 +20270,40 @@ snapshots: yoga-layout@3.2.1: {} - yuku-analyzer@0.9.3: + yuku-analyzer@0.10.2: dependencies: - '@yuku-toolchain/types': 0.9.3 - yuku-ast: 0.9.3 + '@yuku-toolchain/types': 0.10.2 + yuku-ast: 0.10.2 optionalDependencies: - '@yuku-analyzer/binding-android-arm64': 0.9.3 - '@yuku-analyzer/binding-darwin-arm64': 0.9.3 - '@yuku-analyzer/binding-darwin-x64': 0.9.3 - '@yuku-analyzer/binding-freebsd-x64': 0.9.3 - '@yuku-analyzer/binding-linux-arm-gnu': 0.9.3 - '@yuku-analyzer/binding-linux-arm-musl': 0.9.3 - '@yuku-analyzer/binding-linux-arm64-gnu': 0.9.3 - '@yuku-analyzer/binding-linux-arm64-musl': 0.9.3 - '@yuku-analyzer/binding-linux-x64-gnu': 0.9.3 - '@yuku-analyzer/binding-linux-x64-musl': 0.9.3 - '@yuku-analyzer/binding-win32-arm64': 0.9.3 - '@yuku-analyzer/binding-win32-x64': 0.9.3 + '@yuku-analyzer/binding-android-arm64': 0.10.2 + '@yuku-analyzer/binding-darwin-arm64': 0.10.2 + '@yuku-analyzer/binding-darwin-x64': 0.10.2 + '@yuku-analyzer/binding-freebsd-x64': 0.10.2 + '@yuku-analyzer/binding-linux-arm-gnu': 0.10.2 + '@yuku-analyzer/binding-linux-arm-musl': 0.10.2 + '@yuku-analyzer/binding-linux-arm64-gnu': 0.10.2 + '@yuku-analyzer/binding-linux-arm64-musl': 0.10.2 + '@yuku-analyzer/binding-linux-x64-gnu': 0.10.2 + '@yuku-analyzer/binding-linux-x64-musl': 0.10.2 + '@yuku-analyzer/binding-win32-arm64': 0.10.2 + '@yuku-analyzer/binding-win32-x64': 0.10.2 - yuku-ast@0.9.3: + yuku-ast@0.10.2: dependencies: - '@yuku-toolchain/types': 0.9.3 + '@yuku-toolchain/types': 0.10.2 - zbsearch@4.0.0: {} + zbsearch@4.0.1: {} zod-to-json-schema@3.25.2(zod@3.25.76): dependencies: zod: 3.25.76 - zod-validation-error@4.0.2(zod@4.6.2): + zod-validation-error@4.0.2(zod@4.6.5): dependencies: - zod: 4.6.2 + zod: 4.6.5 zod@3.25.76: {} - zod@4.6.2: {} + zod@4.6.5: {} zwitch@2.0.4: {}