diff --git a/.cspell/tech-terms.txt b/.cspell/tech-terms.txt index 8b1653f6f8..2b0f5bbd92 100644 --- a/.cspell/tech-terms.txt +++ b/.cspell/tech-terms.txt @@ -39,4 +39,6 @@ gitea MMDD ABCDEFGHJKLMNPQRSTUVWXYZ23456789 setex -kxeyPrefix \ No newline at end of file +kxeyPrefix +dyld +nsis diff --git a/.cspell/third-party.txt b/.cspell/third-party.txt index 7b0973f5ac..617634cd74 100644 --- a/.cspell/third-party.txt +++ b/.cspell/third-party.txt @@ -36,3 +36,5 @@ nuxtzzle Deel WorkOS authjs +vite +electronjs diff --git a/biome.json b/biome.json index 015f02171a..020c18cd64 100644 --- a/biome.json +++ b/biome.json @@ -132,6 +132,7 @@ "!**/dist", "!**/coverage", "!**/build", + "!**/demo/electron/out", "!**/.next", "!**/.svelte-kit", "!**/.contentlayer", diff --git a/demo/electron/.gitignore b/demo/electron/.gitignore new file mode 100644 index 0000000000..75ef73cdb5 --- /dev/null +++ b/demo/electron/.gitignore @@ -0,0 +1,6 @@ +node_modules +dist +out +.DS_Store +.eslintcache +*.log* diff --git a/demo/electron/.npmrc b/demo/electron/.npmrc new file mode 100644 index 0000000000..2ced95274c --- /dev/null +++ b/demo/electron/.npmrc @@ -0,0 +1,3 @@ +electron_mirror=https://npmmirror.com/mirrors/electron/ +electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/ +shamefully-hoist=true diff --git a/demo/electron/README.md b/demo/electron/README.md new file mode 100644 index 0000000000..eee088b8ec --- /dev/null +++ b/demo/electron/README.md @@ -0,0 +1,19 @@ +# Better Auth Electron Example + +This is an example of how to use Better Auth with Electron. + +## Prerequirements + +Make sure you've set-up the [Better Auth Demo App](../nextjs/README.md). + +## How to run + +1. Clone the repo and open it in your code editor +2. Run the following commands + + ```bash + pnpm install + pnpm dev + ``` + +Checkout the [electron guide](https://www.better-auth.com/docs/integrations/electron) to learn more. diff --git a/demo/electron/build/entitlements.mac.plist b/demo/electron/build/entitlements.mac.plist new file mode 100644 index 0000000000..38c887b211 --- /dev/null +++ b/demo/electron/build/entitlements.mac.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + + diff --git a/demo/electron/build/icon.icns b/demo/electron/build/icon.icns new file mode 100644 index 0000000000..c4bf4a397c Binary files /dev/null and b/demo/electron/build/icon.icns differ diff --git a/demo/electron/build/icon.ico b/demo/electron/build/icon.ico new file mode 100644 index 0000000000..f7ffefc813 Binary files /dev/null and b/demo/electron/build/icon.ico differ diff --git a/demo/electron/build/icon.png b/demo/electron/build/icon.png new file mode 100644 index 0000000000..eefc8c85fe Binary files /dev/null and b/demo/electron/build/icon.png differ diff --git a/demo/electron/electron-builder.yml b/demo/electron/electron-builder.yml new file mode 100644 index 0000000000..6812874578 --- /dev/null +++ b/demo/electron/electron-builder.yml @@ -0,0 +1,44 @@ +appId: com.electron.app +productName: electron +directories: + buildResources: build +files: + - "!**/.vscode/*" + - "!src/*" + - "!electron.vite.config.{js,ts,mjs,cjs}" + - "!{.eslintcache,eslint.config.mjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}" + - "!{.env,.env.*,.npmrc,pnpm-lock.yaml}" + - "!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}" +asarUnpack: + - resources/** +win: + executableName: electron +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always + installerIcon: build/icon.ico + installerHeaderIcon: build/icon.ico +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +electronDownload: + mirror: https://npmmirror.com/mirrors/electron/ diff --git a/demo/electron/electron.vite.config.ts b/demo/electron/electron.vite.config.ts new file mode 100644 index 0000000000..26d71ddc79 --- /dev/null +++ b/demo/electron/electron.vite.config.ts @@ -0,0 +1,17 @@ +import { resolve } from "node:path"; +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "electron-vite"; + +export default defineConfig({ + main: {}, + preload: {}, + renderer: { + resolve: { + alias: { + "@renderer": resolve("src/renderer/src"), + }, + }, + plugins: [tailwindcss(), react()], + }, +}); diff --git a/demo/electron/package.json b/demo/electron/package.json new file mode 100644 index 0000000000..c46946e34d --- /dev/null +++ b/demo/electron/package.json @@ -0,0 +1,50 @@ +{ + "name": "@better-auth/electron-demo", + "productName": "Better Auth + Electron", + "private": true, + "version": "1.0.0", + "description": "An Electron application with React and TypeScript", + "main": "./out/main/index.js", + "scripts": { + "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false", + "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false", + "typecheck": "npm run typecheck:node && npm run typecheck:web", + "start": "electron-vite preview", + "dev": "electron-vite dev", + "build": "npm run typecheck && electron-vite build", + "postinstall": "electron-builder install-app-deps", + "build:unpack": "npm run build && electron-builder --dir", + "build:win": "npm run build && electron-builder --win", + "build:mac": "electron-vite build && electron-builder --mac", + "build:linux": "electron-vite build && electron-builder --linux" + }, + "dependencies": { + "@better-auth/electron": "workspace:*", + "@electron-toolkit/utils": "^4.0.0", + "@radix-ui/react-avatar": "^1.1.11", + "@radix-ui/react-slot": "^1.2.3", + "better-auth": "workspace:*", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "conf": "^15.0.2", + "electron-store": "^11.0.2", + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "catalog:tailwind" + }, + "devDependencies": { + "@electron-toolkit/tsconfig": "^2.0.0", + "@tailwindcss/vite": "catalog:tailwind", + "@types/node": "^22.19.1", + "@types/react": "catalog:react19", + "@types/react-dom": "catalog:react19", + "@vitejs/plugin-react": "^5.1.1", + "electron": "^39.2.6", + "electron-builder": "^26.0.12", + "electron-vite": "^5.0.0", + "react": "catalog:react19", + "react-dom": "catalog:react19", + "tailwindcss": "catalog:tailwind", + "typescript": "catalog:", + "vite": "^7.2.6" + } +} diff --git a/demo/electron/resources/icon.png b/demo/electron/resources/icon.png new file mode 100644 index 0000000000..eefc8c85fe Binary files /dev/null and b/demo/electron/resources/icon.png differ diff --git a/demo/electron/src/lib/auth-client.ts b/demo/electron/src/lib/auth-client.ts new file mode 100644 index 0000000000..95bcbb4340 --- /dev/null +++ b/demo/electron/src/lib/auth-client.ts @@ -0,0 +1,16 @@ +import { electronClient } from "@better-auth/electron/client"; +import { storage } from "@better-auth/electron/storage"; +import { createAuthClient } from "better-auth/client"; + +export const authClient = createAuthClient({ + baseURL: "http://localhost:3000/api/auth", + plugins: [ + electronClient({ + protocol: { + scheme: "com.better-auth.demo", + }, + signInURL: "http://localhost:3000/sign-in", + storage: storage(), + }), + ], +}); diff --git a/demo/electron/src/main/index.ts b/demo/electron/src/main/index.ts new file mode 100644 index 0000000000..acf285cd95 --- /dev/null +++ b/demo/electron/src/main/index.ts @@ -0,0 +1,68 @@ +import { join } from "node:path"; +import { electronApp, optimizer } from "@electron-toolkit/utils"; +import { app, BrowserWindow, shell } from "electron"; +import icon from "../../resources/icon.png?asset"; +import { authClient } from "../lib/auth-client"; + +function createWindow(): void { + // Create the browser window. + const mainWindow = new BrowserWindow({ + width: 900, + height: 670, + show: false, + autoHideMenuBar: true, + title: "Better Auth + Electron", + icon, + webPreferences: { + preload: join(__dirname, "../preload/index.js"), + sandbox: false, + contextIsolation: true, + nodeIntegration: false, + }, + }); + + mainWindow.on("ready-to-show", () => { + mainWindow.show(); + }); + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url); + return { action: "deny" }; + }); + + mainWindow.loadFile(join(__dirname, "../renderer/index.html")); +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.whenReady().then(() => { + // Set app user model id for windows + electronApp.setAppUserModelId("com.better-auth.demo"); + + // Default open or close DevTools by F12 in development + // and ignore CommandOrControl + R in production. + // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + app.on("browser-window-created", (_, window) => { + optimizer.watchWindowShortcuts(window); + }); + + createWindow(); + + app.on("activate", function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); + } +}); + +authClient.setupMain(); diff --git a/demo/electron/src/preload/index.d.ts b/demo/electron/src/preload/index.d.ts new file mode 100644 index 0000000000..a471678d4f --- /dev/null +++ b/demo/electron/src/preload/index.d.ts @@ -0,0 +1,6 @@ +import type { authClient } from "../lib/auth-client"; + +declare global { + type Bridges = typeof authClient.$Infer.Bridges; + interface Window extends Bridges {} +} diff --git a/demo/electron/src/preload/index.ts b/demo/electron/src/preload/index.ts new file mode 100644 index 0000000000..db3c070b7c --- /dev/null +++ b/demo/electron/src/preload/index.ts @@ -0,0 +1,3 @@ +import { authClient } from "../lib/auth-client"; + +authClient.setupRenderer(); diff --git a/demo/electron/src/renderer/index.html b/demo/electron/src/renderer/index.html new file mode 100644 index 0000000000..c2c8eb14ae --- /dev/null +++ b/demo/electron/src/renderer/index.html @@ -0,0 +1,16 @@ + + + + + + + + + +
+ + + diff --git a/demo/electron/src/renderer/src/App.tsx b/demo/electron/src/renderer/src/App.tsx new file mode 100644 index 0000000000..e1c2220b5b --- /dev/null +++ b/demo/electron/src/renderer/src/App.tsx @@ -0,0 +1,56 @@ +import { BackgroundRippleEffect } from "./components/background-ripple-effect"; +import { Profile } from "./components/profile"; +import { RequestAuth } from "./components/request-auth"; +import { useUser } from "./components/user-provider"; + +function App(): React.JSX.Element { + const { user, loading } = useUser(); + + return ( +
+ {/* Background Ripple Effect */} +
+ +
+ +
+

+ BETTER-AUTH. +

+ +

+ Official demo to showcase{" "} + + better-auth. + {" "} + with Electron. +

+ + {loading && ( +
+ + + + Loading... +
+ )} + {!loading && !user ? : } +
+
+ ); +} + +export default App; diff --git a/demo/electron/src/renderer/src/components/background-ripple-effect.tsx b/demo/electron/src/renderer/src/components/background-ripple-effect.tsx new file mode 100644 index 0000000000..ae42da1231 --- /dev/null +++ b/demo/electron/src/renderer/src/components/background-ripple-effect.tsx @@ -0,0 +1,134 @@ +"use client"; +import type React from "react"; +import { useMemo, useRef, useState } from "react"; +import { cn } from "../lib/utils"; + +export const BackgroundRippleEffect = ({ + rows = 8, + cols = 27, + cellSize = 56, +}: { + rows?: number; + cols?: number; + cellSize?: number; +}) => { + const [clickedCell, setClickedCell] = useState<{ + row: number; + col: number; + } | null>(null); + const [rippleKey, setRippleKey] = useState(0); + const ref = useRef(null); + + return ( +
+
+
+ { + setClickedCell({ row, col }); + setRippleKey((k) => k + 1); + }} + interactive + /> +
+
+ ); +}; + +type DivGridProps = { + className?: string; + rows: number; + cols: number; + cellSize: number; // in pixels + borderColor: string; + fillColor: string; + clickedCell: { row: number; col: number } | null; + onCellClick?: (row: number, col: number) => void; + interactive?: boolean; +}; + +type CellStyle = React.CSSProperties & { + ["--delay"]?: string; + ["--duration"]?: string; +}; + +const DivGrid = ({ + className, + rows = 7, + cols = 30, + cellSize = 56, + borderColor = "#3f3f46", + fillColor = "rgba(14,165,233,0.3)", + clickedCell = null, + onCellClick = () => {}, + interactive = true, +}: DivGridProps) => { + const cells = useMemo( + () => Array.from({ length: rows * cols }, (_, idx) => idx), + [rows, cols], + ); + + const gridStyle: React.CSSProperties = { + display: "grid", + gridTemplateColumns: `repeat(${cols}, ${cellSize}px)`, + gridTemplateRows: `repeat(${rows}, ${cellSize}px)`, + width: cols * cellSize, + height: rows * cellSize, + marginInline: "auto", + }; + + return ( +
+ {cells.map((idx) => { + const rowIdx = Math.floor(idx / cols); + const colIdx = idx % cols; + const distance = clickedCell + ? Math.hypot(clickedCell.row - rowIdx, clickedCell.col - colIdx) + : 0; + const delay = clickedCell ? Math.max(0, distance * 55) : 0; // ms + const duration = 200 + distance * 80; // ms + + const style: CellStyle = clickedCell + ? { + "--delay": `${delay}ms`, + "--duration": `${duration}ms`, + } + : {}; + + return ( +
onCellClick?.(rowIdx, colIdx) : undefined + } + /> + ); + })} +
+ ); +}; diff --git a/demo/electron/src/renderer/src/components/profile.tsx b/demo/electron/src/renderer/src/components/profile.tsx new file mode 100644 index 0000000000..7886914c8b --- /dev/null +++ b/demo/electron/src/renderer/src/components/profile.tsx @@ -0,0 +1,52 @@ +import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; +import { Button } from "./ui/button"; +import { useUser } from "./user-provider"; + +export function Profile() { + const { user } = useUser(); + + if (!user) { + return null; + } + + return ( +
+ + + + {(user.name || user.email)?.charAt(0).toUpperCase()} + + +

+ {user.name} + + {user.email} + +

+ +
+ ); +} diff --git a/demo/electron/src/renderer/src/components/request-auth.tsx b/demo/electron/src/renderer/src/components/request-auth.tsx new file mode 100644 index 0000000000..65f4a5ef3d --- /dev/null +++ b/demo/electron/src/renderer/src/components/request-auth.tsx @@ -0,0 +1,150 @@ +import type { ElectronRequestAuthOptions } from "@better-auth/electron/client"; +import { cn } from "@renderer/lib/utils"; +import { useState } from "react"; +import { Button } from "./ui/button"; + +export function RequestAuth() { + const [openedBrowser, setOpenedBrowser] = useState(false); + + const handleRequestAuth = + (opts?: ElectronRequestAuthOptions | undefined) => () => { + void window.requestAuth(opts); + setTimeout(() => { + setOpenedBrowser(true); + }, 500); + }; + + return ( + <> +
+ + + + + + +
+
+

+ A browser window has been opened for authentication. +
+ Please complete the process there. +

+
+ + ); +} diff --git a/demo/electron/src/renderer/src/components/theme-provider.tsx b/demo/electron/src/renderer/src/components/theme-provider.tsx new file mode 100644 index 0000000000..b321bb11b0 --- /dev/null +++ b/demo/electron/src/renderer/src/components/theme-provider.tsx @@ -0,0 +1,73 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +type Theme = "dark" | "light" | "system"; + +type ThemeProviderProps = { + children: React.ReactNode; + defaultTheme?: Theme; + storageKey?: string; +}; + +type ThemeProviderState = { + theme: Theme; + setTheme: (theme: Theme) => void; +}; + +const initialState: ThemeProviderState = { + theme: "system", + setTheme: () => null, +}; + +const ThemeProviderContext = createContext(initialState); + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "vite-ui-theme", + ...props +}: ThemeProviderProps) { + const [theme, setTheme] = useState( + () => (localStorage.getItem(storageKey) as Theme) || defaultTheme, + ); + + useEffect(() => { + const root = window.document.documentElement; + + root.classList.remove("light", "dark"); + + if (theme === "system") { + const systemTheme = window.matchMedia("(prefers-color-scheme: dark)") + .matches + ? "dark" + : "light"; + + root.classList.add(systemTheme); + return; + } + + root.classList.add(theme); + }, [theme]); + + const value = { + theme, + setTheme: (theme: Theme) => { + localStorage.setItem(storageKey, theme); + setTheme(theme); + }, + }; + + return ( + + {children} + + ); +} + +export const useTheme = () => { + const context = useContext(ThemeProviderContext); + + if (context === undefined) + throw new Error("useTheme must be used within "); + + return context; +}; diff --git a/demo/electron/src/renderer/src/components/ui/avatar.tsx b/demo/electron/src/renderer/src/components/ui/avatar.tsx new file mode 100644 index 0000000000..99b42bac93 --- /dev/null +++ b/demo/electron/src/renderer/src/components/ui/avatar.tsx @@ -0,0 +1,51 @@ +import * as AvatarPrimitive from "@radix-ui/react-avatar"; +import type * as React from "react"; + +import { cn } from "../../lib/utils"; + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/demo/electron/src/renderer/src/components/ui/button.tsx b/demo/electron/src/renderer/src/components/ui/button.tsx new file mode 100644 index 0000000000..ba79971dd9 --- /dev/null +++ b/demo/electron/src/renderer/src/components/ui/button.tsx @@ -0,0 +1,59 @@ +import { Slot } from "@radix-ui/react-slot"; +import type { VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; +import type * as React from "react"; + +import { cn } from "../../lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40", + outline: + "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean; + }) { + const Comp = asChild ? Slot : "button"; + + return ( + + ); +} + +export { Button, buttonVariants }; diff --git a/demo/electron/src/renderer/src/components/user-provider.tsx b/demo/electron/src/renderer/src/components/user-provider.tsx new file mode 100644 index 0000000000..33b3083c7f --- /dev/null +++ b/demo/electron/src/renderer/src/components/user-provider.tsx @@ -0,0 +1,62 @@ +import { + createContext, + useContext, + useEffect, + useState, + useTransition, +} from "react"; +import type { authClient } from "../../../lib/auth-client"; + +const UserContext = createContext<{ + loading: boolean; + user: (typeof authClient.$Infer.Session)["user"] | null; +} | null>(null); + +export function UserProvider({ + children, +}: { + children?: React.ReactNode | undefined; +}) { + const [loading, startTransition] = useTransition(); + const [user, setUser] = useState< + (typeof authClient.$Infer.Session)["user"] | null + >(null); + + useEffect(() => { + startTransition(async () => { + setUser(await window.getUser()); + }); + const unsubscribe = window.onAuthenticated((u) => { + setUser(u); + }); + const unsubscribeUserUpdated = window.onUserUpdated((u) => { + setUser(u); + }); + return () => { + unsubscribe(); + unsubscribeUserUpdated(); + setUser(null); + }; + }, []); + + return ( + + {children} + + ); +} + +export function useUser() { + const state = useContext(UserContext); + + if (state === null) { + throw new Error("useUser must be used within "); + } + + return state; +} diff --git a/demo/electron/src/renderer/src/env.d.ts b/demo/electron/src/renderer/src/env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/demo/electron/src/renderer/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/demo/electron/src/renderer/src/global.css b/demo/electron/src/renderer/src/global.css new file mode 100644 index 0000000000..bb5835f352 --- /dev/null +++ b/demo/electron/src/renderer/src/global.css @@ -0,0 +1,131 @@ +@import "tailwindcss"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.147 0.004 49.25); + --card: oklch(1 0 0); + --card-foreground: oklch(0.147 0.004 49.25); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.147 0.004 49.25); + --primary: oklch(0.216 0.006 56.043); + --primary-foreground: oklch(0.985 0.001 106.423); + --secondary: oklch(0.97 0.001 106.424); + --secondary-foreground: oklch(0.216 0.006 56.043); + --muted: oklch(0.97 0.001 106.424); + --muted-foreground: oklch(0.553 0.013 58.071); + --accent: oklch(0.97 0.001 106.424); + --accent-foreground: oklch(0.216 0.006 56.043); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.923 0.003 48.717); + --input: oklch(0.923 0.003 48.717); + --ring: oklch(0.709 0.01 56.259); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0.001 106.423); + --sidebar-foreground: oklch(0.147 0.004 49.25); + --sidebar-primary: oklch(0.216 0.006 56.043); + --sidebar-primary-foreground: oklch(0.985 0.001 106.423); + --sidebar-accent: oklch(0.97 0.001 106.424); + --sidebar-accent-foreground: oklch(0.216 0.006 56.043); + --sidebar-border: oklch(0.923 0.003 48.717); + --sidebar-ring: oklch(0.709 0.01 56.259); + --scrollbar-thumb: var(--border); + --scrollbar-thumb-hover: var(--ring); + --scrollbar-track: transparent; + --radius: 0.2rem; + --fd-nav-height: 56px; + --fd-banner-height: 0px; + --fd-tocnav-height: 0px; +} + +.dark { + --background: hsl(0 0% 0%); + --foreground: oklch(0.985 0.001 106.423); + --card: oklch(0.147 0.004 49.25); + --card-foreground: oklch(0.985 0.001 106.423); + --popover: oklch(0.147 0.004 49.25); + --popover-foreground: oklch(0.985 0.001 106.423); + --primary: oklch(0.985 0.001 106.423); + --primary-foreground: oklch(0.216 0.006 56.043); + --secondary: oklch(0.268 0.007 34.298); + --secondary-foreground: oklch(0.985 0.001 106.423); + --muted: oklch(0.268 0.007 34.298); + --muted-foreground: oklch(0.709 0.01 56.259); + --accent: oklch(0.268 0.007 34.298); + --accent-foreground: oklch(0.985 0.001 106.423); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.268 0.007 34.298); + --input: oklch(0.268 0.007 34.298); + --ring: oklch(0.553 0.013 58.071); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.216 0.006 56.043); + --sidebar-foreground: oklch(0.985 0.001 106.423); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0.001 106.423); + --sidebar-accent: oklch(0.268 0.007 34.298); + --sidebar-accent-foreground: oklch(0.985 0.001 106.423); + --sidebar-border: oklch(0.268 0.007 34.298); + --sidebar-ring: oklch(0.553 0.013 58.071); + --scrollbar-thumb: var(--border); + --scrollbar-thumb-hover: var(--ring); + --scrollbar-track: transparent; +} + +@theme inline { + --breakpoint-navbar: 64rem; + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +html { + @apply bg-background text-foreground; +} + +#root { + @apply min-h-dvh flex flex-col; +} diff --git a/demo/electron/src/renderer/src/lib/utils.ts b/demo/electron/src/renderer/src/lib/utils.ts new file mode 100644 index 0000000000..d39aff9e9a --- /dev/null +++ b/demo/electron/src/renderer/src/lib/utils.ts @@ -0,0 +1,7 @@ +import type { ClassValue } from "clsx"; +import { clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/demo/electron/src/renderer/src/main.tsx b/demo/electron/src/renderer/src/main.tsx new file mode 100644 index 0000000000..e3d29e2d0a --- /dev/null +++ b/demo/electron/src/renderer/src/main.tsx @@ -0,0 +1,19 @@ +import "./global.css"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; +import { ThemeProvider } from "./components/theme-provider"; +import { UserProvider } from "./components/user-provider"; + +createRoot(document.getElementById("root")!).render( + + + + + + + , +); diff --git a/demo/electron/tsconfig.json b/demo/electron/tsconfig.json new file mode 100644 index 0000000000..155ebaa675 --- /dev/null +++ b/demo/electron/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.web.json" } + ] +} diff --git a/demo/electron/tsconfig.node.json b/demo/electron/tsconfig.node.json new file mode 100644 index 0000000000..076386a2c1 --- /dev/null +++ b/demo/electron/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", + "include": [ + "electron.vite.config.*", + "src/main/**/*", + "src/preload/**/*", + "src/lib/auth-client.ts" + ], + "compilerOptions": { + "composite": true, + "types": ["electron-vite/node"] + } +} diff --git a/demo/electron/tsconfig.web.json b/demo/electron/tsconfig.web.json new file mode 100644 index 0000000000..4143a2fb8b --- /dev/null +++ b/demo/electron/tsconfig.web.json @@ -0,0 +1,18 @@ +{ + "extends": "@electron-toolkit/tsconfig/tsconfig.web.json", + "include": [ + "src/renderer/src/env.d.ts", + "src/renderer/src/**/*", + "src/renderer/src/**/*.tsx", + "src/preload/*.d.ts", + "src/lib/auth-client.ts" + ], + "compilerOptions": { + "composite": true, + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@renderer/*": ["src/renderer/src/*"] + } + } +} diff --git a/demo/nextjs/app/(auth)/sign-in/_components/sign-in.tsx b/demo/nextjs/app/(auth)/sign-in/_components/sign-in.tsx index bef427e3ca..c5074224f3 100644 --- a/demo/nextjs/app/(auth)/sign-in/_components/sign-in.tsx +++ b/demo/nextjs/app/(auth)/sign-in/_components/sign-in.tsx @@ -40,6 +40,7 @@ export default function SignIn() {
router.push(getCallbackURL(params))} callbackURL="/dashboard" /> @@ -53,6 +54,9 @@ export default function SignIn() { await authClient.signIn.social({ provider: "google", callbackURL: "/dashboard", + fetchOptions: { + query: params, + }, }); }} aria-label="Sign in with Google" @@ -92,6 +96,9 @@ export default function SignIn() { await authClient.signIn.social({ provider: "github", callbackURL: "/dashboard", + fetchOptions: { + query: params, + }, }); }} aria-label="Sign in with GitHub" @@ -119,6 +126,9 @@ export default function SignIn() { await authClient.signIn.social({ provider: "microsoft", callbackURL: "/dashboard", + fetchOptions: { + query: params, + }, }); }} aria-label="Sign in with Microsoft" @@ -146,6 +156,9 @@ export default function SignIn() { await authClient.signIn.social({ provider: "vercel", callbackURL: "/dashboard", + fetchOptions: { + query: params, + }, }); }} aria-label="Sign in with Vercel" @@ -185,6 +198,7 @@ export default function SignIn() { onClick={async () => { await authClient.signIn.passkey({ fetchOptions: { + query: params, onSuccess() { toast.success("Successfully signed in"); router.push(getCallbackURL(params)); diff --git a/demo/nextjs/app/(auth)/sign-in/_components/sign-up.tsx b/demo/nextjs/app/(auth)/sign-in/_components/sign-up.tsx index 4c5b59108c..d72d1ac677 100644 --- a/demo/nextjs/app/(auth)/sign-in/_components/sign-up.tsx +++ b/demo/nextjs/app/(auth)/sign-in/_components/sign-up.tsx @@ -27,6 +27,7 @@ export function SignUp() { router.push(getCallbackURL(params))} callbackURL={getCallbackURL(params)} /> diff --git a/demo/nextjs/app/(auth)/sign-in/page.tsx b/demo/nextjs/app/(auth)/sign-in/page.tsx index 3efc0b6028..6e710eecfd 100644 --- a/demo/nextjs/app/(auth)/sign-in/page.tsx +++ b/demo/nextjs/app/(auth)/sign-in/page.tsx @@ -16,6 +16,7 @@ export default function Page() { useEffect(() => { authClient.oneTap({ fetchOptions: { + query: params, onError: ({ error }) => { toast.error(error.message || "An error occurred"); }, diff --git a/demo/nextjs/components/forms/sign-in-form.tsx b/demo/nextjs/components/forms/sign-in-form.tsx index 999ad58fd3..e23b52e1d1 100644 --- a/demo/nextjs/components/forms/sign-in-form.tsx +++ b/demo/nextjs/components/forms/sign-in-form.tsx @@ -32,12 +32,14 @@ interface SignInFormProps { onSuccess?: () => void; callbackURL?: string; showPasswordToggle?: boolean; + params?: URLSearchParams; } export function SignInForm({ onSuccess, callbackURL = "/dashboard", showPasswordToggle = false, + params, }: SignInFormProps) { const [loading, startTransition] = useTransition(); const [isMounted, setIsMounted] = useState(false); @@ -65,6 +67,7 @@ export function SignInForm({ callbackURL, }, { + query: params ? Object.fromEntries(params.entries()) : undefined, onSuccess() { toast.success("Successfully signed in"); onSuccess?.(); diff --git a/demo/nextjs/components/forms/sign-up-form.tsx b/demo/nextjs/components/forms/sign-up-form.tsx index 732e869b2a..297c163dff 100644 --- a/demo/nextjs/components/forms/sign-up-form.tsx +++ b/demo/nextjs/components/forms/sign-up-form.tsx @@ -36,11 +36,13 @@ type SignUpFormValues = z.infer; interface SignUpFormProps { onSuccess?: () => void; callbackURL?: string; + params?: URLSearchParams; } export function SignUpForm({ onSuccess, callbackURL = "/dashboard", + params, }: SignUpFormProps) { const [loading, startTransition] = useTransition(); const { image, imagePreview, handleImageChange, clearImage } = @@ -66,6 +68,7 @@ export function SignUpForm({ image: image ? await convertImageToBase64(image) : "", callbackURL, fetchOptions: { + query: params ? Object.fromEntries(params.entries()) : undefined, onError: (ctx) => { toast.error(ctx.error.message); }, diff --git a/demo/nextjs/components/providers.tsx b/demo/nextjs/components/providers.tsx index a0b89158fa..773b055a2d 100644 --- a/demo/nextjs/components/providers.tsx +++ b/demo/nextjs/components/providers.tsx @@ -2,7 +2,9 @@ import { QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { useEffect } from "react"; import { getQueryClient } from "@/data/query-client"; +import { authClient } from "@/lib/auth-client"; import { ThemeProvider } from "./theme-provider"; import { Toaster } from "./ui/sonner"; @@ -13,6 +15,11 @@ type Props = { const Providers = ({ children }: Props) => { const queryClient = getQueryClient(); + useEffect(() => { + const id = authClient.ensureElectronRedirect(); + return () => clearInterval(id); + }, []); + return ( diff --git a/demo/nextjs/lib/auth-client.ts b/demo/nextjs/lib/auth-client.ts index f6983cd99a..831baa7226 100644 --- a/demo/nextjs/lib/auth-client.ts +++ b/demo/nextjs/lib/auth-client.ts @@ -1,4 +1,5 @@ import { dashClient } from "@better-auth/dash/client"; +import { electronProxyClient } from "@better-auth/electron/proxy"; import { oauthProviderClient } from "@better-auth/oauth-provider/client"; import { passkeyClient } from "@better-auth/passkey/client"; import { stripeClient } from "@better-auth/stripe/client"; @@ -41,6 +42,11 @@ export const authClient = createAuthClient({ customSessionClient(), deviceAuthorizationClient(), lastLoginMethodClient(), + electronProxyClient({ + protocol: { + scheme: "com.better-auth.demo", + }, + }), ], fetchOptions: { onError(e) { diff --git a/demo/nextjs/lib/auth.ts b/demo/nextjs/lib/auth.ts index 90acd1a696..4f6ebadff0 100644 --- a/demo/nextjs/lib/auth.ts +++ b/demo/nextjs/lib/auth.ts @@ -1,4 +1,5 @@ import { dash, sendEmail } from "@better-auth/dash"; +import { electron } from "@better-auth/electron"; import { oauthProvider } from "@better-auth/oauth-provider"; import { passkey } from "@better-auth/passkey"; import { scim } from "@better-auth/scim"; @@ -435,11 +436,13 @@ const authOptions = { oauthAuthServerConfig: true, }, }), + electron(), ], trustedOrigins: [ "https://*.better-auth.com", "https://better-auth-demo-*-better-auth.vercel.app", "exp://", + "com.better-auth.demo:/", "https://appleid.apple.com", ], } satisfies BetterAuthOptions; diff --git a/demo/nextjs/package.json b/demo/nextjs/package.json index fd9f53d953..9e60ec5b41 100644 --- a/demo/nextjs/package.json +++ b/demo/nextjs/package.json @@ -18,6 +18,7 @@ "@better-auth/scim": "workspace:*", "@better-auth/sso": "workspace:*", "@better-auth/stripe": "workspace:*", + "@better-auth/electron": "workspace:*", "@hookform/resolvers": "^5.2.2", "@libsql/kysely-libsql": "^0.4.1", "@modelcontextprotocol/sdk": "^1.25.3", diff --git a/docs/components/icons.tsx b/docs/components/icons.tsx index 2ab8af1369..d11c0bd47a 100644 --- a/docs/components/icons.tsx +++ b/docs/components/icons.tsx @@ -584,4 +584,19 @@ export const Icons = { > ), + electron: (props?: SVGProps) => ( + + + + ), }; diff --git a/docs/components/sidebar-content.tsx b/docs/components/sidebar-content.tsx index 2d36e7675e..5f03b17089 100644 --- a/docs/components/sidebar-content.tsx +++ b/docs/components/sidebar-content.tsx @@ -1506,6 +1506,12 @@ C0.7,239.6,62.1,0.5,62.2,0.4c0,0,54,13.8,119.9,30.8S302.1,62,302.2,62c0.2,0,0.2, href: "", icon: LucideAArrowDown, }, + { + title: "Electron", + icon: Icons.electron, + href: "/docs/integrations/electron", + isNew: true, + }, { title: "Expo", icon: Icons.expo, diff --git a/docs/content/docs/integrations/electron.mdx b/docs/content/docs/integrations/electron.mdx new file mode 100644 index 0000000000..bbffd4794c --- /dev/null +++ b/docs/content/docs/integrations/electron.mdx @@ -0,0 +1,683 @@ +--- +title: Electron Integration +description: Integrate Better Auth with Electron. +--- + +Electron is a popular framework for building cross-platform desktop applications using web technologies. + +Better Auth can be integrated into Electron apps to provide secure authentication flows, leveraging the system browser. + +## Installation + + + + ### Configure a Better Auth front- & back-end + + Before integrating with Electron, ensure you have a Better Auth server and client set up. + + To get started, check out our [installation](/docs/installation) guide for setting up Better Auth. + + + + ### Install the required packages + + Install the Better Auth server package and the Electron integration package in your server, Electron app, and web client projects. + + **In each project, run:** + + ```package-install + better-auth @better-auth/electron + ``` + + + + + ### Add the Electron plugin to your Better Auth server + + Add the Electron plugin to your Better Auth server. + + ```ts title="web/lib/auth.ts" + import { betterAuth } from "better-auth"; + import { electron } from "@better-auth/electron"; + + export const auth = betterAuth({ + plugins: [electron()], + emailAndPassword: { + enabled: true, + }, + social: { + google: { + clientId: process.env.GOOGLE_CLIENT_ID!, + clientSecret: process.env.GOOGLE_CLIENT_SECRET!, + }, + }, + }); + ``` + + + + ### Add the proxy plugin to your web client + + On your frontend, add the proxy plugin to handle redirects back into the Electron app. + + ```ts title="web/lib/auth-client.ts" + import { createAuthClient } from "better-auth/client"; + import { electronProxyClient } from "@better-auth/electron/proxy"; + + export const authClient = createAuthClient({ + baseURL: "http://localhost:8081", + plugins: [ + electronProxyClient({ + protocol: { + scheme: "com.example.app" + }, + }), + ], + }); + ``` + + + + + ### Initialize the Electron client + + ```ts title="electron/lib/auth-client.ts" + import { createAuthClient } from "better-auth/client"; + import { electronClient } from "@better-auth/electron/client"; + + export const authClient = createAuthClient({ + baseURL: "http://localhost:8081", // Base URL of your Better Auth frontend + plugins: [ + electronClient({ + signInURL: "https://app.example.com/sign-in", // The URL to redirect to for authentication + protocol: { + scheme: "com.example.app" // The custom protocol scheme registered by your Electron app + }, + storage: { + getItem: async (key) => { + // retrieve entry from storage + }, + setItem: async (key, value) => { + // set entry in storage + }, + }, + }), + ], + }); + ``` + + If you'd rather not implement your own storage solution, we offer a default option: + + 1. Make sure to install the `conf` package: + ```package-install + conf + ``` + 2. Then, you can use it as follows: + + ```ts title="electron/lib/auth-client.ts" + import { storage } from "@better-auth/electron/storage"; + + electronClient({ + storage: storage(), + }); + ``` + + + You should never expose the authClient directly + to the renderer process. Instead, [create an IPC bridge](#creating-ipc-bridges) to securely communicate between the main and renderer processes. + + + + + + ### Scheme and Trusted Origins + + The Electron plugin uses deep links to redirect users back to your app after authentication. + To enable this, you need to add your app's protocol scheme to the `trustedOrigins` on your **Better Auth server**. + + First, make sure you have a custom protocol scheme registered in your build configuration. + + + + ```ts title="forge.config.js" + module.exports = { + packagerConfig: { + protocols: [{ + name: "MyApp Protocol", + schemes: ["com.example.app"], + }], + }, + // ...other config options + }; + ``` + + + + ```ts title="electron-builder.json5" + { + "protocols": [ + { + "name": "MyApp Protocol", + "schemes": ["com.example.app"] + } + ], + // ...other config options + } + ``` + + + + Then, update your Better Auth config to include the scheme in `trustedOrigins`: + + ```ts title="web/lib/auth.ts" + export const auth = betterAuth({ + trustedOrigins: ["com.example.app:/"], + }); + ``` + + + + ### Configure the BrowserWindow + + Ensure that your `BrowserWindow` is configured with `nodeIntegration` set to `false` and `contextIsolation` set to `true`, to ensure NodeJS APIs aren't exposed to any JavaScript process running in the browser. + + ```ts title="electron/main.ts" + import { BrowserWindow } from "electron"; + import { join } from "node:path"; + + const win = new BrowserWindow({ + webPreferences: { + preload: join(__dirname, "preload.mjs"), + nodeIntegration: false, + contextIsolation: true, + }, + }); + ``` + + + + + ### Setup the Main Process + + In your Electron main process, use the `setupMain()` method from the Electron auth client to handle necessary configurations. + + This will: + - Register the protocol handler for deep links. + - Set up content security policies. + - Set up IPC bridges for communication between main and renderer processes. + + ```ts title="electron/main.ts" + import { authClient } from "./lib/auth-client"; + + authClient.setupMain(); + ``` + + Note that this must be called before the app is ready. + + + + ### Setup the Renderer Process + + In your preload script, use the `setupRenderer()` method from the Electron auth client to expose safe IPC bridges to the renderer process. + + ```ts title="electron/preload.ts" + import { authClient } from "./lib/auth-client"; + + authClient.setupRenderer(); + ``` + + Note that this must also be called before the app is ready. + + + To infer the types of the exposed bridges, you can use `authClient.$Infer.Bridges` to extend the `Window` interface. + + ```ts title="electron/preload.d.ts" + import type { authClient } from "./lib/auth-client"; + + declare global { + type Bridges = typeof authClient.$Infer.Bridges; + interface Window extends Bridges {} + } + ``` + + + + + +## Usage + +### Handling Authorization in the Browser + +In order to redirect users back to your Electron application, you need to call the `ensureElectronRedirect()` method on your web sign-in callback page. Also make sure to preserve any PKCE and state parameters during the sign-in initiation, by passing them via `fetchOptions.query`. + +The following example uses React, but the same logic applies to any framework: + +```tsx title="web/pages/sign-in.tsx" +import { useEffect, use } from "react"; +import { authClient } from "../auth-client"; + +function SignIn({ + searchParams, +}: { + searchParams: Promise<{ + client_id?: string | undefined; + state?: string | undefined; + code_challenge?: string | undefined; + code_challenge_method?: string | undefined; + }>; +}) { + const query = use(searchParams); + + useEffect(() => { + const id = authClient.ensureElectronRedirect(); + return () => { + clearTimeout(id); + } + }, []); + + return ( + + ); +} +``` + +### Handling Authentication in Electron + +In your Electron renderer process, you can use the IPC bridges exposed by the preload script. + +```tsx title="electron/App.tsx" +function Auth() { + useEffect(() => { + const unsubscribeAuthenticated = + window.onAuthenticated((user) => { + console.log("Authenticated user:", user); + }); + const unsubscribeAuthError = + window.onAuthError((ctx) => { + toast.error(`Authentication error: ${ctx.message}`); + }); + + return () => { + unsubscribeAuthenticated(); + unsubscribeAuthError(); + }; + }, []); + + return ( + <> + + + + ); +} +``` + +In the main process, you can call from the auth client directly: + +```ts title="electron/main.ts" +import { authClient } from "./lib/auth-client"; + +authClient.requestAuth(); +``` + +### Sign Out + +To sign out the user inside the renderer process, you can use the `signOut` bridge in the renderer process: + +```ts title="electron/App.tsx" + +``` + +### Subscribing to User Updates + +You can listen for user changes via the `onUserUpdated` bridge in the renderer process: + +```ts title="electron/App.tsx" +useEffect(() => { + const unsubscribe = window.onUserUpdated((user) => { + console.log("User updated:", user); + }); + return () => unsubscribe(); +}, []); +``` + +### Handling Errors + +Listen for authentication errors via the `onAuthError` bridge in the renderer process. The bridge will receive error context forwarded from fetch hooks. + +```ts title="electron/error-listener.tsx" +useEffect(() => { + const unsubscribe = window.onAuthError((ctx) => { + console.error("Authentication error:", ctx); + }); + return () => unsubscribe(); +}, []); +``` + +### Creating IPC bridges + +You should create IPC bridges to extend the functionality exposed to your renderer process. This ensures a minimal, safe API surface. + +First, create an IPC handler in the main process that uses the `authClient` to perform the desired action: + +```ts title="electron/main.ts" +import { authClient } from "./lib/auth-client"; +import { ipcMain } from "electron"; + +ipcMain.handle("myBridge", async (_event, data) => { + const cookie = authClient.getCookie(); + return await authClient.someEndpoint({ + data, + fetchOptions: { + headers: { cookie }, + }, + }); +}); +``` + +Next, expose the bridge in your preload script using `contextBridge`: + +```ts title="electron/preload.ts" +import { contextBridge, ipcRenderer } from "electron"; + +contextBridge.exposeInMainWorld("myBridge", (data: Record) => { + return ipcRenderer.invoke("myBridge", data); +}); +``` + + + To infer the types of your bridge, extend the `Window` interface: + + ```ts title="electron/preload.d.ts" + import type { authClient } from "./lib/auth-client"; + + declare global { + type Bridges = typeof authClient.$Infer.Bridges; + interface Window extends Bridges { + myBridge: (data: Record) => Promise; + } + } + ``` + + + +Now you can call your custom bridge from anywhere in the renderer process: + +```ts title="electron/App.tsx" +useEffect(() => { + window + .myBridge({ + foo: "bar", + }) + .then((res) => { + console.log("Bridge response:", res); + }); +}, []); +``` + +For more details, check out Electron's [Inter-Process Communication](https://www.electronjs.org/docs/latest/tutorial/ipc) tutorial. + +## Options + +### Server plugin + +#### `codeExpiresIn?` + +The duration, in seconds, for which the authorization code is valid. (defaults to `300`) + +Note that the authorization code will be refreshed during active endpoint usage. + +```ts title="web/auth.ts" +electron({ + codeExpiresIn: 300, // 5 minutes +}); +``` + +#### `redirectCookieExpiresIn?` + +The duration, in seconds, for which the redirect cookie remains valid. (defaults to `120`) + +```ts title="web/auth.ts" +electron({ + redirectCookieExpiresIn: 120, // 2 minutes +}); +``` + +The redirect cookie name is derived by the `clientID`. + +#### `cookiePrefix?` + +The prefix to use for cookies set by the plugin. (defaults to `better-auth`) + +```ts title="web/auth.ts" +electron({ + cookiePrefix: "better-auth", +}); +``` + +#### `clientID?` + +The client id to use for identifying the Electron client during authorization. (defaults to `electron`) + +Make sure this matches the clientID provided to both the proxy and electron client plugin. + +```ts title="web/auth.ts" +electron({ + clientID: "electron", +}); +``` + +#### `disableOriginOverride?` + +Override the origin for Electron API routes. (defaults to `false`) + +Enable this if you're facing cors origin issues with Electron API routes. + +```ts title="web/auth.ts" +electron({ + disableOriginOverride: true, +}); +``` + +### Proxy client + +#### `protocol` + +The protocol scheme to use for deep linking in Electron. + +Should follow the [reverse domain name notation](https://datatracker.ietf.org/doc/html/rfc8252#section-7.1) to ensure uniqueness. + +Make sure this matches the protocol scheme provided to the Electron client and `trustedOrigins`. + +```ts title="web/auth-client.ts" +electronProxyClient({ + protocol: "com.example.app", +}); +``` + +```ts title="web/auth-client.ts" +electronProxyClient({ + protocol: { + scheme: "com.example.app", + }, +}); +``` + +#### `callbackPath?` + +The callback path to use for authentication redirects. (defaults to `/auth/callback`) + +Make sure this matches the path provided to the electron client plugin. + +```ts title="web/auth-client.ts" +electronProxyClient({ + callbackPath: "/auth/callback", +}); +``` + +#### `clientID?` + +The client id to use for identifying the Electron client during authorization. (defaults to `electron`) + +Make sure this matches the clientID provided to both the server and electron client plugin. + +```ts title="web/auth-client.ts" +electronProxyClient({ + clientID: "electron", +}); +``` + +#### `cookiePrefix?` + +The prefix to use for cookies set by the plugin. (defaults to `better-auth`) + +```ts title="web/auth-client.ts" +electronProxyClient({ + cookiePrefix: "better-auth", +}); +``` + +### Client plugin + +#### `signInURL` + +The URL to redirect to for authentication. + +```ts title="electron/auth-client.ts" +electronClient({ + signInURL: "http://localhost:3000/sign-in", +}); +``` + +#### `protocol` + +The protocol scheme to use for deep linking in Electron. + +Should follow the [reverse domain name notation](https://datatracker.ietf.org/doc/html/rfc8252#section-7.1) to ensure uniqueness. + +Make sure this matches the protocol scheme provided to the proxy client and `trustedOrigins`. + +```ts title="web/auth-client.ts" +electronProxyClient({ + protocol: "com.example.app", +}); +``` + +```ts title="web/auth-client.ts" +electronProxyClient({ + protocol: { + scheme: "com.example.app", + }, +}); +``` + +#### `callbackPath?` + +The callback path to use for authentication redirects. (defaults to `/auth/callback`) + +Make sure this matches the path provided to the proxy client plugin. + +```ts title="electron/auth-client.ts" +electronClient({ + callbackPath: "/auth/callback", +}); +``` + +#### `storage` + +Storage solution to use to store session and cookie data. + +By default a storage file is generated in the `userData` directory. The name is derived by the project name. + +```ts title="electron/auth-client.ts" +electronClient({ + storage: { + getItem: (key) => { + // get entry from storage + }, + setItem: (key, value) => { + // set entry in storage + }, + }, +}); +``` + +#### `storagePrefix?` + +Prefix for local storage keys. (defaults to `better-auth`) + +```ts title="electron/auth-client.ts" +electronClient({ + storagePrefix: "better-auth", +}); +``` + +#### `cookiePrefix?` + +Prefix(es) for server cookie names to filter. (defaults to `better-auth`) + +This is used to identify which cookies belong to better-auth to +prevent infinite refetching when third-party cookies are set. + +```ts title="electron/auth-client.ts" +electronClient({ + cookiePrefix: "better-auth", +}); +``` + +```ts title="electron/auth-client.ts" +electronClient({ + cookiePrefix: ["better-auth", "my-app"], +}); +``` + +#### `channelPrefix?` + +Channel prefix for IPC bridges. (defaults to `better-auth`) + +```ts title="electron/auth-client.ts" +electronClient({ + channelPrefix: "myapp", +}); +``` + +#### `clientID?` + +The client id to use for identifying the Electron client during authorization. (defaults to `electron`) + +Make sure this matches the clientID provided to both the server and proxy client plugin. + +```ts title="electron/auth-client.ts" +electronClient({ + clientID: "electron", +}); +``` + +#### `disableCache?` + +Whether to disable caching the session data locally. (defaults to `false`) + +```ts title="electron/auth-client.ts" +electronClient({ + disableCache: true, +}); +``` diff --git a/knip.jsonc b/knip.jsonc index 9e47a6f94e..5bccffd9ff 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -81,6 +81,16 @@ "react-native" ] }, + "packages/electron": { + "ignoreDependencies": [ + // loading of optional peers + "conf", + + // implicit dependencies + "electron" + ], + "project": ["src/**/*.ts", "test/**/*.ts"] + }, "packages/stripe": { "ignoreDependencies": [ // implicit dependencies diff --git a/packages/better-auth/src/cookies/cookie-utils.ts b/packages/better-auth/src/cookies/cookie-utils.ts index 96ada13fda..47bf7fe18a 100644 --- a/packages/better-auth/src/cookies/cookie-utils.ts +++ b/packages/better-auth/src/cookies/cookie-utils.ts @@ -1,4 +1,4 @@ -interface CookieAttributes { +export interface CookieAttributes { value: string; "max-age"?: number | undefined; expires?: Date | undefined; diff --git a/packages/better-auth/src/utils/index.ts b/packages/better-auth/src/utils/index.ts index ac4f86af76..52b639f0d8 100644 --- a/packages/better-auth/src/utils/index.ts +++ b/packages/better-auth/src/utils/index.ts @@ -2,3 +2,4 @@ export * from "../oauth2/state"; export type { StateData } from "../state"; export { generateGenericState, parseGenericState } from "../state"; export * from "./hide-metadata"; +export * from "./url"; diff --git a/packages/electron/README.md b/packages/electron/README.md new file mode 100644 index 0000000000..b4d5991f98 --- /dev/null +++ b/packages/electron/README.md @@ -0,0 +1,14 @@ +# Better Auth Electron Plugin + +This plugin integrates Better Auth with Electron, allowing you to easily add +authentication to your Electron applications. + +- **Main Better Auth Installation:** [Installation Guide][] +- **Electron Integration Guide:** [Electron Integration Guide][] + +## License + +MIT + +[electron integration guide]: https://www.better-auth.com/docs/integrations/electron +[installation guide]: https://www.better-auth.com/docs/installation diff --git a/packages/electron/package.json b/packages/electron/package.json new file mode 100644 index 0000000000..39c5c6b43f --- /dev/null +++ b/packages/electron/package.json @@ -0,0 +1,104 @@ +{ + "name": "@better-auth/electron", + "version": "1.5.0-beta.1", + "type": "module", + "description": "Better Auth integration for Electron applications.", + "main": "dist/index.mjs", + "module": "dist/index.mjs", + "types": "dist/index.d.mts", + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/better-auth/better-auth", + "directory": "packages/electron" + }, + "homepage": "https://www.better-auth.com/docs/integrations/electron", + "keywords": [ + "electron", + "auth", + "better-auth", + "typescript" + ], + "scripts": { + "test": "vitest", + "coverage": "vitest run --coverage --coverage.provider=istanbul", + "lint:package": "publint run --strict", + "lint:types": "attw --profile esm-only --pack .", + "build": "tsdown", + "dev": "tsdown --watch", + "typecheck": "tsc --project tsconfig.json" + }, + "exports": { + ".": { + "dev-source": "./src/index.ts", + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "./client": { + "dev-source": "./src/client.ts", + "types": "./dist/client.d.mts", + "default": "./dist/client.mjs" + }, + "./proxy": { + "dev-source": "./src/proxy.ts", + "types": "./dist/proxy.d.mts", + "default": "./dist/proxy.mjs" + }, + "./storage": { + "dev-source": "./src/storage.ts", + "types": "./dist/storage.d.mts", + "default": "./dist/storage.mjs" + } + }, + "typesVersions": { + "*": { + "*": [ + "./dist/index.d.mts" + ], + "client": [ + "./dist/client.d.mts" + ], + "proxy": [ + "./dist/proxy.d.mts" + ], + "storage": [ + "./dist/storage.d.mts" + ] + } + }, + "peerDependenciesMeta": { + "electron": { + "optional": true + }, + "conf": { + "optional": true + } + }, + "peerDependencies": { + "@better-auth/core": "workspace:*", + "@better-auth/utils": "catalog:", + "@better-fetch/fetch": "catalog:", + "better-auth": "workspace:*", + "better-call": "catalog:", + "conf": "^15.0.2" + }, + "dependencies": { + "zod": "^4.3.5" + }, + "devDependencies": { + "@better-auth/core": "workspace:*", + "@types/better-sqlite3": "^7.6.13", + "better-auth": "workspace:*", + "better-sqlite3": "^12.6.2", + "tsdown": "catalog:" + }, + "engines": { + "node": ">=22.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/packages/electron/src/authenticate.ts b/packages/electron/src/authenticate.ts new file mode 100644 index 0000000000..338d631355 --- /dev/null +++ b/packages/electron/src/authenticate.ts @@ -0,0 +1,133 @@ +import type { BetterAuthClientOptions } from "@better-auth/core"; +import { BetterAuthError } from "@better-auth/core/error"; +import { base64Url } from "@better-auth/utils/base64"; +import { createHash } from "@better-auth/utils/hash"; +import type { BetterFetch } from "@better-fetch/fetch"; +import { APIError, getBaseURL } from "better-auth"; +import { signInSocial } from "better-auth/api"; +import { generateRandomString } from "better-auth/crypto"; +import { shell } from "electron"; +import * as z from "zod"; +import type { ElectronClientOptions } from "./types/client"; +import { isProcessType } from "./utils"; + +export const kCodeVerifier = Symbol.for("better-auth:code_verifier"); +export const kState = Symbol.for("better-auth:state"); + +const requestAuthOptionsSchema = (() => { + const { provider, idToken, loginHint, ...signInSocialBody } = + signInSocial().options.body.shape; + + return z.object({ + ...signInSocialBody, + provider: z.string().nonempty().optional(), + }); +})(); +export type ElectronRequestAuthOptions = z.infer< + typeof requestAuthOptionsSchema +>; + +/** + * Opens the system browser to request user authentication. + */ +export async function requestAuth( + clientOptions: BetterAuthClientOptions | undefined, + options: ElectronClientOptions, + cfg?: ElectronRequestAuthOptions | undefined, +) { + if (!isProcessType("browser")) { + throw new BetterAuthError( + "`requestAuth` can only be called in the main process", + ); + } + const { randomBytes } = await import("node:crypto"); + + const state = generateRandomString(16, "A-Z", "a-z", "0-9"); + + const codeVerifier = base64Url.encode(randomBytes(32)); + const codeChallenge = base64Url.encode( + await createHash("SHA-256").digest(codeVerifier), + ); + + (globalThis as any)[kCodeVerifier] = codeVerifier; + (globalThis as any)[kState] = state; + + let url: URL | null = null; + if (cfg?.provider) { + const baseURL = getBaseURL( + clientOptions?.baseURL, + clientOptions?.basePath, + undefined, + true, + ); + + if (!baseURL) { + console.log("No base URL found in client options"); + throw APIError.from("INTERNAL_SERVER_ERROR", { + code: "NO_BASE_URL", + message: "Base URL is required to use provider-based sign-in.", + }); + } + url = new URL(`${baseURL}/electron/init-oauth-proxy`); + for (const [key, value] of Object.entries(cfg)) { + url.searchParams.set( + key, + typeof value === "string" ? value : JSON.stringify(value), + ); + } + } else { + url = new URL(options.signInURL); + } + url.searchParams.set("client_id", options.clientID || "electron"); + url.searchParams.set("code_challenge", codeChallenge); + url.searchParams.set("code_challenge_method", "S256"); + url.searchParams.set("state", state); + + if (url === null) { + throw new Error("Failed to construct sign-in URL."); + } + + await shell.openExternal(url.toString(), { + activate: true, + }); +} + +/** + * Exchanges the authorization code for a session. + */ +export async function authenticate( + $fetch: BetterFetch, + options: ElectronClientOptions, + body: { + token: string; + }, + getWindow: () => Electron.BrowserWindow | null | undefined, +) { + const codeVerifier = (globalThis as any)[kCodeVerifier]; + const state = (globalThis as any)[kState]; + (globalThis as any)[kCodeVerifier] = undefined; + (globalThis as any)[kState] = undefined; + + if (!codeVerifier) { + throw new Error("Code verifier not found."); + } + if (!state) { + throw new Error("State not found."); + } + + await $fetch("/electron/token", { + method: "POST", + body: { + ...body, + state, + code_verifier: codeVerifier, + }, + onSuccess: (ctx) => { + getWindow()?.webContents.send( + `${options.channelPrefix || "better-auth"}:authenticated`, + ctx.data.user, + ); + }, + throw: true, + }); +} diff --git a/packages/electron/src/bridges.ts b/packages/electron/src/bridges.ts new file mode 100644 index 0000000000..91489fbc2e --- /dev/null +++ b/packages/electron/src/bridges.ts @@ -0,0 +1,137 @@ +import type { BetterAuthClientOptions, ClientStore } from "@better-auth/core"; +import { BetterAuthError } from "@better-auth/core/error"; +import type { BetterFetch, BetterFetchError } from "@better-fetch/fetch"; +import type { User } from "better-auth"; +import electron from "electron"; +import type { ElectronRequestAuthOptions } from "./authenticate"; +import { requestAuth } from "./authenticate"; +import type { ElectronClientOptions } from "./client"; + +const { ipcRenderer, ipcMain, contextBridge, webContents } = electron; + +export function getChannelPrefixWithDelimiter(ns: string = "better-auth") { + return ns.length > 0 ? ns + ":" : ns; +} + +function listenerFactory( + channel: string, + listener: ( + event: Electron.IpcRendererEvent, + ...args: any[] + ) => void | Promise, +) { + ipcRenderer.on(channel, listener); + return () => { + ipcRenderer.off(channel, listener); + }; +} + +/** + * Exposes IPC bridges to the renderer process. + */ +export function exposeBridges(opts: ElectronClientOptions) { + if (!process.contextIsolated) { + throw new BetterAuthError( + "Context isolation must be enabled to use IPC bridges securely.", + ); + } + + const prefix = getChannelPrefixWithDelimiter(opts.channelPrefix); + const bridges = { + getUser: async () => { + return (await ipcRenderer.invoke(`${prefix}getUser`)) as User & + Record; + }, + requestAuth: async (options?: ElectronRequestAuthOptions) => { + await ipcRenderer.invoke(`${prefix}requestAuth`, options); + }, + signOut: async () => { + await ipcRenderer.invoke(`${prefix}signOut`); + }, + onAuthenticated: ( + callback: (user: User & Record) => unknown, + ) => { + const channel = `${prefix}authenticated`; + return listenerFactory(channel, async (_evt, user) => { + await callback(user); + }); + }, + onUserUpdated: ( + callback: (user: (User & Record) | null) => unknown, + ) => { + const channel = `${prefix}user-updated`; + return listenerFactory(channel, async (_evt, user) => { + await callback(user); + }); + }, + onAuthError: ( + callback: (context: BetterFetchError & { path: string }) => unknown, + ) => { + const channel = `${prefix}error`; + return listenerFactory(channel, async (_evt, context) => { + await callback(context); + }); + }, + }; + + for (const [key, value] of Object.entries(bridges)) { + contextBridge.exposeInMainWorld(key, value); + } + + return {} as { + $InferBridges: typeof bridges; + }; +} + +/** + * Sets up IPC bridges in the main process. + */ +export function setupBridges( + ctx: { + $fetch: BetterFetch; + $store: ClientStore | null; + getCookie: () => string; + }, + opts: ElectronClientOptions, + clientOptions: BetterAuthClientOptions | undefined, +) { + const prefix = getChannelPrefixWithDelimiter(opts.channelPrefix); + + ctx.$store?.atoms.session?.subscribe((state) => { + if (state.isPending === true) return; + + webContents + .getFocusedWebContents() + ?.send(`${prefix}user-updated`, state?.data?.user ?? null); + }); + + ipcMain.handle(`${prefix}getUser`, async () => { + const result = await ctx.$fetch<{ user: User & Record }>( + "/get-session", + { + method: "GET", + headers: { + cookie: ctx.getCookie(), + "content-type": "application/json", + }, + }, + ); + + return result.data?.user ?? null; + }); + ipcMain.handle( + `${prefix}requestAuth`, + (_evt, options?: ElectronRequestAuthOptions | undefined) => + requestAuth(clientOptions, opts, options), + ); + ipcMain.handle(`${prefix}signOut`, async () => { + await ctx.$fetch("/sign-out", { + method: "POST", + body: "{}", + headers: { + cookie: ctx.getCookie(), + "content-type": "application/json", + }, + }); + }); +} diff --git a/packages/electron/src/client.ts b/packages/electron/src/client.ts new file mode 100644 index 0000000000..8b1573219c --- /dev/null +++ b/packages/electron/src/client.ts @@ -0,0 +1,208 @@ +import { Buffer } from "node:buffer"; +import { base64 } from "@better-auth/utils/base64"; +import type { BetterAuthClientPlugin, ClientStore } from "better-auth"; +import { isDevelopment, isTest } from "better-auth"; +import electron from "electron"; +import type { ElectronRequestAuthOptions } from "./authenticate"; +import { requestAuth } from "./authenticate"; +import type { exposeBridges } from "./bridges"; +import { getChannelPrefixWithDelimiter } from "./bridges"; +import { + getCookie, + getSetCookie, + hasBetterAuthCookies, + hasSessionCookieChanged, +} from "./cookies"; +import { setupMain, setupRenderer } from "./setup"; +import type { ElectronClientOptions, Storage } from "./types/client"; +import { isProcessType, parseProtocolScheme } from "./utils"; + +const { app, safeStorage, webContents } = electron; + +const storageAdapter = (storage: Storage) => { + return { + ...storage, + getDecrypted: (name: string) => { + const item = storage.getItem(name); + if (!item || typeof item !== "string") return null; + return safeStorage.decryptString(Buffer.from(base64.decode(item))); + }, + setEncrypted: (name: string, value: string) => { + return storage.setItem( + name, + base64.encode(safeStorage.encryptString(value)), + ); + }, + }; +}; + +export const electronClient = (options: ElectronClientOptions) => { + const opts = { + storagePrefix: "better-auth", + cookiePrefix: "better-auth", + channelPrefix: "better-auth", + callbackPath: "/auth/callback", + ...options, + }; + + const { scheme } = parseProtocolScheme(opts.protocol); + + let store: ClientStore | null = null; + const cookieName = `${opts.storagePrefix}.cookie`; + const localCacheName = `${opts.storagePrefix}.local_cache`; + const { getDecrypted, setEncrypted } = storageAdapter(opts.storage); + + if ( + (isDevelopment() || isTest()) && + // At least 1 dot, no leading or trailing dot, no consecutive dots + /^(?!\.)(?!.*\.\.)(?!.*\.$)[^.]+\.[^.]+$/.test(scheme) + ) { + console.warn( + "The provided scheme does not follow the reverse domain name notation. For example: `app.example.com` -> `com.example.app`.", + ); + } + + return { + id: "electron", + fetchPlugins: [ + { + id: "electron", + name: "Electron", + async init(url, options) { + if (!isProcessType("browser")) { + throw new Error( + "Requests must be made from the Electron main process", + ); + } + const storedCookie = getDecrypted(cookieName); + const cookie = getCookie(storedCookie || "{}"); + options ||= {}; + options.credentials = "omit"; + options.headers = { + ...options.headers, + cookie, + "user-agent": app.userAgentFallback, + "electron-origin": `${scheme}:/`, + "x-skip-oauth-proxy": "true", + }; + + if (url.endsWith("/sign-out")) { + setEncrypted(cookieName, "{}"); + store?.atoms.session?.set({ + ...store.atoms.session.get(), + data: null, + error: null, + isPending: false, + }); + setEncrypted(localCacheName, "{}"); + } + + return { + url, + options, + }; + }, + hooks: { + onSuccess: async (context) => { + const setCookie = context.response.headers.get("set-cookie"); + + if (setCookie) { + if (hasBetterAuthCookies(setCookie, opts.cookiePrefix)) { + const prevCookie = getDecrypted(cookieName); + const toSetCookie = getSetCookie( + setCookie || "{}", + prevCookie ?? undefined, + ); + + if (hasSessionCookieChanged(prevCookie, toSetCookie)) { + setEncrypted(cookieName, toSetCookie); + store?.notify("$sessionSignal"); + } else { + setEncrypted(cookieName, toSetCookie); + } + } + } + + if ( + context.request.url.toString().includes("/get-session") && + !opts.disableCache + ) { + const data = context.data; + setEncrypted(localCacheName, JSON.stringify(data)); + } + }, + onError: async (context) => { + webContents + .getFocusedWebContents() + ?.send( + `${getChannelPrefixWithDelimiter(opts.channelPrefix)}error`, + { + ...context.error, + path: context.request.url, + }, + ); + }, + }, + }, + ], + getActions: ($fetch, $store, clientOptions) => { + store = $store; + + const getCookieFn = () => { + const cookie = getDecrypted(cookieName); + return getCookie(cookie || "{}"); + }; + + return { + /** + * Gets the stored cookie. + * + * You can use this to get the cookie stored in + * the device and use it in your fetch requests. + * + * @example + * ```ts + * const cookie = client.getCookie(); + * await fetch("https://api.example.com", { + * headers: { + * cookie, + * }, + * }); + * ``` + */ + getCookie: getCookieFn, + /** + * Initiates the authentication process. + * Opens the system's default browser for user authentication. + */ + requestAuth: (options?: ElectronRequestAuthOptions | undefined) => + requestAuth(clientOptions, opts, options), + /** + * Sets up the renderer process. + * + * - Exposes IPC bridges to the renderer process. + */ + setupRenderer: () => setupRenderer(opts), + /** + * Sets up the main process. + * + * - Registers custom protocol scheme. + * - Registers IPC bridge handlers. + * - Handles content security policy if needed. + */ + setupMain: (cfg?: { + csp?: boolean | undefined; + bridges?: boolean | undefined; + scheme?: boolean | undefined; + getWindow?: () => electron.BrowserWindow | null | undefined; + }) => setupMain($fetch, store, getCookieFn, opts, clientOptions, cfg), + $Infer: {} as { + Bridges: ReturnType["$InferBridges"]; + }, + }; + }, + } satisfies BetterAuthClientPlugin; +}; + +export { handleDeepLink } from "./setup"; +export * from "./types/client"; diff --git a/packages/electron/src/cookies.ts b/packages/electron/src/cookies.ts new file mode 100644 index 0000000000..3a53c4df7e --- /dev/null +++ b/packages/electron/src/cookies.ts @@ -0,0 +1,148 @@ +import { parseSetCookieHeader } from "better-auth/cookies"; + +interface StoredCookie { + value: string; + expires: string | null; +} + +export function getSetCookie(header: string, prevCookie?: string | undefined) { + const parsed = parseSetCookieHeader(header); + let toSetCookie: Record = {}; + parsed.forEach((cookie, key) => { + const expiresAt = cookie["expires"]; + const maxAge = cookie["max-age"]; + const expires = maxAge + ? new Date(Date.now() + Number(maxAge) * 1000) + : expiresAt + ? new Date(String(expiresAt)) + : null; + toSetCookie[key] = { + value: cookie["value"], + expires: expires ? expires.toISOString() : null, + }; + }); + if (prevCookie) { + try { + const prevCookieParsed = JSON.parse(prevCookie); + toSetCookie = { + ...prevCookieParsed, + ...toSetCookie, + }; + } catch { + // + } + } + return JSON.stringify(toSetCookie); +} + +export function getCookie(cookie: string) { + let parsed = {} as Record; + try { + parsed = JSON.parse(cookie) as Record; + } catch (_e) {} + const toSend = Object.entries(parsed).reduce((acc, [key, value]) => { + if (value.expires && new Date(value.expires) < new Date()) { + return acc; + } + return `${acc}; ${key}=${value.value}`; + }, ""); + return toSend; +} + +/** + * Compare if session cookies have actually changed by comparing their values. + * Ignores expiry timestamps that naturally change on each request. + * + * @param prevCookie - Previous cookie JSON string + * @param newCookie - New cookie JSON string + * @returns true if session cookies have changed, false otherwise + */ +export function hasSessionCookieChanged( + prevCookie: string | null, + newCookie: string, +): boolean { + if (!prevCookie) return true; + + try { + const prev = JSON.parse(prevCookie) as Record; + const next = JSON.parse(newCookie) as Record; + + // Get all session-related cookie keys (session_token, session_data) + const sessionKeys = new Set(); + Object.keys(prev).forEach((key) => { + if (key.includes("session_token") || key.includes("session_data")) { + sessionKeys.add(key); + } + }); + Object.keys(next).forEach((key) => { + if (key.includes("session_token") || key.includes("session_data")) { + sessionKeys.add(key); + } + }); + + // Compare the values of session cookies (ignore expires timestamps) + for (const key of sessionKeys) { + const prevValue = prev[key]?.value; + const nextValue = next[key]?.value; + if (prevValue !== nextValue) { + return true; + } + } + + return false; + } catch { + // If parsing fails, assume cookie changed + return true; + } +} + +/** + * Check if the Set-Cookie header contains better-auth cookies. + * This prevents infinite refetching when non-better-auth cookies (like third-party cookies) change. + * + * Supports multiple cookie naming patterns: + * - Default: "better-auth.session_token", "better-auth-passkey", "__Secure-better-auth.session_token" + * - Custom prefix: "myapp.session_token", "myapp-passkey", "__Secure-myapp.session_token" + * - Custom full names: "my_custom_session_token", "custom_session_data" + * - No prefix (cookiePrefix=""): matches any cookie with known suffixes + * - Multiple prefixes: ["better-auth", "my-app"] matches cookies starting with any of the prefixes + * + * @param setCookieHeader - The Set-Cookie header value + * @param cookiePrefix - The cookie prefix(es) to check for. Can be a string, array of strings, or empty string. + * @returns true if the header contains better-auth cookies, false otherwise + */ +export function hasBetterAuthCookies( + setCookieHeader: string, + cookiePrefix: string | string[], +): boolean { + const cookies = parseSetCookieHeader(setCookieHeader); + const cookieSuffixes = ["session_token", "session_data"]; + const prefixes = Array.isArray(cookiePrefix) ? cookiePrefix : [cookiePrefix]; + + // Check if any cookie is a better-auth cookie + for (const name of cookies.keys()) { + // Remove __Secure- prefix if present for comparison + const nameWithoutSecure = name.startsWith("__Secure-") + ? name.slice(9) + : name; + + // Check against all provided prefixes + for (const prefix of prefixes) { + if (prefix) { + // When prefix is provided, check if cookie starts with the prefix + // This matches all better-auth cookies including session cookies, passkey cookies, etc. + if (nameWithoutSecure.startsWith(prefix)) { + return true; + } + } else { + // When prefix is empty, check for common better-auth cookie patterns + for (const suffix of cookieSuffixes) { + if (nameWithoutSecure.endsWith(suffix)) { + return true; + } + } + } + } + } + return false; +} diff --git a/packages/electron/src/error-codes.ts b/packages/electron/src/error-codes.ts new file mode 100644 index 0000000000..2ff3950789 --- /dev/null +++ b/packages/electron/src/error-codes.ts @@ -0,0 +1,10 @@ +import { defineErrorCodes } from "better-auth"; + +export const ELECTRON_ERROR_CODES = defineErrorCodes({ + INVALID_TOKEN: "Invalid or expired token.", + STATE_MISMATCH: "state mismatch", + MISSING_CODE_CHALLENGE: "missing code challenge", + INVALID_CODE_VERIFIER: "Invalid code verifier", + MISSING_STATE: "state is required", + MISSING_PKCE: "pkce is required", +}); diff --git a/packages/electron/src/index.ts b/packages/electron/src/index.ts new file mode 100644 index 0000000000..36e35a938f --- /dev/null +++ b/packages/electron/src/index.ts @@ -0,0 +1,198 @@ +/// + +import type { HookEndpointContext } from "@better-auth/core"; +import { createAuthMiddleware } from "@better-auth/core/api"; +import { APIError } from "@better-auth/core/error"; +import type { BetterAuthPlugin } from "better-auth"; +import { safeJSONParse } from "better-auth"; +import { generateRandomString } from "better-auth/crypto"; +import * as z from "zod"; +import { ELECTRON_ERROR_CODES } from "./error-codes"; +import { electronInitOAuthProxy, electronToken } from "./routes"; +import type { ElectronOptions } from "./types"; + +declare module "@better-auth/core" { + interface BetterAuthPluginRegistry { + electron: { + creator: typeof electron; + }; + } +} + +export const electron = (options?: ElectronOptions | undefined) => { + const opts = { + codeExpiresIn: 300, // 5 minutes + redirectCookieExpiresIn: 120, // 2 minutes + cookiePrefix: "better-auth", + clientID: "electron", + ...(options || {}), + }; + + const hookMatcher = (ctx: HookEndpointContext) => { + return !!( + ctx.path?.startsWith("/sign-in") || + ctx.path?.startsWith("/sign-up") || + ctx.path?.startsWith("/callback") || + ctx.path?.startsWith("/oauth2/callback") || + ctx.path?.startsWith("/magic-link/verify") || + ctx.path?.startsWith("/email-otp/verify-email") || + ctx.path?.startsWith("/verify-email") || + ctx.path?.startsWith("/one-tap/callback") || + ctx.path?.startsWith("/passkey/verify-authentication") || + ctx.path?.startsWith("/phone-number/verify") + ); + }; + + return { + id: "electron", + async onRequest(request, _ctx) { + if (opts.disableOriginOverride || request.headers.get("origin")) { + return; + } + + const electronOrigin = request.headers.get("electron-origin"); + if (!electronOrigin) { + return; + } + + const req = request.clone(); + req.headers.set("origin", electronOrigin); + return { + request: req, + }; + }, + hooks: { + after: [ + { + matcher: (ctx) => !hookMatcher(ctx), + handler: createAuthMiddleware(async (ctx) => { + const transferCookie = await ctx.getSignedCookie( + `${opts.cookiePrefix}.transfer_token`, + ctx.context.secret, + ); + if (!ctx.context.newSession?.session || !transferCookie) { + return; + } + + const cookie = ctx.context.createAuthCookie("transfer_token", { + maxAge: opts.codeExpiresIn, + }); + // Refresh the transfer cookie to extend its validity + // Avoids expiration during multi-step auth flows on active usage + // Can still expire when no endpoint is hit within the valid period + await ctx.setSignedCookie( + cookie.name, + transferCookie, + ctx.context.secret, + cookie.attributes, + ); + }), + }, + { + matcher: hookMatcher, + handler: createAuthMiddleware(async (ctx) => { + const querySchema = z.object({ + client_id: z.string(), + code_challenge: z.string().nonempty(), + code_challenge_method: z.string().optional().default("plain"), + state: z.string().nonempty(), + }); + const cookie = ctx.context.createAuthCookie("transfer_token", { + maxAge: opts.codeExpiresIn, + }); + if ( + ctx.query?.client_id === opts.clientID && + (ctx.path.startsWith("/sign-in") || + ctx.path.startsWith("/sign-up")) + ) { + const query = querySchema.safeParse(ctx.query); + if (query.success) { + await ctx.setSignedCookie( + cookie.name, + JSON.stringify(query.data), + ctx.context.secret, + cookie.attributes, + ); + } + } + + if (!ctx.context.newSession?.session) { + return; + } + + const transferCookie = await ctx.getSignedCookie( + cookie.name, + ctx.context.secret, + ); + ctx.setCookie(cookie.name, "", { + ...cookie.attributes, + maxAge: 0, + }); + let transferPayload: z.infer | null = null; + if (!!transferCookie) { + transferPayload = safeJSONParse(transferCookie); + } else { + const query = querySchema.safeParse(ctx.query); + if (query.success) { + transferPayload = query.data; + } + } + if (!transferPayload) { + return; + } + + const { client_id, code_challenge, code_challenge_method, state } = + transferPayload; + if (client_id !== opts.clientID) { + return; + } + if (!state) { + throw APIError.from( + "BAD_REQUEST", + ELECTRON_ERROR_CODES.MISSING_STATE, + ); + } + if (!code_challenge) { + throw APIError.from( + "BAD_REQUEST", + ELECTRON_ERROR_CODES.MISSING_PKCE, + ); + } + + const redirectCookieName = `${opts.cookiePrefix}.${opts.clientID}`; + + const identifier = generateRandomString(32, "a-z", "A-Z", "0-9"); + const codeExpiresInMs = opts.codeExpiresIn * 1000; + const expiresAt = new Date(Date.now() + codeExpiresInMs); + await ctx.context.internalAdapter.createVerificationValue({ + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: ctx.context.newSession.user.id, + codeChallenge: code_challenge, + codeChallengeMethod: code_challenge_method.toLowerCase(), + state, + }), + expiresAt, + }); + + ctx.setCookie(redirectCookieName, identifier, { + ...ctx.context.authCookies.sessionToken.attributes, + maxAge: opts.redirectCookieExpiresIn, + httpOnly: false, + }); + + return ctx; + }), + }, + ], + }, + endpoints: { + electronToken: electronToken(opts), + electronInitOAuthProxy: electronInitOAuthProxy(opts), + }, + options: opts, + $ERROR_CODES: ELECTRON_ERROR_CODES, + } satisfies BetterAuthPlugin; +}; + +export type * from "./types"; diff --git a/packages/electron/src/proxy.ts b/packages/electron/src/proxy.ts new file mode 100644 index 0000000000..5b4586cba2 --- /dev/null +++ b/packages/electron/src/proxy.ts @@ -0,0 +1,75 @@ +import type { BetterAuthClientPlugin } from "@better-auth/core"; +import { parseCookies } from "better-auth/cookies"; +import type { ElectronProxyClientOptions } from "./types/client"; +import { parseProtocolScheme } from "./utils"; + +export const electronProxyClient = (options: ElectronProxyClientOptions) => { + const opts = { + clientID: "electron", + cookiePrefix: "better-auth", + callbackPath: "/auth/callback", + ...options, + }; + const redirectCookieName = `${opts.cookiePrefix}.${opts.clientID}`; + const { scheme } = parseProtocolScheme(opts.protocol); + + return { + id: "electron-proxy", + getActions: () => { + return { + /** + * Ensures redirecting to the Electron app. + * + * Polls for a cookie set by the server to indicate that an authorization code is available. + * + * @returns The interval ID which can be used to clear the polling. + */ + ensureElectronRedirect: ( + cfg?: + | { + /** + * @default 10_000 + */ + timeout?: number | undefined; + /** + * @default 100 + */ + interval?: number | undefined; + } + | undefined, + ) => { + const timeout = cfg?.timeout || 10_000; + const interval = cfg?.interval || 100; + + const handleRedirect = () => { + if (typeof document === "undefined") { + return false; + } + const authorizationCode = parseCookies(document.cookie).get( + redirectCookieName, + ); + if (!authorizationCode) { + return false; + } + document.cookie = `${redirectCookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`; + + window.location.replace( + `${scheme}:/${opts.callbackPath}#token=${authorizationCode}`, + ); + return true; + }; + + const start = Date.now(); + const id = setInterval(() => { + const success = handleRedirect(); + if (success || Date.now() - start > timeout) { + clearInterval(id); + } + }, interval); + + return id; + }, + }; + }, + } satisfies BetterAuthClientPlugin; +}; diff --git a/packages/electron/src/routes.ts b/packages/electron/src/routes.ts new file mode 100644 index 0000000000..2dffbc8a2d --- /dev/null +++ b/packages/electron/src/routes.ts @@ -0,0 +1,191 @@ +import { Buffer } from "node:buffer"; +import { timingSafeEqual } from "node:crypto"; +import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error"; +import { SocialProviderListEnum } from "@better-auth/core/social-providers"; +import { safeJSONParse } from "@better-auth/core/utils/json"; +import { base64Url } from "@better-auth/utils/base64"; +import { createHash } from "@better-auth/utils/hash"; +import { betterFetch } from "@better-fetch/fetch"; +import { createAuthEndpoint } from "better-auth/api"; +import { setSessionCookie } from "better-auth/cookies"; +import type { User } from "better-auth/db"; +import { parseUserOutput } from "better-auth/db"; +import * as z from "zod"; +import { ELECTRON_ERROR_CODES } from "./error-codes"; +import type { ElectronOptions } from "./types"; + +const electronTokenBodySchema = z.object({ + token: z.string().nonempty(), + state: z.string().nonempty(), + code_verifier: z.string().nonempty(), +}); + +export const electronToken = (opts: ElectronOptions) => + createAuthEndpoint( + "/electron/token", + { + method: "POST", + body: electronTokenBodySchema, + metadata: { + scope: "http", + }, + }, + async (ctx) => { + const token = await ctx.context.internalAdapter.findVerificationValue( + `electron:${ctx.body.token}`, + ); + if (!token || token.expiresAt < new Date()) { + throw APIError.from("NOT_FOUND", ELECTRON_ERROR_CODES.INVALID_TOKEN); + } + + const tokenRecord = safeJSONParse>(token.value); + if (!tokenRecord) { + throw APIError.from( + "INTERNAL_SERVER_ERROR", + ELECTRON_ERROR_CODES.INVALID_TOKEN, + ); + } + + if (tokenRecord.state !== ctx.body.state) { + throw APIError.from("BAD_REQUEST", ELECTRON_ERROR_CODES.STATE_MISMATCH); + } + + if (!tokenRecord.codeChallenge) { + throw APIError.from( + "BAD_REQUEST", + ELECTRON_ERROR_CODES.MISSING_CODE_CHALLENGE, + ); + } + if (tokenRecord.codeChallengeMethod === "s256") { + const codeChallenge = Buffer.from( + base64Url.decode(tokenRecord.codeChallenge), + ); + const codeVerifier = Buffer.from( + await createHash("SHA-256").digest(ctx.body.code_verifier), + ); + + if ( + codeChallenge.length !== codeVerifier.length || + !timingSafeEqual(codeChallenge, codeVerifier) + ) { + throw APIError.from( + "BAD_REQUEST", + ELECTRON_ERROR_CODES.INVALID_CODE_VERIFIER, + ); + } + } else { + if (tokenRecord.codeChallenge !== ctx.body.code_verifier) { + throw APIError.from( + "BAD_REQUEST", + ELECTRON_ERROR_CODES.INVALID_CODE_VERIFIER, + ); + } + } + await ctx.context.internalAdapter.deleteVerificationValue(token.id); + + const user = await ctx.context.internalAdapter.findUserById( + tokenRecord.userId, + ); + if (!user) { + throw APIError.from( + "INTERNAL_SERVER_ERROR", + BASE_ERROR_CODES.USER_NOT_FOUND, + ); + } + + const session = await ctx.context.internalAdapter.createSession(user.id); + if (!session) { + throw APIError.from( + "INTERNAL_SERVER_ERROR", + BASE_ERROR_CODES.FAILED_TO_CREATE_SESSION, + ); + } + + await setSessionCookie(ctx, { + session, + user, + }); + + return ctx.json({ + token: session.token, + user: parseUserOutput(ctx.context.options, user) as User & + Record, + }); + }, + ); + +const electronInitOAuthProxyQuerySchema = z.object({ + provider: z.string().nonempty(), + state: z.string(), + code_challenge: z.string(), + code_challenge_method: z.string().optional(), +}); + +export const electronInitOAuthProxy = (opts: ElectronOptions) => + createAuthEndpoint( + "/electron/init-oauth-proxy", + { + method: "GET", + query: electronInitOAuthProxyQuerySchema, + metadata: { + scope: "http", + }, + }, + async (ctx) => { + const isSocialProvider = SocialProviderListEnum.safeParse( + ctx.query.provider, + ); + if (!isSocialProvider && !ctx.context.getPlugin("generic-oauth")) { + throw APIError.from("BAD_REQUEST", BASE_ERROR_CODES.PROVIDER_NOT_FOUND); + } + + const headers = new Headers(ctx.request?.headers); + headers.set("origin", new URL(ctx.context.baseURL).origin); + let setCookie: string | null = null; + const searchParams = new URLSearchParams(); + searchParams.set("client_id", opts.clientID || "electron"); + searchParams.set("code_challenge", ctx.query.code_challenge); + searchParams.set( + "code_challenge_method", + ctx.query.code_challenge_method || "plain", + ); + searchParams.set("state", ctx.query.state); + const res = await betterFetch<{ + url: string | undefined; + redirect: boolean; + user?: User & Record; + token?: string; + }>( + `${isSocialProvider ? "/sign-in/social" : "/sign-in/oauth2"}?${searchParams.toString()}`, + { + baseURL: ctx.context.baseURL, + method: "POST", + body: { + provider: ctx.query.provider, + disableRedirect: true, + }, + onResponse: (ctx) => { + const headers = ctx.response.headers; + setCookie = headers.get("set-cookie") ?? null; + }, + headers, + }, + ); + + if (res.error) { + throw new APIError("INTERNAL_SERVER_ERROR", { + message: res.error.message || "An unknown error occurred.", + }); + } + + if (setCookie) { + ctx.setHeader("set-cookie", setCookie); + } + if (res.data.url) { + ctx.setHeader("Location", res.data.url); + ctx.setStatus(302); + return; + } + return ctx.json(res.data); + }, + ); diff --git a/packages/electron/src/setup.ts b/packages/electron/src/setup.ts new file mode 100644 index 0000000000..b339e1e90e --- /dev/null +++ b/packages/electron/src/setup.ts @@ -0,0 +1,289 @@ +import { resolve } from "node:path"; +import type { BetterAuthClientOptions, ClientStore } from "@better-auth/core"; +import { BetterAuthError } from "@better-auth/core/error"; +import type { BetterFetch } from "@better-fetch/fetch"; +import electron from "electron"; +import { authenticate } from "./authenticate"; +import { exposeBridges, setupBridges } from "./bridges"; +import type { ElectronClientOptions } from "./client"; +import { isProcessType, parseProtocolScheme } from "./utils"; + +const { app, session, protocol, BrowserWindow } = electron; + +export function withGetWindowFallback( + win?: (() => Electron.BrowserWindow | null | undefined) | undefined, +) { + return ( + win ?? + (() => { + const allWindows = BrowserWindow.getAllWindows(); + return allWindows.length > 0 ? allWindows[0] : null; + }) + ); +} + +export function setupRenderer(opts: ElectronClientOptions) { + if (!isProcessType("renderer")) { + throw new BetterAuthError( + "setupRenderer can only be called in the renderer process.", + ); + } + void exposeBridges(opts); +} + +export type SetupMainConfig = { + getWindow?: () => electron.BrowserWindow | null | undefined; + csp?: boolean | undefined; + bridges?: boolean | undefined; + scheme?: boolean | undefined; +}; +export function setupMain( + $fetch: BetterFetch, + $store: ClientStore | null, + getCookie: () => string, + opts: ElectronClientOptions, + clientOptions: BetterAuthClientOptions | undefined, + cfg?: SetupMainConfig | undefined, +) { + if (!isProcessType("browser")) { + throw new BetterAuthError( + "setupMain can only be called in the main process.", + ); + } + + if (!cfg || cfg.csp === true) { + setupCSP(clientOptions); + } + if (!cfg || cfg.scheme === true) { + registerProtocolScheme($fetch, opts, withGetWindowFallback(cfg?.getWindow)); + } + if (!cfg || cfg.bridges === true) { + setupBridges( + { + $fetch, + $store, + getCookie, + }, + opts, + clientOptions, + ); + } +} + +/** + * Handles the deep link URL for authentication. + */ +export async function handleDeepLink({ + $fetch, + options, + url, + getWindow, +}: { + $fetch: BetterFetch; + options: ElectronClientOptions; + url: string; + getWindow?: SetupMainConfig["getWindow"] | undefined; +}) { + if (!isProcessType("browser")) { + throw new BetterAuthError( + "`handleDeepLink` can only be called in the main process.", + ); + } + + let parsedURL: URL | null = null; + try { + parsedURL = new URL(url); + } catch {} + if (!parsedURL) { + return; + } + + const { scheme } = parseProtocolScheme(options.protocol); + + if (!url.startsWith(`${scheme}:/`)) { + return; + } + const { protocol, pathname, hostname, hash } = parsedURL; + if (protocol !== `${scheme}:`) { + return; + } + + const path = "/" + hostname + pathname; + + if (path !== (options.callbackPath || "/auth/callback")) { + return; + } + + if (!hash.startsWith("#token=")) { + return; + } + + const token = hash.substring("#token=".length); + + await authenticate( + $fetch, + options, + { + token, + }, + withGetWindowFallback(getWindow), + ); +} + +function registerProtocolScheme( + $fetch: BetterFetch, + options: ElectronClientOptions, + getWindow: () => electron.BrowserWindow | null | undefined, +) { + const { scheme, privileges = {} } = + typeof options.protocol === "string" + ? { + scheme: options.protocol, + } + : options.protocol; + + protocol.registerSchemesAsPrivileged([ + { + scheme, + privileges: { + standard: false, + secure: true, + ...privileges, + }, + }, + ]); + + let hasSetupProtocolClient = false; + if (process?.defaultApp) { + if (process.argv.length >= 2 && typeof process.argv[1] === "string") { + hasSetupProtocolClient = app.setAsDefaultProtocolClient( + scheme, + process.execPath, + [resolve(process.argv[1])], + ); + } + } else { + hasSetupProtocolClient = app.setAsDefaultProtocolClient(scheme); + } + + if (!hasSetupProtocolClient) { + console.error( + `Failed to register protocol ${scheme} as default protocol client.`, + ); + } + + const gotTheLock = app.requestSingleInstanceLock(); + + if (!gotTheLock) { + app.quit(); + } else { + app.on("second-instance", async (_event, commandLine, _workingDir, url) => { + // Someone tried to run a second instance, we should focus our window. + const win = getWindow(); + if (win) { + if (win.isMinimized()) win.restore(); + win.focus(); + } + + if (!url) { + const maybeURL = commandLine.pop(); + if (typeof maybeURL === "string" && maybeURL.trim() !== "") { + try { + url = new URL(maybeURL).toString(); + } catch { + // + } + } + } + + if (process?.platform !== "darwin" && typeof url === "string") { + await handleDeepLink({ + $fetch, + options, + url, + getWindow, + }); + } + }); + + app.on("open-url", async (_event, url) => { + if (process?.platform === "darwin") { + await handleDeepLink({ + $fetch, + options, + url, + getWindow, + }); + } + }); + + app.whenReady().then(async () => { + if ( + process?.platform !== "darwin" && + typeof process.argv[1] === "string" + ) { + await handleDeepLink({ + $fetch, + options, + url: process.argv[1], + getWindow, + }); + } + }); + } +} + +function setupCSP(clientOptions: BetterAuthClientOptions | undefined) { + app.whenReady().then(() => { + session.defaultSession.webRequest.onHeadersReceived((details, callback) => { + const origin = new URL(clientOptions?.baseURL || "", "http://localhost") + .origin; + const cspKey = Object.keys(details.responseHeaders || {}).find( + (k) => k.toLowerCase() === "content-security-policy", + ); + if (!cspKey) { + return callback({ + responseHeaders: { + ...(details.responseHeaders || {}), + "content-security-policy": `connect-src 'self' ${origin}`, + }, + }); + } + const policy = details.responseHeaders?.[cspKey]?.toString() || ""; + const csp = new Map(); + + for (let token of policy.split(";")) { + token = token.trim(); + + if (!token || !/^[\x00-\x7f]*$/.test(token)) continue; + + const [rawDirectiveName, ...directiveValue] = token.split(/\s+/); + const directiveName = rawDirectiveName?.toLowerCase(); + if (!directiveName) continue; + + if (csp.has(directiveName)) continue; + + csp.set(directiveName, directiveValue); + } + + if (csp.has("connect-src")) { + const values = csp.get("connect-src") || []; + if (!values.includes(origin)) { + values.push(origin); + } + csp.set("connect-src", values); + } else { + csp.set("connect-src", ["'self'", origin]); + } + + callback({ + responseHeaders: { + ...details.responseHeaders, + "content-security-policy": Array.from(csp.entries()) + .map(([k, v]) => `${k} ${v.join(" ")}`) + .join("; "), + }, + }); + }); + }); +} diff --git a/packages/electron/src/storage.ts b/packages/electron/src/storage.ts new file mode 100644 index 0000000000..dcf9d28fa6 --- /dev/null +++ b/packages/electron/src/storage.ts @@ -0,0 +1,33 @@ +import type { Options as ConfOptions } from "conf"; +import Conf from "conf"; +import electron from "electron"; +import type { Storage } from "./client"; + +const { app } = electron; + +export const storage = ( + opts?: ConfOptions> | undefined, +): Storage => { + if (!app) { + return { + getItem: () => null, + setItem: () => {}, + }; + } + + const config = new Conf({ + cwd: app.getPath("userData"), + projectName: app.getName(), + projectVersion: app.getVersion(), + ...opts, + }); + + return { + getItem: (key) => { + return config.get(key, null); + }, + setItem: (key, value) => { + config.set(key, value); + }, + }; +}; diff --git a/packages/electron/src/types/client.ts b/packages/electron/src/types/client.ts new file mode 100644 index 0000000000..cb42f06caf --- /dev/null +++ b/packages/electron/src/types/client.ts @@ -0,0 +1,118 @@ +export interface Storage { + getItem: (name: string) => unknown | null; + setItem: (name: string, value: unknown) => void; +} + +export interface ElectronClientOptions { + /** + * The URL to redirect to for authentication. + * + * @example "http://localhost:3000/sign-in" + */ + signInURL: string | URL; + /** + * The protocol scheme to use for deep linking in Electron. + * + * Should follow the reverse domain name notation to ensure uniqueness. + * + * @see {@link https://datatracker.ietf.org/doc/html/rfc8252#section-7.1} + * @example "com.example.app" + */ + protocol: + | string + | { + scheme: string; + privileges?: Electron.Privileges | undefined; + }; + /** + * The callback path to use for authentication redirects. + * + * @default "/auth/callback" + */ + callbackPath?: string; + /** + * An instance of a storage solution (e.g., `electron-store`) + * to store session and cookie data. + * + * @example + * ```ts + * electronClient({ + * storage: window.localStorage, + * }); + * ``` + */ + storage: Storage; + /** + * Prefix for local storage keys (e.g., "my-app_cookie", "my-app_session_data") + * @default "better-auth" + */ + storagePrefix?: string | undefined; + /** + * Prefix(es) for server cookie names to filter (e.g., "better-auth.session_token") + * This is used to identify which cookies belong to better-auth to prevent + * infinite refetching when third-party cookies are set. + * + * Can be a single string or an array of strings to match multiple prefixes. + * + * @default "better-auth" + * @example "better-auth" + * @example ["better-auth", "my-app"] + */ + cookiePrefix?: string | string[] | undefined; + /** + * Channel prefix for IPC bridges (e.g., "better-auth:request-auth") + * + * @default "better-auth" + */ + channelPrefix?: string | undefined; + /** + * Client ID to use for identifying the Electron client during authorization. + * + * @default "electron" + */ + clientID?: string | undefined; + /** + * Whether to disable caching the session data locally. + * + * @default false + */ + disableCache?: boolean | undefined; +} + +export interface ElectronProxyClientOptions { + /** + * The protocol scheme to use for deep linking in Electron. + * + * Should follow the reverse domain name notation to ensure uniqueness. + * + * Note that this must match the protocol scheme registered in the server plugin. + * + * @see {@link https://datatracker.ietf.org/doc/html/rfc8252#section-7.1} + * @example "com.example.app" + */ + protocol: + | string + | { + scheme: string; + }; + /** + * The callback path to use for authentication redirects. + * + * @default "/auth/callback" + */ + callbackPath?: string; + /** + * Client ID to use for identifying the Electron client during authorization. + * + * @default "electron" + */ + clientID?: string | undefined; + /** + * The prefix to use for cookies set by the plugin. + * + * @default "better-auth" + */ + cookiePrefix?: string | undefined; +} + +export type { ElectronRequestAuthOptions } from "../authenticate"; diff --git a/packages/electron/src/types/index.ts b/packages/electron/src/types/index.ts new file mode 100644 index 0000000000..9c15534fd3 --- /dev/null +++ b/packages/electron/src/types/index.ts @@ -0,0 +1 @@ +export * from "./options"; diff --git a/packages/electron/src/types/options.ts b/packages/electron/src/types/options.ts new file mode 100644 index 0000000000..eab5573968 --- /dev/null +++ b/packages/electron/src/types/options.ts @@ -0,0 +1,33 @@ +export interface ElectronOptions { + /** + * The duration (in seconds) for which the authorization code remains valid. + * + * @default 300 (5 minutes) + */ + codeExpiresIn?: number | undefined; + /** + * The duration (in seconds) for which the redirect cookie remains valid. + * + * @default 120 (2 minutes) + */ + redirectCookieExpiresIn?: number | undefined; + /** + * The prefix to use for cookies set by the plugin. + * + * @default "better-auth" + */ + cookiePrefix?: string | undefined; + /** + * Client ID to use for identifying the Electron client during authorization. + * + * @default "electron" + */ + clientID?: string | undefined; + /** + * Override the origin for Electron API routes. + * Enable this if you're facing cors origin issues with Electron API routes. + * + * @default false + */ + disableOriginOverride?: boolean | undefined; +} diff --git a/packages/electron/src/utils.ts b/packages/electron/src/utils.ts new file mode 100644 index 0000000000..836b637d04 --- /dev/null +++ b/packages/electron/src/utils.ts @@ -0,0 +1,21 @@ +import type { ElectronClientOptions } from "./types/client"; + +export function isProcessType(type: typeof process.type) { + return typeof process !== "undefined" && process.type === type; +} + +export function parseProtocolScheme( + protocolOption: ElectronClientOptions["protocol"], +) { + if (typeof protocolOption === "string") { + return { + scheme: protocolOption, + privileges: {}, + }; + } + + return { + scheme: protocolOption.scheme, + privileges: protocolOption.privileges || {}, + }; +} diff --git a/packages/electron/test/electron.test.ts b/packages/electron/test/electron.test.ts new file mode 100644 index 0000000000..8583cc4d66 --- /dev/null +++ b/packages/electron/test/electron.test.ts @@ -0,0 +1,1212 @@ +import { randomBytes } from "node:crypto"; +import { createAuthMiddleware } from "@better-auth/core/api"; +import { base64Url } from "@better-auth/utils/base64"; +import { createHash } from "@better-auth/utils/hash"; +import { parseSetCookieHeader } from "better-auth/cookies"; +import { generateRandomString } from "better-auth/crypto"; +import { getMigrations } from "better-auth/db/migration"; +import { describe, expect, vi } from "vitest"; +import { authenticate, kCodeVerifier, kState } from "../src/authenticate"; +import { electron } from "../src/index"; +import { it, testUtils } from "./utils"; + +const mockElectron = vi.hoisted(() => { + const BrowserWindow = { + constructor: vi.fn(), + send: vi.fn(), + webContents: { + send: vi.fn(), + }, + }; + + const electron = { + ipcMain: { + handle: vi.fn(), + }, + app: { + userAgentFallback: "test-user-agent", + whenReady: vi.fn(() => Promise.resolve()), + setAsDefaultProtocolClient: vi.fn(() => true), + requestSingleInstanceLock: vi.fn(() => true), + on: vi.fn(), + quit: vi.fn(), + }, + shell: { + openExternal: vi.fn(), + }, + safeStorage: { + encryptString: vi.fn((str: string) => + Buffer.from(str).toString("base64"), + ), + decryptString: vi.fn((buf: Buffer) => + Buffer.from(buf.toString(), "base64").toString(), + ), + }, + webContents: { + getFocusedWebContents: vi.fn(() => BrowserWindow), + }, + session: { + defaultSession: { + webRequest: { + onBeforeSendHeaders: vi.fn(), + onHeadersReceived: vi.fn(), + }, + }, + }, + protocol: { + registerSchemesAsPrivileged: vi.fn(), + }, + BrowserWindow, + }; + + return { + ...electron, + default: electron, + }; +}); + +vi.mock("electron", () => mockElectron); + +describe("Electron", () => { + const { auth, client, proxyClient, options } = testUtils(); + + it("should throw error when making requests outside the main process", async ({ + setProcessType, + }) => { + setProcessType("renderer"); + + await expect(client.getSession()).rejects.toThrowError( + "Requests must be made from the Electron main process", + ); + }); + + it("should open external url in default browser", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + await client.requestAuth(); + + (globalThis as any)[kCodeVerifier] = undefined; + (globalThis as any)[kState] = undefined; + + expect(mockElectron.shell.openExternal).toHaveBeenCalledWith( + expect.stringContaining(options.signInURL), + { + activate: true, + }, + ); + }); + + it("should set redirect cookie after signing in", async () => { + (globalThis as any)[kCodeVerifier] = "test-challenge"; + (globalThis as any)[kState] = "abc"; + + const { error } = await proxyClient.signUp.email( + { + email: "test@test.com", + password: "password", + name: "Test User", + }, + { + query: { + client_id: "electron", + code_challenge: "test-challenge", + code_challenge_method: "plain", + state: "abc", + }, + onResponse: async (ctx) => { + const cookies = parseSetCookieHeader( + ctx.response.headers.get("set-cookie") || "", + ); + + const redirectCookie = cookies.get(`better-auth.electron`); + expect(redirectCookie).toBeDefined(); + expect(redirectCookie?.httponly).not.toBe(true); + expect(redirectCookie?.["max-age"]).toStrictEqual(120); + }, + customFetchImpl: (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }, + }, + ); + expect(error).toBeNull(); + }); + + it("should exchange token", async ({ setProcessType }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + const codeVerifier = base64Url.encode(randomBytes(32)); + const codeChallenge = base64Url.encode( + await createHash("SHA-256").digest(codeVerifier), + ); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge, + codeChallengeMethod: "s256", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + const { data } = await client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: codeVerifier, + state: "abc", + }, + onResponse: async (ctx) => { + const cookies = parseSetCookieHeader( + ctx.response.headers.get("set-cookie") || "", + ); + + expect(cookies.has("better-auth.session_token")).toBe(true); + }, + }); + + expect(data?.token).toBeDefined(); + expect(data?.user.id).toBe(user.id); + + expect(mockElectron.safeStorage.encryptString).toHaveBeenCalled(); + }); + + it("should emit authenticated event on success", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + (globalThis as any)[kCodeVerifier] = "test-challenge"; + (globalThis as any)[kState] = "abc"; + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "test-challenge", + codeChallengeMethod: "plain", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + await expect( + authenticate( + client.$fetch, + options, + { + token: identifier, + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ), + ).resolves.toBeUndefined(); + + expect(mockElectron.BrowserWindow.webContents.send).toHaveBeenCalledWith( + "better-auth:authenticated", + expect.objectContaining({ + id: user.id, + }), + ); + }); + + it("should emit user-updated event when session atom updates", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + client.setupMain(); + + const mockUser = { + id: "test-user", + }; + + client.$store.atoms.session!.set({ + data: { + user: mockUser, + }, + }); + + expect(mockElectron.BrowserWindow.send).toHaveBeenCalledWith( + "better-auth:user-updated", + mockUser, + ); + }); + + it("should reject expired tokens", async ({ setProcessType }) => { + setProcessType("browser"); + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + (globalThis as any)[kCodeVerifier] = "test-challenge"; + (globalThis as any)[kState] = "abc"; + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "test-challenge", + codeChallengeMethod: "plain", + state: "abc", + }), + expiresAt: new Date(Date.now() + 999), + }, + }); + + vi.advanceTimersByTime(1000); + + await expect( + authenticate( + client.$fetch, + options, + { + token: identifier, + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ).catch((err: any) => { + expect(err.error.message).toBe("Invalid or expired token."); + throw err; + }), + ).rejects.toThrowError("NOT_FOUND"); + }); + + it("should reject invalid/non-existent tokens", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + (globalThis as any)[kCodeVerifier] = "test-challenge"; + (globalThis as any)[kState] = "abc"; + + await expect( + authenticate( + client.$fetch, + options, + { + token: "non-existent", + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ).catch((err: any) => { + expect(err.error.message).toBe("Invalid or expired token."); + throw err; + }), + ).rejects.toThrowError("NOT_FOUND"); + }); + + it("should emit error event on failure", async ({ setProcessType }) => { + setProcessType("browser"); + + await client.changeEmail({ + // @ts-expect-error + newEmail: null, + }); + + expect(mockElectron.BrowserWindow.send).toHaveBeenCalledWith( + "better-auth:error", + expect.objectContaining({ + status: 400, + }), + ); + }); + + it("should error when user referenced by token does not exist", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + // Create verification referencing a non-existent user id + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: "non-existent-user", + codeChallenge: "x", + codeChallengeMethod: "plain", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300_000), + }, + }); + + await expect( + client + .$fetch("/electron/token", { + method: "POST", + body: { token: identifier, code_verifier: "x", state: "abc" }, + throw: true, + customFetchImpl: (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }, + }) + .catch((err) => { + throw err.cause; + }), + ).rejects.toThrow( + expect.objectContaining({ + code: auth.$ERROR_CODES.USER_NOT_FOUND.code, + }), + ); + }); + + it("should throw when createSession returns null", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signUpEmail({ + body: { + name: "Test User", + email: "test-create-session-null@test.com", + password: "password", + }, + }); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "x", + codeChallengeMethod: "plain", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300_000), + }, + }); + + const ctx = await auth.$context; + const original = ctx.internalAdapter.createSession; + try { + ctx.internalAdapter.createSession = vi.fn().mockResolvedValue(null); + await expect( + client.$fetch("/electron/token", { + method: "POST", + body: { token: identifier, code_verifier: "x", state: "abc" }, + throw: true, + customFetchImpl: (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }, + }), + ).rejects.toThrow(/FAILED_TO_CREATE_SESSION|INTERNAL_SERVER_ERROR/); + } finally { + ctx.internalAdapter.createSession = original; + } + }); + + it("requestAuth should throw if called outside browser process", async ({ + setProcessType, + }) => { + setProcessType("renderer"); + await expect(client.requestAuth()).rejects.toThrowError( + "`requestAuth` can only be called in the main process", + ); + }); + + it("should delete verification entry after successful token exchange", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signUpEmail({ + body: { + name: "Test User", + email: "test-delete-verification@test.com", + password: "password", + }, + }); + + const codeVerifier = base64Url.encode(randomBytes(32)); + const codeChallenge = base64Url.encode( + await createHash("SHA-256").digest(codeVerifier), + ); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge, + codeChallengeMethod: "s256", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + const ctx = await auth.$context; + const spy = vi.spyOn(ctx.internalAdapter, "deleteVerificationValue"); + + const { data } = await client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: codeVerifier, + state: "abc", + }, + }); + + expect(data?.token).toBeDefined(); + expect(data?.user.id).toBe(user.id); + expect(spy).toHaveBeenCalled(); + spy.mockRestore(); + }); + + it("should register protocol", async ({ setProcessType }) => { + setProcessType("browser"); + + client.setupMain({ + scheme: true, + }); + + expect( + mockElectron.protocol.registerSchemesAsPrivileged, + ).toHaveBeenCalledWith( + expect.arrayContaining([ + expect.objectContaining({ + scheme: options.protocol.scheme, + }), + ]), + ); + expect(mockElectron.app.setAsDefaultProtocolClient).toHaveBeenCalledWith( + options.protocol.scheme, + ); + }); + + it("should add client origin to CSP if missing", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + client.setupMain({ + csp: true, + }); + + // wait a tick for whenReady then-callback to run + await Promise.resolve(); + + const onHeadersReceived = + mockElectron.session.defaultSession.webRequest.onHeadersReceived; + expect(onHeadersReceived).toHaveBeenCalled(); + + const handler = onHeadersReceived.mock.calls[0][0]; + + const details = { + responseHeaders: {}, + }; + + let callbackResult: any = null; + const callback = (res: any) => { + callbackResult = res; + }; + + await handler(details, callback); + + expect(callbackResult).not.toBeNull(); + const respHeaders = callbackResult.responseHeaders; + expect(respHeaders).toBeDefined(); + const csp = String(respHeaders["content-security-policy"]); + expect(csp).toContain("connect-src"); + expect(csp).toContain("http://localhost:3000"); + }); + + describe("pkce", () => { + it("should require pkce", async ({ setProcessType }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + await expect( + authenticate( + client.$fetch, + options, + { + token: identifier, + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ), + ).rejects.toThrowError("Code verifier not found."); + }); + + it("should require a state parameter", async ({ setProcessType }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + (globalThis as any)[kCodeVerifier] = "test-challenge"; + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "test-challenge", + codeChallengeMethod: "plain", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + await expect( + authenticate( + client.$fetch, + options, + { + token: identifier, + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ), + ).rejects.toThrowError("State not found."); + }); + + it("should verify that state parameter matches", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { + email: "test@test.com", + password: "password", + }, + }); + + (globalThis as any)[kCodeVerifier] = "test-challenge"; + (globalThis as any)[kState] = "abc"; + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: "test-challenge", + codeChallengeMethod: "plain", + state: "def", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + await expect( + authenticate( + client.$fetch, + options, + { + token: identifier, + }, + // @ts-expect-error + () => mockElectron.BrowserWindow, + ).catch((err: any) => { + expect(err.error.message).toBe("state mismatch"); + throw err; + }), + ).rejects.toThrowError("BAD_REQUEST"); + }); + + it("should return error when token record is missing code challenge", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { email: "test@test.com", password: "password" }, + }); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + state: "abc", + }), + expiresAt: new Date(Date.now() + 300_000), + }, + }); + + await expect( + client.$fetch("/electron/token", { + method: "POST", + body: { token: identifier, code_verifier: "anything", state: "abc" }, + throw: true, + customFetchImpl: (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }, + }), + ).rejects.toThrowError("BAD_REQUEST"); + }); + + it("should reject when code_verifier does not match", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { user } = await auth.api.signInEmail({ + body: { email: "test@test.com", password: "password" }, + }); + + const actualVerifier = base64Url.encode(randomBytes(32)); + const actualChallenge = base64Url.encode( + await createHash("SHA-256").digest(actualVerifier), + ); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge: actualChallenge, + codeChallengeMethod: "s256", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300_000), + }, + }); + + const invalidVerifier = base64Url.encode(randomBytes(32)); + await expect( + client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: invalidVerifier, + state: "abc", + }, + throw: true, + customFetchImpl: (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }, + }), + ).rejects.toThrowError("BAD_REQUEST"); + }); + }); + + describe("cookies", () => { + it("should send cookie and get session", async ({ setProcessType }) => { + setProcessType("browser"); + + const { data } = await client.getSession(); + expect(data).toMatchObject({ + session: expect.any(Object), + user: expect.any(Object), + }); + + expect(mockElectron.safeStorage.decryptString).toHaveBeenCalled(); + }); + + it("should get cookies", async () => { + const c = client.getCookie(); + expect(c).includes("better-auth.session_token"); + }); + + it("should not trigger infinite refetch with non-./src/cookies", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const { hasBetterAuthCookies } = await import("../src/cookies"); + + const betterAuthOnlyHeader = "better-auth.session_token=abc; Path=/"; + expect(hasBetterAuthCookies(betterAuthOnlyHeader, "better-auth")).toBe( + true, + ); + + const sessionDataHeader = "better-auth.session_data=xyz; Path=/"; + expect(hasBetterAuthCookies(sessionDataHeader, "better-auth")).toBe(true); + + const secureBetterAuthHeader = + "__Secure-better-auth.session_token=abc; Path=/"; + expect(hasBetterAuthCookies(secureBetterAuthHeader, "better-auth")).toBe( + true, + ); + + const secureSessionDataHeader = + "__Secure-better-auth.session_data=xyz; Path=/"; + expect(hasBetterAuthCookies(secureSessionDataHeader, "better-auth")).toBe( + true, + ); + + const nonBetterAuthHeader = "__cf_bm=abc123; Path=/; HttpOnly; Secure"; + expect(hasBetterAuthCookies(nonBetterAuthHeader, "better-auth")).toBe( + false, + ); + + const mixedHeader = + "__cf_bm=abc123; Path=/; HttpOnly; Secure, better-auth.session_token=xyz; Path=/"; + expect(hasBetterAuthCookies(mixedHeader, "better-auth")).toBe(true); + + const customPrefixHeader = "my-app.session_token=abc; Path=/"; + expect(hasBetterAuthCookies(customPrefixHeader, "my-app")).toBe(true); + expect(hasBetterAuthCookies(customPrefixHeader, "better-auth")).toBe( + false, + ); + + const customPrefixDataHeader = "my-app.session_data=abc; Path=/"; + expect(hasBetterAuthCookies(customPrefixDataHeader, "my-app")).toBe(true); + + const emptyPrefixHeader = "session_token=abc; Path=/"; + expect(hasBetterAuthCookies(emptyPrefixHeader, "")).toBe(true); + + const customFullNameHeader = "my_custom_session_token=abc; Path=/"; + expect(hasBetterAuthCookies(customFullNameHeader, "")).toBe(true); + + const customFullDataHeader = "my_custom_session_data=xyz; Path=/"; + expect(hasBetterAuthCookies(customFullDataHeader, "")).toBe(true); + + const multipleNonBetterAuthHeader = + "__cf_bm=abc123; Path=/, _ga=GA1.2.123456789.1234567890; Path=/"; + expect( + hasBetterAuthCookies(multipleNonBetterAuthHeader, "better-auth"), + ).toBe(false); + + // Non-session better-auth cookies should still be detected (e.g., passkey cookies) + const nonSessionBetterAuthHeader = "better-auth.other_cookie=abc; Path=/"; + expect( + hasBetterAuthCookies(nonSessionBetterAuthHeader, "better-auth"), + ).toBe(true); + + // Passkey cookie should be detected + const passkeyHeader = "better-auth-passkey=xyz; Path=/"; + expect(hasBetterAuthCookies(passkeyHeader, "better-auth")).toBe(true); + + // Secure passkey cookie should be detected + const securePasskeyHeader = "__Secure-better-auth-passkey=xyz; Path=/"; + expect(hasBetterAuthCookies(securePasskeyHeader, "better-auth")).toBe( + true, + ); + + // Custom passkey cookie name should be detected + const customPasskeyHeader = "better-auth-custom-challenge=xyz; Path=/"; + expect(hasBetterAuthCookies(customPasskeyHeader, "better-auth")).toBe( + true, + ); + }); + + it("should allow independent cookiePrefix configuration", async () => { + const { hasBetterAuthCookies } = await import("../src/cookies"); + + const customCookieHeader = "my-app.session_token=abc; Path=/"; + + expect(hasBetterAuthCookies(customCookieHeader, "my-app")).toBe(true); + + expect(hasBetterAuthCookies(customCookieHeader, "better-auth")).toBe( + false, + ); + }); + + it("should support array of cookie prefixes", async () => { + const { hasBetterAuthCookies } = await import("../src/cookies"); + + // Test with multiple prefixes - should match any of them + const betterAuthHeader = "better-auth.session_token=abc; Path=/"; + expect( + hasBetterAuthCookies(betterAuthHeader, ["better-auth", "my-app"]), + ).toBe(true); + + const myAppHeader = "my-app.session_data=xyz; Path=/"; + expect(hasBetterAuthCookies(myAppHeader, ["better-auth", "my-app"])).toBe( + true, + ); + + const otherAppHeader = "other-app.session_token=def; Path=/"; + expect( + hasBetterAuthCookies(otherAppHeader, ["better-auth", "my-app"]), + ).toBe(false); + + // Test with passkey cookies + const passkeyHeader1 = "better-auth-passkey=xyz; Path=/"; + expect( + hasBetterAuthCookies(passkeyHeader1, ["better-auth", "my-app"]), + ).toBe(true); + + const passkeyHeader2 = "my-app-passkey=xyz; Path=/"; + expect( + hasBetterAuthCookies(passkeyHeader2, ["better-auth", "my-app"]), + ).toBe(true); + + // Test with __Secure- prefix + const secureHeader = "__Secure-my-app.session_token=abc; Path=/"; + expect( + hasBetterAuthCookies(secureHeader, ["better-auth", "my-app"]), + ).toBe(true); + + // Test with empty array (should check for suffixes) + const sessionTokenHeader = "session_token=abc; Path=/"; + expect(hasBetterAuthCookies(sessionTokenHeader, [])).toBe(false); + expect(hasBetterAuthCookies(sessionTokenHeader, [""])).toBe(true); + }); + }); + + it("should preserve unchanged client store session properties on signout", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + await client.signUp.email({ + name: "Test User", + email: "test-2@test.com", + password: "password", + }); + + const before = client.$store.atoms.session!.get(); + await client.signOut(); + const after = client.$store.atoms.session!.get(); + + expect(after).toMatchObject({ + ...before, + data: null, + error: null, + isPending: false, + }); + }); + + it("should modify origin header to electron origin if origin is not set", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + let originalOrigin: string | null = null; + let origin: string | null = null; + const { auth, client } = testUtils({ + hooks: { + before: createAuthMiddleware(async (ctx) => { + origin = ctx.request?.headers.get("origin") ?? null; + }), + }, + plugins: [ + { + id: "test", + async onRequest(request, ctx) { + const origin = request.headers.get("origin"); + originalOrigin = origin; + }, + }, + electron(), + ], + }); + const { runMigrations } = await getMigrations(auth.options); + await runMigrations(); + await client.signUp.email({ + name: "Test User", + email: "test@test.com", + password: "password", + callbackURL: "http://localhost:3000/callback", + }); + expect(origin).toBe("myapp:/"); + expect(originalOrigin).toBeNull(); + }); + + it("should not modify origin header if origin is set", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const originalOrigin = "test.com"; + let origin: string | null = null; + const { auth, client } = testUtils({ + hooks: { + before: createAuthMiddleware(async (ctx) => { + origin = ctx.request?.headers.get("origin") ?? null; + }), + }, + plugins: [electron()], + }); + const { runMigrations } = await getMigrations(auth.options); + await runMigrations(); + await client.signUp.email( + { + name: "Test User", + email: "test@test.com", + password: "password", + callbackURL: "http://localhost:3000/callback", + }, + { + headers: { + origin: originalOrigin, + }, + }, + ); + expect(origin).toBe(originalOrigin); + }); + + it("should not modify origin header if disableOriginOverride is set", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + let origin: string | null = null; + const { auth, client } = testUtils({ + plugins: [electron({ disableOriginOverride: true })], + hooks: { + before: createAuthMiddleware(async (ctx) => { + origin = ctx.request?.headers.get("origin") ?? null; + }), + }, + }); + const { runMigrations } = await getMigrations(auth.options); + await runMigrations(); + await client.signUp.email({ + name: "Test User", + email: "test@test.com", + password: "password", + callbackURL: "http://localhost:3000/callback", + }); + expect(origin).toBe(null); + }); + + it("should register ipc handlers", async ({ setProcessType }) => { + setProcessType("browser"); + + client.setupMain({ + bridges: true, + }); + + const prefix = `${(options as any).channelPrefix ?? "better-auth"}:`; + + expect(mockElectron.ipcMain.handle).toHaveBeenCalledWith( + `${prefix}getUser`, + expect.any(Function), + ); + expect(mockElectron.ipcMain.handle).toHaveBeenCalledWith( + `${prefix}requestAuth`, + expect.any(Function), + ); + expect(mockElectron.ipcMain.handle).toHaveBeenCalledWith( + `${prefix}signOut`, + expect.any(Function), + ); + }); + + it("should surface safeStorage errors during encryption", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + // Create a user and verification entry that would normally trigger + // cookie/session encryption during the token exchange. + const { user } = await auth.api.signUpEmail({ + body: { + name: "Sage Storage Test", + email: "safe-storage@test.com", + password: "password", + }, + }); + + const codeVerifier = base64Url.encode(randomBytes(32)); + const codeChallenge = base64Url.encode( + await createHash("SHA-256").digest(codeVerifier), + ); + + const identifier = generateRandomString(16, "A-Z", "a-z", "0-9"); + await (await auth.$context).adapter.create({ + model: "verification", + data: { + identifier: `electron:${identifier}`, + value: JSON.stringify({ + userId: user.id, + codeChallenge, + codeChallengeMethod: "s256", + state: "abc", + }), + expiresAt: new Date(Date.now() + 300 * 1000), + }, + }); + + // Make encryptString throw + mockElectron.safeStorage.encryptString.mockImplementationOnce(() => { + throw new Error("encryption failed"); + }); + + // Expect the token exchange to surface the error (encryption failure) + await expect( + client.$fetch("/electron/token", { + method: "POST", + body: { + token: identifier, + code_verifier: codeVerifier, + state: "abc", + }, + }), + ).rejects.toThrow("encryption failed"); + }); + + it("should quit when single instance lock not acquired", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + mockElectron.app.requestSingleInstanceLock.mockReturnValueOnce(false); + + client.setupMain({ + scheme: true, + }); + + expect(mockElectron.app.quit).toHaveBeenCalled(); + }); + + it("should log error when setAsDefaultProtocolClient fails", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + const original = mockElectron.app.setAsDefaultProtocolClient; + mockElectron.app.setAsDefaultProtocolClient.mockReturnValueOnce(false); + + const spy = vi.spyOn(console, "error").mockImplementation(() => {}); + + client.setupMain({ + scheme: true, + }); + + expect(mockElectron.app.setAsDefaultProtocolClient).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); + + spy.mockRestore(); + mockElectron.app.setAsDefaultProtocolClient = original; + }); + + it("should not duplicate CSP origin entry when already present", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + client.setupMain({ + csp: true, + }); + + // wait a tick for whenReady then-callback to run + await Promise.resolve(); + + const onHeadersReceived = + mockElectron.session.defaultSession.webRequest.onHeadersReceived; + expect(onHeadersReceived).toHaveBeenCalled(); + + const handler = onHeadersReceived.mock.calls[0][0]; + + const origin = "http://localhost:3000"; + const details = { + responseHeaders: { + "content-security-policy": [`connect-src 'self' ${origin}`], + }, + }; + + let callbackResult: any = null; + const callback = (res: any) => { + callbackResult = res; + }; + + // First invocation - policy already contains origin once + await handler(details, callback); + const firstPolicy = String( + callbackResult.responseHeaders["content-security-policy"], + ); + const firstCount = ( + firstPolicy.match( + new RegExp(origin.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), + ) || [] + ).length; + + // Invoke handler again with the policy that already contains the origin + callbackResult = null; + await handler(details, callback); + const secondPolicy = String( + callbackResult.responseHeaders["content-security-policy"], + ); + const secondCount = ( + secondPolicy.match( + new RegExp(origin.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), + ) || [] + ).length; + + // Origin should not be duplicated + expect(firstCount).toBeGreaterThanOrEqual(1); + expect(secondCount).toBe(firstCount); + }); + + it("should reject requestAuth when shell.openExternal fails", async ({ + setProcessType, + }) => { + setProcessType("browser"); + + mockElectron.shell.openExternal.mockRejectedValueOnce( + new Error("failed to open"), + ); + + await expect(client.requestAuth()).rejects.toThrow(); + }); +}); diff --git a/packages/electron/test/utils.ts b/packages/electron/test/utils.ts new file mode 100644 index 0000000000..cb33c6d286 --- /dev/null +++ b/packages/electron/test/utils.ts @@ -0,0 +1,127 @@ +/// + +import type { BetterAuthOptions } from "better-auth"; +import { betterAuth } from "better-auth"; +import type { FetchEsque } from "better-auth/client"; +import { createAuthClient } from "better-auth/client"; +import { getMigrations } from "better-auth/db/migration"; +import { oAuthProxy } from "better-auth/plugins"; +import Database from "better-sqlite3"; +import { afterAll, beforeAll, test, vi } from "vitest"; +import { electronClient } from "../src/client"; +import { electron } from "../src/index"; +import { electronProxyClient } from "../src/proxy"; +import type { ElectronClientOptions } from "../src/types/client"; + +export const it = test.extend<{ + setProcessType: (type: typeof process.type) => void; +}>({ + setProcessType: async ({}, use) => { + const originalType = process.type; + const originalVersions = process.versions; + + const assignProcessType = (type: typeof process.type) => { + Object.defineProperties(process, { + type: { + configurable: true, + get: () => type, + }, + versions: { + configurable: true, + get: () => ({ + ...originalVersions, + electron: "some-version", + }), + }, + }); + }; + + try { + await use(assignProcessType); + } finally { + Object.defineProperties(process, { + type: { configurable: true, value: originalType }, + versions: { configurable: true, value: originalVersions }, + }); + } + }, +}); + +function getTestInstance(overrideOpts?: BetterAuthOptions) { + const storage = new Map(); + const options = { + signInURL: "http://localhost:3000/sign-in", + protocol: { + scheme: "myapp", + }, + storage: { + getItem: (name) => { + return storage.get(name) || null; + }, + setItem: (name, value) => { + storage.set(name, value); + }, + }, + } satisfies ElectronClientOptions; + + const auth = betterAuth({ + baseURL: "http://localhost:3000", + database: new Database(":memory:"), + emailAndPassword: { + enabled: true, + }, + socialProviders: { + google: { + clientId: "test", + clientSecret: "test", + }, + }, + plugins: [electron(), oAuthProxy()], + trustedOrigins: ["myapp:/"], + ...(overrideOpts || {}), + }); + + const customFetchImpl: FetchEsque = (url, init) => { + const req = new Request(url.toString(), init); + return auth.handler(req); + }; + + const proxyClient = createAuthClient({ + baseURL: "http://localhost:3000", + fetchOptions: { + customFetchImpl, + }, + plugins: [electronProxyClient(options)], + }); + + const client = createAuthClient({ + baseURL: "http://localhost:3000", + fetchOptions: { + customFetchImpl, + }, + plugins: [electronClient(options)], + }); + + return { + auth, + proxyClient, + client, + options, + customFetchImpl, + }; +} + +export function testUtils(overrideOpts?: BetterAuthOptions) { + const testInstance = getTestInstance(overrideOpts); + + beforeAll(async () => { + const { runMigrations } = await getMigrations(testInstance.auth.options); + await runMigrations(); + vi.useFakeTimers(); + }); + afterAll(() => { + vi.useRealTimers(); + }); + + return testInstance; +} diff --git a/packages/electron/tsconfig.json b/packages/electron/tsconfig.json new file mode 100644 index 0000000000..7ff846acaf --- /dev/null +++ b/packages/electron/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["esnext", "dom", "dom.iterable"] + }, + "include": ["./src"], + "references": [ + { + "path": "../core/tsconfig.json" + } + ] +} diff --git a/packages/electron/tsdown.config.ts b/packages/electron/tsdown.config.ts new file mode 100644 index 0000000000..98ac9d6397 --- /dev/null +++ b/packages/electron/tsdown.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + dts: { build: true, incremental: true }, + format: ["esm"], + entry: [ + "./src/index.ts", + "./src/client.ts", + "./src/proxy.ts", + "./src/storage.ts", + ], + external: ["better-auth", "better-call", "@better-fetch/fetch", "electron"], + treeshake: true, +}); diff --git a/packages/electron/vitest.config.ts b/packages/electron/vitest.config.ts new file mode 100644 index 0000000000..c261d2b759 --- /dev/null +++ b/packages/electron/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineProject } from "vitest/config"; + +export default defineProject({ + test: { + server: { + deps: { + external: ["electron"], + }, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 767dd3a8ef..125729a430 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,6 +117,85 @@ importers: specifier: catalog:vitest version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.0)(@vitest/ui@4.0.18)(happy-dom@20.4.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.2.0)(typescript@5.9.3))(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + demo/electron: + dependencies: + '@better-auth/electron': + specifier: workspace:* + version: link:../../packages/electron + '@electron-toolkit/utils': + specifier: ^4.0.0 + version: 4.0.0(electron@39.5.1) + '@radix-ui/react-avatar': + specifier: ^1.1.11 + version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.4(@types/react@19.2.10)(react@19.2.4) + better-auth: + specifier: workspace:* + version: link:../../packages/better-auth + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + conf: + specifier: ^15.0.2 + version: 15.1.0 + electron-store: + specifier: ^11.0.2 + version: 11.0.2 + tailwind-merge: + specifier: ^3.3.1 + version: 3.4.0 + tailwindcss-animate: + specifier: catalog:tailwind + version: 1.0.7(tailwindcss@4.1.18) + devDependencies: + '@electron-toolkit/tsconfig': + specifier: ^2.0.0 + version: 2.0.0(@types/node@22.19.8) + '@tailwindcss/vite': + specifier: catalog:tailwind + version: 4.1.18(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@types/node': + specifier: ^22.19.1 + version: 22.19.8 + '@types/react': + specifier: catalog:react19 + version: 19.2.10 + '@types/react-dom': + specifier: catalog:react19 + version: 19.2.3(@types/react@19.2.10) + '@vitejs/plugin-react': + specifier: ^5.1.1 + version: 5.1.3(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + electron: + specifier: ^39.2.6 + version: 39.5.1 + electron-builder: + specifier: ^26.0.12 + version: 26.7.0(electron-builder-squirrel-windows@26.7.0) + electron-vite: + specifier: ^5.0.0 + version: 5.0.0(@swc/core@1.15.3)(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + react: + specifier: catalog:react19 + version: 19.2.4 + react-dom: + specifier: catalog:react19 + version: 19.2.4(react@19.2.4) + tailwindcss: + specifier: catalog:tailwind + version: 4.1.18 + typescript: + specifier: 'catalog:' + version: 5.9.3 + vite: + specifier: ^7.2.6 + version: 7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + demo/expo: dependencies: '@better-auth/expo': @@ -139,16 +218,16 @@ importers: version: 7.1.26(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@rn-primitives/avatar': specifier: ^1.1.0 - version: 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@rn-primitives/separator': specifier: ^1.1.0 - version: 1.2.0(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 1.2.0(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@rn-primitives/slot': specifier: ^1.1.0 - version: 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@rn-primitives/types': specifier: ^1.1.0 - version: 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@types/better-sqlite3': specifier: ^7.6.12 version: 7.6.13 @@ -184,7 +263,7 @@ importers: version: 8.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-router: specifier: ~6.0.22 - version: 6.0.22(193f004e4d1f794f3c17de7b0c4302be) + version: 6.0.22(71728b829b512756b00beaf554dc1af1) expo-secure-store: specifier: ~15.0.8 version: 15.0.8(expo@54.0.32) @@ -196,7 +275,7 @@ importers: version: 3.0.9(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-system-ui: specifier: ~6.0.9 - version: 6.0.9(expo@54.0.32)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0)) + version: 6.0.9(expo@54.0.32)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0)) expo-web-browser: specifier: ~15.0.10 version: 15.0.10(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0)) @@ -238,7 +317,7 @@ importers: version: 15.12.1(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-web: specifier: ~0.21.2 - version: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react-native-worklets: specifier: ^0.5.1 version: 0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) @@ -270,6 +349,9 @@ importers: '@better-auth/dash': specifier: ^0.1.6 version: 0.1.6(better-auth@packages+better-auth)(zod@4.3.6) + '@better-auth/electron': + specifier: workspace:* + version: link:../../packages/electron '@better-auth/oauth-provider': specifier: workspace:* version: link:../../packages/oauth-provider @@ -434,7 +516,7 @@ importers: version: 3.16.2 next: specifier: 16.1.6 - version: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -583,7 +665,7 @@ importers: version: link:../../packages/better-auth next: specifier: 16.1.6 - version: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: specifier: catalog:react19 version: 19.2.4 @@ -716,13 +798,13 @@ importers: version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@scalar/nextjs-api-reference': specifier: ^0.9.14 - version: 0.9.15(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4) + version: 0.9.15(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.50.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.46.1)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) + version: 1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.50.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.46.1)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3)) '@vercel/og': specifier: ^0.8.6 version: 0.8.6 @@ -758,19 +840,19 @@ importers: version: 12.29.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) fumadocs-core: specifier: 16.4.9 - version: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + version: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) fumadocs-mdx: specifier: 14.2.6 - version: 14.2.6(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.6(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-typescript: specifier: ^5.0.1 - version: 5.0.1(a7f9956228988da580bf3f255eb9d12e) + version: 5.0.1(b82f4d749b5fdd7dc1595c4a740ccc94) fumadocs-ui: specifier: 16.4.9 - version: 16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) + version: 16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) geist: specifier: ^1.5.1 - version: 1.5.1(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) + version: 1.5.1(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)) gray-matter: specifier: ^4.0.3 version: 4.0.3 @@ -785,7 +867,7 @@ importers: version: 1.4.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) jotai: specifier: ^2.16.2 - version: 2.16.2(@babel/core@7.28.6)(@babel/template@7.28.6)(@types/react@19.2.10)(react@19.2.4) + version: 2.16.2(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.10)(react@19.2.4) js-beautify: specifier: ^1.15.4 version: 1.15.4 @@ -803,7 +885,7 @@ importers: version: 12.29.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next: specifier: 16.1.6 - version: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -937,10 +1019,10 @@ importers: version: 0.30.6 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mongodb: specifier: ^7.0.0 - version: 7.0.0 + version: 7.0.0(socks@2.8.7) mysql2: specifier: ^3.16.2 version: 3.16.2 @@ -1064,7 +1146,7 @@ importers: version: 0.15.4(solid-js@1.9.11) '@solidjs/start': specifier: ^1.2.1 - version: 1.2.1(solid-js@1.9.11)(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.2.1(solid-js@1.9.11)(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) better-auth: specifier: workspace:* version: link:../../../packages/better-auth @@ -1073,7 +1155,7 @@ importers: version: 1.9.11 vinxi: specifier: ^0.5.11 - version: 0.5.11(af991c32974e6dfef2e6764239993deb) + version: 0.5.11(a59819f55c4935ff24bbe5864b6de9f1) devDependencies: '@better-auth-test/test-utils': specifier: workspace:* @@ -1135,7 +1217,7 @@ importers: version: link:../../../../../packages/better-auth drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) hono: specifier: ^4.11.6 version: 4.11.7 @@ -1282,7 +1364,7 @@ importers: version: 0.31.4 drizzle-orm: specifier: '>=0.41.0' - version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@5.22.0) + version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@5.22.0) jose: specifier: ^6.1.0 version: 6.1.3 @@ -1291,7 +1373,7 @@ importers: version: 0.28.10 mongodb: specifier: ^6.0.0 || ^7.0.0 - version: 7.0.0 + version: 7.0.0(socks@2.8.7) mysql2: specifier: ^3.0.0 version: 3.16.2 @@ -1439,7 +1521,7 @@ importers: version: 17.2.3 drizzle-orm: specifier: ^0.41.0 - version: 0.41.0(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.41.0(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) open: specifier: ^10.2.0 version: 10.2.0 @@ -1534,7 +1616,7 @@ importers: version: 0.3.1 drizzle-orm: specifier: '>=0.41.0' - version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) tsdown: specifier: 'catalog:' version: 0.20.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.17.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) @@ -1542,6 +1624,40 @@ importers: specifier: 'catalog:' version: 5.9.3 + packages/electron: + dependencies: + '@better-auth/utils': + specifier: 'catalog:' + version: 0.3.1 + '@better-fetch/fetch': + specifier: 'catalog:' + version: 1.1.21 + better-call: + specifier: 'catalog:' + version: 1.2.1(zod@4.3.6) + conf: + specifier: ^15.0.2 + version: 15.1.0 + zod: + specifier: ^4.3.5 + version: 4.3.6 + devDependencies: + '@better-auth/core': + specifier: workspace:* + version: link:../core + '@types/better-sqlite3': + specifier: ^7.6.13 + version: 7.6.13 + better-auth: + specifier: workspace:* + version: link:../better-auth + better-sqlite3: + specifier: ^12.6.2 + version: 12.6.2 + tsdown: + specifier: 'catalog:' + version: 0.20.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.17.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) + packages/expo: dependencies: '@better-fetch/fetch': @@ -1562,19 +1678,19 @@ importers: version: link:../better-auth expo-constants: specifier: ~18.0.13 - version: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) + version: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) expo-linking: specifier: ~8.0.11 - version: 8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + version: 8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) expo-network: specifier: ^8.0.8 version: 8.0.8(expo@54.0.32)(react@19.2.4) expo-web-browser: specifier: ~15.0.10 - version: 15.0.10(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) + version: 15.0.10(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) react-native: specifier: ~0.83.1 - version: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + version: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) tsdown: specifier: 'catalog:' version: 0.20.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.17.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) @@ -1634,7 +1750,7 @@ importers: version: 0.3.1 mongodb: specifier: ^7.0.0 - version: 7.0.0 + version: 7.0.0(socks@2.8.7) tsdown: specifier: 'catalog:' version: 0.20.1(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.17.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) @@ -1912,6 +2028,9 @@ importers: packages: + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@0no-co/graphql.web@1.2.0': resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} peerDependencies: @@ -2115,6 +2234,10 @@ packages: resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.6': resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} @@ -3274,6 +3397,10 @@ packages: resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} engines: {node: '>=18'} + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -3298,6 +3425,56 @@ packages: '@electric-sql/pglite@0.3.2': resolution: {integrity: sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==} + '@electron-toolkit/tsconfig@2.0.0': + resolution: {integrity: sha512-AdPsP770WhW7b260h13SHMdmjEEHJL6xFtgi3jwgdsSQbJOkJLeNnnpZW9qxTPCvmRI6vmdzWz5K3gibFS6SNg==} + peerDependencies: + '@types/node': '*' + + '@electron-toolkit/utils@4.0.0': + resolution: {integrity: sha512-qXSntwEzluSzKl4z5yFNBknmPGjPa3zFhE4mp9+h0cgokY5ornAeP+CJQDBhKsL1S58aOQfcwkD3NwLZCl+64g==} + peerDependencies: + electron: '>=13.0.0' + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + + '@electron/notarize@2.5.0': + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/rebuild@4.0.3': + resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -4786,6 +4963,14 @@ packages: '@lynx-js/types': optional: true + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + '@mapbox/node-pre-gyp@2.0.0': resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} engines: {node: '>=18'} @@ -4966,10 +5151,18 @@ packages: '@nothing-but/utils@0.17.0': resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/config@8.3.4': resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==} engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/git@5.0.8': resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6728,6 +6921,9 @@ packages: '@rolldown/pluginutils@1.0.0-rc.1': resolution: {integrity: sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==} + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -7262,6 +7458,10 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -7564,6 +7764,9 @@ packages: '@types/bun@1.3.8': resolution: {integrity: sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/canvas-confetti@1.9.0': resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} @@ -7624,6 +7827,9 @@ packages: '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/google.accounts@0.0.18': resolution: {integrity: sha512-yHaPznll97ZnMJlPABHyeiIlLn3u6gQaUjA5k/O9lrrpgFB9VT10CKPLuKM0qTHMl50uXpW5sIcG+utm8jMOHw==} @@ -7639,6 +7845,9 @@ packages: '@types/hosted-git-info@3.0.5': resolution: {integrity: sha512-Dmngh7U003cOHPhKGyA7LWqrnvcTyILNgNPmNCxlx7j8MIi54iBliiT8XqVLIQ3GchoOjVAyBzNJVyuaJjqokg==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -7663,6 +7872,9 @@ packages: '@types/jsrsasign@10.5.15': resolution: {integrity: sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -7693,6 +7905,9 @@ packages: '@types/pg@8.16.0': resolution: {integrity: sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==} + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/pluralize@0.0.30': resolution: {integrity: sha512-kVww6xZrW/db5BR9OqiT71J9huRdQ+z/r+LbDuT7/EK50mCmj5FoaIARnVv0rvjUS/YpDox0cDU9lpQT011VBA==} @@ -7725,6 +7940,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -7764,6 +7982,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} @@ -7885,6 +8106,12 @@ packages: peerDependencies: vite: ^4 || ^5 || ^6 || ^7 + '@vitejs/plugin-react@5.1.3': + resolution: {integrity: sha512-NVUnA6gQCl8jfoYqKqQU5Clv0aPw14KkZYCsX6T9Lfu9slI0LOU10OTwFHS/WmptsMMpshNd/1tuWsHQ2Uk+cg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-istanbul@4.0.18': resolution: {integrity: sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ==} peerDependencies: @@ -8063,6 +8290,14 @@ packages: ajv: optional: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -8126,6 +8361,16 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + + app-builder-lib@26.7.0: + resolution: {integrity: sha512-/UgCD8VrO79Wv8aBNpjMfsS1pIUfIPURoRn0Ik6tMe5avdZF+vQgl/juJgipcMmH3YS0BD573lCdCHyoi84USg==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.7.0 + electron-builder-squirrel-windows: 26.7.0 + appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} @@ -8180,6 +8425,10 @@ packages: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -8200,10 +8449,18 @@ packages: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} @@ -8213,6 +8470,16 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} + aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} @@ -8400,6 +8667,10 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} @@ -8456,6 +8727,13 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} + engines: {node: '>=12.0.0'} + + builder-util@26.4.1: + resolution: {integrity: sha512-FlgH43XZ50w3UtS1RVGDWOz8v9qMXPC7upMtKMtBEnYdt1OVoS61NYhKm/4x+cIaWqJTXua0+VVPI+fSPGXNIw==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -8499,6 +8777,18 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} @@ -8619,6 +8909,9 @@ packages: chromium-edge-launcher@0.2.0: resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -8672,6 +8965,10 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -8693,6 +8990,9 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -8746,6 +9046,10 @@ packages: colorspace@1.1.4: resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -8775,6 +9079,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -8793,6 +9101,10 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + compatx@0.2.0: resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} @@ -8818,6 +9130,10 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} + conf@15.1.0: + resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} + engines: {node: '>=20'} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -8881,6 +9197,9 @@ packages: core-js-compat@3.48.0: resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -8906,6 +9225,9 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -8914,6 +9236,9 @@ packages: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -9095,6 +9420,10 @@ packages: sqlite3: optional: true + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -9168,6 +9497,14 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -9176,9 +9513,17 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -9217,6 +9562,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + detective-amd@6.0.1: resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} engines: {node: '>=18'} @@ -9276,9 +9624,21 @@ packages: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} + dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dmg-builder@26.7.0: + resolution: {integrity: sha512-uOOBA3f+kW3o4KpSoMQ6SNpdXU7WtxlJRb9vCZgOvqhTz4b3GjcoWKstdisizNZLsylhTMv8TLHFPFW0Uxsj/g==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -9292,6 +9652,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + dot-prop@9.0.0: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} engines: {node: '>=18'} @@ -9538,9 +9902,49 @@ packages: effect@3.18.4: resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@26.7.0: + resolution: {integrity: sha512-3EqkQK+q0kGshdPSKEPb2p5F75TENMKu6Fe5aTdeaPfdzFK4Yjp5L0d6S7K8iyvqIsGQ/ei4bnpyX9wt+kVCKQ==} + + electron-builder@26.7.0: + resolution: {integrity: sha512-LoXbCvSFxLesPneQ/fM7FB4OheIDA2tjqCdUkKlObV5ZKGhYgi5VHPHO/6UUOUodAlg7SrkPx7BZJPby+Vrtbg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@26.6.0: + resolution: {integrity: sha512-LsyHMMqbvJ2vsOvuWJ19OezgF2ANdCiHpIucDHNiLhuI+/F3eW98ouzWSRmXXi82ZOPZXC07jnIravY4YYwCLQ==} + + electron-store@11.0.2: + resolution: {integrity: sha512-4VkNRdN+BImL2KcCi41WvAYbh6zLX5AUTi4so68yPqiItjbgTjqpEnGAqasgnG+lB6GuAyUltKwVopp6Uv+gwQ==} + engines: {node: '>=20'} + electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-vite@5.0.0: + resolution: {integrity: sha512-OHp/vjdlubNlhNkPkL/+3JD34ii5ov7M0GpuXEVdQeqdQ3ulvVR7Dg/rNBLfS5XPIFwgoBLDf9sjjrL+CuDyRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@swc/core': ^1.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@swc/core': + optional: true + + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@39.5.1: + resolution: {integrity: sha512-6s/sBQar+bbW59XSqohZj04MPic+kdVUAWjLbfQB/uLOeNw9jWX5FHaTxpHK29Xp3mKOHef7wErsjwMyCuWltg==} + engines: {node: '>= 12.20.55'} + hasBin: true + embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} peerDependencies: @@ -9595,6 +9999,9 @@ packages: encoding-sniffer@0.2.1: resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -9674,6 +10081,10 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-toolkit@1.39.10: resolution: {integrity: sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w==} @@ -10021,6 +10432,10 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + fast-check@3.23.2: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} @@ -10108,6 +10523,9 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -10177,6 +10595,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + formatly@0.3.0: resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} @@ -10236,10 +10658,30 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -10458,6 +10900,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -10466,6 +10912,10 @@ packages: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globby@14.1.0: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} @@ -10479,6 +10929,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -10524,10 +10978,17 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasha@5.2.2: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} @@ -10607,6 +11068,10 @@ packages: hookable@6.0.1: resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -10636,6 +11101,9 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -10655,6 +11123,10 @@ packages: http-status-codes@2.3.0: resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -10673,6 +11145,11 @@ packages: hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -10792,6 +11269,10 @@ packages: resolution: {integrity: sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==} engines: {node: '>=12.22.0'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -10968,6 +11449,14 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + isbot@5.1.34: resolution: {integrity: sha512-aCMIBSKd/XPRYdiCQTLC8QHH4YT8B3JUADu+7COgYIZPvkeoMcUHMRjZLM9/7V8fCj+l7FSREc1lOPNjzogo/A==} engines: {node: '>=18'} @@ -11014,6 +11503,11 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11133,6 +11627,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -11140,6 +11637,9 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -11149,6 +11649,9 @@ packages: json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -11160,6 +11663,9 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} @@ -11181,6 +11687,9 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -11237,6 +11746,9 @@ packages: launch-editor@2.12.0: resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -11548,6 +12060,10 @@ packages: lottie-web@5.13.0: resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} @@ -11561,6 +12077,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru.min@1.1.3: resolution: {integrity: sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} @@ -11609,6 +12129,10 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -11644,6 +12168,10 @@ packages: match-casing@2.0.1: resolution: {integrity: sha512-LeCq9FI5u4nppJnt4hklxcchkH9qH9+uFjX17f74a99lLkRXfVE49iL0hCtM5DZolps483viAy5zjvlTz/JNoA==} + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -11981,6 +12509,14 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -12016,6 +12552,30 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -12030,6 +12590,10 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -12247,9 +12811,19 @@ packages: resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} engines: {node: '>=10'} + node-abi@4.26.0: + resolution: {integrity: sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==} + engines: {node: '>=22.12.0'} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -12283,6 +12857,11 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -12333,6 +12912,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + npm-install-checks@6.3.0: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12410,6 +12993,10 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -12491,6 +13078,10 @@ packages: oxc-resolver@11.17.0: resolution: {integrity: sha512-R5P2Tw6th+nQJdNcZGfuppBS/sM0x1EukqYffmlfX2xXLgLGCCPwu4ruEr9Sx29mrpkHgITc130Qps2JR90NdQ==} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-event@6.0.1: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} engines: {node: '>=16.17'} @@ -12677,6 +13268,10 @@ packages: pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -12869,6 +13464,11 @@ packages: resolution: {integrity: sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==} engines: {node: '>=12'} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -12927,6 +13527,10 @@ packages: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -13047,6 +13651,10 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + quotation@2.0.3: resolution: {integrity: sha512-yEc24TEgCFLXx7D4JHJJkK4JFVtatO8fziwUxY4nB/Jbea9o9CVS3gt22mA0W7rPYAGW2fWzYDSOtD94PwOyqA==} @@ -13262,6 +13870,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -13328,6 +13940,10 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -13762,6 +14378,10 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -13774,6 +14394,9 @@ packages: '@react-email/render': optional: true + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -13808,6 +14431,9 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} @@ -13854,11 +14480,20 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + rolldown-plugin-dts@0.21.7: resolution: {integrity: sha512-u6mHPTxLzC/eU3hbFqu1Hd47if1zXITvNtbro5PRVqMe3tLzUkdeur87wRg8Y/bX5PYUUtPuGO815uHp8zi9uQ==} engines: {node: '>=20.19.0'} @@ -13935,6 +14570,9 @@ packages: samlify@2.10.2: resolution: {integrity: sha512-y5s1cHwclqwP8h7K2Wj9SfP1q+1S9+jrs5OAegYTLAiuFi7nDvuKqbiXLmUTvYPMpzHcX94wTY2+D604jgTKvA==} + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + sass@1.97.1: resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} engines: {node: '>=14.0.0'} @@ -13967,6 +14605,9 @@ packages: selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -14005,6 +14646,10 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -14111,6 +14756,10 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -14134,10 +14783,18 @@ packages: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + slugify@1.6.6: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} @@ -14145,6 +14802,14 @@ packages: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.9.11: resolution: {integrity: sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==} @@ -14232,6 +14897,10 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -14255,6 +14924,10 @@ packages: standardwebhooks@1.0.0: resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -14371,6 +15044,12 @@ packages: structured-headers@0.4.1: resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -14398,6 +15077,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -14489,6 +15172,10 @@ packages: engines: {node: '>=18'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + tarn@3.0.2: resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} @@ -14501,6 +15188,13 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} @@ -14550,6 +15244,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -14638,6 +15335,9 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -14737,6 +15437,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -14802,6 +15506,10 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -14891,6 +15599,14 @@ packages: resolution: {integrity: sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==} engines: {node: '>=18.12.0'} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -14932,6 +15648,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} @@ -15040,6 +15760,9 @@ packages: uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + urlpattern-polyfill@10.1.0: resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} @@ -15076,6 +15799,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -15135,6 +15861,10 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -15375,6 +16105,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -15388,6 +16121,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -15671,6 +16409,8 @@ packages: snapshots: + 7zip-bin@5.2.0: {} + '@0no-co/graphql.web@1.2.0(graphql@16.12.0)': optionalDependencies: graphql: 16.12.0 @@ -16022,6 +16762,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.28.6': dependencies: '@babel/parser': 7.28.6 @@ -16049,7 +16809,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-compilation-targets@7.28.6': dependencies: @@ -16072,6 +16832,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16079,6 +16852,13 @@ snapshots: regexpu-core: 6.3.1 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.3.1 + semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16086,6 +16866,13 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16097,18 +16884,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-module-imports@7.28.6': dependencies: @@ -16126,9 +16924,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.28.6': {} @@ -16141,6 +16948,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16150,10 +16966,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -16171,7 +16996,7 @@ snapshots: dependencies: '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -16243,11 +17068,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16257,41 +17096,81 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16302,66 +17181,131 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16373,6 +17317,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16382,6 +17331,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16392,6 +17350,16 @@ snapshots: - supports-color optional: true + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16401,6 +17369,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16411,6 +17388,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16419,6 +17401,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16427,6 +17417,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16447,12 +17445,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.28.6 + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16461,6 +17477,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16501,12 +17525,23 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16515,6 +17550,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16524,6 +17567,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16534,11 +17586,21 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16560,6 +17622,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16584,6 +17654,12 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16591,6 +17667,13 @@ snapshots: '@babel/helper-plugin-utils': 7.28.6 optional: true + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + optional: true + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16601,11 +17684,21 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16617,6 +17710,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16630,6 +17734,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16638,11 +17747,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16651,6 +17773,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16660,6 +17790,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16670,6 +17809,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16677,16 +17821,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16694,7 +17855,18 @@ snapshots: '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -16704,17 +17876,34 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 optional: true + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + optional: true + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16738,6 +17927,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16751,11 +17952,29 @@ snapshots: - supports-color optional: true + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16764,16 +17983,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + optional: true + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16790,6 +18028,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16807,6 +18056,12 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16908,6 +18163,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-react@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/preset-typescript@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -16919,6 +18186,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -17340,6 +18618,11 @@ snapshots: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + '@drizzle-team/brocli@0.10.2': {} '@egjs/hammerjs@2.0.17': @@ -17362,6 +18645,114 @@ snapshots: '@electric-sql/pglite@0.3.2': optional: true + '@electron-toolkit/tsconfig@2.0.0(@types/node@22.19.8)': + dependencies: + '@types/node': 22.19.8 + + '@electron-toolkit/utils@4.0.0(electron@39.5.1)': + dependencies: + electron: 39.5.1 + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.0.3': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + detect-libc: 2.1.2 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.26.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.3 + tar: 7.5.7 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.3.3 + minimatch: 9.0.5 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/windows-sign@1.2.2': + dependencies: + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.3.3 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 + transitivePeerDependencies: + - supports-color + optional: true + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -17905,7 +19296,7 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.19.0 optionalDependencies: - expo-router: 6.0.22(193f004e4d1f794f3c17de7b0c4302be) + expo-router: 6.0.22(71728b829b512756b00beaf554dc1af1) react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - bufferutil @@ -17913,7 +19304,7 @@ snapshots: - supports-color - utf-8-validate - '@expo/cli@54.0.22(expo-router@6.0.22)(expo@54.0.32)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))': + '@expo/cli@54.0.22(expo-router@6.0.22)(expo@54.0.32)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))': dependencies: '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) '@expo/code-signing-certificates': 0.0.6 @@ -17947,7 +19338,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3 env-editor: 0.4.2 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) expo-server: 1.0.5 freeport-async: 2.0.0 getenv: 2.0.0 @@ -17980,8 +19371,8 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.19.0 optionalDependencies: - expo-router: 6.0.22(5991a69924777df32846cf001cdadd07) - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + expo-router: 6.0.22(e89d5bee30cbc357dd12201c8dd32438) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) transitivePeerDependencies: - bufferutil - graphql @@ -18045,12 +19436,12 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - '@expo/devtools@0.1.8(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@expo/devtools@0.1.8(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) '@expo/env@2.0.8': dependencies: @@ -18120,7 +19511,7 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - bufferutil - supports-color @@ -18138,13 +19529,13 @@ snapshots: optionalDependencies: react-dom: 19.1.0(react@19.1.0) - '@expo/metro-runtime@6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@expo/metro-runtime@6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: anser: 1.4.10 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) pretty-format: 29.7.0 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: @@ -18201,7 +19592,7 @@ snapshots: '@expo/json-file': 10.0.8 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -18224,11 +19615,11 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - '@expo/vector-icons@15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@expo/vector-icons@15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: - expo-font: 14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo-font: 14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) '@expo/ws-tunnel@1.0.6': {} @@ -18267,9 +19658,9 @@ snapshots: '@formatjs/fast-memoize': 3.1.0 tslib: 2.8.1 - '@fumadocs/ui@16.4.9(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)': + '@fumadocs/ui@16.4.9(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)': dependencies: - fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) postcss-selector-parser: 7.1.1 react: 19.2.4 @@ -18277,7 +19668,7 @@ snapshots: tailwind-merge: 3.4.0 optionalDependencies: '@types/react': 19.2.10 - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) tailwindcss: 4.1.18 '@hapi/hoek@9.3.0': @@ -18576,10 +19967,10 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} - '@libsql/client@0.17.0': + '@libsql/client@0.17.0(encoding@0.1.13)': dependencies: '@libsql/core': 0.17.0 - '@libsql/hrana-client': 0.9.0 + '@libsql/hrana-client': 0.9.0(encoding@0.1.13) js-base64: 3.7.8 libsql: 0.5.22 promise-limit: 2.7.0 @@ -18631,10 +20022,10 @@ snapshots: - bufferutil - utf-8-validate - '@libsql/hrana-client@0.9.0': + '@libsql/hrana-client@0.9.0(encoding@0.1.13)': dependencies: '@libsql/isomorphic-ws': 0.1.5 - cross-fetch: 4.1.0 + cross-fetch: 4.1.0(encoding@0.1.13) js-base64: 3.7.8 node-fetch: 3.3.2 transitivePeerDependencies: @@ -18706,12 +20097,25 @@ snapshots: '@types/react': 19.2.10 preact: '@hongzhiyuan/preact@10.28.0-fc4af453' - '@mapbox/node-pre-gyp@2.0.0': + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': dependencies: consola: 3.4.2 detect-libc: 2.1.2 https-proxy-agent: 7.0.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 semver: 7.7.3 tar: 7.5.2 @@ -18858,12 +20262,12 @@ snapshots: write-file-atomic: 5.0.1 optional: true - '@netlify/functions@3.1.10(rollup@4.55.1)': + '@netlify/functions@3.1.10(encoding@0.1.13)(rollup@4.55.1)': dependencies: '@netlify/blobs': 9.1.2 '@netlify/dev-utils': 2.2.0 '@netlify/serverless-functions-api': 1.41.2 - '@netlify/zip-it-and-ship-it': 12.2.1(rollup@4.55.1) + '@netlify/zip-it-and-ship-it': 12.2.1(encoding@0.1.13)(rollup@4.55.1) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -18899,13 +20303,13 @@ snapshots: '@netlify/serverless-functions-api@2.2.1': {} - '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.55.1)': + '@netlify/zip-it-and-ship-it@12.2.1(encoding@0.1.13)(rollup@4.55.1)': dependencies: - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/types': 7.28.0 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.2.1 - '@vercel/nft': 0.29.4(rollup@4.55.1) + '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.55.1) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.1.0 @@ -18985,6 +20389,16 @@ snapshots: '@nothing-but/utils@0.17.0': {} + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/config@8.3.4': dependencies: '@npmcli/map-workspaces': 3.0.6 @@ -18998,6 +20412,10 @@ snapshots: transitivePeerDependencies: - bluebird + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.3 + '@npmcli/git@5.0.8': dependencies: '@npmcli/promise-spawn': 7.0.2 @@ -20759,6 +22177,14 @@ snapshots: - '@babel/core' - supports-color + '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/traverse': 7.28.6 + '@react-native/codegen': 0.81.5(@babel/core@7.29.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + '@react-native/babel-plugin-codegen@0.83.1(@babel/core@7.28.6)': dependencies: '@babel/traverse': 7.29.0 @@ -20768,6 +22194,15 @@ snapshots: - supports-color optional: true + '@react-native/babel-plugin-codegen@0.83.1(@babel/core@7.29.0)': + dependencies: + '@babel/traverse': 7.29.0 + '@react-native/codegen': 0.83.1(@babel/core@7.29.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + '@react-native/babel-preset@0.81.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20818,6 +22253,56 @@ snapshots: transitivePeerDependencies: - supports-color + '@react-native/babel-preset@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.29.0) + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + '@react-native/babel-preset@0.83.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20869,6 +22354,57 @@ snapshots: - supports-color optional: true + '@react-native/babel-preset@0.83.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.83.1(@babel/core@7.29.0) + babel-plugin-syntax-hermes-parser: 0.32.0 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + optional: true + '@react-native/codegen@0.81.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20879,10 +22415,31 @@ snapshots: nullthrows: 1.1.1 yargs: 17.7.2 + '@react-native/codegen@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.28.6 + glob: 7.2.3 + hermes-parser: 0.29.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + '@react-native/codegen@0.83.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 + glob: 7.2.3 + hermes-parser: 0.32.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + optional: true + + '@react-native/codegen@0.83.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 glob: 7.2.3 hermes-parser: 0.32.0 invariant: 2.2.4 @@ -20906,7 +22463,7 @@ snapshots: - supports-color - utf-8-validate - '@react-native/community-cli-plugin@0.83.1(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))': + '@react-native/community-cli-plugin@0.83.1(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))': dependencies: '@react-native/dev-middleware': 0.83.1 debug: 4.4.3 @@ -20917,7 +22474,7 @@ snapshots: semver: 7.7.3 optionalDependencies: '@react-native-community/cli': 20.0.2(typescript@5.9.3) - '@react-native/metro-config': 0.83.1(@babel/core@7.28.6) + '@react-native/metro-config': 0.83.1(@babel/core@7.29.0) transitivePeerDependencies: - bufferutil - supports-color @@ -20987,6 +22544,16 @@ snapshots: - supports-color optional: true + '@react-native/metro-babel-transformer@0.83.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@react-native/babel-preset': 0.83.1(@babel/core@7.29.0) + hermes-parser: 0.32.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + optional: true + '@react-native/metro-config@0.83.1(@babel/core@7.28.6)': dependencies: '@react-native/js-polyfills': 0.83.1 @@ -20998,6 +22565,17 @@ snapshots: - supports-color optional: true + '@react-native/metro-config@0.83.1(@babel/core@7.29.0)': + dependencies: + '@react-native/js-polyfills': 0.83.1 + '@react-native/metro-babel-transformer': 0.83.1(@babel/core@7.29.0) + metro-config: 0.83.3 + metro-runtime: 0.83.3 + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + '@react-native/normalize-colors@0.74.89': {} '@react-native/normalize-colors@0.81.5': {} @@ -21013,12 +22591,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.17 - '@react-native/virtualized-lists@0.83.1(@types/react@19.2.10)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@react-native/virtualized-lists@0.83.1(@types/react@19.2.10)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 @@ -21035,15 +22613,15 @@ snapshots: transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/bottom-tabs@7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@react-navigation/bottom-tabs@7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: - '@react-navigation/elements': 2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/elements': 2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) color: 4.2.3 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) - react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) + react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -21084,13 +22662,13 @@ snapshots: use-latest-callback: 0.2.6(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) - '@react-navigation/elements@2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@react-navigation/elements@2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: - '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) color: 4.2.3 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) - react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) + react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) use-latest-callback: 0.2.6(react@19.2.4) use-sync-external-store: 1.6.0(react@19.2.4) optional: true @@ -21109,15 +22687,15 @@ snapshots: transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/native-stack@7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@react-navigation/native-stack@7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: - '@react-navigation/elements': 2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/elements': 2.9.3(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) color: 4.2.3 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) - react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) + react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: @@ -21134,14 +22712,14 @@ snapshots: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) - '@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': + '@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4)': dependencies: '@react-navigation/core': 7.13.7(react@19.2.4) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 nanoid: 3.3.11 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) use-latest-callback: 0.2.6(react@19.2.4) optional: true @@ -21218,51 +22796,51 @@ snapshots: '@resvg/resvg-wasm@2.4.0': {} - '@rn-primitives/avatar@1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@rn-primitives/avatar@1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 optionalDependencies: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rn-primitives/hooks@1.3.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@rn-primitives/hooks@1.3.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 optionalDependencies: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rn-primitives/separator@1.2.0(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@rn-primitives/separator@1.2.0(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-separator': 1.1.8(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 optionalDependencies: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - react-dom - '@rn-primitives/slot@1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@rn-primitives/slot@1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rn-primitives/types@1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@rn-primitives/types@1.2.0(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@rolldown/binding-android-arm64@1.0.0-rc.1': optional: true @@ -21311,6 +22889,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.1': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rollup/plugin-alias@5.1.1(rollup@4.55.1)': optionalDependencies: rollup: 4.55.1 @@ -21455,10 +23035,10 @@ snapshots: '@scalar/helpers@0.2.9': {} - '@scalar/nextjs-api-reference@0.9.15(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)': + '@scalar/nextjs-api-reference@0.9.15(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)': dependencies: '@scalar/core': 0.3.34 - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 '@scalar/types@0.5.10': @@ -21705,11 +23285,11 @@ snapshots: dependencies: solid-js: 1.9.11 - '@solidjs/start@1.2.1(solid-js@1.9.11)(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@solidjs/start@1.2.1(solid-js@1.9.11)(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tanstack/server-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1)) cookie-es: 2.0.0 defu: 6.1.4 error-stack-parser: 2.1.4 @@ -21721,7 +23301,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.11) tinyglobby: 0.2.15 - vinxi: 0.5.11(af991c32974e6dfef2e6764239993deb) + vinxi: 0.5.11(a59819f55c4935ff24bbe5864b6de9f1) vite-plugin-solid: 2.11.8(solid-js@1.9.11)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -21838,6 +23418,10 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 @@ -21907,6 +23491,13 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.18 + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.18 @@ -21919,7 +23510,7 @@ snapshots: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@tanstack/router-utils': 1.154.7 babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 @@ -22040,7 +23631,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@tanstack/router-core': 1.157.16 '@tanstack/router-generator': 1.157.16 '@tanstack/router-utils': 1.154.7 @@ -22058,8 +23649,8 @@ snapshots: '@tanstack/router-utils@1.154.7': dependencies: '@babel/core': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 ansis: 4.2.0 diff: 8.0.3 pathe: 2.0.3 @@ -22075,7 +23666,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@tanstack/directive-functions-plugin': 1.121.21(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 @@ -22156,7 +23747,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.157.16 '@tanstack/router-generator': 1.157.16 @@ -22239,7 +23830,7 @@ snapshots: '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/better-sqlite3@7.6.13': dependencies: @@ -22260,6 +23851,13 @@ snapshots: dependencies: bun-types: 1.3.8 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 25.2.0 + '@types/responselike': 1.0.3 + '@types/canvas-confetti@1.9.0': {} '@types/chai@5.2.3': @@ -22326,6 +23924,10 @@ snapshots: '@types/express-serve-static-core': 5.1.1 '@types/serve-static': 2.2.0 + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 25.2.0 + '@types/google.accounts@0.0.18': {} '@types/graceful-fs@4.1.9': @@ -22340,6 +23942,8 @@ snapshots: '@types/hosted-git-info@3.0.5': {} + '@types/http-cache-semantics@4.2.0': {} + '@types/http-errors@2.0.5': {} '@types/is-empty@1.2.3': {} @@ -22360,6 +23964,10 @@ snapshots: '@types/jsrsasign@10.5.15': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 25.2.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -22396,6 +24004,12 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 + '@types/plist@3.0.5': + dependencies: + '@types/node': 25.2.0 + xmlbuilder: 15.1.1 + optional: true + '@types/pluralize@0.0.30': {} '@types/prismjs@1.26.5': {} @@ -22432,6 +24046,10 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/responselike@1.0.3': + dependencies: + '@types/node': 25.2.0 + '@types/semver@7.7.1': {} '@types/send@1.2.1': @@ -22463,6 +24081,9 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/verror@1.10.11': + optional: true + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-mimetype@3.0.2': {} @@ -22544,19 +24165,19 @@ snapshots: '@urql/core': 5.2.0(graphql@16.12.0) wonka: 6.3.5 - '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.50.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.46.1)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))': + '@vercel/analytics@1.6.1(@remix-run/react@2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@sveltejs/kit@2.50.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(svelte@5.46.1)(vue-router@4.6.4(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))': optionalDependencies: '@remix-run/react': 2.17.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@sveltejs/kit': 2.50.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 svelte: 5.46.1 vue: 3.5.27(typescript@5.9.3) vue-router: 4.6.4(vue@3.5.27(typescript@5.9.3)) - '@vercel/nft@0.29.4(rollup@4.55.1)': + '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.55.1)': dependencies: - '@mapbox/node-pre-gyp': 2.0.0 + '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) '@rollup/pluginutils': 5.2.0(rollup@4.55.1) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -22600,9 +24221,9 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1))': dependencies: - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) acorn-loose: 8.5.2 @@ -22611,18 +24232,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.11(af991c32974e6dfef2e6764239993deb) + vinxi: 0.5.11(a59819f55c4935ff24bbe5864b6de9f1) - '@vinxi/server-components@0.5.1(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb))': + '@vinxi/server-components@0.5.1(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(af991c32974e6dfef2e6764239993deb)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1)) acorn: 8.15.0 acorn-loose: 8.5.2 acorn-typescript: 1.4.13(acorn@8.15.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.11(af991c32974e6dfef2e6764239993deb) + vinxi: 0.5.11(a59819f55c4935ff24bbe5864b6de9f1) '@vitejs/plugin-react-swc@4.2.2(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: @@ -22632,6 +24253,18 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' + '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.2 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-istanbul@4.0.18(vitest@4.0.18)': dependencies: '@istanbuljs/schema': 0.1.3 @@ -22713,7 +24346,7 @@ snapshots: '@vue/compiler-core@3.5.27': dependencies: - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@vue/shared': 3.5.27 entities: 7.0.1 estree-walker: 2.0.2 @@ -22726,7 +24359,7 @@ snapshots: '@vue/compiler-sfc@3.5.27': dependencies: - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@vue/compiler-core': 3.5.27 '@vue/compiler-dom': 3.5.27 '@vue/compiler-ssr': 3.5.27 @@ -22873,6 +24506,17 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -22946,6 +24590,51 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + app-builder-bin@5.0.0-alpha.12: {} + + app-builder-lib@26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.3 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.7.0) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.7.0(dmg-builder@26.7.0) + electron-publish: 26.6.0 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.6.1 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.1.1 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.3 + tar: 7.5.7 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + appdirsjs@1.2.7: optional: true @@ -23007,6 +24696,9 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 + assert-plus@1.0.0: + optional: true + assertion-error@2.0.1: {} ast-kit@3.0.0-beta.1: @@ -23024,14 +24716,28 @@ snapshots: astral-regex@1.0.0: optional: true + astral-regex@2.0.0: + optional: true + astring@1.9.0: {} + async-exit-hook@2.0.1: {} + async-limiter@1.0.1: {} async-sema@3.1.1: {} async@3.2.6: {} + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atomically@2.1.0: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + aws-ssl-profiles@1.1.2: {} axobject-query@4.1.0: {} @@ -23041,9 +24747,9 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -23060,6 +24766,19 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.28.6 @@ -23073,7 +24792,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -23082,7 +24801,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 html-entities: 2.3.3 parse5: 7.3.0 validate-html-nesting: 1.2.3 @@ -23096,6 +24815,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): dependencies: '@babel/core': 7.28.6 @@ -23104,6 +24832,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + core-js-compat: 3.48.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.28.6): dependencies: '@babel/core': 7.28.6 @@ -23111,9 +24847,16 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + babel-plugin-react-compiler@1.0.0: dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 babel-plugin-react-native-web@0.21.2: {} @@ -23131,6 +24874,12 @@ snapshots: transitivePeerDependencies: - '@babel/core' + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.0): + dependencies: + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - '@babel/core' + babel-plugin-transform-import-meta@2.3.3(@babel/core@7.28.6): dependencies: '@babel/core': 7.28.6 @@ -23156,6 +24905,25 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.6) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + babel-preset-expo@54.0.10(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@54.0.32)(react-refresh@0.14.2): dependencies: '@babel/helper-module-imports': 7.28.6 @@ -23183,7 +24951,39 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.28.6 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + babel-preset-expo@54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.32)(react-refresh@0.14.2): + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.29.0) + '@babel/preset-react': 7.28.5(@babel/core@7.29.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) + '@react-native/babel-preset': 0.81.5(@babel/core@7.29.0) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) + debug: 4.4.3 + react-refresh: 0.14.2 + resolve-from: 5.0.0 + optionalDependencies: + '@babel/runtime': 7.28.6 + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/core' - supports-color @@ -23194,6 +24994,12 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.6) + babel-preset-jest@29.6.3(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-solid@1.9.9(@babel/core@7.28.6)(solid-js@1.9.11): dependencies: '@babel/core': 7.28.6 @@ -23311,6 +25117,9 @@ snapshots: boolbase@1.0.0: {} + boolean@3.2.0: + optional: true + boxen@8.0.1: dependencies: ansi-align: 3.0.1 @@ -23379,6 +25188,34 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + builder-util-runtime@9.5.1: + dependencies: + debug: 4.4.3 + sax: 1.4.4 + transitivePeerDependencies: + - supports-color + + builder-util@26.4.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.3 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + builtin-modules@3.3.0: {} bumpp@10.4.0(magicast@0.5.1): @@ -23483,6 +25320,33 @@ snapshots: cac@6.7.14: {} + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.5.7 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + caching-transform@4.0.0: dependencies: hasha: 5.2.2 @@ -23625,6 +25489,8 @@ snapshots: transitivePeerDependencies: - supports-color + chromium-pickle-js@0.2.0: {} + ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -23657,7 +25523,6 @@ snapshots: cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - optional: true cli-highlight@2.1.11: dependencies: @@ -23676,6 +25541,12 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + cli-width@4.1.0: {} client-only@0.0.1: {} @@ -23704,6 +25575,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clone@1.0.4: {} clsx@2.1.1: {} @@ -23761,6 +25636,10 @@ snapshots: color: 3.2.1 text-hex: 1.0.0 + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} command-exists@1.2.9: @@ -23778,6 +25657,8 @@ snapshots: commander@4.1.1: {} + commander@5.1.0: {} + commander@7.2.0: {} commander@9.5.0: @@ -23793,6 +25674,8 @@ snapshots: commondir@1.0.1: {} + compare-version@0.1.2: {} + compatx@0.2.0: {} compress-commons@6.0.2: @@ -23830,6 +25713,18 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 + conf@15.1.0: + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + atomically: 2.1.0 + debounce-fn: 6.0.0 + dot-prop: 10.1.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.2 + semver: 7.7.3 + uint8array-extras: 1.5.0 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -23884,6 +25779,9 @@ snapshots: dependencies: browserslist: 4.28.1 + core-util-is@1.0.2: + optional: true + core-util-is@1.0.3: {} cors@2.8.6: @@ -23908,21 +25806,29 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + cron-parser@4.9.0: dependencies: luxon: 3.7.1 croner@9.1.0: {} - cross-fetch@3.2.0: + cross-dirname@0.1.0: + optional: true + + cross-fetch@3.2.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - cross-fetch@4.1.0: + cross-fetch@4.1.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding optional: true @@ -24119,14 +26025,18 @@ snapshots: dayjs@1.11.19: optional: true - db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2): + db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2): optionalDependencies: '@electric-sql/pglite': 0.3.14 - '@libsql/client': 0.17.0 + '@libsql/client': 0.17.0(encoding@0.1.13) better-sqlite3: 12.6.2 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mysql2: 3.16.2 + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + debug@2.6.9: dependencies: ms: 2.0.0 @@ -24179,12 +26089,30 @@ snapshots: dependencies: clone: 1.0.4 + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + define-lazy-prop@2.0.0: {} define-lazy-prop@3.0.0: {} + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + defu@6.1.4: {} + delayed-stream@1.0.0: {} + denque@2.1.0: {} depd@2.0.0: {} @@ -24205,6 +26133,9 @@ snapshots: detect-node-es@1.1.0: {} + detect-node@2.1.0: + optional: true + detective-amd@6.0.1: dependencies: ast-module-types: 6.0.1 @@ -24274,8 +26205,38 @@ snapshots: diff@8.0.3: {} + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.2 + p-limit: 3.1.0 + dlv@1.1.3: {} + dmg-builder@26.7.0(electron-builder-squirrel-windows@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -24294,6 +26255,10 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@10.1.0: + dependencies: + type-fest: 5.4.2 + dot-prop@9.0.0: dependencies: type-fest: 4.41.0 @@ -24336,11 +26301,11 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260127.0 '@electric-sql/pglite': 0.3.14 - '@libsql/client': 0.17.0 + '@libsql/client': 0.17.0(encoding@0.1.13) '@opentelemetry/api': 1.9.0 '@prisma/client': 5.22.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) '@types/better-sqlite3': 7.6.13 @@ -24354,11 +26319,11 @@ snapshots: postgres: 3.4.8 prisma: 7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.5.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@5.22.0): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@5.22.0): optionalDependencies: '@cloudflare/workers-types': 4.20260127.0 '@electric-sql/pglite': 0.3.14 - '@libsql/client': 0.17.0 + '@libsql/client': 0.17.0(encoding@0.1.13) '@opentelemetry/api': 1.9.0 '@prisma/client': 5.22.0(prisma@5.22.0) '@types/better-sqlite3': 7.6.13 @@ -24372,11 +26337,11 @@ snapshots: postgres: 3.4.8 prisma: 5.22.0 - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260127.0 '@electric-sql/pglite': 0.3.14 - '@libsql/client': 0.17.0 + '@libsql/client': 0.17.0(encoding@0.1.13) '@opentelemetry/api': 1.9.0 '@prisma/client': 7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) '@types/better-sqlite3': 7.6.13 @@ -24423,8 +26388,89 @@ snapshots: fast-check: 3.23.2 optional: true + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@26.7.0(dmg-builder@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + electron-winstaller: 5.4.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@26.7.0(electron-builder-squirrel-windows@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + ci-info: 4.3.1 + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.7.0) + fs-extra: 10.1.0 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@26.6.0: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron-store@11.0.2: + dependencies: + conf: 15.1.0 + type-fest: 5.4.2 + electron-to-chromium@1.5.267: {} + electron-vite@5.0.0(@swc/core@1.15.3)(vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + cac: 6.7.14 + esbuild: 0.25.12 + magic-string: 0.30.21 + picocolors: 1.1.1 + vite: 7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + optionalDependencies: + '@swc/core': 1.15.3 + transitivePeerDependencies: + - supports-color + + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.17.21 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@39.5.1: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 22.19.8 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + embla-carousel-react@8.6.0(react@19.2.4): dependencies: embla-carousel: 8.6.0 @@ -24464,6 +26510,11 @@ snapshots: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -24481,8 +26532,7 @@ snapshots: env-editor@0.4.2: {} - env-paths@2.2.1: - optional: true + env-paths@2.2.1: {} env-paths@3.0.0: {} @@ -24528,6 +26578,13 @@ snapshots: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-toolkit@1.39.10: {} es6-error@4.1.1: {} @@ -24866,13 +26923,13 @@ snapshots: transitivePeerDependencies: - supports-color - expo-asset@12.0.12(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + expo-asset@12.0.12(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: '@expo/image-utils': 0.8.8 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) transitivePeerDependencies: - supports-color @@ -24885,12 +26942,12 @@ snapshots: transitivePeerDependencies: - supports-color - expo-constants@18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)): + expo-constants@18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)): dependencies: '@expo/config': 12.0.13 '@expo/env': 2.0.8 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) transitivePeerDependencies: - supports-color @@ -24904,10 +26961,10 @@ snapshots: expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - expo-file-system@19.0.21(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)): + expo-file-system@19.0.21(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)): dependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) expo-font@14.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: @@ -24916,12 +26973,12 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) fontfaceobserver: 2.3.0 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) expo-keep-awake@15.0.8(expo@54.0.32)(react@19.1.0): dependencies: @@ -24930,7 +26987,7 @@ snapshots: expo-keep-awake@15.0.8(expo@54.0.32)(react@19.2.4): dependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) react: 19.2.4 expo-linking@8.0.11(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): @@ -24943,12 +27000,12 @@ snapshots: - expo - supports-color - expo-linking@8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + expo-linking@8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: - expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) invariant: 2.2.4 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) transitivePeerDependencies: - expo - supports-color @@ -24967,18 +27024,18 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - expo-modules-core@3.0.29(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + expo-modules-core@3.0.29(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: invariant: 2.2.4 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) expo-network@8.0.8(expo@54.0.32)(react@19.2.4): dependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) react: 19.2.4 - expo-router@6.0.22(193f004e4d1f794f3c17de7b0c4302be): + expo-router@6.0.22(71728b829b512756b00beaf554dc1af1): dependencies: '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@expo/schema-utils': 0.1.8 @@ -25014,28 +27071,28 @@ snapshots: react-dom: 19.1.0(react@19.1.0) react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-reanimated: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@types/react' - '@types/react-dom' - supports-color - expo-router@6.0.22(5991a69924777df32846cf001cdadd07): + expo-router@6.0.22(e89d5bee30cbc357dd12201c8dd32438): dependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) '@expo/schema-utils': 0.1.8 '@radix-ui/react-slot': 1.2.0(@types/react@19.2.10)(react@19.2.4) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-navigation/bottom-tabs': 7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - '@react-navigation/native-stack': 7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/bottom-tabs': 7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/native': 7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-navigation/native-stack': 7.9.0(@react-navigation/native@7.1.26(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) client-only: 0.0.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) - expo-linking: 8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) + expo-linking: 8.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) expo-server: 1.0.5 fast-deep-equal: 3.1.3 invariant: 2.2.4 @@ -25043,10 +27100,10 @@ snapshots: query-string: 7.1.3 react: 19.2.4 react-fast-compare: 3.2.2 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) - react-native-is-edge-to-edge: 1.2.1(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) + react-native-is-edge-to-edge: 1.2.1(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-safe-area-context: 5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-screens: 4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) semver: 7.6.3 server-only: 0.0.1 sf-symbols-typescript: 2.2.0 @@ -25055,9 +27112,9 @@ snapshots: vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-native-gesture-handler: 2.30.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-reanimated: 4.2.1(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-web: 0.21.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-native-gesture-handler: 2.30.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-reanimated: 4.2.1(react-native-worklets@0.5.1(@babel/core@7.29.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@types/react' @@ -25084,14 +27141,14 @@ snapshots: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-system-ui@6.0.9(expo@54.0.32)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0)): + expo-system-ui@6.0.9(expo@54.0.32)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0)): dependencies: '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) optionalDependencies: - react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - supports-color @@ -25100,10 +27157,10 @@ snapshots: expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - expo-web-browser@15.0.10(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)): + expo-web-browser@15.0.10(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)): dependencies: - expo: 54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + expo: 54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) expo@54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: @@ -25140,33 +27197,33 @@ snapshots: - supports-color - utf-8-validate - expo@54.0.32(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + expo@54.0.32(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.22)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: '@babel/runtime': 7.28.6 - '@expo/cli': 54.0.22(expo-router@6.0.22)(expo@54.0.32)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) + '@expo/cli': 54.0.22(expo-router@6.0.22)(expo@54.0.32)(graphql@16.12.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) '@expo/config': 12.0.13 '@expo/config-plugins': 54.0.4 - '@expo/devtools': 0.1.8(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@expo/devtools': 0.1.8(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) '@expo/fingerprint': 0.15.4 '@expo/metro': 54.2.0 '@expo/metro-config': 54.0.14(expo@54.0.32) - '@expo/vector-icons': 15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@expo/vector-icons': 15.0.3(expo-font@14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.10(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@54.0.32)(react-refresh@0.14.2) - expo-asset: 12.0.12(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) - expo-file-system: 19.0.21(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4)) - expo-font: 14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.32)(react-refresh@0.14.2) + expo-asset: 12.0.12(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo-constants: 18.0.13(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) + expo-file-system: 19.0.21(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4)) + expo-font: 14.0.11(expo@54.0.32)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) expo-keep-awake: 15.0.8(expo@54.0.32)(react@19.2.4) expo-modules-autolinking: 3.0.24 - expo-modules-core: 3.0.29(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + expo-modules-core: 3.0.29(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) pretty-format: 29.7.0 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 optionalDependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.2.4(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -25232,6 +27289,9 @@ snapshots: transitivePeerDependencies: - supports-color + extsprintf@1.4.1: + optional: true + fast-check@3.23.2: dependencies: pure-rand: 6.1.0 @@ -25278,9 +27338,9 @@ snapshots: fbjs-css-vars@1.0.2: {} - fbjs@3.0.5: + fbjs@3.0.5(encoding@0.1.13): dependencies: - cross-fetch: 3.2.0 + cross-fetch: 3.2.0(encoding@0.1.13) fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 @@ -25319,6 +27379,10 @@ snapshots: file-uri-to-path@1.0.0: {} + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -25394,6 +27458,14 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + formatly@0.3.0: dependencies: fd-package-json: 2.0.0 @@ -25433,12 +27505,40 @@ snapshots: fs-constants@1.0.0: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - optional: true + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 fs.realpath@1.0.0: {} @@ -25448,7 +27548,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): + fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): dependencies: '@formatjs/intl-localematcher': 0.8.0 '@orama/orama': 3.1.18 @@ -25475,21 +27575,21 @@ snapshots: '@types/react': 19.2.10 algoliasearch: 5.46.2 lucide-react: 0.563.0(react@19.2.4) - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) zod: 4.3.6 transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.6(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.6(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react@19.2.4)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.27.2 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) js-yaml: 4.1.1 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 @@ -25504,16 +27604,16 @@ snapshots: zod: 4.3.6 optionalDependencies: '@types/react': 19.2.10 - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) react: 19.2.4 vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - fumadocs-typescript@5.0.1(a7f9956228988da580bf3f255eb9d12e): + fumadocs-typescript@5.0.1(b82f4d749b5fdd7dc1595c4a740ccc94): dependencies: estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 react: 19.2.4 @@ -25525,13 +27625,13 @@ snapshots: unist-util-visit: 5.1.0 optionalDependencies: '@types/react': 19.2.10 - fumadocs-ui: 16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) + fumadocs-ui: 16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) transitivePeerDependencies: - supports-color - fumadocs-ui@16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18): + fumadocs-ui@16.4.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18): dependencies: - '@fumadocs/ui': 16.4.9(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) + '@fumadocs/ui': 16.4.9(@types/react@19.2.10)(fumadocs-core@16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18) '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25543,7 +27643,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) class-variance-authority: 0.7.1 - fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.4.9(@oramacloud/client@2.1.4)(@tanstack/react-router@1.157.16(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.10)(algoliasearch@5.46.2)(lucide-react@0.563.0(react@19.2.4))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) lucide-react: 0.563.0(react@19.2.4) next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 @@ -25552,16 +27652,20 @@ snapshots: scroll-into-view-if-needed: 3.1.0 optionalDependencies: '@types/react': 19.2.10 - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) tailwindcss: 4.1.18 transitivePeerDependencies: - '@types/react-dom' function-bind@1.1.2: {} + geist@1.5.1(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): + dependencies: + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + geist@1.5.1(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): dependencies: - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) gel@2.2.0: dependencies: @@ -25677,6 +27781,16 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + optional: true + global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -25685,6 +27799,12 @@ snapshots: dependencies: ini: 1.3.8 + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + globby@14.1.0: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -25700,6 +27820,20 @@ snapshots: gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + graceful-fs@4.2.11: {} grammex@3.1.12: @@ -25763,8 +27897,17 @@ snapshots: has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasha@5.2.2: dependencies: is-stream: 2.0.1 @@ -25885,6 +28028,10 @@ snapshots: hookable@6.0.1: {} + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -25921,6 +28068,8 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@4.2.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -25949,6 +28098,11 @@ snapshots: http-status-codes@2.3.0: optional: true + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -25965,6 +28119,12 @@ snapshots: hyphenate-style-name@1.1.0: {} + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -26071,6 +28231,8 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} iron-webcrypto@1.2.1: {} @@ -26125,8 +28287,7 @@ snapshots: dependencies: is-docker: 3.0.0 - is-interactive@1.0.0: - optional: true + is-interactive@1.0.0: {} is-module@1.0.0: {} @@ -26164,8 +28325,7 @@ snapshots: is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: - optional: true + is-unicode-supported@0.1.0: {} is-url-superb@4.0.0: {} @@ -26195,6 +28355,10 @@ snapshots: isarray@1.0.0: {} + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + isbot@5.1.34: {} isexe@2.0.0: {} @@ -26210,7 +28374,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -26261,6 +28425,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -26290,7 +28460,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -26350,9 +28520,9 @@ snapshots: jose@6.1.3: {} - jotai@2.16.2(@babel/core@7.28.6)(@babel/template@7.28.6)(@types/react@19.2.10)(react@19.2.4): + jotai@2.16.2(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.10)(react@19.2.4): optionalDependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/template': 7.28.6 '@types/react': 19.2.10 react: 19.2.4 @@ -26398,17 +28568,24 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: optional: true json-parse-even-better-errors@3.0.2: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} json-schema@0.4.0: {} + json-stringify-safe@5.0.1: + optional: true + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -26416,7 +28593,12 @@ snapshots: jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - optional: true + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 jsonwebtoken@9.0.3: dependencies: @@ -26448,6 +28630,10 @@ snapshots: jwt-decode@4.0.0: {} + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -26499,6 +28685,8 @@ snapshots: shell-quote: 1.8.3 optional: true + lazy-val@1.0.5: {} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -26768,7 +28956,6 @@ snapshots: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - optional: true logform@2.7.0: dependencies: @@ -26802,6 +28989,8 @@ snapshots: lottie-web@5.13.0: {} + lowercase-keys@2.0.0: {} + lowlight@3.3.0: dependencies: '@types/hast': 3.0.4 @@ -26816,6 +29005,10 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru.min@1.1.3: {} lru.min@1.1.4: @@ -26833,14 +29026,14 @@ snapshots: magicast@0.2.11: dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 recast: 0.23.11 magicast@0.3.5: dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 source-map-js: 1.2.1 magicast@0.5.1: @@ -26878,6 +29071,22 @@ snapshots: dependencies: semver: 7.7.3 + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -26907,6 +29116,11 @@ snapshots: match-casing@2.0.1: {} + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + math-intrinsics@1.1.0: {} mcp-handler@1.0.7(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1)): @@ -26916,7 +29130,7 @@ snapshots: commander: 11.1.0 redis: 4.7.1 optionalDependencies: - next: 16.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) + next: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1) mdast-comment-marker@3.0.0: dependencies: @@ -27265,7 +29479,7 @@ snapshots: metro-transform-plugins@0.83.3: dependencies: '@babel/core': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.0 '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 flow-enums-runtime: 0.0.6 @@ -27276,9 +29490,9 @@ snapshots: metro-transform-worker@0.83.3: dependencies: '@babel/core': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 metro: 0.83.3 metro-babel-transformer: 0.83.3 @@ -27297,11 +29511,11 @@ snapshots: dependencies: '@babel/code-frame': 7.28.6 '@babel/core': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -27625,8 +29839,7 @@ snapshots: mime@1.6.0: {} - mime@2.6.0: - optional: true + mime@2.6.0: {} mime@3.0.0: {} @@ -27634,11 +29847,14 @@ snapshots: mimic-fn@1.2.0: {} - mimic-fn@2.1.0: - optional: true + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} mini-svg-data-uri@1.4.4: {} @@ -27677,6 +29893,34 @@ snapshots: minimist@1.2.8: {} + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@7.1.2: {} minizlib@3.1.0: @@ -27687,6 +29931,10 @@ snapshots: mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mkdirp@1.0.4: {} mlly@1.7.4: @@ -27709,11 +29957,13 @@ snapshots: '@types/whatwg-url': 13.0.0 whatwg-url: 14.2.0 - mongodb@7.0.0: + mongodb@7.0.0(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.4.5 bson: 7.1.1 mongodb-connection-string-url: 7.0.0 + optionalDependencies: + socks: 2.8.7 motion-dom@12.29.2: dependencies: @@ -27905,10 +30155,66 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.12.4(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@netlify/blobs@10.5.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2)(rolldown@1.0.0-rc.1): + next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.18 + caniuse-lite: 1.0.30001766 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.58.0 + babel-plugin-react-compiler: 1.0.0 + sass: 1.97.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.1): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.18 + caniuse-lite: 1.0.30001766 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.58.0 + babel-plugin-react-compiler: 1.0.0 + sass: 1.97.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nitropack@2.12.4(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.16.2)(rolldown@1.0.0-rc.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 - '@netlify/functions': 3.1.10(rollup@4.55.1) + '@netlify/functions': 3.1.10(encoding@0.1.13)(rollup@4.55.1) '@rollup/plugin-alias': 5.1.1(rollup@4.55.1) '@rollup/plugin-commonjs': 28.0.6(rollup@4.55.1) '@rollup/plugin-inject': 5.0.5(rollup@4.55.1) @@ -27916,7 +30222,7 @@ snapshots: '@rollup/plugin-node-resolve': 16.0.1(rollup@4.55.1) '@rollup/plugin-replace': 6.0.2(rollup@4.55.1) '@rollup/plugin-terser': 0.4.4(rollup@4.55.1) - '@vercel/nft': 0.29.4(rollup@4.55.1) + '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.55.1) archiver: 7.0.1 c12: 3.3.3(magicast@0.3.5) chokidar: 4.0.3 @@ -27927,7 +30233,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.1.0 crossws: 0.3.5 - db0: 0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2) + db0: 0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2) defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 @@ -27973,7 +30279,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 5.2.0 unplugin-utils: 0.2.5 - unstorage: 1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2) + unstorage: 1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2) untyped: 2.0.0 unwasm: 0.3.11 youch: 4.1.0-beta.8 @@ -28034,8 +30340,19 @@ snapshots: dependencies: semver: 7.7.3 + node-abi@4.26.0: + dependencies: + semver: 7.7.3 + + node-addon-api@1.7.2: + optional: true + node-addon-api@7.1.1: {} + node-api-version@0.2.1: + dependencies: + semver: 7.7.3 + node-domexception@1.0.0: {} node-emoji@2.2.0: @@ -28047,9 +30364,11 @@ snapshots: node-fetch-native@1.6.7: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -28061,6 +30380,21 @@ snapshots: node-gyp-build@4.8.4: {} + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.2 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.5.7 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + node-int64@0.4.0: {} node-mock-http@1.0.2: {} @@ -28077,7 +30411,7 @@ snapshots: node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 node-stream-zip@1.15.0: optional: true @@ -28104,6 +30438,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@6.1.0: {} + npm-install-checks@6.3.0: dependencies: semver: 7.7.3 @@ -28211,6 +30547,9 @@ snapshots: object-inspect@1.13.4: {} + object-keys@1.1.1: + optional: true + obug@2.1.1: {} ofetch@1.4.1: @@ -28246,7 +30585,6 @@ snapshots: onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - optional: true onetime@6.0.0: dependencies: @@ -28314,7 +30652,6 @@ snapshots: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - optional: true outvariant@1.4.3: {} @@ -28341,6 +30678,8 @@ snapshots: '@oxc-resolver/binding-win32-ia32-msvc': 11.17.0 '@oxc-resolver/binding-win32-x64-msvc': 11.17.0 + p-cancelable@2.1.1: {} + p-event@6.0.1: dependencies: p-timeout: 6.1.4 @@ -28441,7 +30780,7 @@ snapshots: parse-json@7.1.1: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 @@ -28535,6 +30874,8 @@ snapshots: dependencies: through: 2.3.8 + pe-library@0.4.1: {} + peberminta@0.9.0: {} pend@1.2.0: {} @@ -28705,6 +31046,11 @@ snapshots: postgres@3.4.8: {} + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -28804,6 +31150,8 @@ snapshots: proc-log@4.2.0: {} + proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} process-on-spawn@1.1.0: @@ -28847,7 +31195,6 @@ snapshots: graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7 - optional: true property-information@7.1.0: {} @@ -28919,6 +31266,8 @@ snapshots: dependencies: inherits: 2.0.4 + quick-lru@5.1.1: {} + quotation@2.0.3: {} quote-unquote@1.0.0: {} @@ -29053,13 +31402,13 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-gesture-handler@2.30.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-gesture-handler@2.30.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: '@egjs/hammerjs': 2.0.17 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) optional: true react-native-is-edge-to-edge@1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): @@ -29067,10 +31416,10 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge@1.2.1(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-is-edge-to-edge@1.2.1(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) optional: true react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): @@ -29082,12 +31431,12 @@ snapshots: react-native-worklets: 0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) semver: 7.7.2 - react-native-reanimated@4.2.1(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-reanimated@4.2.1(react-native-worklets@0.5.1(@babel/core@7.29.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4))(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) - react-native-is-edge-to-edge: 1.2.1(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) - react-native-worklets: 0.5.1(@babel/core@7.28.6)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) + react-native-is-edge-to-edge: 1.2.1(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + react-native-worklets: 0.5.1(@babel/core@7.29.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) semver: 7.7.3 optional: true @@ -29096,10 +31445,10 @@ snapshots: react: 19.1.0 react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) - react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-safe-area-context@5.6.2(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) optional: true react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): @@ -29110,11 +31459,11 @@ snapshots: react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) warn-once: 0.1.1 - react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-screens@4.20.0(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 react-freeze: 1.0.4(react@19.2.4) - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) warn-once: 0.1.1 optional: true @@ -29126,11 +31475,11 @@ snapshots: react-native: 0.81.5(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.1.17)(react@19.1.0) warn-once: 0.1.1 - react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@babel/runtime': 7.28.6 '@react-native/normalize-colors': 0.74.89 - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) inline-style-prefixer: 7.0.1 memoize-one: 6.0.0 nullthrows: 1.1.1 @@ -29141,11 +31490,11 @@ snapshots: transitivePeerDependencies: - encoding - react-native-web@0.21.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@babel/runtime': 7.28.6 '@react-native/normalize-colors': 0.74.89 - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) inline-style-prefixer: 7.0.1 memoize-one: 6.0.0 nullthrows: 1.1.1 @@ -29176,21 +31525,21 @@ snapshots: transitivePeerDependencies: - supports-color - react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): + react-native-worklets@0.5.1(@babel/core@7.29.0)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4): dependencies: - '@babel/core': 7.28.6 - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) convert-source-map: 2.0.0 react: 19.2.4 - react-native: 0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4) + react-native: 0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4) semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -29243,20 +31592,20 @@ snapshots: - supports-color - utf-8-validate - react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4): + react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.83.1 - '@react-native/codegen': 0.83.1(@babel/core@7.28.6) - '@react-native/community-cli-plugin': 0.83.1(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6)) + '@react-native/codegen': 0.83.1(@babel/core@7.29.0) + '@react-native/community-cli-plugin': 0.83.1(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0)) '@react-native/gradle-plugin': 0.83.1 '@react-native/js-polyfills': 0.83.1 '@react-native/normalize-colors': 0.83.1 - '@react-native/virtualized-lists': 0.83.1(@types/react@19.2.10)(react-native@0.83.1(@babel/core@7.28.6)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.28.6))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) + '@react-native/virtualized-lists': 0.83.1(@types/react@19.2.10)(react-native@0.83.1(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.83.1(@babel/core@7.29.0))(@types/react@19.2.10)(react@19.2.4))(react@19.2.4) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.28.6) + babel-jest: 29.7.0(@babel/core@7.29.0) babel-plugin-syntax-hermes-parser: 0.32.0 base64-js: 1.5.1 commander: 12.1.0 @@ -29308,6 +31657,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.18.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.1.17)(react@19.1.0): dependencies: react: 19.1.0 @@ -29391,6 +31742,12 @@ snapshots: react@19.2.4: {} + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -30460,6 +32817,10 @@ snapshots: requires-port@1.0.0: {} + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + reselect@5.1.1: {} resend@6.9.1(@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): @@ -30469,6 +32830,8 @@ snapshots: optionalDependencies: '@react-email/render': 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -30499,6 +32862,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + restore-cursor@2.0.0: dependencies: onetime: 2.0.1 @@ -30508,7 +32875,6 @@ snapshots: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - optional: true retext-contractions@6.0.0: dependencies: @@ -30594,10 +32960,24 @@ snapshots: reusify@1.1.0: {} + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + rimraf@3.0.2: dependencies: glob: 7.2.3 + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + rolldown-plugin-dts@0.21.7(oxc-resolver@11.17.0)(rolldown@1.0.0-rc.1)(typescript@5.9.3): dependencies: '@babel/generator': 8.0.0-beta.4 @@ -30718,6 +33098,10 @@ snapshots: xml-escape: 1.1.0 xpath: 0.0.32 + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + sass@1.97.1: dependencies: chokidar: 4.0.3 @@ -30762,9 +33146,11 @@ snapshots: dependencies: parseley: 0.12.1 - semver@5.7.2: + semver-compare@1.0.0: optional: true + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -30811,6 +33197,11 @@ snapshots: serialize-error@2.1.0: {} + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -30970,6 +33361,10 @@ snapshots: dependencies: is-arrayish: 0.3.2 + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.3 + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -30993,12 +33388,34 @@ snapshots: is-fullwidth-code-point: 2.0.0 optional: true + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + slugify@1.6.6: {} + smart-buffer@4.2.0: {} + smob@1.5.0: {} smol-toml@1.6.0: {} + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + solid-js@1.9.11: dependencies: csstype: 3.2.3 @@ -31007,9 +33424,9 @@ snapshots: solid-refresh@0.6.3(solid-js@1.9.11): dependencies: - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.0 '@babel/helper-module-imports': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 solid-js: 1.9.11 transitivePeerDependencies: - supports-color @@ -31081,6 +33498,10 @@ snapshots: srvx@0.10.1: {} + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + stack-trace@0.0.10: {} stack-utils@2.0.6: @@ -31102,6 +33523,8 @@ snapshots: '@stablelib/base64': 1.0.1 fast-sha256: 1.3.0 + stat-mode@1.0.0: {} + statuses@1.5.0: {} statuses@2.0.2: {} @@ -31209,6 +33632,12 @@ snapshots: structured-headers@0.4.1: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -31224,6 +33653,18 @@ snapshots: optionalDependencies: '@babel/core': 7.28.6 + styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + optionalDependencies: + '@babel/core': 7.29.0 + + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + styleq@0.1.3: {} sucrase@3.35.1: @@ -31236,6 +33677,12 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + supports-color@10.2.2: {} supports-color@5.5.0: @@ -31368,6 +33815,14 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + tarn@3.0.2: {} tedious@18.6.1: @@ -31387,6 +33842,16 @@ snapshots: temp-dir@2.0.0: {} + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + terminal-link@2.1.1: dependencies: ansi-escapes: 4.3.2 @@ -31436,6 +33901,10 @@ snapshots: through@2.3.8: {} + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tiny-inflate@1.0.3: {} tiny-invariant@1.3.3: {} @@ -31501,6 +33970,10 @@ snapshots: trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -31594,6 +34067,9 @@ snapshots: type-detect@4.0.8: {} + type-fest@0.13.1: + optional: true + type-fest@0.21.3: {} type-fest@0.7.1: {} @@ -31644,6 +34120,8 @@ snapshots: ufo@1.6.3: {} + uint8array-extras@1.5.0: {} + ultrahtml@1.6.0: {} unconfig-core@7.4.2: @@ -31793,6 +34271,14 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.2.5 + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -31847,8 +34333,9 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.1.2: - optional: true + universalify@0.1.2: {} + + universalify@2.0.1: {} unixify@1.0.0: dependencies: @@ -31874,7 +34361,7 @@ snapshots: optionalDependencies: synckit: 0.11.11 - unstorage@1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2): + unstorage@1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -31887,7 +34374,7 @@ snapshots: optionalDependencies: '@azure/identity': 4.13.0 '@netlify/blobs': 10.5.0 - db0: 0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2) + db0: 0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2) ioredis: 5.9.2 until-async@3.0.2: {} @@ -31923,6 +34410,10 @@ snapshots: uqr@0.1.2: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + urlpattern-polyfill@10.1.0: {} urlpattern-polyfill@8.0.2: {} @@ -31974,6 +34465,8 @@ snapshots: dependencies: react: 19.2.4 + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -32025,6 +34518,13 @@ snapshots: - '@types/react' - '@types/react-dom' + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -32078,7 +34578,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.11(af991c32974e6dfef2e6764239993deb): + vinxi@0.5.11(a59819f55c4935ff24bbe5864b6de9f1): dependencies: '@babel/core': 7.28.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) @@ -32099,7 +34599,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.12.4(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@netlify/blobs@10.5.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2)(rolldown@1.0.0-rc.1) + nitropack: 2.12.4(@azure/identity@4.13.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@netlify/blobs@10.5.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(encoding@0.1.13)(mysql2@3.16.2)(rolldown@1.0.0-rc.1) node-fetch-native: 1.6.7 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -32111,7 +34611,7 @@ snapshots: ufo: 1.6.3 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2) + unstorage: 1.16.1(@azure/identity@4.13.0)(@netlify/blobs@10.5.0)(db0@0.3.2(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(better-sqlite3@12.6.2)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260127.0)(@electric-sql/pglite@0.3.14)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.8)(gel@2.2.0)(kysely@0.28.10)(mysql2@3.16.2)(pg@8.16.3)(postgres@3.4.8)(prisma@7.2.0(@types/react@19.2.10)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(mysql2@3.16.2))(ioredis@5.9.2) vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) zod: 4.3.6 transitivePeerDependencies: @@ -32188,6 +34688,25 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + vite@7.3.1(@types/node@22.19.8)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.8 + fsevents: 2.3.3 + jiti: 2.6.1 + less: 4.5.1 + lightningcss: 1.30.2 + sass: 1.97.1 + terser: 5.44.1 + tsx: 4.21.0 + yaml: 2.8.2 + vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -32382,6 +34901,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + when-exit@2.1.5: {} + which-module@2.0.1: {} which@2.0.2: @@ -32392,6 +34913,10 @@ snapshots: dependencies: isexe: 3.1.1 + which@5.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 123da784ef..fa9e6ac7da 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -40,6 +40,8 @@ onlyBuiltDependencies: - '@prisma/engines' - '@swc/core' - better-sqlite3 + - electron + - electron-winstaller - esbuild - less - msw