From cd5cdf41685604eb1fb44cedcf4cc28d974852d7 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 24 Dec 2025 23:38:15 +0800 Subject: [PATCH] docs: use data table for community plugin list (#6953) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- .cspell/names.txt | 16 +- docs/components/community-plugins-table.tsx | 351 ++++++++++++++++++ .../docs/plugins/community-plugins.mdx | 19 +- docs/package.json | 1 + pnpm-lock.yaml | 38 +- 5 files changed, 400 insertions(+), 25 deletions(-) create mode 100644 docs/components/community-plugins-table.tsx diff --git a/.cspell/names.txt b/.cspell/names.txt index cd9519006e..5fa6714c46 100644 --- a/.cspell/names.txt +++ b/.cspell/names.txt @@ -3,4 +3,18 @@ Oskar Gmerek Lluis Agusti -Vijit \ No newline at end of file +Vijit +TPEOficial +GeKorm +Daanish2003 +marcellosso +tobimori +zpg6 +kevcube +erickweil +TheUntraceable +yultyyev +Fyrlex +alexasomba +Vijit +neiii diff --git a/docs/components/community-plugins-table.tsx b/docs/components/community-plugins-table.tsx new file mode 100644 index 0000000000..fd9463d5a6 --- /dev/null +++ b/docs/components/community-plugins-table.tsx @@ -0,0 +1,351 @@ +"use client"; + +import type { + ColumnDef, + ColumnFiltersState, + SortingState, +} from "@tanstack/react-table"; +import { + flexRender, + getCoreRowModel, + getFilteredRowModel, + getSortedRowModel, + useReactTable, +} from "@tanstack/react-table"; +import { ArrowUpDown, Search } from "lucide-react"; +import { useState } from "react"; + +export interface CommunityPlugin { + name: string; + url: string; + description: string; + author: { + name: string; + github: string; + avatar: string; + }; +} + +const columns: ColumnDef[] = [ + { + accessorKey: "name", + header: ({ column }) => { + return ( + + ); + }, + cell: ({ row }) => { + return ( + + {row.original.name} + + ); + }, + }, + { + accessorKey: "description", + header: "Description", + cell: ({ row }) => { + return ( +
+ {row.original.description} +
+ ); + }, + }, + { + accessorKey: "author.name", + header: ({ column }) => { + return ( + + ); + }, + cell: ({ row }) => { + const author = row.original.author; + return ( + + {author.name} + {author.name} + + ); + }, + }, +]; + +export const communityPlugins: CommunityPlugin[] = [ + { + name: "@dymo-api/better-auth", + url: "https://github.com/TPEOficial/dymo-api-better-auth", + description: + "Sign Up Protection and validation of disposable emails (the world's largest database with nearly 14 million entries).", + author: { + name: "TPEOficial", + github: "TPEOficial", + avatar: "https://github.com/TPEOficial.png", + }, + }, + { + name: "better-auth-harmony", + url: "https://github.com/gekorm/better-auth-harmony/", + description: + "Email & phone normalization and additional validation, blocking over 55,000 temporary email domains.", + author: { + name: "GeKorm", + github: "GeKorm", + avatar: "https://github.com/GeKorm.png", + }, + }, + { + name: "validation-better-auth", + url: "https://github.com/Daanish2003/validation-better-auth", + description: + "Validate API request using any validation library (e.g., Zod, Yup)", + author: { + name: "Daanish2003", + github: "Daanish2003", + avatar: "https://github.com/Daanish2003.png", + }, + }, + { + name: "better-auth-localization", + url: "https://github.com/marcellosso/better-auth-localization", + description: + "Localize and customize better-auth messages with easy translation and message override support.", + author: { + name: "marcellosso", + github: "marcellosso", + avatar: "https://github.com/marcellosso.png", + }, + }, + { + name: "better-auth-attio-plugin", + url: "https://github.com/tobimori/better-auth-attio-plugin", + description: "Sync your products Better Auth users & workspaces with Attio", + author: { + name: "tobimori", + github: "tobimori", + avatar: "https://github.com/tobimori.png", + }, + }, + { + name: "better-auth-cloudflare", + url: "https://github.com/zpg6/better-auth-cloudflare", + description: + "Seamlessly integrate with Cloudflare Workers, D1, Hyperdrive, KV, R2, and geolocation services. Includes CLI for project generation, automated resource provisioning on Cloudflare, and database migrations. Supports Next.js, Hono, and more!", + author: { + name: "zpg6", + github: "zpg6", + avatar: "https://github.com/zpg6.png", + }, + }, + { + name: "expo-better-auth-passkey", + url: "https://github.com/kevcube/expo-better-auth-passkey", + description: + "Better-auth client plugin for using passkeys on mobile platforms in expo apps. Supports iOS, macOS, Android (and web!) by wrapping the existing better-auth passkey client plugin.", + author: { + name: "kevcube", + github: "kevcube", + avatar: "https://github.com/kevcube.png", + }, + }, + { + name: "better-auth-credentials-plugin", + url: "https://github.com/erickweil/better-auth-credentials-plugin", + description: "LDAP authentication plugin for Better Auth.", + author: { + name: "erickweil", + github: "erickweil", + avatar: "https://github.com/erickweil.png", + }, + }, + { + name: "better-auth-opaque", + url: "https://github.com/TheUntraceable/better-auth-opaque", + description: + "Provides database-breach resistant authentication using the zero-knowledge OPAQUE protocol.", + author: { + name: "TheUntraceable", + github: "TheUntraceable", + avatar: "https://github.com/theuntraceable.png", + }, + }, + { + name: "better-auth-firebase-auth", + url: "https://github.com/yultyyev/better-auth-firebase-auth", + description: + "Firebase Authentication plugin for Better Auth with built-in email service, Google Sign-In, and password reset functionality.", + author: { + name: "yultyyev", + github: "yultyyev", + avatar: "https://github.com/yultyyev.png", + }, + }, + { + name: "better-auth-university", + url: "https://github.com/LuyxLLC/better-auth-university", + description: + "University plugin for allowing only specific email domains to be passed through. Includes a University model with name and domain.", + author: { + name: "Fyrlex", + github: "Fyrlex", + avatar: "https://github.com/Fyrlex.png", + }, + }, + { + name: "@alexasomba/better-auth-paystack", + url: "https://github.com/alexasomba/better-auth-paystack", + description: + "Paystack plugin for Better Auth — integrates Paystack transactions, webhooks, and subscription flows.", + author: { + name: "alexasomba", + github: "alexasomba", + avatar: "https://github.com/alexasomba.png", + }, + }, + { + name: "better-auth-lark", + url: "https://github.com/uselark/better-auth-lark", + description: + "Lark billing plugin that automatically creates customers and subscribes them to free plans on signup.", + author: { + name: "Vijit", + github: "vijit-lark", + avatar: "https://github.com/vijit-lark.png", + }, + }, + { + name: "stargate-better-auth", + url: "https://github.com/neiii/stargate-better-auth", + description: + "Gate access to resources based on whether the user has starred a repository", + author: { + name: "neiii", + github: "neiii", + avatar: "https://github.com/neiii.png", + }, + }, +]; +export function CommunityPluginsTable() { + const [sorting, setSorting] = useState([]); + const [columnFilters, setColumnFilters] = useState([]); + const [globalFilter, setGlobalFilter] = useState(""); + + const table = useReactTable({ + data: communityPlugins, + columns, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onGlobalFilterChange: setGlobalFilter, + state: { + sorting, + columnFilters, + globalFilter, + }, + }); + + return ( +
+
+ + setGlobalFilter(e.target.value)} + className="w-full rounded-lg border bg-background pl-10 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring" + /> +
+ +
+
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + ))} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + ))} + + )) + ) : ( + + + + )} + +
+ {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext(), + )} +
+ {flexRender( + cell.column.columnDef.cell, + cell.getContext(), + )} +
+ No plugins found. +
+
+
+ +
+
+ Showing {table.getRowModel().rows.length} of {communityPlugins.length}{" "} + plugins +
+
+
+ ); +} diff --git a/docs/content/docs/plugins/community-plugins.mdx b/docs/content/docs/plugins/community-plugins.mdx index 0d4bc4b79b..4fdc05353f 100644 --- a/docs/content/docs/plugins/community-plugins.mdx +++ b/docs/content/docs/plugins/community-plugins.mdx @@ -3,25 +3,12 @@ title: Community Plugins description: A list of recommended community plugins. --- +import { CommunityPluginsTable } from "@/components/community-plugins-table"; + This page showcases a list of recommended community made plugins. We encourage you to create custom plugins and maybe get added to the list! To create your own custom plugin, get started by reading our [plugins documentation](/docs/concepts/plugins). And if you want to share your plugin with the community, please open a pull request to add it to this list. -|
Plugin
| Description |
Author
| -| ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [@dymo-api/better-auth](https://github.com/TPEOficial/dymo-api-better-auth) | Sign Up Protection and validation of disposable emails (the world's largest database with nearly 14 million entries). | [TPEOficial](https://github.com/TPEOficial) | -| [better-auth-harmony](https://github.com/gekorm/better-auth-harmony/) | Email & phone normalization and additional validation, blocking over 55,000 temporary email domains. | [GeKorm](https://github.com/GeKorm) | -| [validation-better-auth](https://github.com/Daanish2003/validation-better-auth) | Validate API request using any validation library (e.g., Zod, Yup) | [Daanish2003](https://github.com/Daanish2003) | -| [better-auth-localization](https://github.com/marcellosso/better-auth-localization) | Localize and customize better-auth messages with easy translation and message override support. | [marcellosso](https://github.com/marcellosso) | -| [better-auth-attio-plugin](https://github.com/tobimori/better-auth-attio-plugin) | Sync your products Better Auth users & workspaces with Attio | [tobimori](https://github.com/tobimori) | -| [better-auth-cloudflare](https://github.com/zpg6/better-auth-cloudflare) | Seamlessly integrate with Cloudflare Workers, D1, Hyperdrive, KV, R2, and geolocation services. Includes CLI for project generation, automated resource provisioning on Cloudflare, and database migrations. Supports Next.js, Hono, and more! | [zpg6](https://github.com/zpg6) | -| [expo-better-auth-passkey](https://github.com/kevcube/expo-better-auth-passkey) | Better-auth client plugin for using passkeys on mobile platforms in expo apps. Supports iOS, macOS, Android (and web!) by wrapping the existing better-auth passkey client plugin. | [kevcube](https://github.com/kevcube) | -| [better-auth-credentials-plugin](https://github.com/erickweil/better-auth-credentials-plugin) | LDAP authentication plugin for Better Auth. | [erickweil](https://github.com/erickweil) | -| [better-auth-opaque](https://github.com/TheUntraceable/better-auth-opaque) | Provides database-breach resistant authentication using the zero-knowledge OPAQUE protocol. | [TheUntraceable](https://github.com/TheUntraceable) | -| [better-auth-firebase-auth](https://github.com/yultyyev/better-auth-firebase-auth) | Firebase Authentication plugin for Better Auth with built-in email service, Google Sign-In, and password reset functionality. | [yultyyev](https://github.com/yultyyev) | -| [better-auth-university](https://github.com/LuyxLLC/better-auth-university) | University plugin for allowing only specific email domains to be passed through. Includes a University model with name and domain. | [Fyrlex](https://github.com/Fyrlex) | -| [@alexasomba/better-auth-paystack](https://github.com/alexasomba/better-auth-paystack) | Paystack plugin for Better Auth — integrates Paystack transactions, webhooks, and subscription flows. | [alexasomba](https://github.com/alexasomba) | -| [better-auth-lark](https://github.com/uselark/better-auth-lark) | [Lark billing](https://docs.uselark.ai/) plugin that automatically creates customers and subscribes them to free plans on signup.| [Vijit](https://github.com/vijit-lark) | -| [stargate-better-auth](https://github.com/neiii/stargate-better-auth) | Gate access to resources based on whether the user has starred a repository | [neiii](https://github.com/neiii) | + diff --git a/docs/package.json b/docs/package.json index b3eff39786..e72f9ce2ec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -47,6 +47,7 @@ "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@scalar/nextjs-api-reference": "^0.8.17", + "@tanstack/react-table": "^8.21.3", "@vercel/analytics": "^1.5.0", "@vercel/og": "^0.8.5", "ai": "^5.0.64", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6a8e4fe06..02987a245e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -401,7 +401,7 @@ importers: version: 12.23.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) geist: specifier: ^1.4.2 - version: 1.4.2(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) + version: 1.4.2(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -513,7 +513,7 @@ importers: version: 2.1.1 geist: specifier: ^1.4.2 - version: 1.4.2(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) + version: 1.4.2(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) lucide-react: specifier: ^0.542.0 version: 0.542.0(react@19.2.3) @@ -702,6 +702,9 @@ importers: '@scalar/nextjs-api-reference': specifier: ^0.8.17 version: 0.8.17(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0))(react@19.2.3) + '@tanstack/react-table': + specifier: ^8.21.3 + version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@vercel/analytics': specifier: ^1.5.0 version: 1.5.0(@remix-run/react@2.17.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(@sveltejs/kit@2.37.1(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.2)))(svelte@5.38.2)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.2)))(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0))(react@19.2.3)(svelte@5.38.2)(vue-router@4.5.1(vue@3.5.19(typescript@5.9.3)))(vue@3.5.19(typescript@5.9.3)) @@ -755,7 +758,7 @@ importers: version: 15.8.3(@oramacloud/client@2.1.4)(@tanstack/react-router@1.139.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(algoliasearch@5.36.0)(lucide-react@0.542.0(react@19.2.3))(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18) geist: specifier: ^1.4.2 - version: 1.4.2(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) + version: 1.4.2(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)) gray-matter: specifier: ^4.0.3 version: 4.0.3 @@ -6530,6 +6533,13 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + '@tanstack/router-core@1.139.7': resolution: {integrity: sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==} engines: {node: '>=12'} @@ -6592,6 +6602,10 @@ packages: '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + '@tanstack/virtual-file-routes@1.139.0': resolution: {integrity: sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==} engines: {node: '>=12'} @@ -16655,7 +16669,7 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@4.1.13))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) + expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@3.25.76))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) transitivePeerDependencies: - bufferutil - supports-color @@ -16740,7 +16754,7 @@ snapshots: '@expo/json-file': 10.0.7 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@4.1.13))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) + expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@3.25.76))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -19999,6 +20013,12 @@ snapshots: react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) + '@tanstack/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/table-core': 8.21.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + '@tanstack/router-core@1.139.7': dependencies: '@tanstack/history': 1.139.0 @@ -20147,6 +20167,8 @@ snapshots: '@tanstack/store@0.8.0': {} + '@tanstack/table-core@8.21.3': {} + '@tanstack/virtual-file-routes@1.139.0': {} '@ts-morph/common@0.27.0': @@ -21073,7 +21095,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.28.4 - expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@4.1.13))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) + expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@3.25.76))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -22709,7 +22731,7 @@ snapshots: expo-keep-awake@15.0.7(expo@54.0.21)(react@19.2.3): dependencies: - expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@4.1.13))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) + expo: 54.0.21(@babel/core@7.28.4)(@expo/metro-runtime@6.1.2)(@modelcontextprotocol/sdk@1.25.1(hono@4.10.2)(zod@3.25.76))(expo-router@6.0.14)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@react-native/metro-config@0.81.0(@babel/core@7.28.4))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3) react: 19.2.3 expo-linking@7.1.7(expo@54.0.21)(react-native@0.80.2(@babel/core@7.28.4)(@react-native-community/cli@20.0.1(typescript@5.9.3))(@types/react@19.2.2)(react@19.2.3))(react@19.2.3): @@ -23401,7 +23423,7 @@ snapshots: function-bind@1.1.2: {} - geist@1.4.2(next@16.0.10(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)): + geist@1.4.2(next@16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)): dependencies: next: 16.0.10(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.90.0)