diff --git a/.changeset/native-router-metro-adapter.md b/.changeset/native-router-metro-adapter.md new file mode 100644 index 0000000000..835a89bec8 --- /dev/null +++ b/.changeset/native-router-metro-adapter.md @@ -0,0 +1,11 @@ +--- +'@tanstack/react-native-router': minor +'@tanstack/router-core': minor +'@tanstack/router-generator': minor +'@tanstack/router-plugin': minor +'@tanstack/react-start': minor +'@tanstack/start-plugin-core': minor +'@tanstack/history': patch +--- + +Add the experimental React Native router adapter with native stack support, a React Native route-generation target, and Metro integrations for Router file routes and Start server-function transforms. diff --git a/.gitignore b/.gitignore index a8970f3db8..2fead638e1 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,8 @@ vite.config.ts.timestamp_* **/llms **/.tanstack - # eslint-plugin-start perf fixtures /e2e/eslint-plugin-start/src/perf/generated + +**/ios/** +**/android/** diff --git a/.npmrc b/.npmrc index 268c392d3c..d45000dc8a 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,8 @@ provenance=true + +# Hoist @babel/* runtime helpers to workspace root so Metro (which has trouble +# walking pnpm's nested .pnpm/@/node_modules layout) can resolve +# them via standard node_modules upward traversal. Required for the +# react-native example. Additive — does not change resolution for other +# packages. +public-hoist-pattern[]=@babel/runtime diff --git a/docs/router/config.json b/docs/router/config.json index fd564ceb28..07dfa9d786 100644 --- a/docs/router/config.json +++ b/docs/router/config.json @@ -258,6 +258,10 @@ { "label": "Render Optimizations", "to": "guide/render-optimizations" + }, + { + "label": "React Native (Native Stack)", + "to": "guide/react-native-native-stack" } ], "frameworks": [ diff --git a/docs/router/guide/react-native-native-stack.md b/docs/router/guide/react-native-native-stack.md new file mode 100644 index 0000000000..15f1a92266 --- /dev/null +++ b/docs/router/guide/react-native-native-stack.md @@ -0,0 +1,390 @@ +--- +title: React Native Native Stack +--- + +This guide documents the React Native package and native stack behavior powered by `react-native-screens`. + +## Package + +Install `@tanstack/react-native-router` and provide a native history: + +```tsx +import { + createRouter, + createNativeHistory, +} from '@tanstack/react-native-router/core' + +export const router = createRouter({ + routeTree, + history: createNativeHistory(), +}) +``` + +Render with `NativeRouterProvider`: + +```tsx +import { NativeRouterProvider } from '@tanstack/react-native-router' +; +``` + +## File-Based Routing (Metro Plugin) + +`@tanstack/router-plugin/metro` wraps your Metro config so the route tree +generates on startup and regenerates as you edit routes. Works for both +stock React Native and Expo (Expo Go and Expo Dev Client) — Expo's +bundler is Metro. + +Install: + +```bash +npm install --save-dev @tanstack/router-plugin @tanstack/router-cli +``` + +`@tanstack/router-cli` is required because the plugin shells out to it for +the initial blocking route generation when Metro starts. + +### Expo + +```js +// metro.config.js +const { getDefaultConfig } = require('expo/metro-config') +const { withTanStackRouter } = require('@tanstack/router-plugin/metro') + +const config = getDefaultConfig(__dirname) +// ...any other Metro customizations... + +module.exports = withTanStackRouter(config) +``` + +### Stock React Native + +```js +// metro.config.js +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') +const { withTanStackRouter } = require('@tanstack/router-plugin/metro') + +const defaultConfig = getDefaultConfig(__dirname) + +module.exports = withTanStackRouter( + mergeConfig(defaultConfig, { + // any custom Metro config... + }), +) +``` + +Add a `tsr.config.json` at the project root: + +```json +{ + "target": "react-native", + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts" +} +``` + +That's it — `expo start` (or `npx react-native start`) now generates the +route tree before bundling and watches `routesDirectory` for changes. +You don't need to run `tanstack-router-cli watch` separately. + +### Options + +`withTanStackRouter` accepts a second argument: + +```js +module.exports = withTanStackRouter(config, { + // Override tsr.config.json values inline: + config: { routesDirectory: './app/routes' }, + + // Project root (defaults to process.cwd()): + root: __dirname, + + // Skip the file watcher (defaults to dev only): + watch: false, + + // Skip the blocking initial generate (defaults to true). Use this if + // you generate routes out-of-band, e.g. as a CI step: + initialGenerate: false, +}) +``` + +### Behavior notes + +- **Synchronous return.** The function returns the (unmodified) config + object immediately. This matters for Expo's Metro CLI, which reads + config fields synchronously before awaiting promises. +- **Initial generation is blocking.** The plugin spawns a subprocess of + `@tanstack/router-cli generate` and waits for it. This typically adds + ~300ms to the first metro config load. +- **Watch mode is async.** Started in the background in dev. Route file + changes regenerate the tree; Metro's own watcher then triggers a fast + refresh. + +## Reference Examples + +The matrix of supported runtime combinations lives at +[`examples/react-native/`](https://github.com/TanStack/router/tree/main/examples/react-native): + +- **`bare`** — stock React Native + Metro (no Expo). Real native iOS + project committed. +- **`expo-go`** — Expo with the Expo Go app (no custom native build). + Router only. +- **`expo-dev-client`** — Expo with `expo run:ios` custom dev client. + Recommended for most apps. Supports the full Router + Start matrix. + +Each example ships Maestro flow skeletons under `.maestro/` for e2e +verification of navigation and deep linking. + +## Deep Linking + +Configure deep linking on `router` `native` options. `NativeRouterProvider` +will wire React Native's `Linking` API automatically. + +```tsx +import { + createRouter, + createNativeHistory, +} from '@tanstack/react-native-router' + +const router = createRouter({ + routeTree, + history: createNativeHistory(), + native: { + linking: { + prefixes: ['myapp://', 'https://myapp.com'], + }, + }, +}) +``` + +Default behavior: + +- `getInitialURL()` is applied once on mount with `push` +- initial deep-link `push` does not animate by default +- runtime URL events are applied with `push` +- URLs are parsed into router hrefs (`/path?query#hash`) + +Supported linking options: + +- `enabled`: enable/disable built-in linking (default `true`) +- `prefixes`: app URL prefixes to match before parsing +- `filter(url)`: ignore specific URLs +- `parseUrl(url)`: custom URL -> router href mapping +- `getInitialURL()`: override initial URL source +- `subscribe(listener)`: override runtime URL subscription source +- `initialMode`: `'replace' | 'push'` for initial URL +- `initialAnimate`: whether initial deep-link push animates (default `false`) +- `incomingMode`: `'replace' | 'push'` for runtime URLs +- `onUnhandledUrl(url)`: callback for ignored/unmatched URLs +- `onError(error, url?)`: callback for parse/navigation errors + +Disable built-in linking: + +```tsx +const router = createRouter({ + routeTree, + history: createNativeHistory(), + native: { + linking: false, + }, +}) +``` + +## Route `native` Options + +Routes can define React Native presentation and lifecycle behavior under `native`: + +```tsx +createRoute({ + path: 'posts/$postId', + native: { + presentation: 'push', + gestureEnabled: true, + animation: 'slide_from_right', + minStackState: 'paused', + }, +}) +``` + +`native` also supports a function form (similar to `head`) so options can be +derived from dynamic match data, including `loaderData`: + +```tsx +createRoute({ + path: 'posts/$postId', + loader: ({ params }) => fetchPost(params.postId), + native: ({ loaderData, params }) => ({ + title: + (loaderData as { title?: string } | undefined)?.title ?? + `Post #${params.postId}`, + headerTintColor: '#fff', + }), +}) +``` + +Supported fields: + +- `presentation`: native screen presentation (`push`, `modal`, etc.) +- `gestureEnabled`: enables native back swipe gestures where supported +- `animation`: native stack animation +- `minStackState`: per-entry minimum (`paused` or `active`) +- `defaultMinStackState`: default minimum for this route and descendants + +`native` options are inherited through matched route ancestors. Child routes +override parent values when both provide the same field. + +## Native Header System + +React Native uses a native-header-first model. + +Configure headers directly from route `native` options: + +```tsx +createRoute({ + path: 'posts/$postId', + native: { + title: ({ params }) => `Post #${params.postId}`, + headerShown: true, + headerTintColor: '#fff', + headerStyle: { backgroundColor: '#6366f1' }, + headerRight: ({ tintColor }) => , + }, +}) +``` + +Header options: + +- `headerShown`: show/hide native header +- `title` / `headerTitle`: title text or custom title renderer +- `headerBackVisible`: control native back button visibility +- `headerLeft` / `headerRight`: custom header actions +- `headerTintColor`: tint color for title/buttons +- `headerStyle.backgroundColor`: header background color +- `headerTransparent`: translucent header mode +- `headerLargeTitle`: iOS large title mode + +Defaults: + +- routes with `presentation: 'none'` default to hidden header +- all other routes default to shown header +- providing `headerLeft` hides native back button unless `headerBackVisible: true` + +### Custom Header Escape Hatch + +Use `native.header` to render a fully custom in-screen header for a route: + +```tsx +native: { + header: ({ params, canGoBack }) => ( + + ), +} +``` + +When `native.header` is used, native header chrome is hidden for that route. + +## Stack Lifecycle Policy + +React Native lifecycle state is resolved in two phases: + +1. Depth fallback policy from router `native` config +2. Minimum-state clamp from route/navigation `native` config + +Router fallback policy: + +```tsx +createRouter({ + routeTree, + history, + native: { + pausedDepth: 3, + detachedDepth: 4, + defaultMinStackState: 'paused', + }, +}) +``` + +- top entry: `active` +- `depth >= detachedDepth`: `detached` +- other non-top entries: `paused` + +Route-level minimums: + +```tsx +createRoute({ + path: 'posts/$postId', + native: { + minStackState: 'paused', + defaultMinStackState: 'paused', + }, +}) +``` + +- `minStackState`: applies to this route entry only +- `defaultMinStackState`: applies to this route and descendants unless overridden + +Navigation-level minimums can be set per entry and persist in history state: + +```tsx +router.navigate({ + to: '/posts/$postId', + params: { postId: '123' }, + native: { minStackState: 'active' }, +}) +``` + +Resolution precedence: + +1. `navigate()` / `` `native.minStackState` +2. route `native.minStackState` +3. nearest route `native.defaultMinStackState` +4. router `native.defaultMinStackState` +5. router depth fallback + +Like `head`, `native` function resolution is state-driven (match/location +updates), not per-render. + +## Stack Reuse Behavior + +React Native defaults to stack reuse behavior for `navigate()` and ``: + +- reuse matching entry when found +- otherwise push a new entry + +You can override per navigation: + +```tsx +router.navigate({ + to: '/posts/$postId', + params: { postId: '123' }, + stackBehavior: 'push', // 'auto' | 'push' | 'replace' | 'reuse' +}) +``` + +When multiple matching entries exist, select which one to reuse: + +```tsx +router.navigate({ + to: '/posts/$postId', + params: { postId: '123' }, + stackBehavior: 'reuse', + stackMatch: 'nearest', // 'nearest' | 'oldest' +}) +``` + +Route-level identity can be configured with `native.getId`: + +```tsx +createRoute({ + path: 'posts/$postId', + native: { + getId: ({ params }) => `post:${params.postId}`, + stackMatch: 'nearest', + }, +}) +``` + +## Notes + +- Interactive swipe-to-go-back is supported through native stack behavior. +- Swipe-to-go-forward is not a native stack capability. +- In this repository's RN example, route tree wiring is currently manual (`src/routeTree.gen.ts`). diff --git a/docs/router/overview.md b/docs/router/overview.md index a208c7b034..8b24b2e56f 100644 --- a/docs/router/overview.md +++ b/docs/router/overview.md @@ -139,3 +139,9 @@ We acknowledge the investment, risk and research that went into their developmen ## Let's go! Enough overview, there's so much more to do with TanStack Router. Hit that next button and let's get started! + +## React Native + +TanStack Router also has an experimental React Native package with native stack support via `react-native-screens`. + +See: [React Native Native Stack](./guide/react-native-native-stack) diff --git a/docs/router/quick-start.md b/docs/router/quick-start.md index a3571756df..49b8a2f2d9 100644 --- a/docs/router/quick-start.md +++ b/docs/router/quick-start.md @@ -93,7 +93,7 @@ Before installing TanStack Router, please ensure your project meets the followin > [!NOTE] > Using TypeScript (`v5.3.x or higher`) is recommended for the best development experience, though not strictly required. We aim to support the last 5 minor versions of TypeScript, but using the latest version will help avoid potential issues. -TanStack Router is currently only compatible with React (with ReactDOM) and Solid. If you're interested in contributing to support other frameworks, such as React Native, Angular, or Vue, please reach out to us on [Discord](https://tlinz.com/discord). +TanStack Router's primary web packages are for React (with ReactDOM) and Solid. For React Native, see the experimental `@tanstack/react-native-router` guide: [React Native Native Stack](./guide/react-native-native-stack). ### Installation diff --git a/examples/react-native/.maestro-README.md b/examples/react-native/.maestro-README.md new file mode 100644 index 0000000000..204b1084e8 --- /dev/null +++ b/examples/react-native/.maestro-README.md @@ -0,0 +1,47 @@ +# Running Maestro flows for the React Native examples + +Each example ships smoke flows under `.maestro/` that exercise navigation + +deep linking. They form the seed of the e2e suite for +`@tanstack/react-native-router`. + +## Install Maestro + +```bash +brew install maestro +``` + +## Per-example invocation + +You need: an iOS simulator booted, the example's app installed (or Expo Go ++ Metro running for `expo-go`), and Maestro on PATH. + +```bash +# bare +cd examples/react-native/bare +maestro test .maestro/navigation.yaml +maestro test .maestro/deep-link.yaml + +# expo-dev-client +cd examples/react-native/expo-dev-client +maestro test .maestro/navigation.yaml +maestro test .maestro/deep-link.yaml + +# expo-go (requires Expo Go installed in the sim and Metro running on 8125) +cd examples/react-native/expo-go +maestro test .maestro/navigation.yaml +``` + +## CI hookup (sketch — not yet wired) + +GitHub Actions on `macos-latest`: + +1. Install Maestro +2. Boot a simulator (`xcrun simctl boot ...`) +3. Build each example (`bare` and `expo-dev-client` only — `expo-go` needs + Expo Go install which is a separate setup) +4. Start Metro for each example (background) +5. `maestro test` against each `.maestro/*.yaml` + +The current flows are the minimal "does it boot + navigate" smoke set. +Expand them as features land — depth lab interactions, lifecycle policies, +sheet detents, header behaviors, etc. diff --git a/examples/react-native/README.md b/examples/react-native/README.md new file mode 100644 index 0000000000..4eaa54f932 --- /dev/null +++ b/examples/react-native/README.md @@ -0,0 +1,69 @@ +# TanStack Router for React Native — Examples + +> **`@tanstack/react-native-router` is currently in alpha.** + +These examples form a matrix that exercises the supported runtime +combinations. Each example is also designed to serve as an end-to-end test +fixture. + +| Example | Bundler runtime | Native build | Router | Start | When to use | +|---|---|---|---|---|---| +| [`bare`](./bare) | Metro (vanilla) | `react-native run-ios` (native iOS project committed) | ✓ | ✓ | You don't want Expo. Maximum control over native code. | +| [`expo-go`](./expo-go) | Metro (Expo's) | None — runs in Expo Go | ✓ | ✗ | Fastest onramp. No Xcode required. Caveat: only works for setups whose native deps are already bundled in Expo Go. | +| [`expo-dev-client`](./expo-dev-client) | Metro (Expo's) | `expo run:ios` (Expo prebuild + custom dev client) | ✓ | ✓ | Expo's developer ergonomics with arbitrary native deps. Recommended for most apps. | + +## Matrix legend + +- **Router** — `@tanstack/react-native-router` (file-based routing, native + stack via `react-native-screens`, gesture-back via + `react-native-gesture-handler`). +- **Start** — `@tanstack/react-start` server functions (`createServerFn`) + compiled to RPC stubs via `@tanstack/react-start/plugin/metro`. The server + itself is a separately deployed Vite or Rsbuild Start build. + +## Why no Start in `expo-go`? + +`expo-go` is constrained to whatever native modules the Expo Go binary on the +device already includes. Start doesn't add native modules, but the typical +Start app uses native deps (`react-native-screens`, `react-native-gesture-handler`) +whose JS↔native versions must match — and the version Expo Go ships with may +drift from the version your `package.json` resolves. The dev-client and bare +flows compile their own binary so the versions always match. + +If you only need Router with a minimal native footprint, `expo-go` is the +quickest path. If you need Start, use `expo-dev-client` or `bare`. + +## Trying them out + +Each example has its own `README.md` with step-by-step instructions. Quick +links: + +- [bare/README.md](./bare/README.md) +- [expo-go/README.md](./expo-go/README.md) +- [expo-dev-client/README.md](./expo-dev-client/README.md) + +## Common environment notes + +When running any example from inside this monorepo: + +- **`EXPO_NO_METRO_WORKSPACE_ROOT=1`** — Expo CLI otherwise computes the + bundle URL relative to the pnpm workspace root, which Metro can't resolve + back to the entry. Setting this pins the bundle URL to `/index.bundle`. + (The example npm scripts set it for you.) +- **`LANG=en_US.UTF-8`** — CocoaPods on macOS errors out without a UTF-8 + locale. If your shell doesn't set `LANG`, prefix the build command with + `LANG=en_US.UTF-8` (only relevant for `bare` and `expo-dev-client`). +- **`.npmrc`** — the workspace root sets + `public-hoist-pattern[]=@babel/runtime` so Metro can resolve Babel + helpers via the standard upward `node_modules` walk through pnpm's + `.pnpm/` layout. +- **Single React copy** — Metro configs in `bare`, `expo-go`, and + `expo-dev-client` all force a single React + RN copy via + `extraNodeModules` + `blockList`. Without this, pnpm's nested layout can + produce duplicate React modules → runtime "Invalid hook call" errors. + +## E2E test plan (forthcoming) + +These examples will host Maestro flows for navigation + deep linking +verification. Each example folder will gain a `.maestro/` directory with +recorded flows that CI can replay against the iOS simulator. diff --git a/examples/react-native/STATE-OF-WORK.md b/examples/react-native/STATE-OF-WORK.md new file mode 100644 index 0000000000..d168bae023 --- /dev/null +++ b/examples/react-native/STATE-OF-WORK.md @@ -0,0 +1,87 @@ +# React Native + TanStack Router/Start — state of work + +Living doc tracking the unified RN branch. Delete once the work is +merged and shipped. + +## Branch: `taren/rn-unified` (off `origin/main`) + +Single source of truth. All the RN router + Phase 1 (Metro file routing) + +- Phase 2 (Start RPC transform) work is here, sitting on a fresh main base. + Both `taren/mystifying-nash-aa11f2` and `taren/start-metro` are now + superseded and can be deleted. + +## Status + +- ✅ `@tanstack/react-native-router` builds against main's signal-based + router-core (migration commit: `81430ac8bf`) +- ✅ Phase 1 — `@tanstack/router-plugin/metro` sync `withTanStackRouter` +- ✅ Phase 2 — `@tanstack/start-plugin-core/metro` + `@tanstack/react-start/plugin/metro` + with worker-safe env-var option passing (commit `ccf607e4bc`) +- ✅ 3-example matrix: bare (RN+Router+Start), expo-go (Router only), + expo-dev-client (RN+Router+Start) +- ✅ Shared `_start-server` (Vite+Start backend) consumes RN RPCs +- ✅ Maestro flow skeletons +- ✅ Docs + sidebar registration +- ✅ Defensive gesture-handler TurboModule probe +- ✅ `@tanstack/react-native-router` eslint, types, unit, and build checks +- ✅ Unit tests (router-plugin/metro: 4 new, react-native-router: 8 total) + +## End-to-end Start RPC verification + +Running Metro for the bare client produces an iOS bundle containing: + +- `createClientRpc` references for each `createServerFn` call site +- Deterministic SHA-256 function ids: `c299b00d...` (listPosts) and + `d4f35c53...` (getPost) +- `http://localhost:3050/_serverFn/` as the normalized RPC base when + `TSR_SERVER_FN_BASE=http://localhost:3050` + +The built `_start-server` registers the same IDs and the matching +`createServerFn(...).handler(createClientRpc(id))` calls return real data: + +- `listPosts` returns 4 posts +- `getPost({ data: '1' })` returns "TanStack Router on React Native" + +What's NOT verified in this local environment: rendering the result in a +native simulator UI. This machine has no Xcode `simctl`, no Xcode.app, +and no Android emulator/device attached. + +## Example matrix + +| Example | Bundler | Native | Router | Start | +| ----------------- | ------------- | ------------------------- | ------ | ----- | +| `bare` | Metro vanilla | iOS + Android (committed) | ✓ | ✓ | +| `expo-go` | Metro (Expo) | Expo Go | ✓ | n/a | +| `expo-dev-client` | Metro (Expo) | Expo prebuild | ✓ | ✓ | +| `_start-server` | Vite (Start) | n/a | n/a | ✓ | + +## Known things the rebase exposed + +(All resolved in this branch — listing for handoff context.) + +1. `@tanstack/config/vite` was renamed to `@tanstack/vite-config` on + main. RN router's `vite.config.ts` updated. +2. `verboseFileRoutes` config was removed from main's router-generator. + The `react-native` target in `template.ts` now uses the same + `serializeRoutePath()` pattern as react/solid/vue. +3. `RouterState` lost `pendingMatches` and `cachedMatches`; they're now + separate stores on `router.stores`. The RN router's transition + rendering subscribes to `router.stores.pendingMatches` via + `useStore` and combines with the routerState selector. +4. `router.__store` moved to `router.stores.__store`. +5. `getLocationChangeInfo` signature changed — now takes + `ParsedLocation` arguments, not a full `RouterState`. +6. Metro's transformer worker pool doesn't share module-level state + with the main process. Phase 2's transformer.cjs was reworked to + pass options through `process.env.TSR_START_METRO_OPTIONS` (env + vars DO propagate to jest-worker children). + +## What's left before merge + +- Run the same RPC route in a native simulator UI and wire the Maestro + flow to assert rendered server data. +- Decide on the `expo-go` story for actually working in Expo Go — + currently bundles cleanly but real-app testing hit native module + version drift. Defensive probes help, but the example is more useful + as documentation of what's possible than as a recommended path. diff --git a/examples/react-native/_start-server/.gitignore b/examples/react-native/_start-server/.gitignore new file mode 100644 index 0000000000..7bbd69db5f --- /dev/null +++ b/examples/react-native/_start-server/.gitignore @@ -0,0 +1,18 @@ +# Dependencies +node_modules/ + +# Build output +.output/ +.vinxi/ +dist/ + +# Generated route tree +src/routeTree.gen.ts + +# Logs +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store diff --git a/examples/react-native/_start-server/README.md b/examples/react-native/_start-server/README.md new file mode 100644 index 0000000000..4a8e759cee --- /dev/null +++ b/examples/react-native/_start-server/README.md @@ -0,0 +1,59 @@ +# `_start-server` — TanStack Start backend for the React Native examples + +This is a small Vite + TanStack Start server that the `bare` and +`expo-dev-client` examples consume via `createServerFn` RPC. + +The `_` prefix marks it as infrastructure, not an example app itself. + +## What it provides + +Two server functions in +[`src/server-fns/posts.ts`](./src/server-fns/posts.ts): + +- `listPosts` — returns the post list +- `getPost` — returns one post by id (with input validation) + +Both back onto the mock data in +[`src/utils/posts.ts`](./src/utils/posts.ts). Replace with a real data +source if you adapt this for your own backend. + +## Run it + +```bash +cd examples/react-native/_start-server +pnpm install +pnpm run dev # Vite dev server on http://localhost:3050 +pnpm run build +pnpm run start # built server on http://localhost:3050 +``` + +You can browse the home page at `http://localhost:3050` to see what's +exposed. Server functions live at `/_serverFn/`. + +## How the RN clients reach it + +The React Native examples (`bare`, `expo-dev-client`) compile every +`createServerFn(...).handler(...)` call site into a typed RPC stub via +`@tanstack/react-start/plugin/metro`. The compiled client code fetches +`/_serverFn/`. The Metro plugin accepts a deployed +server origin, so `serverFnBase: 'http://localhost:3050'` is normalized +to `http://localhost:3050/_serverFn/` in the bundle. + +Function ids are deterministic: `sha256(${relativeFilename}--${functionName})`. +The RN client and this server compute the same id from the same source, +so they agree on routing without any manifest exchange. + +You configure the base URL in the RN client's `metro.config.js`: + +```js +withTanStackStart(config, { serverFnBase: 'http://localhost:3050' }) +``` + +For a physical iOS device on the same Wi-Fi, replace `localhost` with +your Mac's LAN IP (e.g. `http://192.168.1.180:3050`). + +## Status + +The RN-side Metro compiler and this backend are wired together on this +branch. The backend must expose matching `src/server-fns/posts.ts` +handlers so production server function IDs match the RN client source. diff --git a/examples/react-native/_start-server/package.json b/examples/react-native/_start-server/package.json new file mode 100644 index 0000000000..2e24e24875 --- /dev/null +++ b/examples/react-native/_start-server/package.json @@ -0,0 +1,24 @@ +{ + "name": "tanstack-router-react-native-start-server", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev --port 3050", + "build": "vite build", + "start": "pnpx srvx --prod -s ../client dist/server/server.js" + }, + "dependencies": { + "@tanstack/react-router": "workspace:*", + "@tanstack/react-start": "workspace:*", + "react": "19.1.0", + "react-dom": "19.1.0" + }, + "devDependencies": { + "@types/react": "~19.1.0", + "@types/react-dom": "~19.1.0", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.9.3", + "vite": "^7.0.0" + } +} diff --git a/examples/react-native/_start-server/src/router.tsx b/examples/react-native/_start-server/src/router.tsx new file mode 100644 index 0000000000..0789775634 --- /dev/null +++ b/examples/react-native/_start-server/src/router.tsx @@ -0,0 +1,13 @@ +import { createRouter } from '@tanstack/react-router' +import { Route as rootRoute } from './routes/__root' +import { Route as indexRoute } from './routes/index' +import './server-fns/posts' + +const routeTree = rootRoute.addChildren([indexRoute]) + +export function getRouter() { + return createRouter({ + routeTree, + defaultPreload: 'intent', + }) +} diff --git a/examples/react-native/_start-server/src/routes/__root.tsx b/examples/react-native/_start-server/src/routes/__root.tsx new file mode 100644 index 0000000000..adcf3e03e0 --- /dev/null +++ b/examples/react-native/_start-server/src/routes/__root.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + + TanStack Router RN Start Server + + + + + + ) +} diff --git a/examples/react-native/_start-server/src/routes/index.tsx b/examples/react-native/_start-server/src/routes/index.tsx new file mode 100644 index 0000000000..98e729d1bf --- /dev/null +++ b/examples/react-native/_start-server/src/routes/index.tsx @@ -0,0 +1,48 @@ +import * as React from 'react' +import { createRoute } from '@tanstack/react-router' +import { Route as rootRoute } from './__root' + +export const Route = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: HomePage, +}) + +function HomePage() { + return ( +
+

TanStack Router RN — Start Server

+

+ This Vite Start backend hosts the server functions consumed by the React + Native examples (bare and expo-dev-client). + Each function appears at /_serverFn/<sha256-id>. +

+ +

Endpoints

+
    +
  • + GET /_serverFn/<listPosts-id> — returns the post + list +
  • +
  • + GET /_serverFn/<getPost-id> — returns a post by id +
  • +
+ +

+ Function ids are deterministic — the RN client and this server resolve + the same id from the same source layout, so no manifest exchange is + needed. +

+ +

Run locally

+
pnpm run dev # starts on http://localhost:3050
+ +

+ Then point your RN client's serverFnBase at{' '} + http://localhost:3050 (or your machine's LAN IP for a + physical device) when you wire the Metro plugin. +

+
+ ) +} diff --git a/examples/react-native/_start-server/src/server-fns/posts.ts b/examples/react-native/_start-server/src/server-fns/posts.ts new file mode 100644 index 0000000000..87a83cdd65 --- /dev/null +++ b/examples/react-native/_start-server/src/server-fns/posts.ts @@ -0,0 +1,25 @@ +// Server functions exposed by this Start backend. The React Native client +// examples compile matching `src/server-fns/posts.ts` files into RPC stubs +// with the same production function IDs. + +import { createServerFn } from '@tanstack/react-start' +import { getPostData, listPostsData } from '../utils/posts' + +export const listPosts = createServerFn({ method: 'GET' }).handler(async () => { + return listPostsData() +}) + +export const getPost = createServerFn({ method: 'GET' }) + .inputValidator((id: unknown) => { + if (typeof id !== 'string' || id.length === 0) { + throw new Error('Invalid post id') + } + return id + }) + .handler(async ({ data }) => { + const post = getPostData(data) + if (!post) { + throw new Error(`Post ${data} not found`) + } + return post + }) diff --git a/examples/react-native/_start-server/src/utils/posts.ts b/examples/react-native/_start-server/src/utils/posts.ts new file mode 100644 index 0000000000..40d41a6905 --- /dev/null +++ b/examples/react-native/_start-server/src/utils/posts.ts @@ -0,0 +1,49 @@ +// Shared mock data for the React Native Start examples. Replace with a real +// data source for anything beyond demo / e2e use. + +export type Post = { + id: string + title: string + body: string + author: string + createdAt: string +} + +const POSTS: Array = [ + { + id: '1', + title: 'TanStack Router on React Native', + body: 'Type-safe routing for native apps with the same primitives you know from the web.', + author: 'tanstack', + createdAt: '2026-01-15T10:00:00Z', + }, + { + id: '2', + title: 'Server Functions over the wire', + body: 'createServerFn calls compile to typed RPC fetches in your RN bundle.', + author: 'tanstack', + createdAt: '2026-02-02T14:30:00Z', + }, + { + id: '3', + title: 'Native stack lifecycle', + body: 'Pause, resume, and reuse stack entries with declarative options.', + author: 'tanstack', + createdAt: '2026-03-12T09:15:00Z', + }, + { + id: '4', + title: 'Deep linking that just works', + body: 'tanstackrouter:// → /posts/1 → cold-start to the right screen.', + author: 'tanstack', + createdAt: '2026-04-20T16:45:00Z', + }, +] + +export function listPostsData(): Array { + return POSTS +} + +export function getPostData(id: string): Post | null { + return POSTS.find((p) => p.id === id) ?? null +} diff --git a/examples/react-native/_start-server/tsconfig.json b/examples/react-native/_start-server/tsconfig.json new file mode 100644 index 0000000000..e95442d1bd --- /dev/null +++ b/examples/react-native/_start-server/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true + }, + "include": ["src"] +} diff --git a/examples/react-native/_start-server/vite.config.ts b/examples/react-native/_start-server/vite.config.ts new file mode 100644 index 0000000000..035fad58d8 --- /dev/null +++ b/examples/react-native/_start-server/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [ + tanstackStart(), + react(), + ], + server: { + port: 3050, + cors: { + // Permissive in dev so RN simulators / devices can hit the server + // function endpoints from any origin. Lock this down for production. + origin: true, + }, + }, +}) diff --git a/examples/react-native/bare/.gitignore b/examples/react-native/bare/.gitignore new file mode 100644 index 0000000000..e25d5c416e --- /dev/null +++ b/examples/react-native/bare/.gitignore @@ -0,0 +1,38 @@ +# Dependencies +node_modules/ + +# Generated route tree (regenerated by @tanstack/router-plugin/metro on Metro startup) +src/routeTree.gen.ts + +# iOS build artifacts +ios/Pods/ +ios/build/ +ios/.xcode.env.local +ios/DerivedData/ +ios/*.xcworkspace/xcuserdata/ +ios/*.xcodeproj/xcuserdata/ +*.pbxuser +!default.pbxuser + +# Android build artifacts +android/app/build/ +android/build/ +android/.gradle/ +android/local.properties +android/keystores/debug.keystore + +# Metro +.metro-health-check* + +# Logs +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store + +# Editor +*.swp +.vscode/ +.idea/ diff --git a/examples/react-native/bare/.maestro/deep-link.yaml b/examples/react-native/bare/.maestro/deep-link.yaml new file mode 100644 index 0000000000..5a1137315f --- /dev/null +++ b/examples/react-native/bare/.maestro/deep-link.yaml @@ -0,0 +1,12 @@ +# TanStack Router — bare example: deep link smoke test +appId: org.reactjs.native.example.TanStackRouterBare +name: Deep link from cold start +--- +- launchApp: + clearState: true + permissions: + all: allow +- openLink: "tanstackbare:///posts/1" +- assertVisible: "Post" +- back +- assertVisible: "Welcome!" diff --git a/examples/react-native/bare/.maestro/navigation.yaml b/examples/react-native/bare/.maestro/navigation.yaml new file mode 100644 index 0000000000..da5f504603 --- /dev/null +++ b/examples/react-native/bare/.maestro/navigation.yaml @@ -0,0 +1,18 @@ +# TanStack Router — bare example: navigation smoke test +# Run: maestro test .maestro/navigation.yaml +appId: org.reactjs.native.example.TanStackRouterBare +name: Router navigation flow +--- +- launchApp: + clearState: true +- assertVisible: "Welcome!" +- assertVisible: "About →" +- tapOn: "About →" +- assertVisible: "About" +- back +- assertVisible: "Welcome!" +- tapOn: "Posts →" +- assertVisible: "Posts" +- back +- tapOn: "Stack Depth Lab →" +- assertVisible: "Depth" diff --git a/examples/react-native/bare/App.tsx b/examples/react-native/bare/App.tsx new file mode 100644 index 0000000000..9fe087c5dc --- /dev/null +++ b/examples/react-native/bare/App.tsx @@ -0,0 +1,12 @@ +import * as React from 'react' +import { SafeAreaProvider } from 'react-native-safe-area-context' +import { NativeRouterProvider } from '@tanstack/react-native-router' +import { router } from './src/router' + +export default function App() { + return ( + + + + ) +} diff --git a/examples/react-native/bare/README.md b/examples/react-native/bare/README.md new file mode 100644 index 0000000000..cf8de950aa --- /dev/null +++ b/examples/react-native/bare/README.md @@ -0,0 +1,139 @@ +# `bare` — TanStack Router on stock React Native (no Expo) + +This example runs `@tanstack/react-native-router` on a vanilla React Native +project — no Expo SDK, no `expo` CLI, no Expo Go. The bundler is plain +Metro; the native projects (iOS + Android) were generated with +`@react-native-community/cli`. + +## Why this example exists + +Proves the routing/Metro story works for teams that don't want Expo in +their stack. If you'd ship a stock RN app today, this is what your setup +should look like. + +## First-time setup + +```bash +cd examples/react-native/bare + +# Install JS deps (handled by workspace root; included for clarity) +pnpm install + +# Install iOS pods — required after `pnpm install` and whenever native deps change +LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 (cd ios && pod install) +``` + +> **`LANG=en_US.UTF-8`** is needed because CocoaPods errors out on a +> non-UTF-8 locale and macOS often defaults `LANG` to empty. + +## Running on iOS simulator + +```bash +# Build + install + launch app on a booted iOS sim: +LANG=en_US.UTF-8 npm run ios + +# In a separate terminal, start Metro: +npm run start +``` + +The first `npm run ios` does the Xcode build (3–7 min). After that, only +re-run it when native deps change. Day-to-day you only need `npm run start` +plus manual app re-launches. + +## Running on Android + +Requires Android Studio + a connected device or running emulator +(`ANDROID_HOME` env var set). + +```bash +# Build + install + launch app on a connected device/emulator: +npm run android + +# Then start Metro: +npm run start +``` + +The first `npm run android` runs Gradle (slow first build, ~5 min; +faster after). Subsequent runs only need `npm run start` unless native +deps change. + +## What's inside + +``` +bare/ +├── App.tsx # Root: SafeAreaProvider + NativeRouterProvider +├── babel.config.js # @react-native/babel-preset +├── index.js # AppRegistry.registerComponent +├── metro.config.js # @react-native/metro-config + workspace dedup +├── ios/ # Generated by @react-native-community/cli +├── android/ # Generated by @react-native-community/cli +└── src/ + ├── router.ts # createRouter + native history + linking config + └── routes/ # File-based routes (root, index, about, posts, lab) +``` + +## Deep linking (`tanstackbare://`) + +```bash +xcrun simctl openurl booted "tanstackbare:///about" +xcrun simctl openurl booted "tanstackbare:///posts/1" +xcrun simctl openurl booted "tanstackbare:///posts/1/deep/2" +``` + +## Metro plugin (Phase 1) + +`metro.config.js` wraps the Metro config with `withTanStackRouter` from +`@tanstack/router-plugin/metro`. On Metro startup the plugin runs the +route generator synchronously (so the route tree exists before Metro +reads files), and starts a chokidar watcher in dev that regenerates the +tree on route file changes — Metro then triggers a fast refresh. + +## Start integration + +This example uses TanStack Start `createServerFn` calls through the Metro +compiler in +[`@tanstack/react-start/plugin/metro`](../../../packages/react-start/src/plugin/metro.ts). +[`metro.config.js`](./metro.config.js) wires it up: + +```js +const { withTanStackStart } = require('@tanstack/react-start/plugin/metro') + +module.exports = withTanStackRouter( + withTanStackStart(mergeConfig(defaultConfig, config), { + serverFnBase: process.env.TSR_SERVER_FN_BASE ?? 'http://localhost:3050', + }), +) +``` + +Routes call `createServerFn`-compiled functions: + +```tsx +import { listPosts } from '../server-fns/posts' + +export const Route = createFileRoute('/posts')({ + loader: () => listPosts(), + component: PostsScreen, +}) +``` + +The compiler rewrites each call site to a `createClientRpc()` +stub that fetches `/_serverFn/`. The matching server +lives in [`../_start-server`](../_start-server/README.md) and runs on +`http://localhost:3050`. + +## Standalone use (outside the monorepo) + +The example can be cloned and run as a standalone project: + +```bash +npx degit TanStack/router/examples/react-native/bare my-rn-app +cd my-rn-app +npm install +# iOS: +LANG=en_US.UTF-8 (cd ios && pod install) +LANG=en_US.UTF-8 npm run ios +# OR Android: +npm run android +# Metro (separate terminal): +npm run start +``` diff --git a/examples/react-native/bare/android/app/build.gradle b/examples/react-native/bare/android/app/build.gradle new file mode 100644 index 0000000000..15d5f0c5d4 --- /dev/null +++ b/examples/react-native/bare/android/app/build.gradle @@ -0,0 +1,119 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js + // cliFile = file("../../node_modules/react-native/cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = false + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' + +android { + ndkVersion rootProject.ext.ndkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace "com.tanstackrouterbare" + defaultConfig { + applicationId "com.tanstackrouterbare" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} diff --git a/examples/react-native/bare/android/app/debug.keystore b/examples/react-native/bare/android/app/debug.keystore new file mode 100644 index 0000000000..364e105ed3 Binary files /dev/null and b/examples/react-native/bare/android/app/debug.keystore differ diff --git a/examples/react-native/bare/android/app/proguard-rules.pro b/examples/react-native/bare/android/app/proguard-rules.pro new file mode 100644 index 0000000000..11b025724a --- /dev/null +++ b/examples/react-native/bare/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: diff --git a/examples/react-native/bare/android/app/src/main/AndroidManifest.xml b/examples/react-native/bare/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..fb78f39746 --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainActivity.kt b/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainActivity.kt new file mode 100644 index 0000000000..74e144e7d7 --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainActivity.kt @@ -0,0 +1,22 @@ +package com.tanstackrouterbare + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "TanStackRouterBare" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) +} diff --git a/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainApplication.kt b/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainApplication.kt new file mode 100644 index 0000000000..eac03fb12f --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/java/com/tanstackrouterbare/MainApplication.kt @@ -0,0 +1,38 @@ +package com.tanstackrouterbare + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost +import com.facebook.react.defaults.DefaultReactNativeHost + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + + override fun getJSMainModuleName(): String = "index" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactHost: ReactHost + get() = getDefaultReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + loadReactNative(this) + } +} diff --git a/examples/react-native/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml b/examples/react-native/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000000..5c25e728ea --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000..a2f5908281 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000..1b52399808 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000..ff10afd6e1 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000..115a4c768a Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..dcd3cd8083 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..459ca609d3 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000..8ca12fe024 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..8e19b410a1 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000..b824ebdd48 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..4c19a13c23 Binary files /dev/null and b/examples/react-native/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/examples/react-native/bare/android/app/src/main/res/values/strings.xml b/examples/react-native/bare/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000..75b13debd0 --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + TanStackRouterBare + diff --git a/examples/react-native/bare/android/app/src/main/res/values/styles.xml b/examples/react-native/bare/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..7ba83a2ad5 --- /dev/null +++ b/examples/react-native/bare/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/examples/react-native/bare/android/build.gradle b/examples/react-native/bare/android/build.gradle new file mode 100644 index 0000000000..dad99b022a --- /dev/null +++ b/examples/react-native/bare/android/build.gradle @@ -0,0 +1,21 @@ +buildscript { + ext { + buildToolsVersion = "36.0.0" + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.1.20" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + } +} + +apply plugin: "com.facebook.react.rootproject" diff --git a/examples/react-native/bare/android/gradle.properties b/examples/react-native/bare/android/gradle.properties new file mode 100644 index 0000000000..9afe61598f --- /dev/null +++ b/examples/react-native/bare/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Use this property to enable edge-to-edge display support. +# This allows your app to draw behind system bars for an immersive UI. +# Note: Only works with ReactActivity and should not be used with custom Activity. +edgeToEdgeEnabled=false diff --git a/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.jar b/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..1b33c55baa Binary files /dev/null and b/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.properties b/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..d4081da476 --- /dev/null +++ b/examples/react-native/bare/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/examples/react-native/bare/android/gradlew b/examples/react-native/bare/android/gradlew new file mode 100755 index 0000000000..23d15a9367 --- /dev/null +++ b/examples/react-native/bare/android/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/examples/react-native/bare/android/gradlew.bat b/examples/react-native/bare/android/gradlew.bat new file mode 100644 index 0000000000..dd2b8eedbd --- /dev/null +++ b/examples/react-native/bare/android/gradlew.bat @@ -0,0 +1,99 @@ +@REM Copyright (c) Meta Platforms, Inc. and affiliates. +@REM +@REM This source code is licensed under the MIT license found in the +@REM LICENSE file in the root directory of this source tree. + +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/react-native/bare/android/settings.gradle b/examples/react-native/bare/android/settings.gradle new file mode 100644 index 0000000000..b3ff091f1b --- /dev/null +++ b/examples/react-native/bare/android/settings.gradle @@ -0,0 +1,6 @@ +pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } +plugins { id("com.facebook.react.settings") } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } +rootProject.name = 'TanStackRouterBare' +include ':app' +includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/examples/react-native/bare/app.json b/examples/react-native/bare/app.json new file mode 100644 index 0000000000..74edbf730b --- /dev/null +++ b/examples/react-native/bare/app.json @@ -0,0 +1,4 @@ +{ + "name": "TanStackRouterBare", + "displayName": "TanStack Router Bare" +} diff --git a/examples/react-native/bare/babel.config.js b/examples/react-native/bare/babel.config.js new file mode 100644 index 0000000000..3e0218e68f --- /dev/null +++ b/examples/react-native/bare/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], +} diff --git a/examples/react-native/bare/index.js b/examples/react-native/bare/index.js new file mode 100644 index 0000000000..ee1ede4b3f --- /dev/null +++ b/examples/react-native/bare/index.js @@ -0,0 +1,6 @@ +import 'react-native-url-polyfill/auto' +import { AppRegistry } from 'react-native' +import App from './App' +import { name as appName } from './app.json' + +AppRegistry.registerComponent(appName, () => App) diff --git a/examples/react-native/bare/ios/.xcode.env b/examples/react-native/bare/ios/.xcode.env new file mode 100644 index 0000000000..3d5782c715 --- /dev/null +++ b/examples/react-native/bare/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/examples/react-native/bare/ios/Podfile b/examples/react-native/bare/ios/Podfile new file mode 100644 index 0000000000..855bc92a50 --- /dev/null +++ b/examples/react-native/bare/ios/Podfile @@ -0,0 +1,35 @@ +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, min_ios_version_supported +prepare_react_native_project! + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'TanStackRouterBare' do + config = use_native_modules! + + use_react_native!( + :path => config[:reactNativePath], + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false, + # :ccache_enabled => true + ) + end +end diff --git a/examples/react-native/bare/ios/Podfile.lock b/examples/react-native/bare/ios/Podfile.lock new file mode 100644 index 0000000000..48f2161bb7 --- /dev/null +++ b/examples/react-native/bare/ios/Podfile.lock @@ -0,0 +1,2745 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - fast_float (8.0.0) + - FBLazyVector (0.81.5) + - fmt (11.0.2) + - glog (0.3.5) + - hermes-engine (0.81.5): + - hermes-engine/Pre-built (= 0.81.5) + - hermes-engine/Pre-built (0.81.5) + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCTDeprecation (0.81.5) + - RCTRequired (0.81.5) + - RCTTypeSafety (0.81.5): + - FBLazyVector (= 0.81.5) + - RCTRequired (= 0.81.5) + - React-Core (= 0.81.5) + - React (0.81.5): + - React-Core (= 0.81.5) + - React-Core/DevSupport (= 0.81.5) + - React-Core/RCTWebSocket (= 0.81.5) + - React-RCTActionSheet (= 0.81.5) + - React-RCTAnimation (= 0.81.5) + - React-RCTBlob (= 0.81.5) + - React-RCTImage (= 0.81.5) + - React-RCTLinking (= 0.81.5) + - React-RCTNetwork (= 0.81.5) + - React-RCTSettings (= 0.81.5) + - React-RCTText (= 0.81.5) + - React-RCTVibration (= 0.81.5) + - React-callinvoker (0.81.5) + - React-Core (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/CoreModulesHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/Default (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/DevSupport (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) + - React-Core/RCTWebSocket (= 0.81.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTActionSheetHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTAnimationHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTBlobHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTImageHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTLinkingHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTNetworkHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTSettingsHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTTextHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTVibrationHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTWebSocket (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-CoreModules (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety (= 0.81.5) + - React-Core/CoreModulesHeaders (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.81.5) + - React-runtimeexecutor + - ReactCommon + - SocketRocket + - React-cxxreact (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-debug (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - React-timing (= 0.81.5) + - SocketRocket + - React-debug (0.81.5) + - React-defaultsnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-domnativemodule + - React-featureflagsnativemodule + - React-idlecallbacksnativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - SocketRocket + - React-domnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Fabric + - React-Fabric/bridging + - React-FabricComponents + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.81.5) + - React-Fabric/attributedstring (= 0.81.5) + - React-Fabric/bridging (= 0.81.5) + - React-Fabric/componentregistry (= 0.81.5) + - React-Fabric/componentregistrynative (= 0.81.5) + - React-Fabric/components (= 0.81.5) + - React-Fabric/consistency (= 0.81.5) + - React-Fabric/core (= 0.81.5) + - React-Fabric/dom (= 0.81.5) + - React-Fabric/imagemanager (= 0.81.5) + - React-Fabric/leakchecker (= 0.81.5) + - React-Fabric/mounting (= 0.81.5) + - React-Fabric/observers (= 0.81.5) + - React-Fabric/scheduler (= 0.81.5) + - React-Fabric/telemetry (= 0.81.5) + - React-Fabric/templateprocessor (= 0.81.5) + - React-Fabric/uimanager (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animations (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/attributedstring (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/bridging (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistry (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistrynative (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.81.5) + - React-Fabric/components/root (= 0.81.5) + - React-Fabric/components/scrollview (= 0.81.5) + - React-Fabric/components/view (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/root (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/scrollview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/view (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric/consistency (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/core (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/dom (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/imagemanager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/leakchecker (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/scheduler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/telemetry (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/templateprocessor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager/consistency (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-FabricComponents (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.81.5) + - React-FabricComponents/textlayoutmanager (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.81.5) + - React-FabricComponents/components/iostextinput (= 0.81.5) + - React-FabricComponents/components/modal (= 0.81.5) + - React-FabricComponents/components/rncore (= 0.81.5) + - React-FabricComponents/components/safeareaview (= 0.81.5) + - React-FabricComponents/components/scrollview (= 0.81.5) + - React-FabricComponents/components/switch (= 0.81.5) + - React-FabricComponents/components/text (= 0.81.5) + - React-FabricComponents/components/textinput (= 0.81.5) + - React-FabricComponents/components/unimplementedview (= 0.81.5) + - React-FabricComponents/components/virtualview (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/inputaccessory (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/iostextinput (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/modal (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/rncore (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/safeareaview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/scrollview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/switch (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/text (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/textinput (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/unimplementedview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/virtualview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/textlayoutmanager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricImage (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.81.5) + - RCTTypeSafety (= 0.81.5) + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.81.5) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-featureflags (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-featureflagsnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - React-graphics (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-utils + - SocketRocket + - React-hermes (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi + - React-jsiexecutor (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-idlecallbacksnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - React-ImageManager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - SocketRocket + - React-jserrorhandler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - SocketRocket + - React-jsi (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-jsinspector (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-jsinspectorcdp (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsinspectornetwork (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectorcdp + - React-performancetimeline + - React-timing + - SocketRocket + - React-jsinspectortracing (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-oscompat + - React-timing + - SocketRocket + - React-jsitooling (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - SocketRocket + - React-jsitracing (0.81.5): + - React-jsi + - React-logger (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - react-native-safe-area-context (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.6.2) + - react-native-safe-area-context/fabric (= 5.6.2) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-NativeModulesApple (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core + - React-cxxreact + - React-featureflags + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - React-oscompat (0.81.5) + - React-perflogger (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancetimeline (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - SocketRocket + - React-RCTActionSheet (0.81.5): + - React-Core/RCTActionSheetHeaders (= 0.81.5) + - React-RCTAnimation (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTAppDelegate (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon + - SocketRocket + - React-RCTBlob (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTFabric (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-RCTAnimation + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-RCTFBReactNativeSpec (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.81.5) + - ReactCommon + - SocketRocket + - React-RCTFBReactNativeSpec/components (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-RCTImage (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTLinking (0.81.5): + - React-Core/RCTLinkingHeaders (= 0.81.5) + - React-jsi (= 0.81.5) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.81.5) + - React-RCTNetwork (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTRuntime (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - SocketRocket + - React-RCTSettings (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTText (0.81.5): + - React-Core/RCTTextHeaders (= 0.81.5) + - Yoga + - React-RCTVibration (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-rendererconsistency (0.81.5) + - React-renderercss (0.81.5): + - React-debug + - React-utils + - React-rendererdebug (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-RuntimeApple (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - SocketRocket + - React-RuntimeCore (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - React-runtimeexecutor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-featureflags + - React-jsi (= 0.81.5) + - React-utils + - SocketRocket + - React-RuntimeHermes (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-runtimescheduler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - SocketRocket + - React-timing (0.81.5): + - React-debug + - React-utils (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-jsi (= 0.81.5) + - SocketRocket + - ReactAppDependencyProvider (0.81.5): + - ReactCodegen + - ReactCodegen (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - ReactCommon (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - ReactCommon/turbomodule/bridging (= 0.81.5) + - ReactCommon/turbomodule/core (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule/bridging (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule/core (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-debug (= 0.81.5) + - React-featureflags (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - React-utils (= 0.81.5) + - SocketRocket + - RNGestureHandler (2.28.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNScreens (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.16.0) + - SocketRocket + - Yoga + - RNScreens/common (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - SocketRocket (0.7.1) + - Yoga (0.0.0) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactAppDependencyProvider (from `build/generated/ios`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNScreens (from `../node_modules/react-native-screens`) + - SocketRocket (~> 0.7.1) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - SocketRocket + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782 + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../node_modules/react-native/React/Runtime" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactAppDependencyProvider: + :path: build/generated/ios + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNScreens: + :path: "../node_modules/react-native-screens" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 5beb8028d5a2e75dd9634917f23e23d3a061d2aa + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172 + RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 + RCTDeprecation: 5eb1d2eeff5fb91151e8a8eef45b6c7658b6c897 + RCTRequired: cebcf9442fc296c9b89ac791dfd463021d9f6f23 + RCTTypeSafety: b99aa872829ee18f6e777e0ef55852521c5a6788 + React: 914f8695f9bf38e6418228c2ffb70021e559f92f + React-callinvoker: 23cd4e33928608bd0cc35357597568b8b9a5f068 + React-Core: 6a0a97598e9455348113bfe4c573fe8edac34469 + React-CoreModules: a88a6ca48b668401b9780e272e2a607e70f9f955 + React-cxxreact: 06265fd7e8d5c3b6b49e00d328ef76e5f1ae9c8b + React-debug: 039d3dbd3078613e02e3960439bbf52f6d321bc4 + React-defaultsnativemodule: 09efbfa17b15445907689c577e371558d8b08135 + React-domnativemodule: 6284a09207d8e0e974affb0d84b43a0c1aee2554 + React-Fabric: 5ffa7f2a10fb3bf835f97990d341419ae338963d + React-FabricComponents: 25173bc205a6b7c18d87121891f3acef1c329b04 + React-FabricImage: aa90e4b2b34a79f9b4ee56328ad9222cb672f1f3 + React-featureflags: 7bdaca8af1def3ec9203743c91b11ac7c2cb2574 + React-featureflagsnativemodule: 6840bc359820d5e44f1de1f9ba69706e0a88a60b + React-graphics: b0a76138e325f9c5dfcc8fbc62491ab252ca736c + React-hermes: a852be3ab9e1f515e46ba3ea9f48c31d4a9df437 + React-idlecallbacksnativemodule: 38895fd946b2dcb0af387f2176f5f2e578b14277 + React-ImageManager: 44409a10adff7091c9e678b97ee59c7b0576b8ae + React-jserrorhandler: 3852205bbfc68277cd4e7392ad1fa74a170150fd + React-jsi: 7b53959aea60909ac6bbe4dd0bdec6c10d7dc597 + React-jsiexecutor: 19938072af05ade148474bac41e0324a2d733f44 + React-jsinspector: 0aecd79939adf576c6dd7bbbddf90b630e7827e4 + React-jsinspectorcdp: 8245973529c78d150aebddd2c497ee290349faf0 + React-jsinspectornetwork: 496a12dbc80835fac10acf29b9c4386ddcc472f1 + React-jsinspectortracing: 1939b3e0cec087983384c5561bf925f35287d760 + React-jsitooling: 86c70336d5c371b4289499e9303b6da118ad3eeb + React-jsitracing: 8eb0d50d7874886fb3ec7f85e0567f1964a20075 + React-logger: a913317214a26565cd4c045347edf1bcacb80a3f + React-Mapbuffer: 94f4264de2cb156960cd82b338a403f4653f2fd9 + React-microtasksnativemodule: 6c4ee39a36958c39c97b074d28f360246a335e84 + react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460 + React-NativeModulesApple: ebf2ce72b35870036900d6498b33724386540a71 + React-oscompat: eb0626e8ba1a2c61673c991bf9dc21834898475d + React-perflogger: 509e1f9a3ee28df71b0a66de806ac515ce951246 + React-performancetimeline: 43a1ea36ac47853b479ae85e04c1c339721e99f1 + React-RCTActionSheet: 30fe8f9f8d86db4a25ff34595a658ecd837485fc + React-RCTAnimation: 3126eb1cb8e7a6ca33a52fd833d8018aa9311af1 + React-RCTAppDelegate: b03981c790aa40cf26e0f78cc0f1f2df8287ead4 + React-RCTBlob: 53c35e85c85d6bdaa55dc81a0b290d4e78431095 + React-RCTFabric: 4e2a4176f99b6b8f2d2eda9fc82453a3e6c3ef8e + React-RCTFBReactNativeSpec: 947126c649e04b95457a40bc97c4b2a76206534b + React-RCTImage: 074b2faa71a152a456c974e118b60c9eeda94a64 + React-RCTLinking: e5ca17a4f7ae2ad7b0c0483be77e1b383ecd0a8a + React-RCTNetwork: c508d7548c9eceac30a8100a846ea00033a03366 + React-RCTRuntime: 6813778046c775c124179d9e4d7b33d4129bbd84 + React-RCTSettings: dd84c857a4fce42c1e08c1dabcda894e25af4a6e + React-RCTText: 6e4b177d047f98bccb90d6fb1ebdd3391cf8b299 + React-RCTVibration: 9572d4a06a0c92650bcc62913e50eb2a89f19fb6 + React-rendererconsistency: 6f0622076d7b26eda57a582db5ffd8b05fe94652 + React-renderercss: c00b6db35f01e2f17e496d1d0793fc0be89d4f7b + React-rendererdebug: 17f707ba5ba1ed7a10dd997a2e27b2431b24a180 + React-RuntimeApple: b9b9a53afd594eb49c3e6891f84327d1834a2c5e + React-RuntimeCore: 5a0c78665206a44c4a030e2b4af0c8d6ad05ae77 + React-runtimeexecutor: 7f56789cd23bd4ea1f95595eb5c27e08cee3a19e + React-RuntimeHermes: b2d6bc03f4cc9d2eb7ee0a1bfe16c226cb2114ce + React-runtimescheduler: 5cc5c0568bf216e1ee8f3c2c0a1cff2ef3091b32 + React-timing: b1e27e61bd184fab3792947685bebdb2dc55af9a + React-utils: ddf52534853a3b5f19d4615b1a1f172b504673f2 + ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79 + ReactCodegen: 6428cc62cdbf3e3d14000655f2c62653488f8fe9 + ReactCommon: 5f0e5c09a64a2717215dd84380e1a747810406f2 + RNGestureHandler: 3a73f098d74712952870e948b3d9cf7b6cae9961 + RNScreens: 0bbf16c074ae6bb1058a7bf2d1ae017f4306797c + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: 728df40394d49f3f471688747cf558158b3a3bd1 + +PODFILE CHECKSUM: ff58091babe26df5f699ac2e945fa6c7858c5cd2 + +COCOAPODS: 1.16.2 diff --git a/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/project.pbxproj b/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..96d63cdfbd --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/project.pbxproj @@ -0,0 +1,478 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 0C80B921A6F3F58F76C31292 /* libPods-TanStackRouterBare.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-TanStackRouterBare.a */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + F88E3626912AB72C96F2E525 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* TanStackRouterBare.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TanStackRouterBare.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = TanStackRouterBare/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = TanStackRouterBare/Info.plist; sourceTree = ""; }; + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = TanStackRouterBare/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 3B4392A12AC88292D35C810B /* Pods-TanStackRouterBare.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TanStackRouterBare.debug.xcconfig"; path = "Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-TanStackRouterBare.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TanStackRouterBare.release.xcconfig"; path = "Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare.release.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-TanStackRouterBare.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TanStackRouterBare.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = TanStackRouterBare/AppDelegate.swift; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = TanStackRouterBare/LaunchScreen.storyboard; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C80B921A6F3F58F76C31292 /* libPods-TanStackRouterBare.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* TanStackRouterBare */ = { + isa = PBXGroup; + children = ( + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 761780EC2CA45674006654EE /* AppDelegate.swift */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, + ); + name = TanStackRouterBare; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 5DCACB8F33CDC322A6C60F78 /* libPods-TanStackRouterBare.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* TanStackRouterBare */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* TanStackRouterBare.app */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-TanStackRouterBare.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-TanStackRouterBare.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* TanStackRouterBare */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "TanStackRouterBare" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TanStackRouterBare; + productName = TanStackRouterBare; + productReference = 13B07F961A680F5B00A75B9A /* TanStackRouterBare.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "TanStackRouterBare" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* TanStackRouterBare */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + F88E3626912AB72C96F2E525 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-TanStackRouterBare-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TanStackRouterBare/Pods-TanStackRouterBare-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-TanStackRouterBare.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = TanStackRouterBare/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = TanStackRouterBare; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-TanStackRouterBare.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = TanStackRouterBare/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = TanStackRouterBare; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "TanStackRouterBare" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "TanStackRouterBare" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/xcshareddata/xcschemes/TanStackRouterBare.xcscheme b/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/xcshareddata/xcschemes/TanStackRouterBare.xcscheme new file mode 100644 index 0000000000..9994bcc89d --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare.xcodeproj/xcshareddata/xcschemes/TanStackRouterBare.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/react-native/bare/ios/TanStackRouterBare.xcworkspace/contents.xcworkspacedata b/examples/react-native/bare/ios/TanStackRouterBare.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..1386f736ba --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/react-native/bare/ios/TanStackRouterBare/AppDelegate.swift b/examples/react-native/bare/ios/TanStackRouterBare/AppDelegate.swift new file mode 100644 index 0000000000..7219cad0d8 --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/AppDelegate.swift @@ -0,0 +1,48 @@ +import UIKit +import React +import React_RCTAppDelegate +import ReactAppDependencyProvider + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + var reactNativeDelegate: ReactNativeDelegate? + var reactNativeFactory: RCTReactNativeFactory? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + let delegate = ReactNativeDelegate() + let factory = RCTReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + window = UIWindow(frame: UIScreen.main.bounds) + + factory.startReactNative( + withModuleName: "TanStackRouterBare", + in: window, + launchOptions: launchOptions + ) + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} diff --git a/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..81213230de --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/Contents.json b/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/Contents.json new file mode 100644 index 0000000000..2d92bd53fd --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/react-native/bare/ios/TanStackRouterBare/Info.plist b/examples/react-native/bare/ios/TanStackRouterBare/Info.plist new file mode 100644 index 0000000000..9c69a2bc5c --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + TanStackRouterBare + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSLocationWhenInUseUsageDescription + + RCTNewArchEnabled + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/examples/react-native/bare/ios/TanStackRouterBare/LaunchScreen.storyboard b/examples/react-native/bare/ios/TanStackRouterBare/LaunchScreen.storyboard new file mode 100644 index 0000000000..3ac40a1cc1 --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/react-native/bare/ios/TanStackRouterBare/PrivacyInfo.xcprivacy b/examples/react-native/bare/ios/TanStackRouterBare/PrivacyInfo.xcprivacy new file mode 100644 index 0000000000..41b8317f06 --- /dev/null +++ b/examples/react-native/bare/ios/TanStackRouterBare/PrivacyInfo.xcprivacy @@ -0,0 +1,37 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/examples/react-native/bare/metro.config.js b/examples/react-native/bare/metro.config.js new file mode 100644 index 0000000000..471ab59800 --- /dev/null +++ b/examples/react-native/bare/metro.config.js @@ -0,0 +1,76 @@ +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') +const { withTanStackRouter } = require('@tanstack/router-plugin/metro') +const { withTanStackStart } = require('@tanstack/react-start/plugin/metro') +const path = require('path') +const fs = require('fs') + +const projectRoot = __dirname +const monorepoRoot = path.resolve(projectRoot, '../../..') +const isMonorepo = fs.existsSync(path.join(monorepoRoot, 'pnpm-workspace.yaml')) + +const defaultConfig = getDefaultConfig(projectRoot) + +const config = { + resolver: { + unstable_enablePackageExports: true, + }, +} + +if (isMonorepo) { + // Watch the monorepo root so workspace package edits trigger reloads. + config.watchFolders = [monorepoRoot] + + config.resolver = { + ...config.resolver, + nodeModulesPaths: [ + path.resolve(projectRoot, 'node_modules'), + path.resolve(monorepoRoot, 'node_modules'), + ], + // Pin to a single React + RN copy so workspace deps can't pull duplicates + // through pnpm's nested .pnpm layout (causes "Invalid hook call" otherwise). + extraNodeModules: { + react: path.dirname( + require.resolve('react/package.json', { paths: [projectRoot] }), + ), + 'react/jsx-runtime': path.join( + path.dirname( + require.resolve('react/package.json', { paths: [projectRoot] }), + ), + 'jsx-runtime', + ), + 'react/jsx-dev-runtime': path.join( + path.dirname( + require.resolve('react/package.json', { paths: [projectRoot] }), + ), + 'jsx-dev-runtime', + ), + 'react-native': path.dirname( + require.resolve('react-native/package.json', { paths: [projectRoot] }), + ), + }, + } + + // Block any react copy in the pnpm store other than this example's pinned one, + // so transitive deps that resolve react via absolute path can't sneak in a duplicate. + const reactPkg = require('react/package.json') + const exampleReactVersion = reactPkg.version + const esc = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pnpmStore = path.join(monorepoRoot, 'node_modules', '.pnpm') + + config.resolver.blockList = [ + new RegExp( + `^${esc(pnpmStore)}/react@(?!${esc(exampleReactVersion)})[^/]+/.*`, + ), + ] +} + +// Compose: withTanStackStart wraps the merged config to install the +// Start compiler transformer (rewrites createServerFn calls into RPC +// stubs at bundle time). Then withTanStackRouter handles file-based +// route generation. Order doesn't matter for correctness — each wrapper +// only touches its own config slice. +module.exports = withTanStackRouter( + withTanStackStart(mergeConfig(defaultConfig, config), { + serverFnBase: process.env.TSR_SERVER_FN_BASE ?? 'http://localhost:3050', + }), +) diff --git a/examples/react-native/bare/package.json b/examples/react-native/bare/package.json new file mode 100644 index 0000000000..37ff3df2ce --- /dev/null +++ b/examples/react-native/bare/package.json @@ -0,0 +1,39 @@ +{ + "name": "tanstack-router-react-native-bare-example", + "version": "1.0.0", + "main": "index.js", + "private": true, + "scripts": { + "start": "react-native start --port 8124", + "ios": "react-native run-ios --port 8124", + "android": "react-native run-android --port 8124", + "routes:generate": "npx @tanstack/router-cli generate", + "routes:watch": "npx @tanstack/router-cli watch" + }, + "dependencies": { + "@tanstack/react-native-router": "workspace:*", + "@tanstack/react-start": "workspace:*", + "@tanstack/router-core": "workspace:*", + "react": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.16.0", + "react-native-url-polyfill": "^3.0.0" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.3", + "@babel/runtime": "^7.25.0", + "@react-native-community/cli": "20.0.2", + "@react-native-community/cli-platform-android": "20.0.2", + "@react-native-community/cli-platform-ios": "20.0.2", + "@react-native/babel-preset": "0.81.5", + "@react-native/metro-config": "0.81.5", + "@react-native/typescript-config": "0.81.5", + "@tanstack/router-cli": "workspace:*", + "@tanstack/router-plugin": "workspace:*", + "@types/react": "~19.1.0", + "typescript": "^5.9.3" + } +} diff --git a/examples/react-native/bare/src/router.ts b/examples/react-native/bare/src/router.ts new file mode 100644 index 0000000000..dee66d591e --- /dev/null +++ b/examples/react-native/bare/src/router.ts @@ -0,0 +1,35 @@ +import { + createRouter, + createNativeHistory, +} from '@tanstack/react-native-router/core' +import { routeTree } from './routeTree.gen' + +export const router = createRouter({ + routeTree, + history: createNativeHistory(), + defaultPreload: 'intent', + native: { + linking: { + prefixes: ['tanstackbare://'], + initialMode: 'push', + parseUrl: (url) => { + if (!url) return null + if (url.startsWith('tanstackbare://')) { + return `/${url.replace('tanstackbare://', '').replace(/^\/+/, '')}` + } + try { + const parsed = new URL(url) + return `${parsed.pathname}${parsed.search}${parsed.hash}` + } catch { + return null + } + }, + }, + }, +}) + +declare module '@tanstack/react-native-router' { + interface Register { + router: typeof router + } +} diff --git a/examples/react-native/bare/src/routes/__root.tsx b/examples/react-native/bare/src/routes/__root.tsx new file mode 100644 index 0000000000..15a5f5caaf --- /dev/null +++ b/examples/react-native/bare/src/routes/__root.tsx @@ -0,0 +1,31 @@ +import * as React from 'react' +import { StyleSheet, View } from 'react-native' +import { Outlet, createRootRoute } from '@tanstack/react-native-router' + +export const Route = createRootRoute({ + native: { + presentation: 'push', + gestureEnabled: true, + headerTintColor: '#ffffff', + headerStyle: { + backgroundColor: '#10b981', + }, + }, + component: RootComponent, +}) + +// Root provides shared native defaults inherited by descendants. +function RootComponent() { + return ( + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, +}) diff --git a/examples/react-native/bare/src/routes/about.tsx b/examples/react-native/bare/src/routes/about.tsx new file mode 100644 index 0000000000..608d30fb30 --- /dev/null +++ b/examples/react-native/bare/src/routes/about.tsx @@ -0,0 +1,91 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/about')({ + native: { + title: 'About', + }, + component: AboutScreen, +}) + +function AboutScreen() { + return ( + + + About + + TanStack Router for React Native provides the same powerful routing + capabilities you love from the web, adapted for mobile. + + + + Features + + • Native stack navigation with react-native-screens + + + • iOS edge-swipe gesture to go back + + + • Full TypeScript support with type-safe routes + + + • Search params and path params + + • Data loading with loaders + • Android back button handling + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + cardTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 16, + }, + featureText: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, +}) diff --git a/examples/react-native/bare/src/routes/index.tsx b/examples/react-native/bare/src/routes/index.tsx new file mode 100644 index 0000000000..a4032fde29 --- /dev/null +++ b/examples/react-native/bare/src/routes/index.tsx @@ -0,0 +1,115 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/')({ + native: { + title: 'TanStack Router', + }, + component: HomeScreen, +}) + +function HomeScreen() { + return ( + + + Welcome! + + This is a TanStack Router example running on React Native with native + screen navigation. + + + + Features + • Type-safe routing + • Native screen transitions + • Search params and path params + • Data loading with loaders + • Android back button support + + + + Navigate to: + + About → + + + Posts → + + + Stack Depth Lab → + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + features: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + marginBottom: 24, + }, + featuresTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 12, + }, + feature: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, + nav: { + gap: 12, + }, + navTitle: { + fontSize: 16, + fontWeight: '600', + color: '#1f2937', + marginBottom: 4, + }, + navLink: { + backgroundColor: '#10b981', + padding: 16, + borderRadius: 12, + alignItems: 'center', + }, + navLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, +}) diff --git a/examples/react-native/bare/src/routes/posts.$postId.deep.$depth.tsx b/examples/react-native/bare/src/routes/posts.$postId.deep.$depth.tsx new file mode 100644 index 0000000000..f6f3ae712b --- /dev/null +++ b/examples/react-native/bare/src/routes/posts.$postId.deep.$depth.tsx @@ -0,0 +1,364 @@ +import * as React from 'react' +import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native' +import { + Link, + createFileRoute, + useCanGoBack, + useNativeStackDebugSnapshot, + useRouter, + useRouterState, +} from '@tanstack/react-native-router' +import type { NativeHeaderContext } from '@tanstack/react-native-router' + +type NativeMinStackState = 'paused' | 'active' +type NativeStackState = 'active' | 'paused' | 'detached' + +type StackDebugEntry = { + historyIndex: number + locationKey: string + pathname: string + depthLabel: string + entryMinStackState?: NativeMinStackState + resolvedStackState: NativeStackState +} + +const DEFAULT_PAUSED_DEPTH = 3 +const DEFAULT_DETACHED_DEPTH = 4 + +export const Route = createFileRoute('/posts/$postId/deep/$depth')({ + native: { + animation: 'slide_from_right', + title: ({ params }: NativeHeaderContext) => `Depth ${params.depth}`, + }, + component: StackDepthScreen, +}) + +function toNonNegativeInt(value: unknown): number | undefined { + if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) { + return undefined + } + + return Math.floor(value) +} + +function resolveDepthPolicy(router: ReturnType) { + const nativeOptions = ( + router.options as { + native?: { pausedDepth?: number; detachedDepth?: number } + } + ).native + const pausedDepth = + toNonNegativeInt(nativeOptions?.pausedDepth) ?? DEFAULT_PAUSED_DEPTH + const detachedDepth = + toNonNegativeInt(nativeOptions?.detachedDepth) ?? DEFAULT_DETACHED_DEPTH + + return { + pausedDepth, + detachedDepth: Math.max(detachedDepth, pausedDepth + 1), + } +} + +function applyDebugStackStates( + stack: Array>, + detachedDepth: number, +): Array { + if (!stack.length) return [] + + const lastIndex = stack.length - 1 + const next = stack.map((entry, index) => { + const depth = lastIndex - index + let resolvedStackState: NativeStackState = + depth === 0 ? 'active' : depth >= detachedDepth ? 'detached' : 'paused' + + if (entry.entryMinStackState === 'active') { + resolvedStackState = 'active' + } else if ( + entry.entryMinStackState === 'paused' && + resolvedStackState === 'detached' + ) { + resolvedStackState = 'paused' + } + + return { + ...entry, + resolvedStackState, + } + }) + + next[lastIndex] = { + ...next[lastIndex]!, + resolvedStackState: 'active', + } + + return next +} + +function useNativeStackDebug() { + const router = useRouter() + const depthPolicy = React.useMemo(() => resolveDepthPolicy(router), [router]) + const nativeStackSnapshot = useNativeStackDebugSnapshot() + + const stack = React.useMemo(() => { + return nativeStackSnapshot.map((entry) => { + const entryPathname = entry.pathname + const depthMatch = entryPathname.match(/\/deep\/([^/]+)/) + + return { + historyIndex: entry.historyIndex, + locationKey: entry.locationKey, + pathname: entryPathname, + depthLabel: depthMatch?.[1] ?? '-', + entryMinStackState: entry.entryMinStackState, + } + }) + }, [nativeStackSnapshot]) + + const resolvedStack = React.useMemo( + () => applyDebugStackStates(stack, depthPolicy.detachedDepth), + [depthPolicy.detachedDepth, stack], + ) + + return { + depthPolicy, + resolvedStack, + } +} + +function StackDepthScreen() { + const router = useRouter() + const canGoBack = useCanGoBack() + const { depthPolicy, resolvedStack } = useNativeStackDebug() + const locationNativeMinStackState = useRouterState({ + select: (s) => (s.location.state as any).__TSR_nativeMinStackState, + }) + const { postId, depth: depthParam } = Route.useParams() + const depth = Math.max(1, Number(depthParam) || 1) + const nextDepth = depth + 1 + + const [sideEffectCount, setSideEffectCount] = React.useState(0) + const mountId = React.useRef(Math.random().toString(36).slice(2, 8)).current + + React.useEffect(() => { + const id = setInterval(() => setSideEffectCount((count) => count + 1), 1000) + return () => clearInterval(id) + }, []) + + const back = React.useCallback( + (opts?: any) => { + ;(router as any).back(opts) + }, + [router], + ) + + return ( + + + + Link push depth {nextDepth} → + + + + Entry diagnostics + Post ID: {postId} + Depth: {depth} + Mount ID: {mountId} + + Side-effect count (1s interval): {sideEffectCount} + + + Entry minStackState: {String(locationNativeMinStackState ?? 'none')} + + + + + Lifecycle policy + + router pausedDepth: {depthPolicy.pausedDepth} + + + router detachedDepth: {depthPolicy.detachedDepth} + + route defaultMinStackState: none + this route minStackState: none + + result: follows fallback depth policy + + + + + Native stack debugger + Top entry is shown first + {resolvedStack + .slice() + .reverse() + .map((entry, index) => ( + + {index === 0 ? '->' : ' '} i={entry.historyIndex} depth= + {entry.depthLabel || '-'} state={entry.resolvedStackState} min= + {entry.entryMinStackState ?? 'none'} path={entry.pathname} + + ))} + + + + minStackState playground + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + } as any) + }} + > + push(next) default metadata + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + native: { minStackState: 'paused' }, + } as any) + }} + > + + push(next) + native.min=paused + + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + native: { minStackState: 'active' }, + } as any) + }} + > + + push(next) + native.min=active + + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: '1' }, + stackBehavior: 'reuse', + native: { minStackState: 'active' }, + } as any) + }} + > + reuse(depth=1) + force active + + + + + back() API playground + canGoBack: {String(canGoBack)} + + back()}> + back() + + + back({ steps: 2 })}> + back({'{ steps: 2 }'}) + + + back({ to: `/posts/${postId}/deep` })} + > + + back({"{ to: '/posts/:id/deep' }"}) + + + + back({ to: 'root' })}> + back({"{ to: 'root' }"}) + + + back({ to: '/about', ifMissing: 'push' })} + > + + back({"{ to: '/about', ifMissing: 'push' }"}) + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + padding: 20, + gap: 14, + }, + card: { + backgroundColor: 'white', + borderRadius: 12, + padding: 16, + gap: 8, + }, + cardTitle: { + fontSize: 16, + fontWeight: '700', + color: '#111827', + }, + cardRow: { + fontSize: 15, + color: '#374151', + }, + cta: { + marginTop: 2, + backgroundColor: '#10b981', + borderRadius: 12, + paddingVertical: 16, + alignItems: 'center', + }, + ctaText: { + fontSize: 16, + fontWeight: '600', + color: 'white', + }, + action: { + marginTop: 8, + borderRadius: 10, + borderWidth: 1, + borderColor: '#86efac', + backgroundColor: '#ecfdf5', + paddingVertical: 12, + paddingHorizontal: 12, + }, + actionText: { + fontSize: 14, + fontWeight: '600', + color: '#047857', + }, + stackRow: { + fontSize: 13, + color: '#1f2937', + }, +}) diff --git a/examples/react-native/bare/src/routes/posts.$postId.deep.index.tsx b/examples/react-native/bare/src/routes/posts.$postId.deep.index.tsx new file mode 100644 index 0000000000..7470daaddf --- /dev/null +++ b/examples/react-native/bare/src/routes/posts.$postId.deep.index.tsx @@ -0,0 +1,143 @@ +import * as React from 'react' +import { + ActivityIndicator, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native' +import { createFileRoute } from '@tanstack/react-native-router' + +type Comment = { + id: number + name: string + email: string + body: string +} + +async function fetchComments(postId: string): Promise> { + const response = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}/comments`, + ) + return response.json() +} + +export const Route = createFileRoute('/posts/$postId/deep/')({ + native: { + animation: 'slide_from_right', + title: ({ params }) => `Comments (${params.postId})`, + }, + component: CommentsScreen, + loader: async ({ params }) => { + const comments = await fetchComments(params.postId) + return { comments } + }, + pendingComponent: () => ( + + + + Loading comments... + + + ), +}) + +function CommentsScreen() { + const { comments } = Route.useLoaderData() + const { postId } = Route.useParams() + + return ( + + + + Post #{postId} Comments + + This is a deeply nested route: /posts/$postId/deep + + + + {comments.map((comment: Comment) => ( + + {comment.name} + {comment.email} + {comment.body} + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 16, + gap: 12, + }, + header: { + backgroundColor: '#f0fdf4', + padding: 16, + borderRadius: 12, + borderWidth: 1, + borderColor: '#86efac', + }, + headerTitle: { + fontSize: 18, + fontWeight: 'bold', + color: '#166534', + }, + headerSubtitle: { + fontSize: 13, + color: '#15803d', + marginTop: 4, + }, + commentCard: { + backgroundColor: 'white', + padding: 16, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.05, + shadowRadius: 2, + elevation: 1, + }, + commentName: { + fontSize: 15, + fontWeight: '600', + color: '#1f2937', + marginBottom: 2, + }, + commentEmail: { + fontSize: 13, + color: '#6b7280', + marginBottom: 8, + }, + commentBody: { + fontSize: 14, + color: '#4b5563', + lineHeight: 20, + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/bare/src/routes/posts.$postId.index.tsx b/examples/react-native/bare/src/routes/posts.$postId.index.tsx new file mode 100644 index 0000000000..a0e3bddad5 --- /dev/null +++ b/examples/react-native/bare/src/routes/posts.$postId.index.tsx @@ -0,0 +1,154 @@ +import * as React from 'react' +import { + ActivityIndicator, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' +import type { NativeOptionsContext } from '@tanstack/react-native-router' + +type Post = { + id: number + title: string + body: string + userId: number +} + +async function fetchPost(postId: string): Promise { + const response = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}`, + ) + return response.json() +} + +export const Route = createFileRoute('/posts/$postId/')({ + native: ({ params, loaderData }: NativeOptionsContext) => ({ + title: + (loaderData as { post?: { title?: string } } | undefined)?.post?.title ?? + `Post #${params.postId}`, + }), + component: PostScreen, + loader: async ({ params }) => { + const post = await fetchPost(params.postId) + return { post } + }, + pendingComponent: () => ( + + + + Loading post... + + + ), +}) + +function PostScreen() { + const { post } = Route.useLoaderData() + const { postId } = Route.useParams() + + return ( + + + + {post.title} + {post.body} + + Author + User #{post.userId} + + + + + View Comments → + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 16, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + title: { + fontSize: 22, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 16, + lineHeight: 30, + }, + body: { + fontSize: 16, + color: '#4b5563', + lineHeight: 26, + marginBottom: 20, + }, + meta: { + borderTopWidth: 1, + borderTopColor: '#e5e7eb', + paddingTop: 16, + flexDirection: 'row', + justifyContent: 'space-between', + }, + metaLabel: { + fontSize: 14, + color: '#6b7280', + }, + metaValue: { + fontSize: 14, + color: '#1f2937', + fontWeight: '500', + }, + deepLink: { + marginTop: 16, + paddingVertical: 16, + backgroundColor: '#10b981', + borderRadius: 12, + alignItems: 'center', + }, + deepLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/bare/src/routes/posts.index.tsx b/examples/react-native/bare/src/routes/posts.index.tsx new file mode 100644 index 0000000000..b1b3777807 --- /dev/null +++ b/examples/react-native/bare/src/routes/posts.index.tsx @@ -0,0 +1,234 @@ +import * as React from 'react' +import { + ActivityIndicator, + FlatList, + Pressable, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' +// Importing this file makes the Metro Start compiler rewrite its +// createServerFn().handler() bodies into RPC stubs. The handler bodies +// in src/server-fns/posts.ts are stubs that throw if accidentally executed +// on the client — only the function id and the createClientRpc wrapper +// survive the transform. +import { listPosts as listPostsRpc } from '../server-fns/posts' + +type Post = { + id: number + title: string + body: string +} + +async function fetchPosts(): Promise> { + // Toggle between the public placeholder API and the local Start server + // depending on whether TSR_SERVER_FN_BASE was supplied at bundle time. + if (process.env.TSR_SERVER_FN_BASE) { + const result = await listPostsRpc() + return result as unknown as Array + } + const response = await fetch( + 'https://jsonplaceholder.typicode.com/posts?_limit=10', + ) + return response.json() +} + +export const Route = createFileRoute('/posts/')({ + native: { + title: 'Posts', + headerLargeTitle: true, + }, + validateSearch: (search: Record) => ({ + q: typeof search.q === 'string' ? search.q : '', + }), + component: PostsScreen, + loader: async () => { + const posts = await fetchPosts() + return { posts } + }, + pendingComponent: () => ( + + + + Loading posts... + + + ), +}) + +function PostsScreen() { + const { posts } = Route.useLoaderData() + const search = Route.useSearch() as { q?: string } + const q = search.q ?? '' + const navigate = Route.useNavigate() + + const filteredPosts = React.useMemo(() => { + const query = q.trim().toLowerCase() + if (!query) return posts + + return posts.filter((post: Post) => + post.title.toLowerCase().includes(query), + ) + }, [posts, q]) + + const setSearchQuery = React.useCallback( + (nextQuery: string) => { + navigate({ + search: (prev: { q?: string }) => ({ + ...prev, + q: nextQuery.trim() ? nextQuery : undefined, + }), + replace: true, + }) + }, + [navigate], + ) + + return ( + + item.id.toString()} + ListHeaderComponent={ + + + {!!q && ( + setSearchQuery('')} + > + Clear + + )} + + } + ListEmptyComponent={ + + No matching posts + + Try a different title keyword. + + + } + renderItem={({ item }) => ( + + {item.title} + + {item.body} + + + + )} + contentContainerStyle={styles.list} + /> + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + list: { + padding: 16, + gap: 12, + }, + searchWrap: { + marginBottom: 12, + gap: 8, + }, + searchInput: { + height: 46, + borderRadius: 12, + borderWidth: 1, + borderColor: '#d1d5db', + backgroundColor: 'white', + paddingHorizontal: 14, + fontSize: 16, + color: '#111827', + }, + clearButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#dcfce7', + }, + clearButtonText: { + fontSize: 12, + fontWeight: '600', + color: '#166534', + }, + postCard: { + backgroundColor: 'white', + padding: 16, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + flexDirection: 'row', + alignItems: 'center', + }, + postTitle: { + flex: 1, + fontSize: 15, + fontWeight: '600', + color: '#1f2937', + }, + postBody: { + display: 'none', + }, + postArrow: { + fontSize: 18, + color: '#9ca3af', + marginLeft: 8, + }, + emptyState: { + marginTop: 20, + padding: 20, + borderRadius: 12, + backgroundColor: 'white', + alignItems: 'center', + }, + emptyTitle: { + fontSize: 16, + fontWeight: '600', + color: '#111827', + }, + emptySubtitle: { + marginTop: 6, + fontSize: 14, + color: '#6b7280', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/bare/src/server-fns/posts.ts b/examples/react-native/bare/src/server-fns/posts.ts new file mode 100644 index 0000000000..3379723cc1 --- /dev/null +++ b/examples/react-native/bare/src/server-fns/posts.ts @@ -0,0 +1,41 @@ +// Server functions consumed by the React Native client. The Metro +// transformer (`@tanstack/react-start/plugin/metro`) rewrites every +// `createServerFn(...).handler(...)` call site into an RPC stub that +// fetches `/_serverFn/` at runtime. +// +// The matching server-side handler lives at +// `examples/react-native/_start-server/src/server-fns.ts`. Function ids +// are deterministic from (relative file path, function name), so the RN +// client and the Vite Start server agree on routing without any manifest +// exchange — provided both projects are built with the same source layout +// rooted at the workspace root. + +import { createServerFn } from '@tanstack/react-start' + +export type Post = { + id: string + title: string + body: string + author: string + createdAt: string +} + +export const listPosts = createServerFn({ method: 'GET' }).handler( + async (): Promise> => { + // Body discarded by the Metro compiler — replaced with createClientRpc + // pointing at the deployed Start server. This implementation only + // matters when the same source is built into the server. + throw new Error('listPosts handler should not run on the RN client') + }, +) + +export const getPost = createServerFn({ method: 'GET' }) + .inputValidator((id: unknown) => { + if (typeof id !== 'string' || id.length === 0) { + throw new Error('Invalid post id') + } + return id + }) + .handler(async (): Promise => { + throw new Error('getPost handler should not run on the RN client') + }) diff --git a/examples/react-native/bare/tsconfig.json b/examples/react-native/bare/tsconfig.json new file mode 100644 index 0000000000..6bcae90e3f --- /dev/null +++ b/examples/react-native/bare/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@react-native/typescript-config", + "compilerOptions": { + "jsx": "react-native", + "strict": true, + "skipLibCheck": true + }, + "include": ["src", "App.tsx", "index.js"], + "exclude": ["node_modules", "ios", "android"] +} diff --git a/examples/react-native/bare/tsr.config.json b/examples/react-native/bare/tsr.config.json new file mode 100644 index 0000000000..f6cfd20e9a --- /dev/null +++ b/examples/react-native/bare/tsr.config.json @@ -0,0 +1,5 @@ +{ + "target": "react-native", + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts" +} diff --git a/examples/react-native/expo-dev-client/.gitignore b/examples/react-native/expo-dev-client/.gitignore new file mode 100644 index 0000000000..d28b547ae3 --- /dev/null +++ b/examples/react-native/expo-dev-client/.gitignore @@ -0,0 +1,45 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ + +# Native build artifacts +ios/ +android/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +# Lock files (use your own package manager) +pnpm-lock.yaml +yarn.lock +package-lock.json + +# Generated route tree (regenerated by @tanstack/router-plugin/metro) +src/routeTree.gen.ts diff --git a/examples/react-native/expo-dev-client/.maestro/deep-link.yaml b/examples/react-native/expo-dev-client/.maestro/deep-link.yaml new file mode 100644 index 0000000000..af6286ff8b --- /dev/null +++ b/examples/react-native/expo-dev-client/.maestro/deep-link.yaml @@ -0,0 +1,12 @@ +# TanStack Router — expo-dev-client: deep link smoke test +appId: com.tannerlinsley.tanstack-router-rn-example +name: Deep link from cold start +--- +- launchApp: + clearState: true + permissions: + all: allow +- openLink: "tanstackrouter://posts/1" +- assertVisible: "Post" +- back +- assertVisible: "Welcome!" diff --git a/examples/react-native/expo-dev-client/.maestro/navigation.yaml b/examples/react-native/expo-dev-client/.maestro/navigation.yaml new file mode 100644 index 0000000000..a3b8897459 --- /dev/null +++ b/examples/react-native/expo-dev-client/.maestro/navigation.yaml @@ -0,0 +1,16 @@ +# TanStack Router — expo-dev-client: navigation smoke test +appId: com.tannerlinsley.tanstack-router-rn-example +name: Router navigation flow +--- +- launchApp: + clearState: true +- assertVisible: "Welcome!" +- tapOn: "About →" +- assertVisible: "About" +- back +- assertVisible: "Welcome!" +- tapOn: "Posts →" +- assertVisible: "Posts" +- back +- tapOn: "Stack Depth Lab →" +- assertVisible: "Depth" diff --git a/examples/react-native/expo-dev-client/App.tsx b/examples/react-native/expo-dev-client/App.tsx new file mode 100644 index 0000000000..278d95b9f9 --- /dev/null +++ b/examples/react-native/expo-dev-client/App.tsx @@ -0,0 +1,13 @@ +import 'react-native-url-polyfill/auto' +import * as React from 'react' +import { SafeAreaProvider } from 'react-native-safe-area-context' +import { NativeRouterProvider } from '@tanstack/react-native-router' +import { router } from './src/router' + +export default function App() { + return ( + + + + ) +} diff --git a/examples/react-native/expo-dev-client/README.md b/examples/react-native/expo-dev-client/README.md new file mode 100644 index 0000000000..cf7f23fbbc --- /dev/null +++ b/examples/react-native/expo-dev-client/README.md @@ -0,0 +1,146 @@ +# `expo-dev-client` — TanStack Router on Expo with a custom dev client + +This example runs `@tanstack/react-native-router` on an Expo project that +builds its own native binary (a "dev client") via `expo run:ios`. It's the +recommended setup for any Expo app that uses native deps whose JS↔native +versions need to match exactly — which is most non-trivial apps. + +## Why this example exists + +Expo's developer ergonomics (config plugins, `expo-status-bar`, EAS, etc.) +combined with the freedom to use any native module. This is the path most +production Expo apps end up on once they outgrow Expo Go. + +## First-time setup + +```bash +cd examples/react-native/expo-dev-client + +# Install JS deps (handled by workspace root; included for clarity) +pnpm install +``` + +## Running on iOS simulator + +```bash +# Build + install + launch dev client on a booted iOS sim: +LANG=en_US.UTF-8 npm run ios + +# Then start Metro: +npm run start +``` + +The first `npm run ios` runs `expo prebuild` (generates `ios/` folder), +`pod install`, and an Xcode build (5–12 min total). After that, only re-run +when native deps change. + +> **`LANG=en_US.UTF-8`** is required for CocoaPods. If your `LANG` is +> empty (`echo $LANG` shows nothing), pod install will silently fail with +> a Ruby Unicode error. + +## Metro plugin (Phase 1) + +`metro.config.js` wraps the Expo metro config with `withTanStackRouter` +from `@tanstack/router-plugin/metro`. The plugin runs the route generator +synchronously on Metro startup (the route tree exists before bundling +begins) and watches for changes in dev — Metro's own watcher then +triggers a fast refresh. No separate `routes:watch` process needed. + +## Deep linking (`tanstackrouter://`) + +```bash +xcrun simctl openurl booted "tanstackrouter://about" +xcrun simctl openurl booted "tanstackrouter://posts/1" +xcrun simctl openurl booted "tanstackrouter://posts/1/deep/2?view=debug" +xcrun simctl openurl booted "https://tanstack-router-rn-example.local/posts/1/deep/2?view=debug" +``` + +## Native route options (full set) + +This example exercises every `native:` option the router supports — use it +as a reference for what's available. + +```tsx +createFileRoute('/posts/$postId')({ + native: { + presentation: 'push', + gestureEnabled: true, + animation: 'slide_from_right', + minStackState: 'paused', + title: 'Post', + headerTintColor: '#fff', + headerStyle: { backgroundColor: '#6366f1' }, + headerRight: () => , + }, +}) +``` + +`native:` is inherited through ancestors. The root sets shared header +defaults (see `src/routes/__root.tsx`). It can also be a function that +reads `loaderData` / `params`: + +```tsx +native: ({ loaderData, params }) => ({ + title: + (loaderData as { post?: { title?: string } } | undefined)?.post?.title ?? + `Post #${params.postId}`, +}) +``` + +Use `native.header` for a fully custom header component. + +## Stack depth lab (`/posts/$postId/deep/$depth`) + +The depth lab demonstrates: + +- `minStackState: 'paused' | 'active'` lifecycle policies +- `defaultMinStackState` inheritance for a route subtree +- Hidden entry pausing via React Activity boundary (per-second counter) +- Stack reuse controls: `stackBehavior: 'auto' | 'push' | 'replace' | 'reuse'`, + `stackMatch: 'nearest' | 'oldest'`, `entryId` +- Single-stack back API: + - `back()` + - `back({ steps: 2 })` + - `back({ to: '/posts/:id/deep' })` + - `back({ to: 'root' })` + - `back({ to: '/about', ifMissing: 'push' })` +- Native stack debugger panel showing observed entries with inferred + `active` / `paused` / `detached` state. + +## Start integration + +This example uses TanStack Start `createServerFn` calls through the Metro +compiler in +[`@tanstack/react-start/plugin/metro`](../../../packages/react-start/src/plugin/metro.ts). +[`metro.config.js`](./metro.config.js) wires it up: + +```js +const { withTanStackStart } = require('@tanstack/react-start/plugin/metro') + +module.exports = withTanStackRouter( + withTanStackStart(config, { + serverFnBase: process.env.TSR_SERVER_FN_BASE ?? 'http://localhost:3050', + }), +) +``` + +The matching Start backend lives in +[`../_start-server`](../_start-server/README.md) and runs on +`http://localhost:3050`. Function ids are deterministic, so once both +sides are built from the same source the RN client's RPC stubs hit the +right server-side handlers automatically. + +## What's inside + +``` +expo-dev-client/ +├── App.tsx # Root: SafeAreaProvider + NativeRouterProvider +├── app.json # Expo config (scheme: tanstackrouter) +├── babel.config.js # babel-preset-expo +├── index.js # registerRootComponent (Expo) +├── metro.config.js # expo/metro-config + workspace dedup +├── ios/ # Generated by `expo prebuild` +└── src/ + ├── router.ts # Linking config (tanstackrouter:// + universal links) + └── routes/ # Full route set including depth lab +``` diff --git a/examples/react-native/expo-dev-client/app.json b/examples/react-native/expo-dev-client/app.json new file mode 100644 index 0000000000..67d3c81caf --- /dev/null +++ b/examples/react-native/expo-dev-client/app.json @@ -0,0 +1,20 @@ +{ + "expo": { + "name": "TanStack Router RN Example", + "slug": "tanstack-router-rn-example", + "scheme": "tanstackrouter", + "version": "1.0.0", + "orientation": "portrait", + "userInterfaceStyle": "light", + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.tannerlinsley.tanstack-router-rn-example" + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#ffffff" + }, + "package": "com.tannerlinsley.tanstackrouterrnexample" + } + } +} diff --git a/examples/react-native/expo-dev-client/babel.config.js b/examples/react-native/expo-dev-client/babel.config.js new file mode 100644 index 0000000000..9d89e13119 --- /dev/null +++ b/examples/react-native/expo-dev-client/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function (api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/examples/react-native/expo-dev-client/index.js b/examples/react-native/expo-dev-client/index.js new file mode 100644 index 0000000000..5fd059fd06 --- /dev/null +++ b/examples/react-native/expo-dev-client/index.js @@ -0,0 +1,4 @@ +import { registerRootComponent } from 'expo'; +import App from './App'; + +registerRootComponent(App); diff --git a/examples/react-native/expo-dev-client/metro.config.js b/examples/react-native/expo-dev-client/metro.config.js new file mode 100644 index 0000000000..cfbc780d0a --- /dev/null +++ b/examples/react-native/expo-dev-client/metro.config.js @@ -0,0 +1,66 @@ +const { getDefaultConfig } = require('expo/metro-config') +const { withTanStackRouter } = require('@tanstack/router-plugin/metro') +const { withTanStackStart } = require('@tanstack/react-start/plugin/metro') +const path = require('path') +const fs = require('fs') + +const projectRoot = __dirname +const config = getDefaultConfig(projectRoot) +const monorepoRoot = path.resolve(projectRoot, '../../..') +const isMonorepo = fs.existsSync(path.join(monorepoRoot, 'pnpm-workspace.yaml')) + +if (isMonorepo) { + // Watch the monorepo root so edits to workspace packages trigger reloads. + // (Set EXPO_NO_METRO_WORKSPACE_ROOT=1 when running expo to keep bundle URLs + // rooted at the project, otherwise Expo serves them at the workspace path + // which Metro can't resolve back to the entry.) + config.watchFolders = [monorepoRoot] + + // Let Metro find modules in both project and monorepo node_modules + config.resolver.nodeModulesPaths = [ + path.resolve(projectRoot, 'node_modules'), + path.resolve(monorepoRoot, 'node_modules'), + ] + + // Force a single copy of React + React Native — without this, workspace + // packages can pull in their own copy via pnpm's nested .pnpm layout, + // which manifests as "Invalid hook call" / "React.useEffect isn't a function" + // at runtime (multiple React instances). + const reactDir = path.dirname( + require.resolve('react/package.json', { paths: [projectRoot] }), + ) + const reactNativeDir = path.dirname( + require.resolve('react-native/package.json', { paths: [projectRoot] }), + ) + config.resolver.extraNodeModules = { + react: reactDir, + 'react/jsx-runtime': path.join(reactDir, 'jsx-runtime'), + 'react/jsx-dev-runtime': path.join(reactDir, 'jsx-dev-runtime'), + 'react-native': reactNativeDir, + } + + // Block every other react copy in the pnpm store so transitive deps that + // bypass the extraNodeModules alias (by absolute import path) can't pull + // in a second copy. Pattern: node_modules/.pnpm/react@/... + const reactPkg = require('react/package.json') + const exampleReactVersion = reactPkg.version + const esc = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pnpmStore = path.join(monorepoRoot, 'node_modules', '.pnpm') + + config.resolver.blockList = [ + new RegExp( + `^${esc(pnpmStore)}/react@(?!${esc(exampleReactVersion)})[^/]+/.*`, + ), + ] +} + +config.resolver.unstable_enablePackageExports = true + +// Compose: withTanStackStart installs the Start compiler transformer +// (rewrites createServerFn calls into RPC stubs at bundle time). +// withTanStackRouter handles file-based route generation. +module.exports = withTanStackRouter( + withTanStackStart(config, { + serverFnBase: process.env.TSR_SERVER_FN_BASE ?? 'http://localhost:3050', + }), +) diff --git a/examples/react-native/expo-dev-client/package.json b/examples/react-native/expo-dev-client/package.json new file mode 100644 index 0000000000..cff37fc690 --- /dev/null +++ b/examples/react-native/expo-dev-client/package.json @@ -0,0 +1,36 @@ +{ + "name": "tanstack-router-react-native-expo-dev-client-example", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "start": "EXPO_NO_METRO_WORKSPACE_ROOT=1 expo start", + "android": "EXPO_NO_METRO_WORKSPACE_ROOT=1 expo run:android", + "ios": "EXPO_NO_METRO_WORKSPACE_ROOT=1 expo run:ios", + "web": "EXPO_NO_METRO_WORKSPACE_ROOT=1 expo start --web", + "routes:generate": "npx @tanstack/router-cli generate", + "routes:watch": "npx @tanstack/router-cli watch" + }, + "dependencies": { + "@tanstack/react-native-router": "^0.0.1", + "@tanstack/react-start": "workspace:*", + "@tanstack/router-core": "workspace:*", + "expo": "~54.0.0", + "expo-status-bar": "~3.0.9", + "react": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.16.0", + "react-native-url-polyfill": "^3.0.0", + "react-native-web": "^0.21.2" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/runtime": "^7.25.0", + "@tanstack/router-cli": "^1.163.3", + "@tanstack/router-plugin": "^1.164.0", + "@types/react": "~19.1.0", + "typescript": "^5.9.3" + }, + "private": true +} diff --git a/examples/react-native/expo-dev-client/src/router.ts b/examples/react-native/expo-dev-client/src/router.ts new file mode 100644 index 0000000000..6183946939 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/router.ts @@ -0,0 +1,53 @@ +// Import from /core subpath to avoid loading React Native components at module load time +import { + createRouter, + createNativeHistory, +} from '@tanstack/react-native-router/core' +import { routeTree } from './routeTree.gen' + +// Create the router with native history +export const router = createRouter({ + routeTree, + history: createNativeHistory(), + defaultPreload: 'intent', + native: { + linking: { + prefixes: [ + 'tanstackrouter://', + 'https://tanstack-router-rn-example.local', + ], + initialMode: 'push', + parseUrl: (url) => { + if (!url) return null + + if (url.startsWith('tanstackrouter://')) { + return `/${url.replace('tanstackrouter://', '').replace(/^\/+/, '')}` + } + + try { + const parsed = new URL(url) + + if (parsed.protocol === 'exp:') { + const path = parsed.pathname.replace(/^\/--/, '') || '/' + return `${path}${parsed.search}${parsed.hash}` + } + + if (parsed.protocol === 'https:') { + return `${parsed.pathname}${parsed.search}${parsed.hash}` + } + } catch { + return null + } + + return null + }, + }, + }, +}) + +// Register the router for type safety +declare module '@tanstack/react-native-router' { + interface Register { + router: typeof router + } +} diff --git a/examples/react-native/expo-dev-client/src/routes/__root.tsx b/examples/react-native/expo-dev-client/src/routes/__root.tsx new file mode 100644 index 0000000000..15a5f5caaf --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/__root.tsx @@ -0,0 +1,31 @@ +import * as React from 'react' +import { StyleSheet, View } from 'react-native' +import { Outlet, createRootRoute } from '@tanstack/react-native-router' + +export const Route = createRootRoute({ + native: { + presentation: 'push', + gestureEnabled: true, + headerTintColor: '#ffffff', + headerStyle: { + backgroundColor: '#10b981', + }, + }, + component: RootComponent, +}) + +// Root provides shared native defaults inherited by descendants. +function RootComponent() { + return ( + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/about.tsx b/examples/react-native/expo-dev-client/src/routes/about.tsx new file mode 100644 index 0000000000..608d30fb30 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/about.tsx @@ -0,0 +1,91 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/about')({ + native: { + title: 'About', + }, + component: AboutScreen, +}) + +function AboutScreen() { + return ( + + + About + + TanStack Router for React Native provides the same powerful routing + capabilities you love from the web, adapted for mobile. + + + + Features + + • Native stack navigation with react-native-screens + + + • iOS edge-swipe gesture to go back + + + • Full TypeScript support with type-safe routes + + + • Search params and path params + + • Data loading with loaders + • Android back button handling + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + cardTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 16, + }, + featureText: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/index.tsx b/examples/react-native/expo-dev-client/src/routes/index.tsx new file mode 100644 index 0000000000..a4032fde29 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/index.tsx @@ -0,0 +1,115 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/')({ + native: { + title: 'TanStack Router', + }, + component: HomeScreen, +}) + +function HomeScreen() { + return ( + + + Welcome! + + This is a TanStack Router example running on React Native with native + screen navigation. + + + + Features + • Type-safe routing + • Native screen transitions + • Search params and path params + • Data loading with loaders + • Android back button support + + + + Navigate to: + + About → + + + Posts → + + + Stack Depth Lab → + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + features: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + marginBottom: 24, + }, + featuresTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 12, + }, + feature: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, + nav: { + gap: 12, + }, + navTitle: { + fontSize: 16, + fontWeight: '600', + color: '#1f2937', + marginBottom: 4, + }, + navLink: { + backgroundColor: '#10b981', + padding: 16, + borderRadius: 12, + alignItems: 'center', + }, + navLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.$depth.tsx b/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.$depth.tsx new file mode 100644 index 0000000000..f6f3ae712b --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.$depth.tsx @@ -0,0 +1,364 @@ +import * as React from 'react' +import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native' +import { + Link, + createFileRoute, + useCanGoBack, + useNativeStackDebugSnapshot, + useRouter, + useRouterState, +} from '@tanstack/react-native-router' +import type { NativeHeaderContext } from '@tanstack/react-native-router' + +type NativeMinStackState = 'paused' | 'active' +type NativeStackState = 'active' | 'paused' | 'detached' + +type StackDebugEntry = { + historyIndex: number + locationKey: string + pathname: string + depthLabel: string + entryMinStackState?: NativeMinStackState + resolvedStackState: NativeStackState +} + +const DEFAULT_PAUSED_DEPTH = 3 +const DEFAULT_DETACHED_DEPTH = 4 + +export const Route = createFileRoute('/posts/$postId/deep/$depth')({ + native: { + animation: 'slide_from_right', + title: ({ params }: NativeHeaderContext) => `Depth ${params.depth}`, + }, + component: StackDepthScreen, +}) + +function toNonNegativeInt(value: unknown): number | undefined { + if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) { + return undefined + } + + return Math.floor(value) +} + +function resolveDepthPolicy(router: ReturnType) { + const nativeOptions = ( + router.options as { + native?: { pausedDepth?: number; detachedDepth?: number } + } + ).native + const pausedDepth = + toNonNegativeInt(nativeOptions?.pausedDepth) ?? DEFAULT_PAUSED_DEPTH + const detachedDepth = + toNonNegativeInt(nativeOptions?.detachedDepth) ?? DEFAULT_DETACHED_DEPTH + + return { + pausedDepth, + detachedDepth: Math.max(detachedDepth, pausedDepth + 1), + } +} + +function applyDebugStackStates( + stack: Array>, + detachedDepth: number, +): Array { + if (!stack.length) return [] + + const lastIndex = stack.length - 1 + const next = stack.map((entry, index) => { + const depth = lastIndex - index + let resolvedStackState: NativeStackState = + depth === 0 ? 'active' : depth >= detachedDepth ? 'detached' : 'paused' + + if (entry.entryMinStackState === 'active') { + resolvedStackState = 'active' + } else if ( + entry.entryMinStackState === 'paused' && + resolvedStackState === 'detached' + ) { + resolvedStackState = 'paused' + } + + return { + ...entry, + resolvedStackState, + } + }) + + next[lastIndex] = { + ...next[lastIndex]!, + resolvedStackState: 'active', + } + + return next +} + +function useNativeStackDebug() { + const router = useRouter() + const depthPolicy = React.useMemo(() => resolveDepthPolicy(router), [router]) + const nativeStackSnapshot = useNativeStackDebugSnapshot() + + const stack = React.useMemo(() => { + return nativeStackSnapshot.map((entry) => { + const entryPathname = entry.pathname + const depthMatch = entryPathname.match(/\/deep\/([^/]+)/) + + return { + historyIndex: entry.historyIndex, + locationKey: entry.locationKey, + pathname: entryPathname, + depthLabel: depthMatch?.[1] ?? '-', + entryMinStackState: entry.entryMinStackState, + } + }) + }, [nativeStackSnapshot]) + + const resolvedStack = React.useMemo( + () => applyDebugStackStates(stack, depthPolicy.detachedDepth), + [depthPolicy.detachedDepth, stack], + ) + + return { + depthPolicy, + resolvedStack, + } +} + +function StackDepthScreen() { + const router = useRouter() + const canGoBack = useCanGoBack() + const { depthPolicy, resolvedStack } = useNativeStackDebug() + const locationNativeMinStackState = useRouterState({ + select: (s) => (s.location.state as any).__TSR_nativeMinStackState, + }) + const { postId, depth: depthParam } = Route.useParams() + const depth = Math.max(1, Number(depthParam) || 1) + const nextDepth = depth + 1 + + const [sideEffectCount, setSideEffectCount] = React.useState(0) + const mountId = React.useRef(Math.random().toString(36).slice(2, 8)).current + + React.useEffect(() => { + const id = setInterval(() => setSideEffectCount((count) => count + 1), 1000) + return () => clearInterval(id) + }, []) + + const back = React.useCallback( + (opts?: any) => { + ;(router as any).back(opts) + }, + [router], + ) + + return ( + + + + Link push depth {nextDepth} → + + + + Entry diagnostics + Post ID: {postId} + Depth: {depth} + Mount ID: {mountId} + + Side-effect count (1s interval): {sideEffectCount} + + + Entry minStackState: {String(locationNativeMinStackState ?? 'none')} + + + + + Lifecycle policy + + router pausedDepth: {depthPolicy.pausedDepth} + + + router detachedDepth: {depthPolicy.detachedDepth} + + route defaultMinStackState: none + this route minStackState: none + + result: follows fallback depth policy + + + + + Native stack debugger + Top entry is shown first + {resolvedStack + .slice() + .reverse() + .map((entry, index) => ( + + {index === 0 ? '->' : ' '} i={entry.historyIndex} depth= + {entry.depthLabel || '-'} state={entry.resolvedStackState} min= + {entry.entryMinStackState ?? 'none'} path={entry.pathname} + + ))} + + + + minStackState playground + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + } as any) + }} + > + push(next) default metadata + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + native: { minStackState: 'paused' }, + } as any) + }} + > + + push(next) + native.min=paused + + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: String(nextDepth) }, + stackBehavior: 'push', + native: { minStackState: 'active' }, + } as any) + }} + > + + push(next) + native.min=active + + + + { + router.navigate({ + to: '/posts/$postId/deep/$depth', + params: { postId, depth: '1' }, + stackBehavior: 'reuse', + native: { minStackState: 'active' }, + } as any) + }} + > + reuse(depth=1) + force active + + + + + back() API playground + canGoBack: {String(canGoBack)} + + back()}> + back() + + + back({ steps: 2 })}> + back({'{ steps: 2 }'}) + + + back({ to: `/posts/${postId}/deep` })} + > + + back({"{ to: '/posts/:id/deep' }"}) + + + + back({ to: 'root' })}> + back({"{ to: 'root' }"}) + + + back({ to: '/about', ifMissing: 'push' })} + > + + back({"{ to: '/about', ifMissing: 'push' }"}) + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + padding: 20, + gap: 14, + }, + card: { + backgroundColor: 'white', + borderRadius: 12, + padding: 16, + gap: 8, + }, + cardTitle: { + fontSize: 16, + fontWeight: '700', + color: '#111827', + }, + cardRow: { + fontSize: 15, + color: '#374151', + }, + cta: { + marginTop: 2, + backgroundColor: '#10b981', + borderRadius: 12, + paddingVertical: 16, + alignItems: 'center', + }, + ctaText: { + fontSize: 16, + fontWeight: '600', + color: 'white', + }, + action: { + marginTop: 8, + borderRadius: 10, + borderWidth: 1, + borderColor: '#86efac', + backgroundColor: '#ecfdf5', + paddingVertical: 12, + paddingHorizontal: 12, + }, + actionText: { + fontSize: 14, + fontWeight: '600', + color: '#047857', + }, + stackRow: { + fontSize: 13, + color: '#1f2937', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.index.tsx b/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.index.tsx new file mode 100644 index 0000000000..7470daaddf --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/posts.$postId.deep.index.tsx @@ -0,0 +1,143 @@ +import * as React from 'react' +import { + ActivityIndicator, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native' +import { createFileRoute } from '@tanstack/react-native-router' + +type Comment = { + id: number + name: string + email: string + body: string +} + +async function fetchComments(postId: string): Promise> { + const response = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}/comments`, + ) + return response.json() +} + +export const Route = createFileRoute('/posts/$postId/deep/')({ + native: { + animation: 'slide_from_right', + title: ({ params }) => `Comments (${params.postId})`, + }, + component: CommentsScreen, + loader: async ({ params }) => { + const comments = await fetchComments(params.postId) + return { comments } + }, + pendingComponent: () => ( + + + + Loading comments... + + + ), +}) + +function CommentsScreen() { + const { comments } = Route.useLoaderData() + const { postId } = Route.useParams() + + return ( + + + + Post #{postId} Comments + + This is a deeply nested route: /posts/$postId/deep + + + + {comments.map((comment: Comment) => ( + + {comment.name} + {comment.email} + {comment.body} + + ))} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 16, + gap: 12, + }, + header: { + backgroundColor: '#f0fdf4', + padding: 16, + borderRadius: 12, + borderWidth: 1, + borderColor: '#86efac', + }, + headerTitle: { + fontSize: 18, + fontWeight: 'bold', + color: '#166534', + }, + headerSubtitle: { + fontSize: 13, + color: '#15803d', + marginTop: 4, + }, + commentCard: { + backgroundColor: 'white', + padding: 16, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.05, + shadowRadius: 2, + elevation: 1, + }, + commentName: { + fontSize: 15, + fontWeight: '600', + color: '#1f2937', + marginBottom: 2, + }, + commentEmail: { + fontSize: 13, + color: '#6b7280', + marginBottom: 8, + }, + commentBody: { + fontSize: 14, + color: '#4b5563', + lineHeight: 20, + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/posts.$postId.index.tsx b/examples/react-native/expo-dev-client/src/routes/posts.$postId.index.tsx new file mode 100644 index 0000000000..a0e3bddad5 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/posts.$postId.index.tsx @@ -0,0 +1,154 @@ +import * as React from 'react' +import { + ActivityIndicator, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' +import type { NativeOptionsContext } from '@tanstack/react-native-router' + +type Post = { + id: number + title: string + body: string + userId: number +} + +async function fetchPost(postId: string): Promise { + const response = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}`, + ) + return response.json() +} + +export const Route = createFileRoute('/posts/$postId/')({ + native: ({ params, loaderData }: NativeOptionsContext) => ({ + title: + (loaderData as { post?: { title?: string } } | undefined)?.post?.title ?? + `Post #${params.postId}`, + }), + component: PostScreen, + loader: async ({ params }) => { + const post = await fetchPost(params.postId) + return { post } + }, + pendingComponent: () => ( + + + + Loading post... + + + ), +}) + +function PostScreen() { + const { post } = Route.useLoaderData() + const { postId } = Route.useParams() + + return ( + + + + {post.title} + {post.body} + + Author + User #{post.userId} + + + + + View Comments → + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 16, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + title: { + fontSize: 22, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 16, + lineHeight: 30, + }, + body: { + fontSize: 16, + color: '#4b5563', + lineHeight: 26, + marginBottom: 20, + }, + meta: { + borderTopWidth: 1, + borderTopColor: '#e5e7eb', + paddingTop: 16, + flexDirection: 'row', + justifyContent: 'space-between', + }, + metaLabel: { + fontSize: 14, + color: '#6b7280', + }, + metaValue: { + fontSize: 14, + color: '#1f2937', + fontWeight: '500', + }, + deepLink: { + marginTop: 16, + paddingVertical: 16, + backgroundColor: '#10b981', + borderRadius: 12, + alignItems: 'center', + }, + deepLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/routes/posts.index.tsx b/examples/react-native/expo-dev-client/src/routes/posts.index.tsx new file mode 100644 index 0000000000..587e115475 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/routes/posts.index.tsx @@ -0,0 +1,229 @@ +import * as React from 'react' +import { + ActivityIndicator, + FlatList, + Pressable, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' +// Importing this file makes the Metro Start compiler rewrite its +// createServerFn().handler() bodies into RPC stubs. +import { listPosts as listPostsRpc } from '../server-fns/posts' + +type Post = { + id: number + title: string + body: string +} + +async function fetchPosts(): Promise> { + if (process.env.TSR_SERVER_FN_BASE) { + const result = await listPostsRpc() + return result as unknown as Array + } + const response = await fetch( + 'https://jsonplaceholder.typicode.com/posts?_limit=10', + ) + return response.json() +} + +export const Route = createFileRoute('/posts/')({ + native: { + title: 'Posts', + headerLargeTitle: true, + }, + validateSearch: (search: Record) => ({ + q: typeof search.q === 'string' ? search.q : '', + }), + component: PostsScreen, + loader: async () => { + const posts = await fetchPosts() + return { posts } + }, + pendingComponent: () => ( + + + + Loading posts... + + + ), +}) + +function PostsScreen() { + const { posts } = Route.useLoaderData() + const search = Route.useSearch() as { q?: string } + const q = search.q ?? '' + const navigate = Route.useNavigate() + + const filteredPosts = React.useMemo(() => { + const query = q.trim().toLowerCase() + if (!query) return posts + + return posts.filter((post: Post) => + post.title.toLowerCase().includes(query), + ) + }, [posts, q]) + + const setSearchQuery = React.useCallback( + (nextQuery: string) => { + navigate({ + search: (prev: { q?: string }) => ({ + ...prev, + q: nextQuery.trim() ? nextQuery : undefined, + }), + replace: true, + }) + }, + [navigate], + ) + + return ( + + item.id.toString()} + ListHeaderComponent={ + + + {!!q && ( + setSearchQuery('')} + > + Clear + + )} + + } + ListEmptyComponent={ + + No matching posts + + Try a different title keyword. + + + } + renderItem={({ item }) => ( + + {item.title} + + {item.body} + + + + )} + contentContainerStyle={styles.list} + /> + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + list: { + padding: 16, + gap: 12, + }, + searchWrap: { + marginBottom: 12, + gap: 8, + }, + searchInput: { + height: 46, + borderRadius: 12, + borderWidth: 1, + borderColor: '#d1d5db', + backgroundColor: 'white', + paddingHorizontal: 14, + fontSize: 16, + color: '#111827', + }, + clearButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#dcfce7', + }, + clearButtonText: { + fontSize: 12, + fontWeight: '600', + color: '#166534', + }, + postCard: { + backgroundColor: 'white', + padding: 16, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + flexDirection: 'row', + alignItems: 'center', + }, + postTitle: { + flex: 1, + fontSize: 15, + fontWeight: '600', + color: '#1f2937', + }, + postBody: { + display: 'none', + }, + postArrow: { + fontSize: 18, + color: '#9ca3af', + marginLeft: 8, + }, + emptyState: { + marginTop: 20, + padding: 20, + borderRadius: 12, + backgroundColor: 'white', + alignItems: 'center', + }, + emptyTitle: { + fontSize: 16, + fontWeight: '600', + color: '#111827', + }, + emptySubtitle: { + marginTop: 6, + fontSize: 14, + color: '#6b7280', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/expo-dev-client/src/server-fns/posts.ts b/examples/react-native/expo-dev-client/src/server-fns/posts.ts new file mode 100644 index 0000000000..3379723cc1 --- /dev/null +++ b/examples/react-native/expo-dev-client/src/server-fns/posts.ts @@ -0,0 +1,41 @@ +// Server functions consumed by the React Native client. The Metro +// transformer (`@tanstack/react-start/plugin/metro`) rewrites every +// `createServerFn(...).handler(...)` call site into an RPC stub that +// fetches `/_serverFn/` at runtime. +// +// The matching server-side handler lives at +// `examples/react-native/_start-server/src/server-fns.ts`. Function ids +// are deterministic from (relative file path, function name), so the RN +// client and the Vite Start server agree on routing without any manifest +// exchange — provided both projects are built with the same source layout +// rooted at the workspace root. + +import { createServerFn } from '@tanstack/react-start' + +export type Post = { + id: string + title: string + body: string + author: string + createdAt: string +} + +export const listPosts = createServerFn({ method: 'GET' }).handler( + async (): Promise> => { + // Body discarded by the Metro compiler — replaced with createClientRpc + // pointing at the deployed Start server. This implementation only + // matters when the same source is built into the server. + throw new Error('listPosts handler should not run on the RN client') + }, +) + +export const getPost = createServerFn({ method: 'GET' }) + .inputValidator((id: unknown) => { + if (typeof id !== 'string' || id.length === 0) { + throw new Error('Invalid post id') + } + return id + }) + .handler(async (): Promise => { + throw new Error('getPost handler should not run on the RN client') + }) diff --git a/examples/react-native/expo-dev-client/tsconfig.json b/examples/react-native/expo-dev-client/tsconfig.json new file mode 100644 index 0000000000..6c1ac2a995 --- /dev/null +++ b/examples/react-native/expo-dev-client/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "skipLibCheck": true + }, + "include": ["**/*.ts", "**/*.tsx"] +} diff --git a/examples/react-native/expo-dev-client/tsr.config.json b/examples/react-native/expo-dev-client/tsr.config.json new file mode 100644 index 0000000000..f6cfd20e9a --- /dev/null +++ b/examples/react-native/expo-dev-client/tsr.config.json @@ -0,0 +1,5 @@ +{ + "target": "react-native", + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts" +} diff --git a/examples/react-native/expo-go/.gitignore b/examples/react-native/expo-go/.gitignore new file mode 100644 index 0000000000..512c9be39e --- /dev/null +++ b/examples/react-native/expo-go/.gitignore @@ -0,0 +1,25 @@ +# Dependencies +node_modules/ + +# Generated route tree (regenerated by @tanstack/router-plugin/metro on Metro startup) +src/routeTree.gen.ts + +# Expo +.expo/ +dist/ +web-build/ + +# Native build artifacts (expo-go runs in Expo Go — no local native build) +ios/ +android/ + +# Metro +.metro-health-check* + +# Logs +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store diff --git a/examples/react-native/expo-go/.maestro/navigation.yaml b/examples/react-native/expo-go/.maestro/navigation.yaml new file mode 100644 index 0000000000..8ee11b0918 --- /dev/null +++ b/examples/react-native/expo-go/.maestro/navigation.yaml @@ -0,0 +1,15 @@ +# TanStack Router — expo-go: navigation smoke test +# Note: appId is Expo Go, since this example runs inside Expo Go. +appId: host.exp.Exponent +name: Router navigation flow inside Expo Go +--- +- launchApp: + clearState: true +- openLink: "exp://localhost:8125" +- assertVisible: "Welcome!" + timeout: 30000 +- tapOn: "About →" +- assertVisible: "About" +- back +- tapOn: "Posts →" +- assertVisible: "Posts" diff --git a/examples/react-native/expo-go/App.tsx b/examples/react-native/expo-go/App.tsx new file mode 100644 index 0000000000..9fe087c5dc --- /dev/null +++ b/examples/react-native/expo-go/App.tsx @@ -0,0 +1,12 @@ +import * as React from 'react' +import { SafeAreaProvider } from 'react-native-safe-area-context' +import { NativeRouterProvider } from '@tanstack/react-native-router' +import { router } from './src/router' + +export default function App() { + return ( + + + + ) +} diff --git a/examples/react-native/expo-go/README.md b/examples/react-native/expo-go/README.md new file mode 100644 index 0000000000..99118bcffd --- /dev/null +++ b/examples/react-native/expo-go/README.md @@ -0,0 +1,79 @@ +# `expo-go` — TanStack Router via Expo Go (no native build) + +This example runs `@tanstack/react-native-router` inside the **Expo Go** app +on the simulator — no Xcode, no `expo run:ios`, no CocoaPods. Smallest +possible onramp. + +## Why this example exists + +Demonstrates that Router itself doesn't require a custom native build. +You can start exploring TanStack Router on RN with just Expo CLI and the +Expo Go app from the App Store. + +## Trade-offs + +Expo Go ships a fixed set of native modules baked in. Two consequences: + +- **No Start integration.** Server functions don't add native modules per + se, but most Start apps end up using libs that need version-matched + native code. For Start, use [`expo-dev-client`](../expo-dev-client) or + [`bare`](../bare). +- **Native module version drift.** If your `package.json` resolves + `react-native-gesture-handler` (or similar) to a version newer than what + Expo Go was built with, you may see `TurboModuleRegistry.getEnforcing` + errors. The `@tanstack/react-native-router` package includes defensive + probes that gracefully fall back to View-based rendering when a native + module isn't present, so the app still loads — just without those + features. + +If you hit a runtime error you can't work around, switch to +`expo-dev-client` (a one-time native build) and your problem class +disappears. + +## First-time setup + +```bash +cd examples/react-native/expo-go + +# Install JS deps (handled by workspace root; included for clarity) +pnpm install +``` + +## Running on the iOS simulator + +```bash +# Boot a sim (one-time) +xcrun simctl boot "iPhone 17 Pro" +open -a Simulator + +# Install Expo Go in the sim (one-time, if not already there) +brew install --cask expo-go +xcrun simctl install booted "/Applications/Expo Go.app" + +# Start Metro +npm run start + +# Open the app in Expo Go +xcrun simctl openurl booted "exp://localhost:8125" +``` + +## Deep linking (`tsrgo://`) + +```bash +xcrun simctl openurl booted "tsrgo:///about" +xcrun simctl openurl booted "tsrgo:///posts/1" +``` + +## What's inside + +``` +expo-go/ +├── App.tsx # Root: SafeAreaProvider + NativeRouterProvider +├── app.json # Expo config +├── babel.config.js # babel-preset-expo +├── index.js # registerRootComponent (Expo) +├── metro.config.js # expo/metro-config + workspace dedup +└── src/ + ├── router.ts # tsrgo:// linking + └── routes/ # __root, index, about, posts, posts/$postId +``` diff --git a/examples/react-native/expo-go/app.json b/examples/react-native/expo-go/app.json new file mode 100644 index 0000000000..997382c549 --- /dev/null +++ b/examples/react-native/expo-go/app.json @@ -0,0 +1,18 @@ +{ + "expo": { + "name": "TanStack Router (Expo Go)", + "slug": "tanstack-router-rn-expo-go", + "scheme": "tsrgo", + "version": "1.0.0", + "orientation": "portrait", + "userInterfaceStyle": "light", + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.tannerlinsley.tanstack-router-rn-expo-go" + }, + "android": { + "adaptiveIcon": { "backgroundColor": "#ffffff" }, + "package": "com.tannerlinsley.tanstackrouterexpogo" + } + } +} diff --git a/examples/react-native/expo-go/babel.config.js b/examples/react-native/expo-go/babel.config.js new file mode 100644 index 0000000000..e1e3637afd --- /dev/null +++ b/examples/react-native/expo-go/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function (api) { + api.cache(true) + return { + presets: ['babel-preset-expo'], + } +} diff --git a/examples/react-native/expo-go/index.js b/examples/react-native/expo-go/index.js new file mode 100644 index 0000000000..64aaa5bc6d --- /dev/null +++ b/examples/react-native/expo-go/index.js @@ -0,0 +1,5 @@ +import 'react-native-url-polyfill/auto' +import { registerRootComponent } from 'expo' +import App from './App' + +registerRootComponent(App) diff --git a/examples/react-native/expo-go/metro.config.js b/examples/react-native/expo-go/metro.config.js new file mode 100644 index 0000000000..a8c83a6166 --- /dev/null +++ b/examples/react-native/expo-go/metro.config.js @@ -0,0 +1,49 @@ +const { getDefaultConfig } = require('expo/metro-config') +const { withTanStackRouter } = require('@tanstack/router-plugin/metro') +const path = require('path') +const fs = require('fs') + +const projectRoot = __dirname +const config = getDefaultConfig(projectRoot) +const monorepoRoot = path.resolve(projectRoot, '../../..') +const isMonorepo = fs.existsSync(path.join(monorepoRoot, 'pnpm-workspace.yaml')) + +config.resolver.unstable_enablePackageExports = true + +if (isMonorepo) { + config.watchFolders = [monorepoRoot] + + config.resolver.nodeModulesPaths = [ + path.resolve(projectRoot, 'node_modules'), + path.resolve(monorepoRoot, 'node_modules'), + ] + + // Force a single React + RN copy (pnpm's nested layout can otherwise produce + // duplicate React → "Invalid hook call" at runtime). + const reactDir = path.dirname( + require.resolve('react/package.json', { paths: [projectRoot] }), + ) + const reactNativeDir = path.dirname( + require.resolve('react-native/package.json', { paths: [projectRoot] }), + ) + config.resolver.extraNodeModules = { + react: reactDir, + 'react/jsx-runtime': path.join(reactDir, 'jsx-runtime'), + 'react/jsx-dev-runtime': path.join(reactDir, 'jsx-dev-runtime'), + 'react-native': reactNativeDir, + } + + // Block any other react versions in the pnpm store from sneaking into the bundle + // through transitive deps that resolve via absolute path (bypassing aliases). + const reactPkg = require('react/package.json') + const exampleReactVersion = reactPkg.version + const esc = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pnpmStore = path.join(monorepoRoot, 'node_modules', '.pnpm') + config.resolver.blockList = [ + new RegExp( + `^${esc(pnpmStore)}/react@(?!${esc(exampleReactVersion)})[^/]+/.*`, + ), + ] +} + +module.exports = withTanStackRouter(config) diff --git a/examples/react-native/expo-go/package.json b/examples/react-native/expo-go/package.json new file mode 100644 index 0000000000..bad36f0f4d --- /dev/null +++ b/examples/react-native/expo-go/package.json @@ -0,0 +1,30 @@ +{ + "name": "tanstack-router-react-native-expo-go-example", + "version": "1.0.0", + "main": "index.js", + "private": true, + "scripts": { + "start": "EXPO_NO_METRO_WORKSPACE_ROOT=1 expo start --port 8125", + "routes:generate": "npx @tanstack/router-cli generate", + "routes:watch": "npx @tanstack/router-cli watch" + }, + "dependencies": { + "@tanstack/react-native-router": "workspace:*", + "@tanstack/router-core": "workspace:*", + "expo": "~54.0.0", + "expo-status-bar": "~3.0.9", + "react": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.16.0", + "react-native-url-polyfill": "^3.0.0" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/runtime": "^7.25.0", + "@tanstack/router-cli": "workspace:*", + "@types/react": "~19.1.0", + "typescript": "^5.9.3" + } +} diff --git a/examples/react-native/expo-go/src/router.ts b/examples/react-native/expo-go/src/router.ts new file mode 100644 index 0000000000..cf8b4f94f3 --- /dev/null +++ b/examples/react-native/expo-go/src/router.ts @@ -0,0 +1,39 @@ +import { + createRouter, + createNativeHistory, +} from '@tanstack/react-native-router/core' +import { routeTree } from './routeTree.gen' + +export const router = createRouter({ + routeTree, + history: createNativeHistory(), + defaultPreload: 'intent', + native: { + linking: { + prefixes: ['tsrgo://'], + initialMode: 'push', + parseUrl: (url) => { + if (!url) return null + if (url.startsWith('tsrgo://')) { + return `/${url.replace('tsrgo://', '').replace(/^\/+/, '')}` + } + try { + const parsed = new URL(url) + if (parsed.protocol === 'exp:') { + const path = parsed.pathname.replace(/^\/--/, '') || '/' + return `${path}${parsed.search}${parsed.hash}` + } + return null + } catch { + return null + } + }, + }, + }, +}) + +declare module '@tanstack/react-native-router' { + interface Register { + router: typeof router + } +} diff --git a/examples/react-native/expo-go/src/routes/__root.tsx b/examples/react-native/expo-go/src/routes/__root.tsx new file mode 100644 index 0000000000..15a5f5caaf --- /dev/null +++ b/examples/react-native/expo-go/src/routes/__root.tsx @@ -0,0 +1,31 @@ +import * as React from 'react' +import { StyleSheet, View } from 'react-native' +import { Outlet, createRootRoute } from '@tanstack/react-native-router' + +export const Route = createRootRoute({ + native: { + presentation: 'push', + gestureEnabled: true, + headerTintColor: '#ffffff', + headerStyle: { + backgroundColor: '#10b981', + }, + }, + component: RootComponent, +}) + +// Root provides shared native defaults inherited by descendants. +function RootComponent() { + return ( + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, +}) diff --git a/examples/react-native/expo-go/src/routes/about.tsx b/examples/react-native/expo-go/src/routes/about.tsx new file mode 100644 index 0000000000..608d30fb30 --- /dev/null +++ b/examples/react-native/expo-go/src/routes/about.tsx @@ -0,0 +1,91 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/about')({ + native: { + title: 'About', + }, + component: AboutScreen, +}) + +function AboutScreen() { + return ( + + + About + + TanStack Router for React Native provides the same powerful routing + capabilities you love from the web, adapted for mobile. + + + + Features + + • Native stack navigation with react-native-screens + + + • iOS edge-swipe gesture to go back + + + • Full TypeScript support with type-safe routes + + + • Search params and path params + + • Data loading with loaders + • Android back button handling + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + cardTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 16, + }, + featureText: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, +}) diff --git a/examples/react-native/expo-go/src/routes/index.tsx b/examples/react-native/expo-go/src/routes/index.tsx new file mode 100644 index 0000000000..a4032fde29 --- /dev/null +++ b/examples/react-native/expo-go/src/routes/index.tsx @@ -0,0 +1,115 @@ +import * as React from 'react' +import { ScrollView, StyleSheet, Text, View } from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/')({ + native: { + title: 'TanStack Router', + }, + component: HomeScreen, +}) + +function HomeScreen() { + return ( + + + Welcome! + + This is a TanStack Router example running on React Native with native + screen navigation. + + + + Features + • Type-safe routing + • Native screen transitions + • Search params and path params + • Data loading with loaders + • Android back button support + + + + Navigate to: + + About → + + + Posts → + + + Stack Depth Lab → + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 20, + }, + title: { + fontSize: 32, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 12, + }, + description: { + fontSize: 16, + color: '#6b7280', + lineHeight: 24, + marginBottom: 24, + }, + features: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + marginBottom: 24, + }, + featuresTitle: { + fontSize: 18, + fontWeight: '600', + color: '#1f2937', + marginBottom: 12, + }, + feature: { + fontSize: 15, + color: '#4b5563', + lineHeight: 28, + }, + nav: { + gap: 12, + }, + navTitle: { + fontSize: 16, + fontWeight: '600', + color: '#1f2937', + marginBottom: 4, + }, + navLink: { + backgroundColor: '#10b981', + padding: 16, + borderRadius: 12, + alignItems: 'center', + }, + navLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, +}) diff --git a/examples/react-native/expo-go/src/routes/posts.$postId.index.tsx b/examples/react-native/expo-go/src/routes/posts.$postId.index.tsx new file mode 100644 index 0000000000..a0e3bddad5 --- /dev/null +++ b/examples/react-native/expo-go/src/routes/posts.$postId.index.tsx @@ -0,0 +1,154 @@ +import * as React from 'react' +import { + ActivityIndicator, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' +import type { NativeOptionsContext } from '@tanstack/react-native-router' + +type Post = { + id: number + title: string + body: string + userId: number +} + +async function fetchPost(postId: string): Promise { + const response = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}`, + ) + return response.json() +} + +export const Route = createFileRoute('/posts/$postId/')({ + native: ({ params, loaderData }: NativeOptionsContext) => ({ + title: + (loaderData as { post?: { title?: string } } | undefined)?.post?.title ?? + `Post #${params.postId}`, + }), + component: PostScreen, + loader: async ({ params }) => { + const post = await fetchPost(params.postId) + return { post } + }, + pendingComponent: () => ( + + + + Loading post... + + + ), +}) + +function PostScreen() { + const { post } = Route.useLoaderData() + const { postId } = Route.useParams() + + return ( + + + + {post.title} + {post.body} + + Author + User #{post.userId} + + + + + View Comments → + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + content: { + flex: 1, + }, + contentContainer: { + padding: 16, + }, + card: { + backgroundColor: 'white', + padding: 20, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + title: { + fontSize: 22, + fontWeight: 'bold', + color: '#1f2937', + marginBottom: 16, + lineHeight: 30, + }, + body: { + fontSize: 16, + color: '#4b5563', + lineHeight: 26, + marginBottom: 20, + }, + meta: { + borderTopWidth: 1, + borderTopColor: '#e5e7eb', + paddingTop: 16, + flexDirection: 'row', + justifyContent: 'space-between', + }, + metaLabel: { + fontSize: 14, + color: '#6b7280', + }, + metaValue: { + fontSize: 14, + color: '#1f2937', + fontWeight: '500', + }, + deepLink: { + marginTop: 16, + paddingVertical: 16, + backgroundColor: '#10b981', + borderRadius: 12, + alignItems: 'center', + }, + deepLinkText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/expo-go/src/routes/posts.index.tsx b/examples/react-native/expo-go/src/routes/posts.index.tsx new file mode 100644 index 0000000000..777292d8f7 --- /dev/null +++ b/examples/react-native/expo-go/src/routes/posts.index.tsx @@ -0,0 +1,222 @@ +import * as React from 'react' +import { + ActivityIndicator, + FlatList, + Pressable, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native' +import { Link, createFileRoute } from '@tanstack/react-native-router' + +type Post = { + id: number + title: string + body: string +} + +async function fetchPosts(): Promise> { + const response = await fetch( + 'https://jsonplaceholder.typicode.com/posts?_limit=10', + ) + return response.json() +} + +export const Route = createFileRoute('/posts/')({ + native: { + title: 'Posts', + headerLargeTitle: true, + }, + validateSearch: (search: Record) => ({ + q: typeof search.q === 'string' ? search.q : '', + }), + component: PostsScreen, + loader: async () => { + const posts = await fetchPosts() + return { posts } + }, + pendingComponent: () => ( + + + + Loading posts... + + + ), +}) + +function PostsScreen() { + const { posts } = Route.useLoaderData() + const search = Route.useSearch() as { q?: string } + const q = search.q ?? '' + const navigate = Route.useNavigate() + + const filteredPosts = React.useMemo(() => { + const query = q.trim().toLowerCase() + if (!query) return posts + + return posts.filter((post: Post) => + post.title.toLowerCase().includes(query), + ) + }, [posts, q]) + + const setSearchQuery = React.useCallback( + (nextQuery: string) => { + navigate({ + search: (prev: { q?: string }) => ({ + ...prev, + q: nextQuery.trim() ? nextQuery : undefined, + }), + replace: true, + }) + }, + [navigate], + ) + + return ( + + item.id.toString()} + ListHeaderComponent={ + + + {!!q && ( + setSearchQuery('')} + > + Clear + + )} + + } + ListEmptyComponent={ + + No matching posts + + Try a different title keyword. + + + } + renderItem={({ item }) => ( + + {item.title} + + {item.body} + + + + )} + contentContainerStyle={styles.list} + /> + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + loadingContainer: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + list: { + padding: 16, + gap: 12, + }, + searchWrap: { + marginBottom: 12, + gap: 8, + }, + searchInput: { + height: 46, + borderRadius: 12, + borderWidth: 1, + borderColor: '#d1d5db', + backgroundColor: 'white', + paddingHorizontal: 14, + fontSize: 16, + color: '#111827', + }, + clearButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#dcfce7', + }, + clearButtonText: { + fontSize: 12, + fontWeight: '600', + color: '#166534', + }, + postCard: { + backgroundColor: 'white', + padding: 16, + borderRadius: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + flexDirection: 'row', + alignItems: 'center', + }, + postTitle: { + flex: 1, + fontSize: 15, + fontWeight: '600', + color: '#1f2937', + }, + postBody: { + display: 'none', + }, + postArrow: { + fontSize: 18, + color: '#9ca3af', + marginLeft: 8, + }, + emptyState: { + marginTop: 20, + padding: 20, + borderRadius: 12, + backgroundColor: 'white', + alignItems: 'center', + }, + emptyTitle: { + fontSize: 16, + fontWeight: '600', + color: '#111827', + }, + emptySubtitle: { + marginTop: 6, + fontSize: 14, + color: '#6b7280', + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 12, + }, + loadingText: { + fontSize: 16, + color: '#6b7280', + }, +}) diff --git a/examples/react-native/expo-go/tsconfig.json b/examples/react-native/expo-go/tsconfig.json new file mode 100644 index 0000000000..6a530e8057 --- /dev/null +++ b/examples/react-native/expo-go/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "skipLibCheck": true + }, + "include": ["src", "App.tsx", "index.js"], + "exclude": ["node_modules"] +} diff --git a/examples/react-native/expo-go/tsr.config.json b/examples/react-native/expo-go/tsr.config.json new file mode 100644 index 0000000000..f6cfd20e9a --- /dev/null +++ b/examples/react-native/expo-go/tsr.config.json @@ -0,0 +1,5 @@ +{ + "target": "react-native", + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts" +} diff --git a/package.json b/package.json index 89a0dcf333..5cd7b8ef7a 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,8 @@ "react-dom": "$react-dom", "@types/react": "$@types/react", "@types/react-dom": "$@types/react-dom", + "tanstack-router-react-native-example>react": "19.1.0", + "tanstack-router-react-native-example>@types/react": "~19.1.0", "eslint": "$eslint", "vite": "$vite", "@types/node": "$@types/node", @@ -106,6 +108,7 @@ "@tanstack/history": "workspace:*", "@tanstack/router-core": "workspace:*", "@tanstack/react-router": "workspace:*", + "@tanstack/react-native-router": "workspace:*", "@tanstack/router-cli": "workspace:*", "@tanstack/router-devtools": "workspace:*", "@tanstack/router-devtools-core": "workspace:^", diff --git a/packages/history/src/index.ts b/packages/history/src/index.ts index 705dbf0111..77a58d65af 100644 --- a/packages/history/src/index.ts +++ b/packages/history/src/index.ts @@ -56,6 +56,8 @@ export type ParsedHistoryState = HistoryState & { key?: string // TODO: Remove in v2 - use __TSR_key instead __TSR_key?: string __TSR_index: number + __TSR_entryId?: string + __TSR_nativeMinStackState?: 'active' | 'paused' } type ShouldAllowNavigation = any diff --git a/packages/react-native-router/package.json b/packages/react-native-router/package.json new file mode 100644 index 0000000000..1fd1d06601 --- /dev/null +++ b/packages/react-native-router/package.json @@ -0,0 +1,105 @@ +{ + "name": "@tanstack/react-native-router", + "version": "0.0.1", + "description": "(Alpha) Modern and scalable routing for React Native applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/router.git", + "directory": "packages/react-native-router" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "react", + "react-native", + "router", + "routing", + "navigation", + "native", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint", + "test:types": "tsc -p tsconfig.json --noEmit", + "test:unit": "vitest", + "test:unit:dev": "pnpm run test:unit --watch --hideSkippedTests", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "vite build" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./history": { + "import": { + "types": "./dist/esm/history.d.ts", + "default": "./dist/esm/history.js" + }, + "require": { + "types": "./dist/cjs/history.d.cts", + "default": "./dist/cjs/history.cjs" + } + }, + "./core": { + "import": { + "types": "./dist/esm/core.d.ts", + "default": "./dist/esm/core.js" + }, + "require": { + "types": "./dist/cjs/core.d.cts", + "default": "./dist/cjs/core.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=20.19" + }, + "dependencies": { + "@tanstack/history": "workspace:*", + "@tanstack/react-store": "^0.9.1", + "@tanstack/router-core": "workspace:*", + "tiny-invariant": "^1.3.3", + "tiny-warning": "^1.0.3" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "@types/react-native": "^0.72.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-native": ">=0.72.0", + "react-native-gesture-handler": ">=2.0.0", + "react-native-screens": ">=3.0.0" + }, + "peerDependenciesMeta": { + "react-native-gesture-handler": { + "optional": true + }, + "react-native-screens": { + "optional": true + } + } +} diff --git a/packages/react-native-router/src/CatchBoundary.tsx b/packages/react-native-router/src/CatchBoundary.tsx new file mode 100644 index 0000000000..6f341ec238 --- /dev/null +++ b/packages/react-native-router/src/CatchBoundary.tsx @@ -0,0 +1,193 @@ +import * as React from 'react' +import { Pressable, Text, View } from 'react-native' +import type { ErrorInfo } from 'react' +import type { ErrorRouteComponent } from './route' + +export interface ErrorComponentProps { + error: Error + reset: () => void + info?: { componentStack: string } +} + +/** + * Default error component for React Native + */ +export function ErrorComponent({ error }: ErrorComponentProps) { + const [show, setShow] = React.useState(__DEV__) + + return ( + + + Something went wrong! + setShow((d) => !d)}> + + {show ? 'Hide Error' : 'Show Error'} + + + + {show && ( + + {error.message} + + )} + + ) +} + +// Lazy styles to avoid accessing native modules at module load time +let _styles: { + container: object + header: object + title: object + button: object + buttonText: object + errorBox: object + message: object +} | null = null +function getStyles() { + if (!_styles) { + const { StyleSheet } = require('react-native') + _styles = StyleSheet.create({ + container: { + flex: 1, + padding: 16, + justifyContent: 'center', + alignItems: 'center', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + }, + title: { + fontSize: 16, + fontWeight: 'bold', + color: '#1f2937', + }, + button: { + borderWidth: 1, + borderColor: '#6b7280', + paddingHorizontal: 6, + paddingVertical: 2, + borderRadius: 4, + }, + buttonText: { + fontSize: 10, + fontWeight: 'bold', + color: '#6b7280', + }, + errorBox: { + marginTop: 8, + borderWidth: 1, + borderColor: '#dc2626', + borderRadius: 4, + padding: 8, + maxWidth: '100%', + }, + message: { + fontSize: 12, + color: '#dc2626', + }, + }) + } + return _styles! +} + +const styles = { + get container() { + return getStyles().container + }, + get header() { + return getStyles().header + }, + get title() { + return getStyles().title + }, + get button() { + return getStyles().button + }, + get buttonText() { + return getStyles().buttonText + }, + get errorBox() { + return getStyles().errorBox + }, + get message() { + return getStyles().message + }, +} + +export function CatchBoundary(props: { + getResetKey: () => number | string + children: React.ReactNode + errorComponent?: ErrorRouteComponent + onCatch?: (error: Error, errorInfo: ErrorInfo) => void +}) { + const errorComponent = props.errorComponent ?? ErrorComponent + + return ( + { + if (error) { + return React.createElement(errorComponent, { + error, + reset, + }) + } + + return props.children + }} + /> + ) +} + +class CatchBoundaryImpl extends React.Component<{ + getResetKey: () => number | string + children: (props: { + error: Error | null + reset: () => void + }) => React.ReactNode + onCatch?: (error: Error, errorInfo: ErrorInfo) => void +}> { + state = { error: null } as { error: Error | null; resetKey: string } + static getDerivedStateFromProps(props: any) { + return { resetKey: props.getResetKey() } + } + static getDerivedStateFromError(error: Error) { + return { error } + } + reset() { + this.setState({ error: null }) + } + componentDidUpdate( + prevProps: Readonly<{ + getResetKey: () => string + children: (props: { error: any; reset: () => void }) => any + onCatch?: ((error: any, info: any) => void) | undefined + }>, + prevState: any, + ): void { + if (prevState.error && prevState.resetKey !== this.state.resetKey) { + this.reset() + } + } + componentDidCatch(error: Error, errorInfo: ErrorInfo) { + if (this.props.onCatch) { + this.props.onCatch(error, errorInfo) + } + } + render() { + // If the resetKey has changed, don't render the error + return this.props.children({ + error: + this.state.resetKey !== this.props.getResetKey() + ? null + : this.state.error, + reset: () => { + this.reset() + }, + }) + } +} diff --git a/packages/react-native-router/src/Link.tsx b/packages/react-native-router/src/Link.tsx new file mode 100644 index 0000000000..d7a87e5f3f --- /dev/null +++ b/packages/react-native-router/src/Link.tsx @@ -0,0 +1,333 @@ +import * as React from 'react' +import { Pressable, Text } from 'react-native' +import { + deepEqual, + exactPathTest, + functionalUpdate, + removeTrailingSlash, +} from '@tanstack/router-core' +import { useRouterState } from './useRouterState' +import { useRouter } from './useRouter' +import { resolveNativeNavigateOptions } from './nativeNavigation' +import type { + AnyRouter, + LinkOptions, + RegisteredRouter, + RoutePaths, +} from '@tanstack/router-core' +import type { + GestureResponderEvent, + PressableProps, + StyleProp, + TextStyle, + ViewStyle, +} from 'react-native' + +export interface ActiveLinkOptions { + /** + * Props applied when the link is active + */ + activeProps?: { + style?: StyleProp + textStyle?: StyleProp + } + /** + * Props applied when the link is inactive + */ + inactiveProps?: { + style?: StyleProp + textStyle?: StyleProp + } + /** + * Options for determining if the link is active + */ + activeOptions?: { + exact?: boolean + includeSearch?: boolean + includeHash?: boolean + explicitUndefined?: boolean + } +} + +export type NativeLinkProps< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends RoutePaths | string = string, + TTo extends string | undefined = '.', + TMaskFrom extends RoutePaths | string = TFrom, + TMaskTo extends string = '.', +> = LinkOptions & + ActiveLinkOptions & + Omit & { + /** + * Children to render inside the link + */ + children?: + | React.ReactNode + | ((state: { + isActive: boolean + isTransitioning: boolean + }) => React.ReactNode) + /** + * Style for the text when children is a string + */ + textStyle?: StyleProp + /** + * Whether the link is disabled + */ + disabled?: boolean + /** + * Custom onPress handler (called before navigation) + */ + onPress?: (e: GestureResponderEvent) => void + } + +/** + * Hook that returns props for creating a native link + */ +export function useNativeLinkProps< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends string = string, + TTo extends string | undefined = undefined, + TMaskFrom extends string = TFrom, + TMaskTo extends string = '', +>(options: NativeLinkProps) { + const router = useRouter() + const [isTransitioning, setIsTransitioning] = React.useState(false) + const optionsAny = options as any + + const { + activeProps, + inactiveProps, + activeOptions, + to: _to, + disabled, + onPress: userOnPress, + replace, + resetScroll, + viewTransition, + ignoreBlocker, + stackBehavior, + stackMatch, + entryId, + native, + params: _params, + search: _search, + hash: _hash, + state: _state, + mask: _mask, + from: _from, + ...pressableProps + } = optionsAny + + const from = options.from + + const _options = React.useMemo(() => ({ ...options, from }), [options, from]) + + const next = React.useMemo( + () => router.buildLocation({ ..._options } as any), + [router, _options], + ) + + const isActive = useRouterState({ + select: (s) => { + if (activeOptions?.exact) { + const testExact = exactPathTest( + s.location.pathname, + next.pathname, + router.basepath, + ) + if (!testExact) return false + } else { + const currentPathSplit = removeTrailingSlash( + s.location.pathname, + router.basepath, + ) + const nextPathSplit = removeTrailingSlash( + next.pathname, + router.basepath, + ) + + const pathIsFuzzyEqual = + currentPathSplit.startsWith(nextPathSplit) && + (currentPathSplit.length === nextPathSplit.length || + currentPathSplit[nextPathSplit.length] === '/') + + if (!pathIsFuzzyEqual) return false + } + + if (activeOptions?.includeSearch ?? true) { + const searchTest = deepEqual(s.location.search, next.search, { + partial: !activeOptions?.exact, + ignoreUndefined: !activeOptions?.explicitUndefined, + }) + if (!searchTest) return false + } + + if (activeOptions?.includeHash) { + return s.location.hash === next.hash + } + + return true + }, + }) + + const handlePress = React.useCallback( + (e: GestureResponderEvent) => { + if (disabled) return + + userOnPress?.(e) + + setIsTransitioning(true) + + const unsub = router.subscribe('onResolved', () => { + unsub() + setIsTransitioning(false) + }) + + router.navigate({ + ...resolveNativeNavigateOptions(router, { + ..._options, + replace, + resetScroll, + viewTransition, + ignoreBlocker, + stackBehavior, + stackMatch, + entryId, + native, + } as any), + } as any) + }, + [ + disabled, + userOnPress, + router, + _options, + replace, + resetScroll, + viewTransition, + ignoreBlocker, + stackBehavior, + stackMatch, + entryId, + native, + ], + ) + + const resolvedActiveProps = isActive ? functionalUpdate(activeProps, {}) : {} + + const resolvedInactiveProps = isActive + ? {} + : functionalUpdate(inactiveProps, {}) + + return { + onPress: handlePress, + disabled: !!disabled, + isActive, + isTransitioning, + activeProps: resolvedActiveProps, + inactiveProps: resolvedInactiveProps, + pressableProps, + } +} + +/** + * A pressable link component for React Native that navigates to a route. + */ +export const Link = React.forwardRef< + React.ElementRef, + NativeLinkProps +>(function LinkImpl(props, ref) { + const { children, style, textStyle, ...rest } = props + const linkProps = useNativeLinkProps(rest) + + const resolvedStyle = React.useMemo(() => { + return [ + styles.link, + style, + linkProps.isActive + ? linkProps.activeProps?.style + : linkProps.inactiveProps?.style, + ] + }, [ + style, + linkProps.isActive, + linkProps.activeProps?.style, + linkProps.inactiveProps?.style, + ]) + + const resolvedTextStyle = React.useMemo(() => { + return [ + textStyle, + linkProps.isActive + ? linkProps.activeProps?.textStyle + : linkProps.inactiveProps?.textStyle, + ] + }, [ + textStyle, + linkProps.isActive, + linkProps.activeProps?.textStyle, + linkProps.inactiveProps?.textStyle, + ]) + + const renderChildren = () => { + if (typeof children === 'function') { + return children({ + isActive: linkProps.isActive, + isTransitioning: linkProps.isTransitioning, + }) + } + + if (typeof children === 'string') { + return {children} + } + + return children + } + + return ( + { + linkProps.onPress(e) + }} + disabled={linkProps.disabled} + style={resolvedStyle} + accessibilityRole="link" + > + {renderChildren()} + + ) +}) as < + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends string = string, + TTo extends string | undefined = undefined, + TMaskFrom extends string = TFrom, + TMaskTo extends string = '', +>( + props: NativeLinkProps & { + ref?: React.Ref> + }, +) => React.ReactElement + +// Lazy styles to avoid accessing native modules at module load time +let _styles: { link: object } | null = null +function getStyles() { + if (!_styles) { + const { StyleSheet } = require('react-native') + _styles = StyleSheet.create({ + link: { + // Default link styling (minimal) + }, + }) + } + return _styles! +} + +// Use getter for styles +const styles = { + get link() { + return getStyles().link + }, +} diff --git a/packages/react-native-router/src/Match.tsx b/packages/react-native-router/src/Match.tsx new file mode 100644 index 0000000000..892b494dce --- /dev/null +++ b/packages/react-native-router/src/Match.tsx @@ -0,0 +1,241 @@ +import * as React from 'react' +import invariant from 'tiny-invariant' +import warning from 'tiny-warning' +import { + createControlledPromise, + isNotFound, + isRedirect, + rootRouteId, +} from '@tanstack/router-core' +import { CatchBoundary, ErrorComponent } from './CatchBoundary' +import { useRouterState } from './useRouterState' +import { useRouter } from './useRouter' +import { matchContext } from './matchContext' +import { SafeFragment } from './SafeFragment' +import type { AnyRoute } from '@tanstack/router-core' + +export const Match = React.memo(function MatchImpl({ + matchId, +}: { + matchId: string +}) { + const router = useRouter() + const matchState = useRouterState({ + select: (s) => { + const match = s.matches.find((d) => d.id === matchId) + invariant( + match, + `Could not find match for matchId "${matchId}". Please file an issue!`, + ) + return { + routeId: match.routeId, + } + }, + structuralSharing: true as any, + }) + + const route: AnyRoute = router.routesById[matchState.routeId] + + const PendingComponent = + route.options.pendingComponent ?? router.options.defaultPendingComponent + + const pendingElement = PendingComponent ? : null + + const routeErrorComponent = + route.options.errorComponent ?? router.options.defaultErrorComponent + + const routeOnCatch = route.options.onCatch ?? router.options.defaultOnCatch + + const ResolvedSuspenseBoundary = + (route.options.wrapInSuspense ?? PendingComponent) + ? React.Suspense + : SafeFragment + + const ResolvedCatchBoundary = routeErrorComponent + ? CatchBoundary + : SafeFragment + + const resetKey = useRouterState({ + select: (s) => s.loadedAt, + }) + + return ( + + + resetKey} + errorComponent={routeErrorComponent || ErrorComponent} + onCatch={(error, errorInfo) => { + if (isNotFound(error)) throw error + warning(false, `Error in route match: ${matchId}`) + routeOnCatch?.(error, errorInfo) + }} + > + + + + + ) +}) + +export const MatchInner = React.memo(function MatchInnerImpl({ + matchId, +}: { + matchId: string +}): any { + const router = useRouter() + + const { match, key, routeId } = useRouterState({ + select: (s) => { + const match = s.matches.find((d) => d.id === matchId) + + // Return early if match not found (can happen during navigation transitions) + if (!match) { + return { + key: undefined, + routeId: undefined, + match: undefined, + } + } + + const routeId = match.routeId as string + + const remountFn = + (router.routesById[routeId] as AnyRoute).options.remountDeps ?? + router.options.defaultRemountDeps + const remountDeps = remountFn?.({ + routeId, + loaderDeps: match.loaderDeps, + params: match._strictParams, + search: match._strictSearch, + }) + const key = remountDeps ? JSON.stringify(remountDeps) : undefined + + return { + key, + routeId, + match: { + id: match.id, + status: match.status, + error: match.error, + _forcePending: match._forcePending, + _displayPending: match._displayPending, + }, + } + }, + structuralSharing: true as any, + }) + + const route = routeId ? (router.routesById[routeId] as AnyRoute) : undefined + + const out = React.useMemo(() => { + if (!route) return null + const Comp = route.options.component ?? router.options.defaultComponent + if (Comp) { + return + } + return + }, [key, route, router.options.defaultComponent]) + + // Don't render if match not found yet + if (!match || !routeId || !route) { + return null + } + + if (match._displayPending) { + throw router.getMatch(match.id)?._nonReactive.displayPendingPromise + } + + if (match._forcePending) { + throw router.getMatch(match.id)?._nonReactive.minPendingPromise + } + + if (match.status === 'pending') { + const pendingMinMs = + route.options.pendingMinMs ?? router.options.defaultPendingMinMs + if (pendingMinMs) { + const routerMatch = router.getMatch(match.id) + if (routerMatch && !routerMatch._nonReactive.minPendingPromise) { + const minPendingPromise = createControlledPromise() + + routerMatch._nonReactive.minPendingPromise = minPendingPromise + + setTimeout(() => { + minPendingPromise.resolve() + routerMatch._nonReactive.minPendingPromise = undefined + }, pendingMinMs) + } + } + throw router.getMatch(match.id)?._nonReactive.loadPromise + } + + if (match.status === 'notFound') { + invariant(isNotFound(match.error), 'Expected a notFound error') + throw match.error + } + + if (match.status === 'redirected') { + invariant(isRedirect(match.error), 'Expected a redirect error') + throw router.getMatch(match.id)?._nonReactive.loadPromise + } + + if (match.status === 'error') { + throw match.error + } + + return out +}) + +/** + * Render the next child match in the route tree. Typically used inside + * a route component to render nested routes. + */ +export const Outlet = React.memo(function OutletImpl() { + const router = useRouter() + const matchId = React.useContext(matchContext) + const routeId = useRouterState({ + select: (s) => s.matches.find((d) => d.id === matchId)?.routeId as string, + }) + + const parentGlobalNotFound = useRouterState({ + select: (s) => { + const matches = s.matches + const parentMatch = matches.find((d) => d.id === matchId) + invariant( + parentMatch, + `Could not find parent match for matchId "${matchId}"`, + ) + return parentMatch.globalNotFound + }, + }) + + const childMatchId = useRouterState({ + select: (s) => { + const matches = s.matches + const index = matches.findIndex((d) => d.id === matchId) + return matches[index + 1]?.id + }, + }) + + const pendingElement = router.options.defaultPendingComponent ? ( + + ) : null + + if (parentGlobalNotFound) { + return null + } + + if (!childMatchId) { + return null + } + + const nextMatch = + + if (routeId === rootRouteId) { + return ( + {nextMatch} + ) + } + + return nextMatch +}) diff --git a/packages/react-native-router/src/Matches.tsx b/packages/react-native-router/src/Matches.tsx new file mode 100644 index 0000000000..637f1e9232 --- /dev/null +++ b/packages/react-native-router/src/Matches.tsx @@ -0,0 +1,863 @@ +import * as React from 'react' +import { useStore } from '@tanstack/react-store' +import { rootRouteId } from '@tanstack/router-core' +import { useRouterState } from './useRouterState' +import { useRouter } from './useRouter' +import { Match } from './Match' +import { matchContext } from './matchContext' +import { routerStateContext } from './routerStateContext' +import { CatchBoundary, ErrorComponent } from './CatchBoundary' +import { Transitioner } from './Transitioner' +import { resolveNativeRouteOptions } from './resolveNativeRouteOptions' +import type { AnyRoute, RouterState } from '@tanstack/router-core' +import type { + NativeHeaderContext, + NativeHeaderVisibilityOption, + NativeMinStackState, + NativeRouteOptions, + NativeRouteOptionsInput, + NativeStackState, +} from './route' +import type { NativeRouterOptions } from './router' + +// Lazily load react-native-screens to avoid accessing native modules at module load time +let _Screen: any = null +let _ScreenStack: any = null +let _ScreenStackHeaderConfig: any = null +let _ScreenStackHeaderLeftView: any = null +let _ScreenStackHeaderRightView: any = null +let _ScreenStackHeaderCenterView: any = null +let _screensChecked = false +let _screensEnabled = false +let _View: any = null + +function getScreenComponents() { + if (!_screensChecked) { + _screensChecked = true + try { + const screens = require('react-native-screens') + if (!_screensEnabled && typeof screens.enableScreens === 'function') { + screens.enableScreens(true) + _screensEnabled = true + } + _Screen = screens.Screen + _ScreenStack = screens.ScreenStack + _ScreenStackHeaderConfig = screens.ScreenStackHeaderConfig + _ScreenStackHeaderLeftView = screens.ScreenStackHeaderLeftView + _ScreenStackHeaderRightView = screens.ScreenStackHeaderRightView + _ScreenStackHeaderCenterView = screens.ScreenStackHeaderCenterView + } catch { + // react-native-screens not installed, will use View-based rendering + } + + if (!_View) { + try { + _View = require('react-native').View + } catch { + // ignore + } + } + } + return { + Screen: _Screen, + ScreenStack: _ScreenStack, + ScreenStackHeaderConfig: _ScreenStackHeaderConfig, + ScreenStackHeaderLeftView: _ScreenStackHeaderLeftView, + ScreenStackHeaderRightView: _ScreenStackHeaderRightView, + ScreenStackHeaderCenterView: _ScreenStackHeaderCenterView, + View: _View, + } +} + +/** + * Internal component that renders the router's active match tree. + * Uses View-based rendering (no native screen stack). + */ +export function Matches() { + return +} + +function MatchesImpl({ + includeTransitioner, +}: { + includeTransitioner: boolean +}) { + const router = useRouter() + const rootRoute: AnyRoute = router.routesById[rootRouteId] + + const PendingComponent = + rootRoute.options.pendingComponent ?? router.options.defaultPendingComponent + + const pendingElement = PendingComponent ? : null + + const inner = ( + + {includeTransitioner ? : null} + + + ) + + return router.options.InnerWrap ? ( + {inner} + ) : ( + inner + ) +} + +function MatchesInner() { + const router = useRouter() + const matchId = useRouterState({ + select: (s) => s.matches[0]?.id, + }) + + const resetKey = useRouterState({ + select: (s) => s.loadedAt, + }) + + const matchComponent = matchId ? : null + + return ( + + {router.options.disableGlobalCatchBoundary ? ( + matchComponent + ) : ( + resetKey} + errorComponent={ErrorComponent} + onCatch={(error) => { + console.warn( + `The following error wasn't caught by any route! Consider setting an 'errorComponent' in your RootRoute!`, + ) + console.warn(error.message || error.toString()) + }} + > + {matchComponent} + + )} + + ) +} + +/** + * Map our animation option to react-native-screens stackAnimation + */ +function getStackAnimation( + animation: NativeRouteOptions['animation'], +): string | undefined { + if (!animation || animation === 'default') return undefined + return animation +} + +function getGestureEnabled(screen: ScreenEntry): boolean { + if (typeof screen.gestureEnabled === 'boolean') { + return screen.gestureEnabled + } + + return (screen.presentation ?? 'push') === 'push' +} + +function resolveVisibilityOption( + option: NativeHeaderVisibilityOption | undefined, + ctx: NativeHeaderContext, + fallback: boolean, +): boolean { + if (typeof option === 'function') { + return option(ctx) + } + + if (typeof option === 'boolean') { + return option + } + + return fallback +} + +function resolveTitle( + title: NativeRouteOptions['title'], + ctx: NativeHeaderContext, +): string | undefined { + if (typeof title === 'function') { + return title(ctx) + } + + return title +} + +function getDefaultTitle(pathname: string): string { + if (pathname === '/') { + return 'Home' + } + + const parts = pathname.split('/').filter(Boolean) + const segment = parts[parts.length - 1] + if (!segment) { + return 'Screen' + } + + const decoded = decodeURIComponent(segment) + return decoded.replace(/[-_]/g, ' ').replace(/\b\w/g, (s) => s.toUpperCase()) +} + +interface ScreenEntry { + pathname: string + routeId: string + locationKey: string + historyIndex: number + params: Record + search: unknown + loaderData: unknown + context: unknown + state: RouterState + revision: number + native: NativeRouteOptions | undefined + entryMinStackState?: NativeMinStackState + resolvedStackState: NativeStackState + presentation?: NativeRouteOptions['presentation'] + gestureEnabled?: boolean + animation?: NativeRouteOptions['animation'] +} + +function mergeNativeOptions( + previous: NativeRouteOptions | undefined, + next: NativeRouteOptions, +): NativeRouteOptions { + return { + ...previous, + ...next, + headerStyle: + previous?.headerStyle || next.headerStyle + ? { + ...(previous?.headerStyle ?? {}), + ...(next.headerStyle ?? {}), + } + : undefined, + } +} + +function resolveNativeForMatchedIndex( + router: ReturnType, + matches: Array, + targetIndex: number, + pathname: string, + historyIndex: number, +): { + native: NativeRouteOptions | undefined + leafMinStackState: NativeMinStackState | undefined +} { + let mergedNative: NativeRouteOptions | undefined + let leafMinStackState: NativeMinStackState | undefined + + for (let i = 0; i <= targetIndex; i++) { + const match = matches[i]! + const route = router.routesById[match.routeId] as AnyRoute | undefined + const nativeInput = (route?.options as any)?.native as + | NativeRouteOptionsInput + | undefined + + const resolved = resolveNativeRouteOptions(nativeInput, { + pathname, + params: match.params ?? {}, + search: match.search, + loaderData: match.loaderData, + context: match.context, + canGoBack: historyIndex > 0, + }) + + if (!resolved) { + continue + } + + if (i === targetIndex) { + leafMinStackState = resolved.minStackState + mergedNative = mergeNativeOptions(mergedNative, resolved) + continue + } + + const { minStackState: _minStackState, ...inheritedNative } = resolved + mergedNative = mergeNativeOptions(mergedNative, inheritedNative) + } + + return { + native: mergedNative, + leafMinStackState, + } +} + +export interface NativeStackDebugEntry { + pathname: string + routeId: string + historyIndex: number + locationKey: string + entryMinStackState?: NativeMinStackState + resolvedStackState: NativeStackState +} + +let nativeStackDebugSnapshot: Array = [] +const nativeStackDebugListeners = new Set<() => void>() + +function setNativeStackDebugSnapshot(stack: Array) { + nativeStackDebugSnapshot = stack.map((entry) => ({ + pathname: entry.pathname, + routeId: entry.routeId, + historyIndex: entry.historyIndex, + locationKey: entry.locationKey, + entryMinStackState: entry.entryMinStackState, + resolvedStackState: entry.resolvedStackState, + })) + + nativeStackDebugListeners.forEach((listener) => listener()) +} + +export function getNativeStackDebugSnapshot(): Array { + return nativeStackDebugSnapshot +} + +export function subscribeNativeStackDebug(listener: () => void): () => void { + nativeStackDebugListeners.add(listener) + return () => { + nativeStackDebugListeners.delete(listener) + } +} + +export function useNativeStackDebugSnapshot(): Array { + return React.useSyncExternalStore( + subscribeNativeStackDebug, + getNativeStackDebugSnapshot, + getNativeStackDebugSnapshot, + ) +} + +const DEFAULT_PAUSED_DEPTH = 3 + +function toNonNegativeInt(value: unknown): number | undefined { + if (typeof value !== 'number' || !Number.isFinite(value)) { + return undefined + } + + if (value < 0) { + return undefined + } + + return Math.floor(value) +} + +function getDepthPolicy(nativeOptions: NativeRouterOptions | undefined) { + const pausedDepth = + toNonNegativeInt(nativeOptions?.pausedDepth) ?? DEFAULT_PAUSED_DEPTH + const detachedDepth = + toNonNegativeInt(nativeOptions?.detachedDepth) ?? pausedDepth + 1 + + return { + pausedDepth, + detachedDepth: Math.max(detachedDepth, pausedDepth + 1), + } +} + +function clampByMinStackState( + state: NativeStackState, + minStackState: NativeMinStackState | undefined, +): NativeStackState { + if (!minStackState) { + return state + } + + if (minStackState === 'active') { + return 'active' + } + + if (state === 'detached') { + return 'paused' + } + + return state +} + +function resolveRouteMinStackState( + entry: ScreenEntry, + routerNative: NativeRouterOptions | undefined, +): NativeMinStackState | undefined { + if (entry.entryMinStackState) { + return entry.entryMinStackState + } + + return ( + entry.native?.minStackState ?? + entry.native?.defaultMinStackState ?? + routerNative?.defaultMinStackState + ) +} + +function applyStackStates( + stack: Array, + navigationType: 'push' | 'pop' | 'replace' | 'none', + router: ReturnType, +): Array { + if (!stack.length) return stack + + const routerNative = (router.options as any).native as + | NativeRouterOptions + | undefined + const depthPolicy = getDepthPolicy(routerNative) + + const lastIndex = stack.length - 1 + const next = stack.map((entry, index) => { + const depth = lastIndex - index + const fallbackState: NativeStackState = + depth === 0 + ? 'active' + : depth >= depthPolicy.detachedDepth + ? 'detached' + : depth <= depthPolicy.pausedDepth + ? 'paused' + : 'paused' + + const minStackState = resolveRouteMinStackState(entry, routerNative) + const resolved = clampByMinStackState(fallbackState, minStackState) + + return { + ...entry, + resolvedStackState: resolved, + } + }) + + next[lastIndex] = { + ...next[lastIndex]!, + resolvedStackState: 'active', + } + + return next +} + +function cloneRouterState(state: RouterState): RouterState { + try { + if (typeof structuredClone === 'function') { + return structuredClone(state) + } + } catch { + // Fallback below + } + + return { + ...state, + location: { ...state.location }, + resolvedLocation: state.resolvedLocation + ? { ...state.resolvedLocation } + : undefined, + matches: state.matches.map((match) => ({ ...match })), + } +} + +/** + * Native screen wrapper using react-native-screens. + * + * Provides native push/pop animations when navigating between routes. + * Maintains a minimal screen stack to enable proper animation direction: + * - Forward navigation: new screen slides in from right + * - Back navigation: current screen slides out to right + */ +export function NativeScreenMatches() { + const router = useRouter() + const Activity = (React as any).Activity as + | React.ComponentType<{ + mode?: 'visible' | 'hidden' + children?: React.ReactNode + }> + | undefined + + // Lazily get screen components + const { + Screen, + ScreenStack, + ScreenStackHeaderConfig, + ScreenStackHeaderLeftView, + ScreenStackHeaderRightView, + ScreenStackHeaderCenterView, + View, + } = getScreenComponents() + + const isPendingNavigation = useRouterState({ + select: (s) => s.status === 'pending' && s.isLoading, + }) + + // pendingMatches is no longer on RouterState (signal-based core refactor) — + // subscribe to its dedicated store. Only matters when navigation is pending + // and there's a non-trivial match list to render mid-transition. + const pendingMatches = useStore( + router.stores.pendingMatches, + (m) => m, + ) as Array + const usePendingMatches = isPendingNavigation && pendingMatches.length > 1 + + // Get current pathname and animation options from deepest screen match + const currentScreen = useRouterState({ + select: (s): ScreenEntry => { + const historyIndex = s.location.state.__TSR_index + const locationKey = + s.location.state.__TSR_key ?? s.location.state.key ?? s.location.href + const isInitialDeepLink = Boolean( + (s.location.state as any).__TSR_initialDeepLink, + ) + + const matches = usePendingMatches ? pendingMatches : s.matches + + const renderState = usePendingMatches ? { ...s, matches } : s + // Find the deepest match that is a screen (not a layout/navigator) + for (let i = matches.length - 1; i >= 0; i--) { + const match = matches[i]! + if (match.routeId === rootRouteId) continue + const { native, leafMinStackState } = resolveNativeForMatchedIndex( + router, + matches, + i, + s.location.pathname, + historyIndex, + ) + if (native?.presentation === 'none') continue + + return { + pathname: s.location.pathname, + routeId: match.routeId, + locationKey, + historyIndex, + params: match.params ?? {}, + search: match.search, + loaderData: match.loaderData, + context: match.context, + state: cloneRouterState(renderState), + revision: s.loadedAt, + native, + entryMinStackState: + (s.location.state as any).__TSR_nativeMinStackState ?? + leafMinStackState, + resolvedStackState: 'active', + presentation: native?.presentation, + gestureEnabled: native?.gestureEnabled, + animation: isInitialDeepLink ? 'none' : native?.animation, + } + } + + return { + pathname: s.location.pathname, + routeId: rootRouteId, + locationKey, + historyIndex, + params: {}, + search: undefined, + loaderData: undefined, + context: undefined, + state: cloneRouterState(renderState), + revision: s.loadedAt, + native: undefined, + entryMinStackState: (s.location.state as any).__TSR_nativeMinStackState, + resolvedStackState: 'active', + presentation: undefined, + gestureEnabled: undefined, + animation: undefined, + } + }, + }) + + // Track screen stack for proper animation direction + const [screenStack, setScreenStack] = React.useState>(() => + applyStackStates([currentScreen], 'none', router), + ) + + // Update stack when navigation happens + React.useEffect(() => { + setScreenStack((prev) => { + const top = prev[prev.length - 1] + + if (!top) { + return applyStackStates([currentScreen], 'none', router) + } + + const nextIndex = currentScreen.historyIndex + const topIndex = top.historyIndex + + if (nextIndex > topIndex) { + return applyStackStates([...prev, currentScreen], 'push', router) + } + + if (nextIndex < topIndex) { + const existingIndex = prev.findIndex( + (s) => s.historyIndex === nextIndex, + ) + + if (existingIndex === -1) { + return applyStackStates([currentScreen], 'pop', router) + } + + const trimmed = prev.slice(0, existingIndex + 1) + trimmed[trimmed.length - 1] = { + ...currentScreen, + resolvedStackState: trimmed[trimmed.length - 1]!.resolvedStackState, + } + + return applyStackStates(trimmed, 'pop', router) + } + + const isReplace = top.locationKey !== currentScreen.locationKey + + if (isReplace) { + const next = prev.slice() + next[next.length - 1] = { + ...currentScreen, + resolvedStackState: top.resolvedStackState, + } + return applyStackStates(next, 'replace', router) + } + + if ( + top.revision !== currentScreen.revision || + top.animation !== currentScreen.animation || + top.presentation !== currentScreen.presentation || + top.gestureEnabled !== currentScreen.gestureEnabled + ) { + const next = prev.slice() + next[next.length - 1] = { + ...currentScreen, + resolvedStackState: top.resolvedStackState, + } + return next + } + + return prev + }) + }, [ + currentScreen.locationKey, + currentScreen.historyIndex, + currentScreen.revision, + currentScreen.animation, + currentScreen.presentation, + currentScreen.gestureEnabled, + currentScreen.entryMinStackState, + router, + ]) + + React.useEffect(() => { + if (!ScreenStack || !Screen) { + setNativeStackDebugSnapshot([currentScreen]) + return + } + + setNativeStackDebugSnapshot(screenStack) + }, [Screen, ScreenStack, currentScreen, screenStack]) + + const rootRoute: AnyRoute = router.routesById[rootRouteId] + const PendingComponent = + rootRoute.options.pendingComponent ?? router.options.defaultPendingComponent + const pendingElement = PendingComponent ? : null + + // If react-native-screens is not available, fall back to View-based rendering + if (!ScreenStack || !Screen) { + return + } + + const renderStack = screenStack.filter((entry) => { + if (entry.resolvedStackState === 'detached') { + return false + } + return true + }) + + const visibleStack = renderStack.length + ? renderStack + : [screenStack[screenStack.length - 1]!] + + return ( + <> + + + {visibleStack.map((screen, index) => { + const isTop = index === visibleStack.length - 1 + const stackAnimation = getStackAnimation(screen.animation) + const native = screen.native + + const headerContext: NativeHeaderContext = { + pathname: screen.pathname, + params: screen.params, + search: screen.search, + loaderData: screen.loaderData, + context: screen.context, + canGoBack: screen.historyIndex > 0, + } + + const defaultHeaderShown = + screen.presentation === 'none' ? false : true + const headerShown = resolveVisibilityOption( + native?.headerShown, + headerContext, + defaultHeaderShown, + ) + + const headerTintColor = native?.headerTintColor + const headerRenderContext = { + ...headerContext, + tintColor: headerTintColor, + } + + const headerLeftNode = native?.headerLeft?.(headerRenderContext) + const headerRightNode = native?.headerRight?.(headerRenderContext) + const customHeader = native?.header + const hasCustomHeader = typeof customHeader === 'function' + + const showBackButton = resolveVisibilityOption( + native?.headerBackVisible, + headerContext, + headerLeftNode ? false : headerContext.canGoBack, + ) + + const headerTitle = native?.headerTitle + const title = resolveTitle(native?.title, headerContext) + const titleText = + typeof headerTitle === 'function' + ? undefined + : typeof headerTitle === 'string' + ? headerTitle + : (title ?? getDefaultTitle(screen.pathname)) + + const headerCenterNode = + typeof headerTitle === 'function' + ? headerTitle(headerRenderContext) + : undefined + + const customHeaderNode = hasCustomHeader + ? customHeader(headerContext) + : undefined + + const shouldHideNativeHeader = hasCustomHeader ? true : !headerShown + const showBackInCustomView = Boolean(headerLeftNode && showBackButton) + + return ( + { + if (!isTop) { + return + } + if (router.history.canGoBack()) { + if ((router as any).back) { + ;(router as any).back() + } else { + router.history.back() + } + } + }} + > + + + + {screen.resolvedStackState === 'paused' && Activity ? ( + + {customHeaderNode && View ? ( + + {customHeaderNode} + + + ) : ( + + )} + + ) : customHeaderNode && View ? ( + + {customHeaderNode} + + + ) : ( + + )} + + + + ) + })} + + + ) +} + +// Lazy styles to avoid accessing native modules at module load time +let _styles: { + container: object + screen: object + customHeaderContainer: object +} | null = null +function getStyles() { + if (!_styles) { + const { StyleSheet } = require('react-native') + _styles = StyleSheet.create({ + container: { + flex: 1, + }, + screen: { + ...StyleSheet.absoluteFillObject, + }, + customHeaderContainer: { + flex: 1, + }, + }) + } + return _styles! +} + +const styles = { + get container() { + return getStyles().container + }, + get screen() { + return getStyles().screen + }, + get customHeaderContainer() { + return getStyles().customHeaderContainer + }, +} diff --git a/packages/react-native-router/src/NativeRouterProvider.tsx b/packages/react-native-router/src/NativeRouterProvider.tsx new file mode 100644 index 0000000000..8d2f6c1de0 --- /dev/null +++ b/packages/react-native-router/src/NativeRouterProvider.tsx @@ -0,0 +1,306 @@ +import * as React from 'react' +import { BackHandler, Linking, Platform, View } from 'react-native' +import { Matches, NativeScreenMatches } from './Matches' +import { parseExternalUrl } from './linking' +import { resolveNativeNavigateOptions } from './nativeNavigation' +import { getRouterContext } from './routerContext' +import type { AnyRouter, RegisteredRouter } from '@tanstack/router-core' +import type { NativeLinkingMode, NativeLinkingOptions } from './linking' + +// Lazily load GestureHandlerRootView to avoid accessing native modules at module load time +let _GestureHandlerRootView: any = null +let _gestureHandlerChecked = false + +function getGestureHandlerRootView() { + if (!_gestureHandlerChecked) { + _gestureHandlerChecked = true + try { + // Probe for the native TurboModule first. `getEnforcing` throws (and + // logs to LogBox in dev) when the native side isn't registered, but + // `get()` returns null. This matters in environments where the JS + // version of gesture-handler is installed but the native binary + // doesn't expose a matching module (e.g., Expo Go bundled with a + // different gesture-handler build than the one resolved in JS). + const RN = require('react-native') as { + TurboModuleRegistry?: { get?: (name: string) => unknown } + } + if (!RN.TurboModuleRegistry?.get?.('RNGestureHandlerModule')) { + return null + } + + const gestureHandler = require('react-native-gesture-handler') + _GestureHandlerRootView = gestureHandler.GestureHandlerRootView + } catch { + // gesture-handler not installed + } + } + return _GestureHandlerRootView +} + +export interface NativeRouterProviderProps< + TRouter extends AnyRouter = RegisteredRouter, +> { + router: TRouter + /** + * Use native screen stack rendering (requires react-native-screens) + * @default true + */ + useNativeScreens?: boolean + /** + * Additional context to merge into the router context + */ + context?: Record + /** + * Children to render (optional, typically not used as Matches is rendered automatically) + */ + children?: React.ReactNode +} + +function defaultLinkingSubscribe(listener: (url: string) => void) { + const sub = Linking.addEventListener('url', ({ url }) => { + listener(url) + }) + + return () => sub.remove() +} + +function resolveLinkingOptions( + linking: boolean | NativeLinkingOptions | undefined, +): Required< + Pick< + NativeLinkingOptions, + 'enabled' | 'initialMode' | 'initialAnimate' | 'incomingMode' + > +> & + Omit< + NativeLinkingOptions, + 'enabled' | 'initialMode' | 'initialAnimate' | 'incomingMode' + > { + if (linking === false) { + return { + enabled: false, + initialMode: 'push', + initialAnimate: false, + incomingMode: 'push', + prefixes: [], + } + } + + const options = linking === true || linking == null ? {} : linking + + return { + enabled: options.enabled ?? true, + prefixes: options.prefixes ?? [], + filter: options.filter, + parseUrl: options.parseUrl, + getInitialURL: options.getInitialURL ?? (() => Linking.getInitialURL()), + subscribe: options.subscribe ?? defaultLinkingSubscribe, + initialMode: options.initialMode ?? 'push', + initialAnimate: options.initialAnimate ?? false, + incomingMode: options.incomingMode ?? 'push', + onUnhandledUrl: options.onUnhandledUrl, + onError: options.onError, + } +} + +function useNativeLinking(router: AnyRouter) { + const linking = (router.options as any).native?.linking as + | boolean + | NativeLinkingOptions + | undefined + const linkingOptions = React.useMemo( + () => resolveLinkingOptions(linking), + [linking], + ) + + const navigateToExternalUrl = React.useCallback( + (url: string, mode: NativeLinkingMode, isInitial = false) => { + if (!linkingOptions.enabled) { + return + } + + try { + if (linkingOptions.filter && !linkingOptions.filter(url)) { + linkingOptions.onUnhandledUrl?.(url) + return + } + + const parsedHref = + linkingOptions.parseUrl?.(url) ?? + parseExternalUrl(url, linkingOptions.prefixes ?? []) + + if (!parsedHref) { + linkingOptions.onUnhandledUrl?.(url) + return + } + + if (router.history.location.href === parsedHref) { + return + } + + const navigateOptions = resolveNativeNavigateOptions( + router as any, + { + to: parsedHref, + replace: mode === 'replace', + state: + isInitial && mode === 'push' && !linkingOptions.initialAnimate + ? (prev: Record | undefined) => ({ + ...(prev ?? {}), + __TSR_initialDeepLink: true, + }) + : undefined, + } as any, + ) + + router.navigate(navigateOptions as any) + } catch (error) { + linkingOptions.onError?.(error, url) + } + }, + [router, linkingOptions], + ) + + React.useEffect(() => { + if (!linkingOptions.enabled) return + + let isMounted = true + let unsubscribe: (() => void) | undefined + + const run = async () => { + try { + const initialUrl = await linkingOptions.getInitialURL?.() + if (isMounted && initialUrl) { + navigateToExternalUrl(initialUrl, linkingOptions.initialMode, true) + } + } catch (error) { + linkingOptions.onError?.(error) + } + + if (!isMounted) return + + unsubscribe = linkingOptions.subscribe?.((url) => { + navigateToExternalUrl(url, linkingOptions.incomingMode) + }) + } + + run() + + return () => { + isMounted = false + unsubscribe?.() + } + }, [linkingOptions, navigateToExternalUrl]) +} + +/** + * Low-level provider that places the router into React context. + */ +export function RouterContextProvider< + TRouter extends AnyRouter = RegisteredRouter, +>({ + router, + children, + context, +}: { + router: TRouter + children: React.ReactNode + context?: Record +}) { + // Update router context if provided + if (context) { + router.update({ + ...router.options, + context: { + ...router.options.context, + ...context, + }, + } as any) + } + + const routerContext = getRouterContext() + + const provider = ( + + {children} + + ) + + if (router.options.Wrap) { + return {provider} + } + + return provider +} + +/** + * Hook to handle Android back button press + */ +function useAndroidBackHandler(router: AnyRouter) { + React.useEffect(() => { + if (Platform.OS !== 'android') return + + const subscription = BackHandler.addEventListener( + 'hardwareBackPress', + () => { + if (router.history.canGoBack()) { + if ((router as any).back) { + ;(router as any).back() + } else { + router.history.back() + } + return true // Prevent default back behavior + } + return false // Allow default back behavior (exit app) + }, + ) + + return () => subscription.remove() + }, [router]) +} + +/** + * Top-level component that renders the active route matches and provides the + * router to the React Native tree via context. + * + * This component: + * - Wraps everything in GestureHandlerRootView (if available) + * - Handles Android back button navigation + * - Uses react-native-screens for native stack navigation (if available and enabled) + */ +export function NativeRouterProvider< + TRouter extends AnyRouter = RegisteredRouter, +>({ + router, + useNativeScreens = true, + context, + children, +}: NativeRouterProviderProps) { + // Handle Android back button + useAndroidBackHandler(router) + useNativeLinking(router) + + // Use NativeScreenMatches for native transitions when enabled + // Falls back to View-based Matches if react-native-screens is not available + const MatchesComponent = useNativeScreens ? NativeScreenMatches : Matches + + const content = ( + + {children ?? } + + ) + + // Lazily get GestureHandlerRootView (called during render, not module load) + const GestureHandlerRootView = getGestureHandlerRootView() + + // Wrap in GestureHandlerRootView if available + if (GestureHandlerRootView) { + return ( + + {content} + + ) + } + + return {content} +} diff --git a/packages/react-native-router/src/SafeFragment.tsx b/packages/react-native-router/src/SafeFragment.tsx new file mode 100644 index 0000000000..dee5f62d06 --- /dev/null +++ b/packages/react-native-router/src/SafeFragment.tsx @@ -0,0 +1,9 @@ +import * as React from 'react' + +/** + * A fragment that can be used as a fallback for suspense boundaries + * when no actual suspense boundary is needed. + */ +export function SafeFragment({ children }: { children: React.ReactNode }) { + return <>{children} +} diff --git a/packages/react-native-router/src/Transitioner.tsx b/packages/react-native-router/src/Transitioner.tsx new file mode 100644 index 0000000000..cc077c251f --- /dev/null +++ b/packages/react-native-router/src/Transitioner.tsx @@ -0,0 +1,81 @@ +import * as React from 'react' +import { getLocationChangeInfo, trimPathRight } from '@tanstack/router-core' +import { useRouter } from './useRouter' +import { useRouterState } from './useRouterState' + +/** + * Internal component that handles router loading and transitions. + * Calls router.load() on mount and subscribes to history changes. + */ +export function Transitioner() { + const router = useRouter() + const mountLoadForRouter = React.useRef({ router, mounted: false }) + + const isLoading = useRouterState({ + select: (s) => s.isLoading, + }) + + const previousIsLoading = React.useRef(isLoading) + + // Subscribe to location changes and load new locations + React.useEffect(() => { + const unsub = router.history.subscribe(router.load) + + const nextLocation = router.buildLocation({ + to: router.latestLocation.pathname, + search: true, + params: true, + hash: true, + state: true, + _includeValidateSearch: true, + }) + + if ( + trimPathRight(router.latestLocation.href) !== + trimPathRight(nextLocation.href) + ) { + router.commitLocation({ ...nextLocation, replace: true }) + } + + return () => { + unsub() + } + }, [router, router.history]) + + // Load the initial location on mount + React.useEffect(() => { + if ( + mountLoadForRouter.current.router === router && + mountLoadForRouter.current.mounted + ) { + return + } + mountLoadForRouter.current = { router, mounted: true } + + const tryLoad = async () => { + try { + await router.load() + } catch (err) { + console.error(err) + } + } + + tryLoad() + }, [router]) + + // Emit onLoad event when loading completes + React.useEffect(() => { + if (previousIsLoading.current && !isLoading) { + router.emit({ + type: 'onLoad', + ...getLocationChangeInfo( + router.stores.location.get(), + router.stores.resolvedLocation.get(), + ), + }) + } + previousIsLoading.current = isLoading + }, [router, isLoading]) + + return null +} diff --git a/packages/react-native-router/src/core.ts b/packages/react-native-router/src/core.ts new file mode 100644 index 0000000000..1e3395dd35 --- /dev/null +++ b/packages/react-native-router/src/core.ts @@ -0,0 +1,180 @@ +// Core exports that don't include any React Native-specific components +// Safe to import at module load time without triggering native module access + +// History +export { createNativeHistory } from './history' +export type { NativeHistoryOptions, NativeRouterHistory } from './history' + +// Router (framework-specific) +export { createRouter, Router } from './router' + +// Routes (framework-specific) +export { + Route, + RootRoute, + RouteApi, + getRouteApi, + createRoute, + createRootRoute, + createRouteMask, +} from './route' +export type { + RouteComponent, + ErrorRouteComponent, + NotFoundRouteComponent, +} from './route' + +// Hooks - these don't import React Native components +export { useRouter } from './useRouter' +export { useRouterState } from './useRouterState' +export type { UseRouterStateOptions, UseRouterStateResult } from './useRouterState' + +export { useMatch } from './useMatch' +export type { + UseMatchBaseOptions, + UseMatchOptions, + UseMatchResult, + UseMatchRoute, +} from './useMatch' + +export { useNavigate, Navigate } from './useNavigate' + +export { useParams } from './useParams' +export type { + UseParamsBaseOptions, + UseParamsOptions, + UseParamsRoute, +} from './useParams' + +export { useSearch } from './useSearch' +export type { + UseSearchBaseOptions, + UseSearchOptions, + UseSearchRoute, +} from './useSearch' + +export { useLoaderData } from './useLoaderData' +export type { + UseLoaderDataBaseOptions, + UseLoaderDataOptions, + UseLoaderDataRoute, +} from './useLoaderData' + +// Context +export { getRouterContext } from './routerContext' +export { matchContext, dummyMatchContext } from './matchContext' + +// Types +export type { + StructuralSharingOption, + ValidateSelected, + DefaultStructuralSharingEnabled, + StructuralSharingEnabled, +} from './structuralSharing' + +// Re-export platform-agnostic items from router-core +export { + // Router base class + RouterCore, + // Route base classes + BaseRoute, + BaseRootRoute, + BaseRouteApi, + // Route constants + rootRouteId, + // Redirect + redirect, + isRedirect, + // Not Found + notFound, + isNotFound, + // Utilities + deepEqual, + functionalUpdate, + replaceEqualDeep, +} from '@tanstack/router-core' + +// Re-export types from router-core +export type { + // Route types + AnyRoute, + AnyRouteWithContext, + RouteOptions, + RootRouteOptions, + RouteMask, + RouteConstraints, + Route as RouteCore, + RootRoute as RootRouteCore, + // Router types + AnyRouter, + RouterOptions, + RegisteredRouter, + RouterState, + RouterEvents, + RouterConstructorOptions, + CreateRouterFn, + TrailingSlashOption, + // Navigation types + NavigateOptions, + ToOptions, + LinkOptions, + ResolveRelativePath, + UseNavigateResult, + FromPathOption, + ToMaskOptions, + // Match types + AnyRouteMatch, + MakeRouteMatch, + MakeRouteMatchUnion, + MatchRouteOptions, + // Params/Search types + ResolveUseParams, + ResolveUseSearch, + ResolveUseLoaderData, + UseParamsResult, + UseSearchResult, + UseLoaderDataResult, + FullSearchSchema, + ResolveParams, + ResolveFullPath, + ResolveId, + // Path types + RoutePaths, + RouteById, + RoutesById, + RoutesByPath, + RouteIds, + RouteTypesById, + // Utility types + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + ParsedLocation, + AnyContext, + ConstrainLiteral, + // Redirect types + AnyRedirect, + Redirect, + // Not Found types + NotFoundError, + NotFoundRouteProps, + // Error types + ErrorComponentProps as CoreErrorComponentProps, + // Validator types + AnySchema, + AnyValidator, +} from '@tanstack/router-core' + +// Re-export history types +export type { + RouterHistory, + HistoryLocation, + ParsedHistoryState, + NavigateOptions as HistoryNavigateOptions, + HistoryAction, + BlockerFn, + BlockerFnArgs, + NavigationBlocker, +} from '@tanstack/history' + +export { createMemoryHistory, parseHref } from '@tanstack/history' diff --git a/packages/react-native-router/src/fileRoute.ts b/packages/react-native-router/src/fileRoute.ts new file mode 100644 index 0000000000..5897c90a60 --- /dev/null +++ b/packages/react-native-router/src/fileRoute.ts @@ -0,0 +1,104 @@ +import { createRoute } from './route' +import type { + AnyContext, + AnyRoute, + FileBaseRouteOptions, + FileRoutesByPath, + Register, + ResolveParams, + Route, + RouteConstraints, + UpdatableRouteOptions, +} from '@tanstack/router-core' + +export function createFileRoute< + TFilePath extends keyof FileRoutesByPath, + TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'], + TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'], + TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'], + TFullPath extends RouteConstraints['TFullPath'] = + FileRoutesByPath[TFilePath]['fullPath'], +>( + path: TFilePath, +): FileRoute['createRoute'] { + return new FileRoute(path) + .createRoute +} + +export class FileRoute< + TFilePath extends keyof FileRoutesByPath, + TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'], + TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'], + TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'], + TFullPath extends RouteConstraints['TFullPath'] = + FileRoutesByPath[TFilePath]['fullPath'], +> { + constructor(public path: TFilePath) {} + + createRoute = < + TRegister = Register, + TSearchValidator = undefined, + TParams = ResolveParams, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TChildren = unknown, + TSSR = unknown, + const TServerMiddlewares = unknown, + THandlers = undefined, + >( + options?: FileBaseRouteOptions< + TRegister, + TParentRoute, + TId, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + AnyContext, + TSSR, + TServerMiddlewares, + THandlers + > & + UpdatableRouteOptions< + TParentRoute, + TId, + TFullPath, + TParams, + TSearchValidator, + TLoaderFn, + TLoaderDeps, + AnyContext, + TRouteContextFn, + TBeforeLoadFn + >, + ): Route< + TRegister, + TParentRoute, + TPath, + TFullPath, + TFilePath, + TId, + TSearchValidator, + TParams, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + unknown, + TSSR, + TServerMiddlewares, + THandlers + > => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } +} diff --git a/packages/react-native-router/src/history.ts b/packages/react-native-router/src/history.ts new file mode 100644 index 0000000000..bcd8b1158a --- /dev/null +++ b/packages/react-native-router/src/history.ts @@ -0,0 +1,135 @@ +import { createHistory, parseHref } from '@tanstack/history' +import type { ParsedHistoryState, RouterHistory } from '@tanstack/history' + +export interface NativeHistoryOptions { + initialEntries?: Array + initialIndex?: number +} + +export interface NativeHistoryStackEntry { + index: number + path: string + state: ParsedHistoryState | undefined +} + +export interface NativeRouterHistory extends RouterHistory { + /** + * Called by native gesture handlers when the user swipes back. + * This keeps router state in sync with native navigation. + */ + handleNativeBack: () => void + /** + * Set a callback for native back handling. + */ + setOnNativeBack: (cb: (() => void) | undefined) => void + /** + * Get current stack depth for debugging. + */ + getStackDepth: () => number + /** + * Get a snapshot of the full history stack for debugging. + */ + getStackSnapshot: () => Array +} + +const stateIndexKey = '__TSR_index' + +function createRandomKey() { + return (Math.random() + 1).toString(36).substring(7) +} + +function assignKeyAndIndex(index: number, state: any) { + if (!state) { + state = {} + } + const key = createRandomKey() + return { + ...state, + key, + __TSR_key: key, + [stateIndexKey]: index, + } as ParsedHistoryState +} + +/** + * Create a history implementation for React Native. + * + * This is similar to memory history but designed for integration + * with native navigation patterns and gesture handlers. + * + * @param opts - Configuration options + * @param opts.initialEntries - Initial history entries (default: ['/']) + * @param opts.initialIndex - Initial index in the history stack + * @returns A RouterHistory instance + */ +export function createNativeHistory( + opts: NativeHistoryOptions = { + initialEntries: ['/'], + }, +): NativeRouterHistory { + const entries = opts.initialEntries ?? ['/'] + let index = + opts.initialIndex !== undefined + ? Math.min(Math.max(opts.initialIndex, 0), entries.length - 1) + : entries.length - 1 + const states = entries.map((_entry, i) => assignKeyAndIndex(i, undefined)) + + const getLocation = () => parseHref(entries[index]!, states[index]) + + // Callback for when a native gesture (swipe-back) triggers navigation + let onNativeBack: (() => void) | undefined + + const history = createHistory({ + getLocation, + getLength: () => entries.length, + pushState: (path, state) => { + // Remove all entries after current index (start a new branch) + if (index < entries.length - 1) { + entries.splice(index + 1) + states.splice(index + 1) + } + states.push(state) + entries.push(path) + index = Math.max(entries.length - 1, 0) + }, + replaceState: (path, state) => { + states[index] = state + entries[index] = path + }, + back: () => { + index = Math.max(index - 1, 0) + }, + forward: () => { + index = Math.min(index + 1, entries.length - 1) + }, + go: (n) => { + index = Math.min(Math.max(index + n, 0), entries.length - 1) + }, + createHref: (path) => path, + }) + + // Extend with native-specific functionality + const nativeHistory = history as NativeRouterHistory + + nativeHistory.handleNativeBack = () => { + if (index > 0) { + history.back() + onNativeBack?.() + } + } + + nativeHistory.setOnNativeBack = (cb) => { + onNativeBack = cb + } + + nativeHistory.getStackDepth = () => entries.length + + nativeHistory.getStackSnapshot = () => + entries.map((path, stackIndex) => ({ + index: stackIndex, + path, + state: states[stackIndex], + })) + + return nativeHistory +} diff --git a/packages/react-native-router/src/index.tsx b/packages/react-native-router/src/index.tsx new file mode 100644 index 0000000000..6c464a4216 --- /dev/null +++ b/packages/react-native-router/src/index.tsx @@ -0,0 +1,246 @@ +// History +export { createNativeHistory } from './history' +export type { NativeHistoryOptions, NativeRouterHistory } from './history' + +// Router (framework-specific) +export { createRouter, Router } from './router' +export type { NativeRouterOptions } from './router' + +// Routes (framework-specific) +export { + Route, + RootRoute, + RouteApi, + getRouteApi, + createRoute, + createRootRoute, + createRouteMask, +} from './route' +export { createFileRoute, FileRoute } from './fileRoute' +export type { + RouteComponent, + ErrorRouteComponent, + NotFoundRouteComponent, + NativeRouteOptions, + NativeHeaderOptions, + NativeHeaderContext, + NativeHeaderRenderContext, + NativeHeaderVisibilityOption, + NativeHeaderTitleOption, + NativeHeaderElementOption, + NativeHeaderStyle, + NativeStackMatch, + NativeGetIdContext, + NativeStackState, + NativeMinStackState, + NativeOptionsContext, + NativeRouteOptionsInput, +} from './route' + +// Provider +export { + NativeRouterProvider, + RouterContextProvider, +} from './NativeRouterProvider' +export type { NativeRouterProviderProps } from './NativeRouterProvider' +export type { NativeLinkingMode, NativeLinkingOptions } from './linking' + +// Components +export { Link, useNativeLinkProps } from './Link' +export type { NativeLinkProps, ActiveLinkOptions } from './Link' + +export { Match, MatchInner, Outlet } from './Match' +export { + Matches, + NativeScreenMatches, + getNativeStackDebugSnapshot, + subscribeNativeStackDebug, + useNativeStackDebugSnapshot, +} from './Matches' +export type { NativeStackDebugEntry } from './Matches' +export { Transitioner } from './Transitioner' +export { CatchBoundary, ErrorComponent } from './CatchBoundary' +export type { ErrorComponentProps } from './CatchBoundary' +export { SafeFragment } from './SafeFragment' + +// Hooks +export { useRouter } from './useRouter' +export { useRouterState } from './useRouterState' +export type { + UseRouterStateOptions, + UseRouterStateResult, +} from './useRouterState' + +export { useMatch } from './useMatch' +export type { + UseMatchBaseOptions, + UseMatchOptions, + UseMatchResult, + UseMatchRoute, +} from './useMatch' + +export { useNavigate, Navigate } from './useNavigate' + +export { useParams } from './useParams' +export type { + UseParamsBaseOptions, + UseParamsOptions, + UseParamsRoute, +} from './useParams' + +export { useSearch } from './useSearch' +export type { + UseSearchBaseOptions, + UseSearchOptions, + UseSearchRoute, +} from './useSearch' + +export { useLoaderData } from './useLoaderData' +export type { + UseLoaderDataBaseOptions, + UseLoaderDataOptions, + UseLoaderDataRoute, +} from './useLoaderData' + +export { useLoaderDeps } from './useLoaderDeps' +export type { + UseLoaderDepsBaseOptions, + UseLoaderDepsOptions, + UseLoaderDepsRoute, +} from './useLoaderDeps' + +export { useLocation } from './useLocation' +export type { UseLocationBaseOptions, UseLocationResult } from './useLocation' + +export { useCanGoBack } from './useCanGoBack' + +export { useMatches, useParentMatches, useChildMatches } from './useMatches' +export type { UseMatchesBaseOptions, UseMatchesResult } from './useMatches' + +export { useBlocker, Block } from './useBlocker' +export type { UseBlockerOpts, ShouldBlockFn } from './useBlocker' + +// Context +export { getRouterContext } from './routerContext' +export { matchContext, dummyMatchContext } from './matchContext' + +// Types +export type { + StructuralSharingOption, + ValidateSelected, + DefaultStructuralSharingEnabled, + StructuralSharingEnabled, +} from './structuralSharing' + +// Re-export platform-agnostic items from router-core +export { + // Router base class + RouterCore, + // Route base classes + BaseRoute, + BaseRootRoute, + BaseRouteApi, + // Route constants + rootRouteId, + // Redirect + redirect, + isRedirect, + // Not Found + notFound, + isNotFound, + // Utilities + deepEqual, + functionalUpdate, + replaceEqualDeep, +} from '@tanstack/router-core' + +// Re-export types from router-core +export type { + // Route types + AnyRoute, + AnyRouteWithContext, + RouteOptions, + RootRouteOptions, + RouteMask, + RouteConstraints, + Route as RouteCore, + RootRoute as RootRouteCore, + // Router types + AnyRouter, + RouterOptions, + RegisteredRouter, + RouterState, + RouterEvents, + RouterConstructorOptions, + CreateRouterFn, + TrailingSlashOption, + // Navigation types + NavigateOptions, + StackBehavior, + StackMatch, + ToOptions, + LinkOptions, + ResolveRelativePath, + UseNavigateResult, + FromPathOption, + ToMaskOptions, + // Match types + AnyRouteMatch, + MakeRouteMatch, + MakeRouteMatchUnion, + MatchRouteOptions, + // Params/Search types + ResolveUseParams, + ResolveUseSearch, + ResolveUseLoaderData, + UseParamsResult, + UseSearchResult, + UseLoaderDataResult, + FullSearchSchema, + ResolveParams, + ResolveFullPath, + ResolveId, + // Path types + RoutePaths, + RouteById, + RoutesById, + RoutesByPath, + RouteIds, + RouteTypesById, + // Utility types + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + ParsedLocation, + AnyContext, + ConstrainLiteral, + // Redirect types + AnyRedirect, + Redirect, + // Not Found types + NotFoundError, + NotFoundRouteProps, + // Error types + ErrorComponentProps as CoreErrorComponentProps, + // Validator types + AnySchema, + AnyValidator, + FileRoutesByPath, + FileRouteTypes, + CreateFileRoute, + CreateLazyFileRoute, +} from '@tanstack/router-core' + +// Re-export history types +export type { + RouterHistory, + HistoryLocation, + ParsedHistoryState, + NavigateOptions as HistoryNavigateOptions, + HistoryAction, + BlockerFn, + BlockerFnArgs, + NavigationBlocker, +} from '@tanstack/history' + +export { createMemoryHistory, parseHref } from '@tanstack/history' diff --git a/packages/react-native-router/src/linking.ts b/packages/react-native-router/src/linking.ts new file mode 100644 index 0000000000..44de6cabb7 --- /dev/null +++ b/packages/react-native-router/src/linking.ts @@ -0,0 +1,125 @@ +export type NativeLinkingMode = 'replace' | 'push' + +export interface NativeLinkingOptions { + /** + * Enable/disable built-in deep link handling. + * @default true + */ + enabled?: boolean + /** + * URL prefixes that should be handled by this app. + * Examples: ['myapp://', 'https://myapp.com'] + */ + prefixes?: Array + /** + * Optional URL filter. Return false to ignore a URL. + */ + filter?: (url: string) => boolean + /** + * Custom URL parser to map an external URL to an internal router href. + * Return null to ignore the URL. + */ + parseUrl?: (url: string) => string | null + /** + * Initial URL handler used on mount (cold start). + */ + getInitialURL?: () => Promise + /** + * URL subscription for runtime links while app is already open. + */ + subscribe?: (listener: (url: string) => void) => () => void + /** + * Navigation behavior for the initial URL. + * @default 'push' + */ + initialMode?: NativeLinkingMode + /** + * Whether initial deep-link push should animate. + * + * When `false`, initial deep-link pushes are marked to skip transition + * animation so startup does not look like an in-app navigation. + * @default false + */ + initialAnimate?: boolean + /** + * Navigation behavior for incoming URLs while the app is running. + * @default 'push' + */ + incomingMode?: NativeLinkingMode + /** + * Called when a URL is received but cannot be handled. + */ + onUnhandledUrl?: (url: string) => void + /** + * Called when URL parsing/navigation throws. + */ + onError?: (error: unknown, url?: string) => void +} + +function trimTrailingSlash(input: string) { + return input.length > 1 && input.endsWith('/') ? input.slice(0, -1) : input +} + +function ensureLeadingSlash(href: string) { + if (!href) return '/' + if (href.startsWith('/')) return href + return `/${href}` +} + +function parseWithPrefixes( + url: string, + prefixes: Array, +): string | null { + if (!prefixes.length) return null + + const normalizedPrefixes = prefixes + .map((prefix) => trimTrailingSlash(prefix)) + .sort((a, b) => b.length - a.length) + + const matchedPrefix = normalizedPrefixes.find((prefix) => { + if (url.startsWith(prefix)) return true + return url.startsWith(`${prefix}/`) + }) + + if (!matchedPrefix) { + return null + } + + const remainder = url.slice(matchedPrefix.length) + return ensureLeadingSlash(remainder) +} + +export function parseExternalUrl( + url: string, + prefixes: Array, +): string | null { + if (!url) return null + + if (url.startsWith('/')) return url + + const prefixed = parseWithPrefixes(url, prefixes) + if (prefixed) { + return prefixed + } + + if (prefixes.length > 0) { + return null + } + + try { + const parsed = new URL(url) + + if (parsed.protocol === 'http:' || parsed.protocol === 'https:') { + const href = `${parsed.pathname}${parsed.search}${parsed.hash}` + return ensureLeadingSlash(href) + } + + const nativePath = parsed.host + ? `/${parsed.host}${parsed.pathname}` + : parsed.pathname + + return ensureLeadingSlash(`${nativePath}${parsed.search}${parsed.hash}`) + } catch { + return null + } +} diff --git a/packages/react-native-router/src/matchContext.tsx b/packages/react-native-router/src/matchContext.tsx new file mode 100644 index 0000000000..ce182bd994 --- /dev/null +++ b/packages/react-native-router/src/matchContext.tsx @@ -0,0 +1,8 @@ +import * as React from 'react' + +export const matchContext = React.createContext(undefined) + +// N.B. this only exists so we can conditionally call useContext on it when we are not interested in the nearest match +export const dummyMatchContext = React.createContext( + undefined, +) diff --git a/packages/react-native-router/src/nativeNavigation.ts b/packages/react-native-router/src/nativeNavigation.ts new file mode 100644 index 0000000000..7d9ed9253a --- /dev/null +++ b/packages/react-native-router/src/nativeNavigation.ts @@ -0,0 +1,88 @@ +import { resolveNativeRouteOptions } from './resolveNativeRouteOptions' +import type { AnyRouter, NavigateOptions } from '@tanstack/router-core' +import type { NativeRouteOptionsInput } from './route' + +function mergeNativeOptions( + previous: Record | undefined, + next: Record, +) { + return { + ...previous, + ...next, + headerStyle: + (previous as any)?.headerStyle || (next as any).headerStyle + ? { + ...(((previous as any)?.headerStyle ?? {}) as Record< + string, + unknown + >), + ...(((next as any).headerStyle ?? {}) as Record), + } + : undefined, + } +} + +type ResolveOptions = NavigateOptions & { + stackBehavior?: 'auto' | 'push' | 'replace' | 'reuse' + stackMatch?: 'nearest' | 'oldest' + entryId?: string +} + +export function resolveNativeNavigateOptions( + router: TRouter, + options: ResolveOptions, +): ResolveOptions { + const builtLocation = router.buildLocation({ + ...options, + _includeValidateSearch: true, + } as any) + + const routeMatch = router.getMatchedRoutes(builtLocation.pathname) + let native: Record | undefined + routeMatch.matchedRoutes.forEach((route) => { + const nativeInput = (route.options as any)?.native as + | NativeRouteOptionsInput + | undefined + const resolved = resolveNativeRouteOptions(nativeInput, { + pathname: builtLocation.pathname, + params: routeMatch.routeParams, + search: builtLocation.search, + loaderData: undefined, + context: undefined, + canGoBack: router.history.canGoBack(), + }) + + if (!resolved) { + return + } + + const { minStackState: _minStackState, ...rest } = resolved + native = mergeNativeOptions(native, rest as Record) + }) + + const stackBehavior = options.stackBehavior ?? 'reuse' + const stackMatch = + options.stackMatch ?? (native as any)?.stackMatch ?? 'nearest' + + let entryId = options.entryId + if (!entryId) { + const getId = (native as any)?.getId + + if (getId) { + entryId = getId({ + pathname: builtLocation.pathname, + params: routeMatch.routeParams, + search: builtLocation.search, + }) + } else { + entryId = builtLocation.pathname + } + } + + return { + ...options, + stackBehavior, + stackMatch, + entryId, + } +} diff --git a/packages/react-native-router/src/resolveNativeRouteOptions.ts b/packages/react-native-router/src/resolveNativeRouteOptions.ts new file mode 100644 index 0000000000..c1648b32cc --- /dev/null +++ b/packages/react-native-router/src/resolveNativeRouteOptions.ts @@ -0,0 +1,20 @@ +import type { + NativeOptionsContext, + NativeRouteOptions, + NativeRouteOptionsInput, +} from './route' + +export function resolveNativeRouteOptions( + native: NativeRouteOptionsInput | undefined, + ctx: NativeOptionsContext, +): NativeRouteOptions | undefined { + if (!native) { + return undefined + } + + if (typeof native === 'function') { + return native(ctx) + } + + return native +} diff --git a/packages/react-native-router/src/route.tsx b/packages/react-native-router/src/route.tsx new file mode 100644 index 0000000000..4bd3ccb9fb --- /dev/null +++ b/packages/react-native-router/src/route.tsx @@ -0,0 +1,672 @@ +import { + BaseRootRoute, + BaseRoute, + BaseRouteApi, + notFound, +} from '@tanstack/router-core' +import { useLoaderData } from './useLoaderData' +import { useLoaderDeps } from './useLoaderDeps' +import { useParams } from './useParams' +import { useSearch } from './useSearch' +import { useNavigate } from './useNavigate' +import { useMatch } from './useMatch' +import { useRouter } from './useRouter' +import type * as React from 'react' +import type { + AnyContext, + AnyRoute, + AnyRouter, + ConstrainLiteral, + NotFoundError, + NotFoundRouteProps, + RegisteredRouter, + ResolveFullPath, + ResolveId, + ResolveParams, + RootRouteId, + RootRouteOptions, + RouteConstraints, + RouteIds, + RouteMask, + RouteOptions, + RouteTypesById, + ToMaskOptions, + UseNavigateResult, +} from '@tanstack/router-core' +import type { UseLoaderDataRoute } from './useLoaderData' +import type { UseLoaderDepsRoute } from './useLoaderDeps' +import type { UseMatchRoute } from './useMatch' +import type { UseParamsRoute } from './useParams' +import type { UseSearchRoute } from './useSearch' + +// Component types for React Native +export type RouteComponent = React.ComponentType +export type ErrorRouteComponent = React.ComponentType<{ + error: Error + reset: () => void + info?: { componentStack: string } +}> +export type NotFoundRouteComponent = React.ComponentType + +/** + * Native screen presentation options for React Native. + */ +export interface NativeRouteOptions extends NativeHeaderOptions { + /** + * How this route should be presented in the native navigation stack. + * - 'push': Standard screen push with back gesture (default) + * - 'modal': Present as a modal + * - 'transparentModal': Present as a transparent modal overlay + * - 'containedModal': Modal that stays within parent bounds + * - 'containedTransparentModal': Transparent modal within parent bounds + * - 'fullScreenModal': Full screen modal + * - 'formSheet': Form sheet presentation (iOS) + * - 'none': Not a screen - renders inline (for navigators like tabs/drawer) + */ + presentation?: + | 'push' + | 'modal' + | 'transparentModal' + | 'containedModal' + | 'containedTransparentModal' + | 'fullScreenModal' + | 'formSheet' + | 'none' + + /** + * Enable/disable swipe gesture for back navigation (iOS). + * @default true for 'push', false for modals + */ + gestureEnabled?: boolean + + /** + * Custom animation for screen transitions. + * - 'default': Platform default animation + * - 'fade': Fade in/out + * - 'fade_from_bottom': Fade from bottom (Android) + * - 'flip': Card flip + * - 'simple_push': Simple slide + * - 'slide_from_right': Slide from right + * - 'slide_from_left': Slide from left + * - 'slide_from_bottom': Slide from bottom + * - 'none': No animation + */ + animation?: + | 'default' + | 'fade' + | 'fade_from_bottom' + | 'flip' + | 'simple_push' + | 'slide_from_right' + | 'slide_from_left' + | 'slide_from_bottom' + | 'none' + + /** + * Status bar style when this screen is active. + */ + statusBarStyle?: 'auto' | 'inverted' | 'light' | 'dark' + + /** + * Whether this screen should be rendered with a translucent status bar. + */ + statusBarTranslucent?: boolean + + /** + * Minimum lifecycle state for this route's stack entry. + * - 'paused': this entry will never become detached + * - 'active': this entry will never become paused or detached + */ + minStackState?: NativeMinStackState + + /** + * Default minimum lifecycle state for this route and all descendants. + * Child routes may override with `minStackState` or a nearer + * `defaultMinStackState`. + */ + defaultMinStackState?: NativeMinStackState + + /** + * Identity key resolver used for stack reuse matching. + */ + getId?: (ctx: NativeGetIdContext) => string + + /** + * Default match strategy when multiple stack entries share the same id. + * @default 'nearest' + */ + stackMatch?: NativeStackMatch + + // -- Form sheet / bottom sheet detent options -- + // These only take effect when presentation is 'formSheet'. + + /** + * Heights at which the sheet can rest, as fractions of screen height (0–1). + * Must be in ascending order. Android supports a maximum of 3 detents. + * Use 'fitToContents' to auto-size the sheet to its content. + * @default [1.0] + */ + sheetAllowedDetents?: Array | 'fitToContents' + + /** + * Index into sheetAllowedDetents for the initial snap position. + * Use 'last' to start at the tallest detent. + * @default 0 + */ + sheetInitialDetentIndex?: number | 'last' + + /** + * Show a grabber handle at the top of the sheet. + * @platform ios + * @default false + */ + sheetGrabberVisible?: boolean + + /** + * Corner radius of the sheet in points. + * @platform ios + */ + sheetCornerRadius?: number + + /** + * Largest detent index that keeps the background undimmed. + * Use 'none' to always dim, 'last' to never dim. + * @default 'none' + */ + sheetLargestUndimmedDetentIndex?: number | 'none' | 'last' + + /** + * Whether scrolling to the edge of a scroll view expands the sheet + * to the next larger detent. + * @platform ios + * @default true + */ + sheetExpandsWhenScrolledToEdge?: boolean + + /** + * Shadow elevation for the sheet. + * @platform android + * @default 24 + */ + sheetElevation?: number + + /** + * Callback fired when the active detent changes. + */ + onSheetDetentChanged?: (event: { + nativeEvent: { index: number; isStable: boolean } + }) => void +} + +export type NativeStackState = 'active' | 'paused' | 'detached' +export type NativeMinStackState = 'active' | 'paused' +export type NativeStackMatch = 'nearest' | 'oldest' + +export interface NativeHeaderContext { + pathname: string + params: Record + search: unknown + loaderData: unknown + context: unknown + canGoBack: boolean +} + +export interface NativeHeaderRenderContext extends NativeHeaderContext { + tintColor?: string +} + +export type NativeHeaderVisibilityOption = + | boolean + | ((ctx: NativeHeaderContext) => boolean) + +export type NativeHeaderTitleOption = + | string + | ((ctx: NativeHeaderContext) => string) + +export type NativeHeaderElementOption = + | ((ctx: NativeHeaderRenderContext) => React.ReactNode) + | undefined + +export interface NativeHeaderStyle { + backgroundColor?: string +} + +export interface NativeGetIdContext { + pathname: string + params: Record + search: unknown +} + +export interface NativeOptionsContext extends NativeHeaderContext { + loaderData: unknown + context: unknown +} + +export type NativeRouteOptionsInput = + | NativeRouteOptions + | ((ctx: NativeOptionsContext) => NativeRouteOptions) + +export interface NativeHeaderOptions { + headerShown?: NativeHeaderVisibilityOption + title?: NativeHeaderTitleOption + headerTitle?: string | ((ctx: NativeHeaderRenderContext) => React.ReactNode) + headerBackVisible?: NativeHeaderVisibilityOption + headerLeft?: NativeHeaderElementOption + headerRight?: NativeHeaderElementOption + headerTintColor?: string + headerStyle?: NativeHeaderStyle + headerTransparent?: boolean + headerLargeTitle?: boolean + header?: (ctx: NativeHeaderContext) => React.ReactNode +} + +// Type extensions for components +declare module '@tanstack/router-core' { + export interface UpdatableRouteOptionsExtensions { + component?: RouteComponent + errorComponent?: false | null | undefined | ErrorRouteComponent + notFoundComponent?: NotFoundRouteComponent + pendingComponent?: RouteComponent + native?: NativeRouteOptionsInput + } + + export interface RootRouteOptionsExtensions { + shellComponent?: ({ + children, + }: { + children: React.ReactNode + }) => React.ReactNode + } + + export interface RouteExtensions< + in out TId extends string, + in out TFullPath extends string, + > { + useMatch: UseMatchRoute + useSearch: UseSearchRoute + useParams: UseParamsRoute + useLoaderData: UseLoaderDataRoute + useLoaderDeps: UseLoaderDepsRoute + useNavigate: () => UseNavigateResult + } +} + +/** + * Returns a route-specific API bound to a single route ID. + */ +export function getRouteApi< + const TId, + TRouter extends AnyRouter = RegisteredRouter, +>(id: ConstrainLiteral>) { + return new RouteApi({ id }) +} + +export class RouteApi< + TId, + TRouter extends AnyRouter = RegisteredRouter, +> extends BaseRouteApi { + constructor({ id }: { id: TId }) { + super({ id }) + } + + useMatch: UseMatchRoute = (opts) => { + return useMatch({ + select: opts?.select, + from: this.id, + structuralSharing: opts?.structuralSharing, + } as any) as any + } + + useSearch: UseSearchRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useSearch({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useParams: UseParamsRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useParams({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useLoaderData: UseLoaderDataRoute = (opts) => { + return useLoaderData({ ...opts, from: this.id, strict: false } as any) + } + + useLoaderDeps: UseLoaderDepsRoute = (opts) => { + return useLoaderDeps({ ...opts, from: this.id, strict: false } as any) + } + + useNavigate = (): UseNavigateResult< + RouteTypesById['fullPath'] + > => { + const router = useRouter() + return useNavigate({ from: router.routesById[this.id as string].fullPath }) + } + + notFound = (opts?: NotFoundError) => { + return notFound({ routeId: this.id as string, ...opts }) + } +} + +// Route class +export class Route< + in out TRegister = unknown, + in out TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, + in out TPath extends RouteConstraints['TPath'] = '/', + in out TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath< + TParentRoute, + TPath + >, + in out TCustomId extends RouteConstraints['TCustomId'] = string, + in out TId extends RouteConstraints['TId'] = ResolveId< + TParentRoute, + TCustomId, + TPath + >, + in out TSearchValidator = undefined, + in out TParams = ResolveParams, + in out TRouterContext = AnyContext, + in out TRouteContextFn = AnyContext, + in out TBeforeLoadFn = AnyContext, + in out TLoaderDeps extends Record = {}, + in out TLoaderFn = undefined, + in out TChildren = unknown, + in out TFileRouteTypes = unknown, + in out TSSR = unknown, + in out TServerMiddlewares = unknown, + in out THandlers = undefined, +> extends BaseRoute< + TRegister, + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + TServerMiddlewares, + THandlers +> { + constructor( + options?: RouteOptions< + TRegister, + TParentRoute, + TId, + TCustomId, + TFullPath, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TSSR, + TServerMiddlewares, + THandlers + >, + ) { + super(options) + ;(this as any).$$typeof = Symbol.for('react.memo') + } + + useMatch: UseMatchRoute = (opts) => { + return useMatch({ + select: opts?.select, + from: this.id, + structuralSharing: opts?.structuralSharing, + } as any) as any + } + + useSearch: UseSearchRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useSearch({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useParams: UseParamsRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useParams({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useLoaderData: UseLoaderDataRoute = (opts) => { + return useLoaderData({ ...opts, from: this.id, strict: false } as any) + } + + useLoaderDeps: UseLoaderDepsRoute = (opts) => { + return useLoaderDeps({ ...opts, from: this.id, strict: false } as any) + } + + useNavigate = (): UseNavigateResult => { + return useNavigate({ from: this.fullPath }) + } +} + +// RootRoute class +export class RootRoute< + in out TRegister = unknown, + in out TSearchValidator = undefined, + in out TRouterContext = {}, + in out TRouteContextFn = AnyContext, + in out TBeforeLoadFn = AnyContext, + in out TLoaderDeps extends Record = {}, + in out TLoaderFn = undefined, + in out TChildren = unknown, + in out TFileRouteTypes = unknown, + in out TSSR = unknown, + in out TServerMiddlewares = unknown, + in out THandlers = undefined, +> extends BaseRootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + TServerMiddlewares, + THandlers +> { + constructor( + options?: RootRouteOptions< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + TServerMiddlewares, + THandlers + >, + ) { + super(options) + ;(this as any).$$typeof = Symbol.for('react.memo') + } + + useMatch: UseMatchRoute = (opts) => { + return useMatch({ + select: opts?.select, + from: this.id, + structuralSharing: opts?.structuralSharing, + } as any) as any + } + + useSearch: UseSearchRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useSearch({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useParams: UseParamsRoute = (opts) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + return useParams({ + select: opts?.select, + structuralSharing: opts?.structuralSharing, + from: this.id, + } as any) as any + } + + useLoaderData: UseLoaderDataRoute = (opts) => { + return useLoaderData({ ...opts, from: this.id } as any) + } + + useLoaderDeps: UseLoaderDepsRoute = (opts) => { + return useLoaderDeps({ ...opts, from: this.id } as any) + } + + useNavigate = (): UseNavigateResult<'/'> => { + return useNavigate({ from: this.fullPath }) + } +} + +/** + * Create a new route for React Native. + */ +export function createRoute< + TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, + TPath extends RouteConstraints['TPath'] = '/', + TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath< + TParentRoute, + TPath + >, + TCustomId extends RouteConstraints['TCustomId'] = string, + TId extends RouteConstraints['TId'] = ResolveId< + TParentRoute, + TCustomId, + TPath + >, + TSearchValidator = undefined, + TParams = ResolveParams, + TRouterContext = AnyContext, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TSSR = unknown, + TServerMiddlewares = unknown, + THandlers = undefined, +>( + options: RouteOptions< + unknown, + TParentRoute, + TId, + TCustomId, + TFullPath, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TSSR, + TServerMiddlewares, + THandlers + >, +) { + return new Route(options) +} + +/** + * Create a root route for React Native. + */ +export function createRootRoute< + TRegister = unknown, + TSearchValidator = undefined, + TRouterContext = {}, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TSSR = unknown, + const TServerMiddlewares = unknown, + THandlers = undefined, +>( + options?: RootRouteOptions< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + TServerMiddlewares, + THandlers + >, +): RootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + unknown, + unknown, + TSSR, + TServerMiddlewares, + THandlers +> { + return new RootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + unknown, + unknown, + TSSR, + TServerMiddlewares, + THandlers + >(options as any) +} + +/** + * Create a route mask for React Native. + */ +export function createRouteMask< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends string = string, + TTo extends string = string, +>( + opts: { + routeTree: TRouter['routeTree'] + } & ToMaskOptions, +): RouteMask { + return opts as any +} diff --git a/packages/react-native-router/src/router.ts b/packages/react-native-router/src/router.ts new file mode 100644 index 0000000000..9191b9a8e0 --- /dev/null +++ b/packages/react-native-router/src/router.ts @@ -0,0 +1,91 @@ +import { RouterCore } from '@tanstack/router-core' +import { getStoreFactory } from './routerStores' +import type { RouterHistory } from '@tanstack/history' +import type { + AnyRoute, + CreateRouterFn, + RouterConstructorOptions, + TrailingSlashOption, +} from '@tanstack/router-core' +import type { + ErrorRouteComponent, + NativeMinStackState, + NotFoundRouteComponent, + RouteComponent, +} from './route' +import type { NativeLinkingOptions } from './linking' + +export interface NativeRouterOptions { + pausedDepth?: number + detachedDepth?: number + defaultMinStackState?: NativeMinStackState + linking?: boolean | NativeLinkingOptions +} + +declare module '@tanstack/router-core' { + export interface RouterOptionsExtensions { + native?: NativeRouterOptions + /** + * The default `component` a route should use if no component is provided. + */ + defaultComponent?: RouteComponent + /** + * The default `errorComponent` a route should use if no error component is provided. + */ + defaultErrorComponent?: ErrorRouteComponent + /** + * The default `pendingComponent` a route should use if no pending component is provided. + */ + defaultPendingComponent?: RouteComponent + /** + * The default `notFoundComponent` a route should use if no notFound component is provided. + */ + defaultNotFoundComponent?: NotFoundRouteComponent + /** + * A component that will be used to wrap the entire router. + */ + Wrap?: (props: { children: any }) => React.JSX.Element + /** + * A component that will be used to wrap the inner contents of the router. + */ + InnerWrap?: (props: { children: any }) => React.JSX.Element + /** + * The default `onCatch` handler for errors caught by the Router ErrorBoundary + */ + defaultOnCatch?: (error: Error, errorInfo: React.ErrorInfo) => void + } +} + +/** + * Create a new React Native router instance. + * Pass the resulting router to `NativeRouterProvider`. + */ +export const createRouter: CreateRouterFn = (options) => { + return new Router(options) +} + +export class Router< + in out TRouteTree extends AnyRoute, + in out TTrailingSlashOption extends TrailingSlashOption = 'never', + in out TDefaultStructuralSharingOption extends boolean = false, + in out TRouterHistory extends RouterHistory = RouterHistory, + in out TDehydrated extends Record = Record, +> extends RouterCore< + TRouteTree, + TTrailingSlashOption, + TDefaultStructuralSharingOption, + TRouterHistory, + TDehydrated +> { + constructor( + options: RouterConstructorOptions< + TRouteTree, + TTrailingSlashOption, + TDefaultStructuralSharingOption, + TRouterHistory, + TDehydrated + >, + ) { + super(options, getStoreFactory) + } +} diff --git a/packages/react-native-router/src/routerContext.tsx b/packages/react-native-router/src/routerContext.tsx new file mode 100644 index 0000000000..be38d00435 --- /dev/null +++ b/packages/react-native-router/src/routerContext.tsx @@ -0,0 +1,9 @@ +import * as React from 'react' +import type { AnyRouter } from '@tanstack/router-core' + +// React Native doesn't have window, so we use a simple context +const routerContext = React.createContext(null!) + +export function getRouterContext() { + return routerContext +} diff --git a/packages/react-native-router/src/routerStateContext.tsx b/packages/react-native-router/src/routerStateContext.tsx new file mode 100644 index 0000000000..22a9324e5b --- /dev/null +++ b/packages/react-native-router/src/routerStateContext.tsx @@ -0,0 +1,6 @@ +import * as React from 'react' +import type { AnyRoute, RouterState } from '@tanstack/router-core' + +export const routerStateContext = React.createContext< + RouterState | undefined +>(undefined) diff --git a/packages/react-native-router/src/routerStores.ts b/packages/react-native-router/src/routerStores.ts new file mode 100644 index 0000000000..b353a42cd3 --- /dev/null +++ b/packages/react-native-router/src/routerStores.ts @@ -0,0 +1,26 @@ +import { batch, createAtom } from '@tanstack/react-store' +import { + createNonReactiveMutableStore, + createNonReactiveReadonlyStore, +} from '@tanstack/router-core' +import type { Readable } from '@tanstack/react-store' +import type { GetStoreConfig } from '@tanstack/router-core' + +declare module '@tanstack/router-core' { + export interface RouterReadableStore extends Readable {} +} + +export const getStoreFactory: GetStoreConfig = (opts) => { + if (opts.isServer) { + return { + createMutableStore: createNonReactiveMutableStore, + createReadonlyStore: createNonReactiveReadonlyStore, + batch: (fn) => fn(), + } + } + return { + createMutableStore: createAtom, + createReadonlyStore: createAtom, + batch: batch, + } +} diff --git a/packages/react-native-router/src/structuralSharing.ts b/packages/react-native-router/src/structuralSharing.ts new file mode 100644 index 0000000000..109e2fd83c --- /dev/null +++ b/packages/react-native-router/src/structuralSharing.ts @@ -0,0 +1,45 @@ +import type { + AnyRouter, + Constrain, + OptionalStructuralSharing, + ValidateJSON, +} from '@tanstack/router-core' + +export type DefaultStructuralSharingEnabled = + boolean extends TRouter['options']['defaultStructuralSharing'] + ? false + : NonNullable + +export interface RequiredStructuralSharing { + readonly structuralSharing: Constrain +} + +export type StructuralSharingOption< + TRouter extends AnyRouter, + TSelected, + TStructuralSharing, +> = unknown extends TSelected + ? OptionalStructuralSharing + : unknown extends TRouter['routeTree'] + ? OptionalStructuralSharing + : TSelected extends ValidateJSON + ? OptionalStructuralSharing + : DefaultStructuralSharingEnabled extends true + ? RequiredStructuralSharing + : OptionalStructuralSharing + +export type StructuralSharingEnabled< + TRouter extends AnyRouter, + TStructuralSharing, +> = boolean extends TStructuralSharing + ? DefaultStructuralSharingEnabled + : TStructuralSharing + +export type ValidateSelected< + TRouter extends AnyRouter, + TSelected, + TStructuralSharing, +> = + StructuralSharingEnabled extends true + ? ValidateJSON + : TSelected diff --git a/packages/react-native-router/src/useBlocker.tsx b/packages/react-native-router/src/useBlocker.tsx new file mode 100644 index 0000000000..f20bebd993 --- /dev/null +++ b/packages/react-native-router/src/useBlocker.tsx @@ -0,0 +1,240 @@ +import * as React from 'react' +import { useRouter } from './useRouter' +import type { + BlockerFnArgs, + HistoryAction, + HistoryLocation, +} from '@tanstack/history' +import type { + AnyRoute, + AnyRouter, + ParseRoute, + RegisteredRouter, +} from '@tanstack/router-core' + +interface ShouldBlockFnLocation< + out TRouteId, + out TFullPath, + out TAllParams, + out TFullSearchSchema, +> { + routeId: TRouteId + fullPath: TFullPath + pathname: string + params: TAllParams + search: TFullSearchSchema +} + +type AnyShouldBlockFnLocation = ShouldBlockFnLocation +type MakeShouldBlockFnLocationUnion< + TRouter extends AnyRouter = RegisteredRouter, + TRoute extends AnyRoute = ParseRoute, +> = TRoute extends any + ? ShouldBlockFnLocation< + TRoute['id'], + TRoute['fullPath'], + TRoute['types']['allParams'], + TRoute['types']['fullSearchSchema'] + > + : never + +type BlockerResolver = + | { + status: 'blocked' + current: MakeShouldBlockFnLocationUnion + next: MakeShouldBlockFnLocationUnion + action: HistoryAction + proceed: () => void + reset: () => void + } + | { + status: 'idle' + current: undefined + next: undefined + action: undefined + proceed: undefined + reset: undefined + } + +type ShouldBlockFnArgs = { + current: MakeShouldBlockFnLocationUnion + next: MakeShouldBlockFnLocationUnion + action: HistoryAction +} + +export type ShouldBlockFn = ( + args: ShouldBlockFnArgs, +) => boolean | Promise + +export type UseBlockerOpts< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, +> = { + shouldBlockFn: ShouldBlockFn + enableBeforeUnload?: boolean | (() => boolean) + disabled?: boolean + withResolver?: TWithResolver +} + +function _resolveBlockerOpts< + TRouter extends AnyRouter, + TWithResolver extends boolean, +>( + opts?: UseBlockerOpts, +): UseBlockerOpts { + if (opts === undefined) { + return { + shouldBlockFn: () => true, + withResolver: false, + } as unknown as UseBlockerOpts + } + return opts +} + +/** + * Block navigation based on a condition. + * + * Options: + * - `shouldBlockFn`: A function that returns whether to block navigation + * - `disabled`: Disable the blocker + * - `withResolver`: If true, returns a resolver object for custom UI + * + * @returns A resolver object if `withResolver` is true, otherwise void. + */ +export function useBlocker< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = false, +>( + opts: UseBlockerOpts, +): TWithResolver extends true ? BlockerResolver : void { + const { + shouldBlockFn, + enableBeforeUnload = false, // Disabled by default on native + disabled = false, + withResolver = false, + } = _resolveBlockerOpts(opts) + + const router = useRouter() + const { history } = router + + const [resolver, setResolver] = React.useState({ + status: 'idle', + current: undefined, + next: undefined, + action: undefined, + proceed: undefined, + reset: undefined, + }) + + React.useEffect(() => { + const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => { + function getLocation( + location: HistoryLocation, + ): AnyShouldBlockFnLocation { + const parsedLocation = router.parseLocation(location) + const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) + if (matchedRoutes.foundRoute === undefined) { + return { + routeId: '__notFound__', + fullPath: parsedLocation.pathname, + pathname: parsedLocation.pathname, + params: matchedRoutes.routeParams, + search: router.options.parseSearch(location.search), + } + } + + return { + routeId: matchedRoutes.foundRoute.id, + fullPath: matchedRoutes.foundRoute.fullPath, + pathname: parsedLocation.pathname, + params: matchedRoutes.routeParams, + search: router.options.parseSearch(location.search), + } + } + + const current = getLocation(blockerFnArgs.currentLocation) + const next = getLocation(blockerFnArgs.nextLocation) + + if ( + current.routeId === '__notFound__' && + next.routeId !== '__notFound__' + ) { + return false + } + + const shouldBlock = await shouldBlockFn({ + action: blockerFnArgs.action, + current: current as any, + next: next as any, + }) + if (!withResolver) { + return shouldBlock + } + + if (!shouldBlock) { + return false + } + + const promise = new Promise((resolve) => { + setResolver({ + status: 'blocked', + current, + next, + action: blockerFnArgs.action, + proceed: () => resolve(false), + reset: () => resolve(true), + }) + }) + + const canNavigateAsync = await promise + setResolver({ + status: 'idle', + current: undefined, + next: undefined, + action: undefined, + proceed: undefined, + reset: undefined, + }) + + return canNavigateAsync + } + + return disabled + ? undefined + : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload }) + }, [ + shouldBlockFn, + enableBeforeUnload, + disabled, + withResolver, + history, + router, + ]) + + return resolver as any +} + +type BlockProps< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, + TParams = TWithResolver extends true ? BlockerResolver : void, +> = UseBlockerOpts & { + children?: React.ReactNode | ((params: TParams) => React.ReactNode) +} + +/** + * Declarative component wrapper for useBlocker. + * Renders children with optional access to blocker resolver state. + */ +export function Block< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, +>(opts: BlockProps): React.ReactNode { + const { children, ...rest } = opts + const resolver = useBlocker(rest as any) + return children + ? typeof children === 'function' + ? children(resolver as any) + : children + : null +} diff --git a/packages/react-native-router/src/useCanGoBack.ts b/packages/react-native-router/src/useCanGoBack.ts new file mode 100644 index 0000000000..afe2e9d1fb --- /dev/null +++ b/packages/react-native-router/src/useCanGoBack.ts @@ -0,0 +1,13 @@ +import { useRouterState } from './useRouterState' + +/** + * Returns whether navigation back is possible. + * Uses the internal history index to determine if we can go back. + * + * @returns `true` if there is history to navigate back to, `false` otherwise. + */ +export function useCanGoBack(): boolean { + return useRouterState({ + select: (s): boolean => (s.location.state as any)?.__TSR_index !== 0, + }) +} diff --git a/packages/react-native-router/src/useLoaderData.tsx b/packages/react-native-router/src/useLoaderData.tsx new file mode 100644 index 0000000000..356a7b51b6 --- /dev/null +++ b/packages/react-native-router/src/useLoaderData.tsx @@ -0,0 +1,83 @@ +import { useMatch } from './useMatch' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseLoaderData, + StrictOrFrom, + UseLoaderDataResult, +} from '@tanstack/router-core' + +export interface UseLoaderDataBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, + TStructuralSharing, +> { + select?: ( + match: ResolveUseLoaderData, + ) => ValidateSelected +} + +export type UseLoaderDataOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TSelected, + TStructuralSharing, +> = StrictOrFrom & + UseLoaderDataBaseOptions< + TRouter, + TFrom, + TStrict, + TSelected, + TStructuralSharing + > & + StructuralSharingOption + +export type UseLoaderDataRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseLoaderDataBaseOptions< + TRouter, + TId, + true, + TSelected, + TStructuralSharing + > & + StructuralSharingOption, +) => UseLoaderDataResult + +/** + * Read and select the current route's loader data with type-safety. + */ +export function useLoaderData< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts: UseLoaderDataOptions< + TRouter, + TFrom, + TStrict, + TSelected, + TStructuralSharing + >, +): UseLoaderDataResult { + return useMatch({ + from: opts.from!, + strict: opts.strict, + structuralSharing: opts.structuralSharing, + select: (s: any) => { + return opts.select ? opts.select(s.loaderData) : s.loaderData + }, + } as any) as UseLoaderDataResult +} diff --git a/packages/react-native-router/src/useLoaderDeps.ts b/packages/react-native-router/src/useLoaderDeps.ts new file mode 100644 index 0000000000..023610546c --- /dev/null +++ b/packages/react-native-router/src/useLoaderDeps.ts @@ -0,0 +1,68 @@ +import { useMatch } from './useMatch' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseLoaderDeps, + StrictOrFrom, + UseLoaderDepsResult, +} from '@tanstack/router-core' + +export interface UseLoaderDepsBaseOptions< + TRouter extends AnyRouter, + TFrom, + TSelected, + TStructuralSharing, +> { + select?: ( + deps: ResolveUseLoaderDeps, + ) => ValidateSelected +} + +export type UseLoaderDepsOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TSelected, + TStructuralSharing, +> = StrictOrFrom & + UseLoaderDepsBaseOptions & + StructuralSharingOption + +export type UseLoaderDepsRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseLoaderDepsBaseOptions & + StructuralSharingOption, +) => UseLoaderDepsResult + +/** + * Read and select the current route's loader dependencies object. + * + * Options: + * - `from`: Choose which route's loader deps to read + * - `select`: Map the deps to a derived value + * - `structuralSharing`: Enable structural sharing for stable references + * + * @returns The loader deps (or selected value) for the matched route. + */ +export function useLoaderDeps< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts: UseLoaderDepsOptions, +): UseLoaderDepsResult { + const { select, ...rest } = opts + return useMatch({ + ...rest, + select: (s) => { + return select ? select(s.loaderDeps) : s.loaderDeps + }, + }) as UseLoaderDepsResult +} diff --git a/packages/react-native-router/src/useLocation.ts b/packages/react-native-router/src/useLocation.ts new file mode 100644 index 0000000000..2325cd8030 --- /dev/null +++ b/packages/react-native-router/src/useLocation.ts @@ -0,0 +1,51 @@ +import { useRouterState } from './useRouterState' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + RegisteredRouter, + RouterState, +} from '@tanstack/router-core' + +export interface UseLocationBaseOptions< + TRouter extends AnyRouter, + TSelected, + TStructuralSharing extends boolean = boolean, +> { + select?: ( + state: RouterState['location'], + ) => ValidateSelected +} + +export type UseLocationResult< + TRouter extends AnyRouter, + TSelected, +> = unknown extends TSelected + ? RouterState['location'] + : TSelected + +/** + * Read the current location from the router state with optional selection. + * Useful for subscribing to just the pieces of location you care about. + * + * Options: + * - `select`: Project the `location` object to a derived value + * - `structuralSharing`: Enable structural sharing for stable references + * + * @returns The current location (or selected value). + */ +export function useLocation< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseLocationBaseOptions & + StructuralSharingOption, +): UseLocationResult { + return useRouterState({ + select: (state: any) => + opts?.select ? opts.select(state.location) : state.location, + } as any) as UseLocationResult +} diff --git a/packages/react-native-router/src/useMatch.tsx b/packages/react-native-router/src/useMatch.tsx new file mode 100644 index 0000000000..0c50f880b1 --- /dev/null +++ b/packages/react-native-router/src/useMatch.tsx @@ -0,0 +1,122 @@ +import * as React from 'react' +import invariant from 'tiny-invariant' +import { useRouterState } from './useRouterState' +import { dummyMatchContext, matchContext } from './matchContext' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + MakeRouteMatch, + MakeRouteMatchUnion, + RegisteredRouter, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, +} from '@tanstack/router-core' + +export interface UseMatchBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing extends boolean, +> { + select?: ( + match: MakeRouteMatch, + ) => ValidateSelected + shouldThrow?: TThrow +} + +export type UseMatchRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseMatchBaseOptions< + TRouter, + TFrom, + true, + true, + TSelected, + TStructuralSharing + > & + StructuralSharingOption, +) => UseMatchResult + +export type UseMatchOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing extends boolean, +> = StrictOrFrom & + UseMatchBaseOptions< + TRouter, + TFrom, + TStrict, + TThrow, + TSelected, + TStructuralSharing + > & + StructuralSharingOption + +export type UseMatchResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? TStrict extends true + ? MakeRouteMatch + : MakeRouteMatchUnion + : TSelected + +/** + * Read and select the nearest or targeted route match. + */ +export function useMatch< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts: UseMatchOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected, + TStructuralSharing + >, +): ThrowOrOptional, TThrow> { + const nearestMatchId = React.useContext( + opts.from ? dummyMatchContext : matchContext, + ) + + const matchSelection = useRouterState({ + select: (state: any) => { + const match = state.matches.find((d: any) => + opts.from ? opts.from === d.routeId : d.id === nearestMatchId, + ) + invariant( + !((opts.shouldThrow ?? true) && !match), + `Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`, + ) + + if (match === undefined) { + return undefined + } + + return opts.select ? opts.select(match) : match + }, + structuralSharing: opts.structuralSharing, + } as any) + + return matchSelection as any +} diff --git a/packages/react-native-router/src/useMatches.ts b/packages/react-native-router/src/useMatches.ts new file mode 100644 index 0000000000..caaa54c6ce --- /dev/null +++ b/packages/react-native-router/src/useMatches.ts @@ -0,0 +1,106 @@ +import * as React from 'react' +import { useRouterState } from './useRouterState' +import { matchContext } from './matchContext' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + MakeRouteMatchUnion, + RegisteredRouter, + RouterState, +} from '@tanstack/router-core' + +export interface UseMatchesBaseOptions< + TRouter extends AnyRouter, + TSelected, + TStructuralSharing extends boolean = boolean, +> { + select?: ( + matches: Array>, + ) => ValidateSelected +} + +export type UseMatchesResult< + TRouter extends AnyRouter, + TSelected, +> = unknown extends TSelected ? Array> : TSelected + +/** + * Read the full array of active route matches or select a derived subset. + * + * Useful for debugging, breadcrumbs, or aggregating metadata across matches. + * + * @returns The array of matches (or the selected value). + */ +export function useMatches< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseMatchesBaseOptions & + StructuralSharingOption, +): UseMatchesResult { + return useRouterState({ + select: (state: RouterState) => { + const matches = state.matches + return opts?.select + ? opts.select(matches as Array>) + : matches + }, + structuralSharing: opts?.structuralSharing, + } as any) as UseMatchesResult +} + +/** + * Read the full array of active route matches or select a derived subset + * from the parent boundary up to (but not including) the current match. + */ +export function useParentMatches< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseMatchesBaseOptions & + StructuralSharingOption, +): UseMatchesResult { + const contextMatchId = React.useContext(matchContext) + + return useMatches({ + select: (matches: Array>) => { + const index = matches.findIndex((d) => d.id === contextMatchId) + const parentMatches = matches.slice(0, index) + return opts?.select + ? opts.select(parentMatches) + : (parentMatches as UseMatchesResult) + }, + structuralSharing: opts?.structuralSharing, + } as any) +} + +/** + * Read the full array of active route matches or select a derived subset + * from the children of the current match down to the leaf. + */ +export function useChildMatches< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseMatchesBaseOptions & + StructuralSharingOption, +): UseMatchesResult { + const contextMatchId = React.useContext(matchContext) + + return useMatches({ + select: (matches: Array>) => { + const index = matches.findIndex((d) => d.id === contextMatchId) + const childMatches = matches.slice(index + 1) + return opts?.select + ? opts.select(childMatches) + : (childMatches as UseMatchesResult) + }, + structuralSharing: opts?.structuralSharing, + } as any) +} diff --git a/packages/react-native-router/src/useNavigate.tsx b/packages/react-native-router/src/useNavigate.tsx new file mode 100644 index 0000000000..bf86882c95 --- /dev/null +++ b/packages/react-native-router/src/useNavigate.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { useRouter } from './useRouter' +import { resolveNativeNavigateOptions } from './nativeNavigation' +import type { + AnyRouter, + FromPathOption, + NavigateOptions, + RegisteredRouter, + UseNavigateResult, +} from '@tanstack/router-core' + +/** + * Imperative navigation hook for React Native. + * + * Returns a stable `navigate(options)` function to change the current location + * programmatically. Prefer the `Link` component for user-initiated navigation, + * and use this hook from effects, callbacks, or handlers where imperative + * navigation is required. + */ +export function useNavigate< + TRouter extends AnyRouter = RegisteredRouter, + TDefaultFrom extends string = string, +>(_defaultOpts?: { + from?: FromPathOption +}): UseNavigateResult { + const router = useRouter() + + return React.useCallback( + (options: NavigateOptions) => { + const resolved = resolveNativeNavigateOptions(router, { + ...options, + from: options.from ?? _defaultOpts?.from, + }) + return router.navigate(resolved as any) + }, + [_defaultOpts?.from, router], + ) as UseNavigateResult +} + +/** + * Component that triggers a navigation when rendered. Navigation executes + * in an effect after mount/update. + */ +export function Navigate< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string = string, + const TTo extends string | undefined = undefined, + const TMaskFrom extends string = TFrom, + const TMaskTo extends string = '', +>(props: NavigateOptions): null { + const router = useRouter() + const navigate = useNavigate() + + const previousPropsRef = React.useRef | null>(null) + + React.useLayoutEffect(() => { + if (previousPropsRef.current !== props) { + navigate(props) + previousPropsRef.current = props + } + }, [router, props, navigate]) + + return null +} diff --git a/packages/react-native-router/src/useParams.tsx b/packages/react-native-router/src/useParams.tsx new file mode 100644 index 0000000000..8179841245 --- /dev/null +++ b/packages/react-native-router/src/useParams.tsx @@ -0,0 +1,98 @@ +import { useMatch } from './useMatch' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseParams, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + UseParamsResult, +} from '@tanstack/router-core' + +export interface UseParamsBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing, +> { + select?: ( + params: ResolveUseParams, + ) => ValidateSelected + shouldThrow?: TThrow +} + +export type UseParamsOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing, +> = StrictOrFrom & + UseParamsBaseOptions< + TRouter, + TFrom, + TStrict, + TThrow, + TSelected, + TStructuralSharing + > & + StructuralSharingOption + +export type UseParamsRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseParamsBaseOptions< + TRouter, + TFrom, + /* TStrict */ true, + /* TThrow */ true, + TSelected, + TStructuralSharing + > & + StructuralSharingOption, +) => UseParamsResult + +/** + * Access the current route's path parameters with type-safety. + */ +export function useParams< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts: UseParamsOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected, + TStructuralSharing + >, +): ThrowOrOptional< + UseParamsResult, + TThrow +> { + return useMatch({ + from: opts.from!, + shouldThrow: opts.shouldThrow, + structuralSharing: opts.structuralSharing, + strict: opts.strict, + select: (match) => { + const params = opts.strict === false ? match.params : match._strictParams + + return opts.select ? opts.select(params) : params + }, + }) as any +} diff --git a/packages/react-native-router/src/useRouter.tsx b/packages/react-native-router/src/useRouter.tsx new file mode 100644 index 0000000000..6f9bd7e084 --- /dev/null +++ b/packages/react-native-router/src/useRouter.tsx @@ -0,0 +1,19 @@ +import * as React from 'react' +import warning from 'tiny-warning' +import { getRouterContext } from './routerContext' +import type { AnyRouter, RegisteredRouter } from '@tanstack/router-core' + +/** + * Access the current TanStack Router instance from React context. + * Must be used within a `NativeRouterProvider`. + */ +export function useRouter(opts?: { + warn?: boolean +}): TRouter { + const value = React.useContext(getRouterContext()) + warning( + !((opts?.warn ?? true) && !value), + 'useRouter must be used inside a component!', + ) + return value as any +} diff --git a/packages/react-native-router/src/useRouterState.tsx b/packages/react-native-router/src/useRouterState.tsx new file mode 100644 index 0000000000..69201fc88d --- /dev/null +++ b/packages/react-native-router/src/useRouterState.tsx @@ -0,0 +1,69 @@ +import { useStore } from '@tanstack/react-store' +import { useContext, useRef } from 'react' +import { replaceEqualDeep } from '@tanstack/router-core' +import { useRouter } from './useRouter' +import { routerStateContext } from './routerStateContext' +import type { + AnyRouter, + RegisteredRouter, + RouterState, +} from '@tanstack/router-core' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' + +export type UseRouterStateOptions< + TRouter extends AnyRouter, + TSelected, + TStructuralSharing, +> = { + router?: TRouter + select?: ( + state: RouterState, + ) => ValidateSelected +} & StructuralSharingOption + +export type UseRouterStateResult< + TRouter extends AnyRouter, + TSelected, +> = unknown extends TSelected ? RouterState : TSelected + +/** + * Subscribe to the router's state store with optional selection and + * structural sharing for render optimization. + */ +export function useRouterState< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseRouterStateOptions, +): UseRouterStateResult { + const contextRouter = useRouter({ + warn: opts?.router === undefined, + }) + const router = opts?.router || contextRouter + const previousResult = + useRef>(undefined) + const stateOverride = useContext(routerStateContext) + + return useStore(router.stores.__store, (state) => { + const resolvedState = (stateOverride ?? state) as RouterState< + TRouter['routeTree'] + > + + if (opts?.select) { + if (opts.structuralSharing ?? router.options.defaultStructuralSharing) { + const newSlice = replaceEqualDeep( + previousResult.current, + opts.select(resolvedState), + ) + previousResult.current = newSlice + return newSlice + } + return opts.select(resolvedState) + } + return resolvedState + }) as UseRouterStateResult +} diff --git a/packages/react-native-router/src/useSearch.tsx b/packages/react-native-router/src/useSearch.tsx new file mode 100644 index 0000000000..39d5796336 --- /dev/null +++ b/packages/react-native-router/src/useSearch.tsx @@ -0,0 +1,96 @@ +import { useMatch } from './useMatch' +import type { + StructuralSharingOption, + ValidateSelected, +} from './structuralSharing' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseSearch, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + UseSearchResult, +} from '@tanstack/router-core' + +export interface UseSearchBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing, +> { + select?: ( + state: ResolveUseSearch, + ) => ValidateSelected + shouldThrow?: TThrow +} + +export type UseSearchOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, + TStructuralSharing, +> = StrictOrFrom & + UseSearchBaseOptions< + TRouter, + TFrom, + TStrict, + TThrow, + TSelected, + TStructuralSharing + > & + StructuralSharingOption + +export type UseSearchRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts?: UseSearchBaseOptions< + TRouter, + TFrom, + /* TStrict */ true, + /* TThrow */ true, + TSelected, + TStructuralSharing + > & + StructuralSharingOption, +) => UseSearchResult + +/** + * Read and select the current route's search parameters with type-safety. + */ +export function useSearch< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, + TStructuralSharing extends boolean = boolean, +>( + opts: UseSearchOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected, + TStructuralSharing + >, +): ThrowOrOptional< + UseSearchResult, + TThrow +> { + return useMatch({ + from: opts.from!, + strict: opts.strict, + shouldThrow: opts.shouldThrow, + structuralSharing: opts.structuralSharing, + select: (match: any) => { + return opts.select ? opts.select(match.search) : match.search + }, + }) as any +} diff --git a/packages/react-native-router/tests/history.test.ts b/packages/react-native-router/tests/history.test.ts new file mode 100644 index 0000000000..99efeea135 --- /dev/null +++ b/packages/react-native-router/tests/history.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it, vi } from 'vitest' +import { createNativeHistory } from '../src/history' + +describe('createNativeHistory', () => { + it('respects initialIndex 0', () => { + const history = createNativeHistory({ + initialEntries: ['/first', '/second'], + initialIndex: 0, + }) + + expect(history.location.pathname).toBe('/first') + expect(history.canGoBack()).toBe(false) + }) + + it('exposes native back handling helpers', () => { + const history = createNativeHistory({ + initialEntries: ['/first', '/second'], + }) + const onNativeBack = vi.fn() + + history.setOnNativeBack(onNativeBack) + history.handleNativeBack() + + expect(history.location.pathname).toBe('/first') + expect(onNativeBack).toHaveBeenCalledTimes(1) + expect(history.getStackDepth()).toBe(2) + expect(history.getStackSnapshot()).toMatchObject([ + { index: 0, path: '/first' }, + { index: 1, path: '/second' }, + ]) + }) +}) diff --git a/packages/react-native-router/tests/linking.test.ts b/packages/react-native-router/tests/linking.test.ts new file mode 100644 index 0000000000..09bbaa8a7d --- /dev/null +++ b/packages/react-native-router/tests/linking.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest' +import { parseExternalUrl } from '../src/linking' + +describe('parseExternalUrl', () => { + it('parses custom scheme url using prefixes', () => { + expect(parseExternalUrl('myapp://products/42?ref=test', ['myapp://'])).toBe( + '/products/42?ref=test', + ) + }) + + it('parses universal links using prefixes', () => { + expect( + parseExternalUrl('https://myapp.com/products/42?ref=test#section', [ + 'https://myapp.com', + ]), + ).toBe('/products/42?ref=test#section') + }) + + it('uses longest matching prefix when multiple prefixes match', () => { + expect( + parseExternalUrl('myapp://v2/products/42', ['myapp://', 'myapp://v2']), + ).toBe('/products/42') + }) + + it('falls back to URL parsing when no prefixes are configured', () => { + expect(parseExternalUrl('myapp://products/42?ref=test', [])).toBe( + '/products/42?ref=test', + ) + }) + + it('ignores urls that do not match configured prefixes', () => { + expect( + parseExternalUrl('exp://192.168.1.88:8082/--/', ['tanstackrouter://']), + ).toBeNull() + }) + + it('returns null for invalid urls', () => { + expect(parseExternalUrl('not a url', [])).toBeNull() + }) +}) diff --git a/packages/react-native-router/tsconfig.build.json b/packages/react-native-router/tsconfig.build.json new file mode 100644 index 0000000000..92be18587f --- /dev/null +++ b/packages/react-native-router/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": ["src"] +} diff --git a/packages/react-native-router/tsconfig.json b/packages/react-native-router/tsconfig.json new file mode 100644 index 0000000000..fc0a511b1a --- /dev/null +++ b/packages/react-native-router/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react", + "types": ["node"] + }, + "include": ["src", "tests", "vite.config.ts"] +} diff --git a/packages/react-native-router/vite.config.ts b/packages/react-native-router/vite.config.ts new file mode 100644 index 0000000000..de116fb4b1 --- /dev/null +++ b/packages/react-native-router/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/vite-config' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './tests', + watch: false, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + tsconfigPath: './tsconfig.build.json', + entry: ['./src/index.tsx', './src/core.ts', './src/history.ts'], + srcDir: './src', + }), +) diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index cf3b1c11fe..054b2a78b5 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -1995,8 +1995,16 @@ const createHistoryRouter = () => { }, }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + component: function Component() { + return

About

+ }, + }) + const router = createRouter({ - routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + routeTree: rootRoute.addChildren([indexRoute, postsRoute, aboutRoute]), history, }) @@ -2113,6 +2121,147 @@ describe('history: History gives correct notifcations and state', () => { unsub() }) + + it('router.back should support steps and root', async () => { + const { router } = createHistoryRouter() + + render() + + await act(() => router.navigate({ to: '/posts' })) + await act(() => router.navigate({ to: '/about' })) + + expect(window.location.pathname).toBe('/about') + + act(() => (router as any).back({ steps: 2 })) + + expect( + await screen.findByRole('heading', { name: 'Index' }), + ).toBeInTheDocument() + + await act(() => router.navigate({ to: '/posts' })) + await act(() => router.navigate({ to: '/about' })) + + expect(window.location.pathname).toBe('/about') + + act(() => (router as any).back({ to: 'root' })) + + expect( + await screen.findByRole('heading', { name: 'Index' }), + ).toBeInTheDocument() + }) + + it('router.back should support pathname targets with fallback', async () => { + const { router } = createHistoryRouter() + + render() + + await act(() => router.navigate({ to: '/posts' })) + await act(() => router.navigate({ to: '/about' })) + + expect(window.location.pathname).toBe('/about') + + act(() => (router as any).back({ to: '/posts' })) + + expect( + await screen.findByRole('heading', { name: 'Posts' }), + ).toBeInTheDocument() + + await act(async () => { + await (router as any).back({ to: '/about', ifMissing: 'push' }) + }) + + expect( + await screen.findByRole('heading', { name: 'About' }), + ).toBeInTheDocument() + + const beforeNoop = window.location.pathname + act(() => (router as any).back({ to: '/non-existent', ifMissing: 'noop' })) + expect(window.location.pathname).toBe(beforeNoop) + }) + + it('router.navigate should support stackBehavior reuse by entry id', async () => { + const { router } = createHistoryRouter() + + render() + + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'push', + entryId: 'posts', + } as any), + ) + await act(() => router.navigate({ to: '/about' })) + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'push', + entryId: 'posts', + } as any), + ) + await act(() => router.navigate({ to: '/about' })) + + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'reuse', + stackMatch: 'nearest', + entryId: 'posts', + } as any), + ) + + expect( + await screen.findByRole('heading', { name: 'Posts' }), + ).toBeInTheDocument() + + act(() => router.history.back()) + + expect( + await screen.findByRole('heading', { name: 'About' }), + ).toBeInTheDocument() + }) + + it('router.navigate should support stackMatch oldest', async () => { + const { router } = createHistoryRouter() + + render() + + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'push', + entryId: 'posts', + } as any), + ) + await act(() => router.navigate({ to: '/about' })) + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'push', + entryId: 'posts', + } as any), + ) + await act(() => router.navigate({ to: '/about' })) + + await act(() => + router.navigate({ + to: '/posts', + stackBehavior: 'reuse', + stackMatch: 'oldest', + entryId: 'posts', + } as any), + ) + + expect( + await screen.findByRole('heading', { name: 'Posts' }), + ).toBeInTheDocument() + + act(() => router.history.back()) + + expect( + await screen.findByRole('heading', { name: 'Index' }), + ).toBeInTheDocument() + }) }) it('does not push to history if url and state are the same', async () => { diff --git a/packages/react-start/package.json b/packages/react-start/package.json index 5163a2cab7..2a9549eadd 100644 --- a/packages/react-start/package.json +++ b/packages/react-start/package.json @@ -88,6 +88,16 @@ "default": "./dist/esm/plugin/rsbuild.js" } }, + "./plugin/metro": { + "import": { + "types": "./dist/esm/plugin/metro.d.ts", + "default": "./dist/esm/plugin/metro.js" + }, + "require": { + "types": "./dist/esm/plugin/metro.d.cts", + "default": "./dist/esm/plugin/metro.cjs" + } + }, "./server-entry": { "import": { "types": "./dist/default-entry/esm/server.d.ts", diff --git a/packages/react-start/src/plugin/metro.cjs b/packages/react-start/src/plugin/metro.cjs new file mode 100644 index 0000000000..7238616613 --- /dev/null +++ b/packages/react-start/src/plugin/metro.cjs @@ -0,0 +1,25 @@ +'use strict' + +// CJS shim for `@tanstack/react-start/plugin/metro`. +// +// `metro.config.js` is conventionally CJS, but `@tanstack/react-start` ships +// as ESM. This shim lets users `require()` it in their metro.config.js by +// dynamically importing the ESM build on first call. `withTanStackStart` +// already returns a Promise and Metro accepts Promise-typed configs, so the +// extra `await import()` is invisible at the call site. + +let modulePromise = null + +function loadModule() { + if (!modulePromise) { + modulePromise = import('./metro.js') + } + return modulePromise +} + +async function withTanStackStart(metroConfig, options) { + const mod = await loadModule() + return mod.withTanStackStart(metroConfig, options) +} + +module.exports = { withTanStackStart } diff --git a/packages/react-start/src/plugin/metro.d.cts b/packages/react-start/src/plugin/metro.d.cts new file mode 100644 index 0000000000..bbbe6ce3ea --- /dev/null +++ b/packages/react-start/src/plugin/metro.d.cts @@ -0,0 +1,28 @@ +export interface WithTanStackStartOptions { + /** Project root. Defaults to `process.cwd()`. */ + root?: string + /** + * Base URL of the deployed TanStack Start server. Replaces references to + * `process.env.TSS_SERVER_FN_BASE` and `import.meta.env.TSS_SERVER_FN_BASE` + * in transformed source so client RPC stubs target the right origin. + */ + serverFnBase?: string + /** + * Override the upstream Metro Babel transformer (the one our wrapper + * delegates to). Defaults to `@react-native/metro-babel-transformer`. + */ + originalTransformerPath?: string +} + +export interface MetroLikeConfig { + transformer?: { + babelTransformerPath?: string + [key: string]: unknown + } + [key: string]: unknown +} + +export declare function withTanStackStart( + metroConfig: T | Promise, + options?: WithTanStackStartOptions, +): Promise diff --git a/packages/react-start/src/plugin/metro.ts b/packages/react-start/src/plugin/metro.ts new file mode 100644 index 0000000000..4d497477e1 --- /dev/null +++ b/packages/react-start/src/plugin/metro.ts @@ -0,0 +1,146 @@ +import { createRequire } from 'node:module' +import { createMetroCompiler } from '@tanstack/start-plugin-core/metro' +import type { + CreateMetroCompilerOptions, + MetroCompilerHandle, +} from '@tanstack/start-plugin-core/metro' + +export type CreateReactStartMetroCompilerOptions = Omit< + CreateMetroCompilerOptions, + 'framework' +> + +/** + * Create a TanStack Start compiler for a React Native client built with Metro. + * + * Wraps `createMetroCompiler` with `framework: 'react'`. Returns a handle + * exposing `compile`, `invalidate`, and `getServerFns` — the foundation a + * Metro transformer wrapper (or custom integration) calls per source file. + * + * The Start *server* must be deployed separately (a normal Vite or Rsbuild + * Start build). Server function IDs match across the two builds because + * `generateFunctionId` is deterministic given the same source + root. + * + * @example + * ```ts + * import { createReactStartMetroCompiler } from '@tanstack/react-start/plugin/metro' + * + * const start = createReactStartMetroCompiler({ root: process.cwd() }) + * const result = await start.compile({ id, code }) + * ``` + */ +export function createReactStartMetroCompiler( + options: CreateReactStartMetroCompilerOptions, +): MetroCompilerHandle { + return createMetroCompiler({ + framework: 'react', + ...options, + }) +} + +export interface WithTanStackStartOptions { + /** Project root. Defaults to `process.cwd()`. */ + root?: string + /** + * Base URL of the deployed TanStack Start server. Replaces references to + * `process.env.TSS_SERVER_FN_BASE` and `import.meta.env.TSS_SERVER_FN_BASE` + * in transformed source so client RPC stubs target the right origin. + * + * @example 'https://api.example.com' + */ + serverFnBase?: string + /** + * Override the upstream Metro Babel transformer (the one our wrapper + * delegates to). Defaults to `@react-native/metro-babel-transformer`. + */ + originalTransformerPath?: string +} + +interface MetroLikeConfig { + transformer?: { + babelTransformerPath?: string + [key: string]: unknown + } + [key: string]: unknown +} + +function normalizeServerFnBase(serverFnBase: string | undefined) { + if (!serverFnBase) return undefined + + const withTrailingSlash = serverFnBase.endsWith('/') + ? serverFnBase + : `${serverFnBase}/` + + if (withTrailingSlash.endsWith('/_serverFn/')) { + return withTrailingSlash + } + + return `${withTrailingSlash}_serverFn/` +} + +/** + * Wrap a Metro config so TanStack Start `createServerFn` / `createIsomorphicFn` + * / `createMiddleware` / `createServerOnlyFn` / `createClientOnlyFn` calls in + * your React Native client get rewritten to RPC stubs at bundle time. + * + * The actual Start server (the thing that hosts your `createServerFn` handlers) + * must be deployed separately — typically a Vite or Rsbuild Start build. + * Function IDs match across the two builds because they're deterministic given + * the same source tree + project root. + * + * @example + * ```js + * // metro.config.js + * const { getDefaultConfig } = require('expo/metro-config') + * const { withTanStackRouter } = require('@tanstack/router-plugin/metro') + * const { withTanStackStart } = require('@tanstack/react-start/plugin/metro') + * + * const config = getDefaultConfig(__dirname) + * module.exports = withTanStackRouter( + * withTanStackStart(config, { serverFnBase: 'https://api.example.com' }), + * ) + * ``` + */ +export async function withTanStackStart( + metroConfig: T | Promise, + options: WithTanStackStartOptions = {}, +): Promise { + const config = await metroConfig + const root = options.root ?? process.cwd() + + const require = createRequire(import.meta.url) + const transformerPath = + require.resolve('@tanstack/start-plugin-core/metro/transformer') + const transformer = require(transformerPath) as { + setup: (opts: { + root: string + framework: 'react' + originalTransformerPath?: string + serverFnBase?: string + }) => void + } + + const originalTransformerPath = + options.originalTransformerPath ?? config.transformer?.babelTransformerPath + + transformer.setup({ + root, + framework: 'react', + originalTransformerPath, + serverFnBase: normalizeServerFnBase(options.serverFnBase), + }) + + return { + ...config, + transformer: { + ...(config.transformer ?? {}), + babelTransformerPath: transformerPath, + }, + } +} + +export type { + MetroCompilerHandle, + MetroCompileResult, + CreateMetroCompilerOptions, +} from '@tanstack/start-plugin-core/metro' diff --git a/packages/react-start/vite.config.ts b/packages/react-start/vite.config.ts index 0995b1f9b4..9080d85719 100644 --- a/packages/react-start/vite.config.ts +++ b/packages/react-start/vite.config.ts @@ -15,6 +15,11 @@ const config = defineConfig({ fromDir: 'src/default-entry', toDir: 'dist/plugin/default-entry', }), + copyFilesPlugin({ + pattern: ['*.cjs', '*.d.cts'], + fromDir: 'src/plugin', + toDir: 'dist/esm/plugin', + }), ], }) @@ -39,6 +44,7 @@ export default mergeConfig( './src/rsbuild/browser-decode.ts', './src/rsbuild/ssr-decode.ts', './src/plugin/rsbuild.ts', + './src/plugin/metro.ts', './src/plugin/vite.ts', './src/server-only.ts', './src/client-only.ts', diff --git a/packages/router-core/src/index.ts b/packages/router-core/src/index.ts index ded15fff6d..f68e29c05b 100644 --- a/packages/router-core/src/index.ts +++ b/packages/router-core/src/index.ts @@ -23,6 +23,9 @@ export type { AbsoluteToPath, RelativeToPathAutoComplete, NavigateOptions, + NativeNavigateOptions, + StackBehavior, + StackMatch, ToOptions, ToMaskOptions, ToSubOptions, @@ -264,6 +267,7 @@ export type { ClearCacheFn, CreateRouterFn, SSROption, + BackOptions, } from './router' export * from './config' diff --git a/packages/router-core/src/link.ts b/packages/router-core/src/link.ts index 55d5a79ce8..7398a4806e 100644 --- a/packages/router-core/src/link.ts +++ b/packages/router-core/src/link.ts @@ -294,11 +294,40 @@ export type NavigateOptions< TMaskTo extends string = '.', > = ToOptions & NavigateOptionProps +export type StackBehavior = 'auto' | 'push' | 'replace' | 'reuse' + +export type StackMatch = 'nearest' | 'oldest' + +export interface NativeNavigateOptions { + minStackState?: 'active' | 'paused' +} + /** * The NavigateOptions type is used to describe the options that can be used when describing a navigation action in TanStack Router. * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/NavigateOptionsType) */ export interface NavigateOptionProps { + /** + * Controls stack behavior for this navigation. + * - `auto`: Router default behavior + * - `push`: Always push a new entry + * - `replace`: Replace current entry + * - `reuse`: Reuse an existing matching entry if possible + */ + stackBehavior?: StackBehavior + /** + * Chooses which matching stack entry to reuse when multiple matches exist. + * @default 'nearest' + */ + stackMatch?: StackMatch + /** + * Optional identity for stack reuse matching. + */ + entryId?: string + /** + * Native-specific navigation metadata. + */ + native?: NativeNavigateOptions /** * If set to `true`, the router will scroll the element with an id matching the hash into view with default `ScrollIntoViewOptions`. * If set to `false`, the router will not scroll the element with an id matching the hash into view. diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index bd8a2898ec..d4556f78b7 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -99,7 +99,13 @@ import type { } from './RouterProvider' import type { Manifest, RouterManagedTag } from './manifest' import type { AnySchema, AnyValidator } from './validators' -import type { NavigateOptions, ResolveRelativePath, ToOptions } from './link' +import type { + NavigateOptions, + ResolveRelativePath, + StackBehavior, + StackMatch, + ToOptions, +} from './link' import type { NotFoundError } from './not-found' import type { AnySerializationAdapter, @@ -742,6 +748,13 @@ export type EmitFn = (routerEvent: RouterEvent) => void export type LoadFn = (opts?: { sync?: boolean }) => Promise +export interface BackOptions { + steps?: number + to?: string | 'root' + ifMissing?: 'push' | 'replace' | 'noop' + ignoreBlocker?: boolean +} + export type CommitLocationFn = ({ viewTransition, ignoreBlocker, @@ -976,6 +989,8 @@ export class RouterCore< isServer!: boolean pathParamsDecoder?: (encoded: string) => string protocolAllowlist!: Set + locationPathnameByIndex = new Map() + locationEntryIdByIndex = new Map() /** * @deprecated Use the `createRouter` function instead @@ -1193,6 +1208,16 @@ export class RouterCore< this.history.location, this.latestLocation, ) + + const index = this.latestLocation.state.__TSR_index + if (typeof index === 'number') { + this.locationPathnameByIndex.set(index, this.latestLocation.pathname) + const entryId = (this.latestLocation.state as any).__TSR_entryId + this.locationEntryIdByIndex.set( + index, + typeof entryId === 'string' ? entryId : this.latestLocation.pathname, + ) + } } buildRouteTree = () => { @@ -2277,6 +2302,10 @@ export class RouterCore< reloadDocument, href, publicHref, + stackBehavior, + stackMatch, + entryId, + native, ...rest }) => { let hrefIsUrl = false @@ -2346,6 +2375,94 @@ export class RouterCore< return Promise.resolve() } + let effectiveStackBehavior: StackBehavior | undefined = stackBehavior + if (effectiveStackBehavior === 'replace') { + ;(rest as any).replace = true + } else if (effectiveStackBehavior === 'push') { + ;(rest as any).replace = false + } + + if (effectiveStackBehavior === 'reuse') { + const targetLocation = this.buildLocation({ + to, + ...rest, + _includeValidateSearch: true, + } as any) + + const reuseId = entryId ?? targetLocation.pathname + const currentIndex = this.history.location.state.__TSR_index + + const currentEntryId = + this.locationEntryIdByIndex.get(currentIndex) ?? + this.history.location.pathname + + if (reuseId === currentEntryId) { + return Promise.resolve() + } + + const matchMode: StackMatch = stackMatch ?? 'nearest' + + const indices = + matchMode === 'oldest' + ? Array.from({ length: currentIndex }, (_, i) => i) + : Array.from({ length: currentIndex }, (_, i) => currentIndex - 1 - i) + + for (const index of indices) { + if (this.locationEntryIdByIndex.get(index) === reuseId) { + this.history.go(index - currentIndex, { + ignoreBlocker: rest.ignoreBlocker, + }) + + if (native?.minStackState) { + const locationAfterGo = this.history.location + if (locationAfterGo.state.__TSR_index === index) { + this.history.replace( + locationAfterGo.href, + { + ...locationAfterGo.state, + __TSR_nativeMinStackState: native.minStackState, + }, + { ignoreBlocker: rest.ignoreBlocker }, + ) + } + } + + if (!this.history.subscribers.size) { + this.load() + } + + return Promise.resolve() + } + } + + rest.state = { + ...(rest.state && rest.state !== true + ? functionalUpdate(rest.state as any, this.latestLocation.state) + : {}), + __TSR_entryId: reuseId, + ...(native?.minStackState + ? { __TSR_nativeMinStackState: native.minStackState } + : null), + } + } else if (typeof entryId === 'string') { + rest.state = { + ...(rest.state && rest.state !== true + ? functionalUpdate(rest.state as any, this.latestLocation.state) + : {}), + __TSR_entryId: entryId, + ...(native?.minStackState + ? { __TSR_nativeMinStackState: native.minStackState } + : null), + } + } else if (native?.minStackState) { + rest.state = { + ...(rest.state && rest.state !== true + ? functionalUpdate(rest.state as any, this.latestLocation.state) + : {}), + __TSR_nativeMinStackState: native.minStackState, + } + } + return this.buildAndCommitLocation({ ...rest, href, @@ -2354,6 +2471,62 @@ export class RouterCore< }) } + back = ({ + steps, + to, + ifMissing = 'push', + ignoreBlocker, + }: BackOptions = {}): Promise | void => { + const currentIndex = this.history.location.state.__TSR_index + + if (!currentIndex) { + if (to && to !== 'root') { + if (ifMissing === 'replace') { + return this.navigate({ to, replace: true, ignoreBlocker }) + } + if (ifMissing === 'push') { + return this.navigate({ to, ignoreBlocker }) + } + } + return + } + + if (to !== undefined) { + if (to === 'root') { + this.history.go(-currentIndex, { ignoreBlocker }) + return + } + + const targetPathname = this.buildLocation({ to } as any).pathname + + if (targetPathname === this.history.location.pathname) { + return + } + + for (let index = currentIndex - 1; index >= 0; index--) { + if (this.locationPathnameByIndex.get(index) === targetPathname) { + this.history.go(index - currentIndex, { ignoreBlocker }) + return + } + } + + if (ifMissing === 'replace') { + return this.navigate({ to, replace: true, ignoreBlocker }) + } + + if (ifMissing === 'push') { + return this.navigate({ to, ignoreBlocker }) + } + + return + } + + const requestedSteps = Math.max(1, Math.floor(steps ?? 1)) + const indexDelta = Math.min(requestedSteps, currentIndex) + + this.history.go(-indexDelta, { ignoreBlocker }) + } + latestLoadPromise: undefined | Promise beforeLoad = () => { diff --git a/packages/router-generator/src/config.ts b/packages/router-generator/src/config.ts index bedb265155..b614fd2f7f 100644 --- a/packages/router-generator/src/config.ts +++ b/packages/router-generator/src/config.ts @@ -20,7 +20,10 @@ export type TokenMatcherJson = string | z.infer export type TokenMatcher = z.infer export const baseConfigSchema = z.object({ - target: z.enum(['react', 'solid', 'vue']).optional().default('react'), + target: z + .enum(['react', 'react-native', 'solid', 'vue']) + .optional() + .default('react'), virtualRouteConfig: virtualRootRouteSchema.or(z.string()).optional(), routeFilePrefix: z.string().optional(), routeFileIgnorePrefix: z.string().optional().default('-'), diff --git a/packages/router-generator/src/template.ts b/packages/router-generator/src/template.ts index 11ca968933..3b3cf53b7f 100644 --- a/packages/router-generator/src/template.ts +++ b/packages/router-generator/src/template.ts @@ -104,6 +104,59 @@ export function getTargetTemplate(config: Config): TargetTemplate { }, }, } + case 'react-native': + return { + fullPkg: '@tanstack/react-native-router', + subPkg: 'react-native-router', + rootRoute: { + template: () => + [ + 'import * as React from "react"\n', + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: RootComponent\n }%%tsrExportEnd%%\n\n', + 'function RootComponent() { return (
Hello "%%tsrPath%%"!
) };\n', + ].join(''), + imports: { + tsrImports: () => + "import { Outlet, createRootRoute } from '@tanstack/react-native-router';", + tsrExportStart: () => 'export const Route = createRootRoute(', + tsrExportEnd: () => ');', + }, + }, + route: { + template: () => + [ + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: RouteComponent\n }%%tsrExportEnd%%\n\n', + 'function RouteComponent() { return
Hello "%%tsrPath%%"!
};\n', + ].join(''), + imports: { + tsrImports: () => + "import { createFileRoute } from '@tanstack/react-native-router';", + tsrExportStart: (routePath) => + `export const Route = createFileRoute(${serializeRoutePath(routePath)})(`, + tsrExportEnd: () => ');', + }, + }, + lazyRoute: { + template: () => + [ + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: RouteComponent\n }%%tsrExportEnd%%\n\n', + 'function RouteComponent() { return
Hello "%%tsrPath%%"!
};\n', + ].join(''), + imports: { + tsrImports: () => + "import { createLazyFileRoute } from '@tanstack/react-native-router';", + tsrExportStart: (routePath) => + `export const Route = createLazyFileRoute(${serializeRoutePath(routePath)})(`, + tsrExportEnd: () => ');', + }, + }, + } case 'solid': return { fullPkg: '@tanstack/solid-router', diff --git a/packages/router-generator/tests/generator.test.ts b/packages/router-generator/tests/generator.test.ts index 79f7d505b2..3c0df4879d 100644 --- a/packages/router-generator/tests/generator.test.ts +++ b/packages/router-generator/tests/generator.test.ts @@ -318,6 +318,14 @@ async function postprocess(folderName: string) { } }) } + case 'react-native-target-imports': { + const routeFile = join(makeFolderDir(folderName), 'routes', 'index.tsx') + const text = await fs.readFile(routeFile, 'utf-8') + await expect(text).toMatchFileSnapshot( + join('generator', folderName, 'snapshots', 'index.tsx'), + ) + break + } } } diff --git a/packages/router-generator/tests/generator/react-native-target-imports/routeTree.snapshot.ts b/packages/router-generator/tests/generator/react-native-target-imports/routeTree.snapshot.ts new file mode 100644 index 0000000000..5bf7cf494d --- /dev/null +++ b/packages/router-generator/tests/generator/react-native-target-imports/routeTree.snapshot.ts @@ -0,0 +1,59 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +declare module '@tanstack/react-native-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/packages/router-generator/tests/generator/react-native-target-imports/routes/__root.tsx b/packages/router-generator/tests/generator/react-native-target-imports/routes/__root.tsx new file mode 100644 index 0000000000..b265cd6fbc --- /dev/null +++ b/packages/router-generator/tests/generator/react-native-target-imports/routes/__root.tsx @@ -0,0 +1,4 @@ +// @ts-nocheck +import { createRootRoute } from '@tanstack/react-native-router' + +export const Route = createRootRoute({}) diff --git a/packages/router-generator/tests/generator/react-native-target-imports/routes/index.tsx b/packages/router-generator/tests/generator/react-native-target-imports/routes/index.tsx new file mode 100644 index 0000000000..f5d1c37124 --- /dev/null +++ b/packages/router-generator/tests/generator/react-native-target-imports/routes/index.tsx @@ -0,0 +1,10 @@ +// @ts-nocheck +import { Link, createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/')({ + component: IndexComponent, +}) + +function IndexComponent() { + return Home +} diff --git a/packages/router-generator/tests/generator/react-native-target-imports/snapshots/index.tsx b/packages/router-generator/tests/generator/react-native-target-imports/snapshots/index.tsx new file mode 100644 index 0000000000..f5d1c37124 --- /dev/null +++ b/packages/router-generator/tests/generator/react-native-target-imports/snapshots/index.tsx @@ -0,0 +1,10 @@ +// @ts-nocheck +import { Link, createFileRoute } from '@tanstack/react-native-router' + +export const Route = createFileRoute('/')({ + component: IndexComponent, +}) + +function IndexComponent() { + return Home +} diff --git a/packages/router-generator/tests/generator/react-native-target-imports/tsr.config.json b/packages/router-generator/tests/generator/react-native-target-imports/tsr.config.json new file mode 100644 index 0000000000..5278df7f5a --- /dev/null +++ b/packages/router-generator/tests/generator/react-native-target-imports/tsr.config.json @@ -0,0 +1,3 @@ +{ + "target": "react-native" +} diff --git a/packages/router-plugin/package.json b/packages/router-plugin/package.json index 0242643d19..87910128c9 100644 --- a/packages/router-plugin/package.json +++ b/packages/router-plugin/package.json @@ -103,6 +103,16 @@ "default": "./dist/cjs/esbuild.cjs" } }, + "./metro": { + "import": { + "types": "./dist/esm/metro.d.ts", + "default": "./dist/esm/metro.js" + }, + "require": { + "types": "./dist/cjs/metro.d.cts", + "default": "./dist/cjs/metro.cjs" + } + }, "./package.json": "./package.json" }, "sideEffects": false, diff --git a/packages/router-plugin/src/core/code-splitter/framework-options.ts b/packages/router-plugin/src/core/code-splitter/framework-options.ts index 0a2a9e8230..c55a764c3e 100644 --- a/packages/router-plugin/src/core/code-splitter/framework-options.ts +++ b/packages/router-plugin/src/core/code-splitter/framework-options.ts @@ -21,6 +21,16 @@ export function getFrameworkOptions(framework: string): FrameworkOptions { }, } break + case 'react-native': + frameworkOptions = { + package: '@tanstack/react-native-router', + idents: { + createFileRoute: 'createFileRoute', + lazyFn: 'lazyFn', + lazyRouteComponent: 'lazyRouteComponent', + }, + } + break case 'solid': frameworkOptions = { package: '@tanstack/solid-router', diff --git a/packages/router-plugin/src/metro.ts b/packages/router-plugin/src/metro.ts new file mode 100644 index 0000000000..64da7fb264 --- /dev/null +++ b/packages/router-plugin/src/metro.ts @@ -0,0 +1,154 @@ +import { execFileSync } from 'node:child_process' +import { dirname, isAbsolute, join, normalize } from 'node:path' +import chokidar from 'chokidar' +import { Generator } from '@tanstack/router-generator' +import { getConfig } from './core/config' +import type { GeneratorEvent } from '@tanstack/router-generator' +import type { Config } from './core/config' + +const PLUGIN_NAME = '@tanstack/router-plugin/metro' + +export interface WithTanStackRouterOptions { + /** + * Inline TanStack Router config. Merged with `tsr.config.json` at the + * project root if present. + */ + config?: Partial | (() => Partial) + /** + * Project root used to resolve relative paths (e.g. `routesDirectory`). + * Defaults to `process.cwd()`. + */ + root?: string + /** + * Whether to watch the routes directory and regenerate on changes. + * Defaults to `process.env.NODE_ENV !== 'production'`. + */ + watch?: boolean + /** + * Whether to run an initial blocking route generation when the metro + * config is loaded. Defaults to `true`. Disable if you generate routes + * out-of-band (e.g. as a CI step) and want metro config load to be fast. + */ + initialGenerate?: boolean +} + +/** + * Wrap a Metro config with TanStack Router file-based routing support. + * + * - **Synchronous**: returns the (unmodified) config immediately, so it + * composes cleanly with other Metro config wrappers and works with Expo's + * Metro CLI (which reads config fields synchronously). + * - **Initial generation**: runs `@tanstack/router-cli generate` as a + * blocking subprocess so the route tree exists before Metro starts + * bundling. Disable via `{ initialGenerate: false }` if you generate + * routes elsewhere. + * - **Watch mode**: in dev (`NODE_ENV !== 'production'`) starts a chokidar + * watcher on the routes directory; route file changes regenerate the + * tree, and Metro's own watcher then triggers a reload. + * + * @example + * ```js + * // metro.config.js + * const { getDefaultConfig } = require('expo/metro-config') + * const { withTanStackRouter } = require('@tanstack/router-plugin/metro') + * + * const config = getDefaultConfig(__dirname) + * module.exports = withTanStackRouter(config) + * ``` + */ +export function withTanStackRouter( + metroConfig: T, + options: WithTanStackRouterOptions = {}, +): T { + const root = options.root ?? process.cwd() + const inline = + typeof options.config === 'function' + ? options.config() + : (options.config ?? {}) + const userConfig = getConfig(inline, root) + + if (userConfig.enableRouteGeneration === false) { + return metroConfig + } + + if (options.initialGenerate !== false) { + runInitialGenerateSync(root) + } + + const shouldWatch = options.watch ?? process.env.NODE_ENV !== 'production' + if (shouldWatch) { + startWatcher(root, userConfig) + } + + return metroConfig +} + +export default withTanStackRouter + +function runInitialGenerateSync(root: string): void { + let cliBin: string + try { + const pkgJson = require.resolve('@tanstack/router-cli/package.json', { + paths: [root, __dirname], + }) + cliBin = join(dirname(pkgJson), 'bin', 'tsr.cjs') + } catch { + console.error( + `[${PLUGIN_NAME}] Could not resolve @tanstack/router-cli — skipping initial generate. Install it as a dev dep, or pass { initialGenerate: false }.`, + ) + return + } + try { + execFileSync(process.execPath, [cliBin, 'generate'], { + cwd: root, + stdio: 'pipe', + }) + } catch (err: any) { + const stderr = err?.stderr?.toString?.() ?? '' + console.error( + `[${PLUGIN_NAME}] Initial route generation failed:\n${stderr || err}`, + ) + } +} + +function startWatcher(root: string, userConfig: Config): void { + const generator = new Generator({ config: userConfig, root }) + const generate = async (event?: GeneratorEvent) => { + try { + await generator.run(event) + } catch (err) { + console.error(`[${PLUGIN_NAME}]`, err) + } + } + + const routesDirectoryPath = isAbsolute(userConfig.routesDirectory) + ? userConfig.routesDirectory + : join(root, userConfig.routesDirectory) + + console.info( + `[${PLUGIN_NAME}] Watching routes (${userConfig.routesDirectory})`, + ) + + const watcher = chokidar.watch(routesDirectoryPath, { ignoreInitial: true }) + watcher + .on('add', (file) => generate({ path: normalize(file), type: 'create' })) + .on('change', (file) => + generate({ path: normalize(file), type: 'update' }), + ) + .on('unlink', (file) => + generate({ path: normalize(file), type: 'delete' }), + ) + + const cleanup = () => { + void watcher.close() + } + process.once('exit', cleanup) + process.once('SIGINT', () => { + cleanup() + process.exit(0) + }) + process.once('SIGTERM', () => { + cleanup() + process.exit(0) + }) +} diff --git a/packages/router-plugin/tests/metro.test.ts b/packages/router-plugin/tests/metro.test.ts new file mode 100644 index 0000000000..cd1c97c7b7 --- /dev/null +++ b/packages/router-plugin/tests/metro.test.ts @@ -0,0 +1,112 @@ +import { + existsSync, + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from 'node:fs' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { withTanStackRouter } from '../src/metro' + +// The initial-generate path shells out to router-cli's compiled bin. In +// `nx affected` runs the dep graph builds router-cli first; in a bare +// `pnpm test:unit` it may not be built. Skip the integration assertion +// in that case so the suite remains green out-of-the-box. +function isRouterCliBuilt(): boolean { + try { + const pkgJson = require.resolve('@tanstack/router-cli/package.json') + const distEntry = join(dirname(pkgJson), 'dist', 'cjs', 'index.cjs') + return existsSync(distEntry) + } catch { + return false + } +} + +describe('@tanstack/router-plugin/metro', () => { + let tmpRoot: string + + beforeEach(() => { + tmpRoot = mkdtempSync(join(tmpdir(), 'tsr-metro-test-')) + // Minimal tsr.config.json so getConfig has something to read + writeFileSync( + join(tmpRoot, 'tsr.config.json'), + JSON.stringify({ + target: 'react', + routesDirectory: './src/routes', + generatedRouteTree: './src/routeTree.gen.ts', + }), + ) + mkdirSync(join(tmpRoot, 'src', 'routes'), { recursive: true }) + // A single route so the generator has at least one to template + writeFileSync( + join(tmpRoot, 'src', 'routes', '__root.tsx'), + "export const Route = { id: 'root' }\n", + ) + }) + + afterEach(() => { + rmSync(tmpRoot, { recursive: true, force: true }) + }) + + it('returns the metro config object reference unchanged', () => { + const config = { resolver: {}, transformer: {} } + const result = withTanStackRouter(config, { + root: tmpRoot, + // Skip generator + watcher for this assertion; we only care about + // the function being a sync identity transform on the config arg. + initialGenerate: false, + watch: false, + }) + expect(result).toBe(config) + }) + + it.skipIf(!isRouterCliBuilt())( + 'runs initial route generation synchronously when enabled', + () => { + const config = { resolver: {} } + const generatedTreePath = join(tmpRoot, 'src', 'routeTree.gen.ts') + + withTanStackRouter(config, { + root: tmpRoot, + watch: false, + // initialGenerate defaults to true + }) + + // The route tree file must exist immediately after the call returns. + // No awaiting — proves the wrapper is sync end-to-end. + const tree = readFileSync(generatedTreePath, 'utf8') + expect(tree).toMatch(/routeTree/) + }, + ) + + it('skips generation when enableRouteGeneration is false', () => { + const config = { resolver: {} } + const generatedTreePath = join(tmpRoot, 'src', 'routeTree.gen.ts') + + const result = withTanStackRouter(config, { + root: tmpRoot, + config: { enableRouteGeneration: false }, + watch: false, + }) + + expect(result).toBe(config) + // No tree should have been written + expect(() => readFileSync(generatedTreePath, 'utf8')).toThrow() + }) + + it('skips initial generation when initialGenerate: false', () => { + const config = { resolver: {} } + const generatedTreePath = join(tmpRoot, 'src', 'routeTree.gen.ts') + + withTanStackRouter(config, { + root: tmpRoot, + initialGenerate: false, + watch: false, + }) + + expect(() => readFileSync(generatedTreePath, 'utf8')).toThrow() + }) +}) diff --git a/packages/router-plugin/vite.config.ts b/packages/router-plugin/vite.config.ts index e80f073d21..7db5bd9812 100644 --- a/packages/router-plugin/vite.config.ts +++ b/packages/router-plugin/vite.config.ts @@ -22,6 +22,7 @@ export default mergeConfig( './src/rspack.ts', './src/webpack.ts', './src/esbuild.ts', + './src/metro.ts', ], srcDir: './src', }), diff --git a/packages/start-plugin-core/package.json b/packages/start-plugin-core/package.json index 112d7f51dd..b884b67a60 100644 --- a/packages/start-plugin-core/package.json +++ b/packages/start-plugin-core/package.json @@ -74,6 +74,15 @@ "default": "./dist/esm/rsbuild/types.js" } }, + "./metro": { + "import": { + "types": "./dist/esm/metro/index.d.ts", + "default": "./dist/esm/metro/index.js" + } + }, + "./metro/transformer": { + "require": "./dist/esm/metro/transformer.cjs" + }, "./package.json": "./package.json" }, "sideEffects": false, diff --git a/packages/start-plugin-core/src/metro/index.ts b/packages/start-plugin-core/src/metro/index.ts new file mode 100644 index 0000000000..e80810041b --- /dev/null +++ b/packages/start-plugin-core/src/metro/index.ts @@ -0,0 +1,14 @@ +export { createMetroCompiler } from './start-compiler-host' +export type { + CreateMetroCompilerOptions, + MetroCompileResult, + MetroCompilerHandle, +} from './start-compiler-host' +export { createCompilerHandle, runTransform } from './transformer-impl' +export type { TransformerImplOptions } from './transformer-impl' +export type { + StartCompilerImportTransform, + StartCompilerTransformCandidate, + StartCompilerTransformContext, +} from '../types' +export type { ServerFn } from '../start-compiler/types' diff --git a/packages/start-plugin-core/src/metro/start-compiler-host.ts b/packages/start-plugin-core/src/metro/start-compiler-host.ts new file mode 100644 index 0000000000..a74c7fa958 --- /dev/null +++ b/packages/start-plugin-core/src/metro/start-compiler-host.ts @@ -0,0 +1,153 @@ +import { promises as fs } from 'node:fs' +import { createRequire } from 'node:module' +import { detectKindsInCode } from '../start-compiler/compiler' +import { getTransformCodeFilterForEnv } from '../start-compiler/config' +import { + createStartCompiler, + matchesCodeFilters, +} from '../start-compiler/host' +import { cleanId } from '../start-compiler/utils' +import type { StartCompiler } from '../start-compiler/compiler' +import type { + CompileStartFrameworkOptions, + StartCompilerImportTransform, +} from '../types' +import type { + GenerateFunctionIdFnOptional, + ServerFn, +} from '../start-compiler/types' + +const METRO_ENV_NAME = 'metro-client' + +export interface CreateMetroCompilerOptions { + framework: CompileStartFrameworkOptions + /** + * Project root. Must match the root used by the deployed Start server build + * for `generateFunctionId` to produce matching IDs across the two builds. + */ + root: string + generateFunctionId?: GenerateFunctionIdFnOptional + compilerTransforms?: Array +} + +export interface MetroCompileResult { + code: string + map?: unknown +} + +export interface MetroCompilerHandle { + /** + * Compile a source file. Returns null if the file has nothing to transform + * (does not match any of the start-compiler detection patterns). + * + * Throws on parse / compilation errors so the caller can surface them. + */ + compile: (args: { + id: string + code: string + }) => Promise + /** + * Invalidate cached binding/export info for a file. Call from your dev + * file-watcher when a file changes so the next compile picks up changes. + */ + invalidate: (id: string) => void + /** + * Read-only registry of server functions discovered so far. Empty unless + * `onServerFn` is provided in options to populate something — Metro builds + * standalone, so cross-environment sharing is not needed. + */ + getServerFns: () => Readonly> +} + +/** + * Create a TanStack Start compiler configured for Metro / React Native. + * + * Unlike the Vite and Rsbuild adapters, this is **client-only**: Metro bundles + * the RN client app, while the TanStack Start server is a separate deployment + * (typically a Vite or Rsbuild Start build). The two builds agree on server + * function IDs because `generateFunctionId` is deterministic given the same + * source tree and root. + * + * Server function call sites in the bundled client are rewritten to RPC stubs + * that fetch from the deployed server. The handler bodies are discarded — no + * provider files are extracted (Metro has no virtual-module/query-string + * support for that). + * + * The slow-path import resolution falls back to `require.resolve`. Direct + * imports from `@tanstack/-start` (the recommended pattern) hit the + * fast path and never invoke the resolver — so the limitation only bites when + * `createServerFn` is re-exported through user-defined utility modules with + * non-standard resolution. + */ +export function createMetroCompiler( + opts: CreateMetroCompilerOptions, +): MetroCompilerHandle { + let compiler: StartCompiler | undefined + const serverFnsById: Record = {} + + const codeFilters = getTransformCodeFilterForEnv('client', { + compilerTransforms: opts.compilerTransforms, + }) + + // Resolver anchored at the project root for bare imports (e.g. + // `@tanstack/react-start`). For relative imports, we re-create the require + // anchored at the importer. + const baseRequire = createRequire(opts.root + '/__tsr_metro_resolver__') + + const ensureCompiler = (): StartCompiler => { + if (compiler) return compiler + + compiler = createStartCompiler({ + env: 'client', + envName: METRO_ENV_NAME, + root: opts.root, + mode: 'build', + framework: opts.framework, + providerEnvName: METRO_ENV_NAME, + generateFunctionId: opts.generateFunctionId, + compilerTransforms: opts.compilerTransforms, + serverFnProviderModuleDirectives: undefined, + onServerFnsById: (discovered) => { + for (const [id, fn] of Object.entries(discovered)) { + serverFnsById[id] = fn + } + }, + getKnownServerFns: () => serverFnsById, + encodeModuleSpecifierInDev: undefined, + loadModule: async (moduleId: string) => { + const cleanedId = cleanId(moduleId) + const code = await fs.readFile(cleanedId, 'utf8') + compiler!.ingestModule({ code, id: cleanedId }) + }, + resolveId: (source: string, importer?: string) => { + try { + const req = importer ? createRequire(importer) : baseRequire + return Promise.resolve(cleanId(req.resolve(source))) + } catch { + return Promise.resolve(null) + } + }, + }) + + return compiler + } + + return { + async compile({ id, code }) { + if (!matchesCodeFilters(code, codeFilters)) return null + const c = ensureCompiler() + const detectedKinds = detectKindsInCode(code, 'client', { + compilerTransforms: opts.compilerTransforms, + }) + const result = await c.compile({ id, code, detectedKinds }) + if (!result) return null + return { code: result.code, map: result.map ?? undefined } + }, + invalidate(id: string) { + compiler?.invalidateModule(id) + }, + getServerFns() { + return serverFnsById + }, + } +} diff --git a/packages/start-plugin-core/src/metro/transformer-impl.ts b/packages/start-plugin-core/src/metro/transformer-impl.ts new file mode 100644 index 0000000000..1f2b54304f --- /dev/null +++ b/packages/start-plugin-core/src/metro/transformer-impl.ts @@ -0,0 +1,81 @@ +import { createMetroCompiler } from './start-compiler-host' +import type { + CreateMetroCompilerOptions, + MetroCompilerHandle, +} from './start-compiler-host' + +/** + * The shape of the original Metro Babel transformer that we wrap. + * We don't strictly type Metro's args/result here — different Metro versions + * disagree on details, and we just pass them straight through after rewriting + * `args.src`. + */ +interface OriginalTransformer { + transform: (args: TransformArgs) => Promise | unknown +} + +interface TransformArgs { + filename: string + src: string + options?: Record + plugins?: Array +} + +export interface TransformerImplOptions extends CreateMetroCompilerOptions { + originalTransformerPath?: string + /** + * If provided, replaces references to `process.env.TSS_SERVER_FN_BASE` and + * `import.meta.env.TSS_SERVER_FN_BASE` in transformed source so client RPC + * stubs know where to send requests. + */ + serverFnBase?: string +} + +const SERVER_FN_BASE_PATTERN = + /(?:process\.env|import\.meta\.env)\.TSS_SERVER_FN_BASE/g + +export function createCompilerHandle( + options: TransformerImplOptions, +): MetroCompilerHandle { + return createMetroCompiler({ + framework: options.framework, + root: options.root, + generateFunctionId: options.generateFunctionId, + compilerTransforms: options.compilerTransforms, + }) +} + +export async function runTransform(input: { + args: TransformArgs + compiler: MetroCompilerHandle + originalTransformer: OriginalTransformer + options: TransformerImplOptions +}): Promise { + const { args, compiler, originalTransformer, options } = input + + let src = args.src + let mutated = false + + const compiled = await compiler.compile({ id: args.filename, code: src }) + if (compiled) { + src = compiled.code + mutated = true + } + + if (options.serverFnBase) { + const replaced = src.replace( + SERVER_FN_BASE_PATTERN, + JSON.stringify(options.serverFnBase), + ) + if (replaced !== src) { + src = replaced + mutated = true + } + } + + if (!mutated) { + return originalTransformer.transform(args) + } + + return originalTransformer.transform({ ...args, src }) +} diff --git a/packages/start-plugin-core/src/metro/transformer.cjs b/packages/start-plugin-core/src/metro/transformer.cjs new file mode 100644 index 0000000000..6ffbd5a4e7 --- /dev/null +++ b/packages/start-plugin-core/src/metro/transformer.cjs @@ -0,0 +1,162 @@ +'use strict' + +// Metro entry point for the TanStack Start compiler. +// +// Metro loads `transformer.babelTransformerPath` synchronously via require() +// in EACH worker process. That means module-level state set by `setup()` +// in the main process doesn't propagate to workers. We pass options +// through `process.env.TSR_START_METRO_OPTIONS` (a JSON string) which IS +// inherited by Metro's jest-worker children. `setup()` writes it; this +// transformer reads it lazily on the first transform call. +// +// The actual compile logic lives in the ESM sibling and is loaded via +// dynamic import on first call. + +const ENV_KEY = 'TSR_START_METRO_OPTIONS' + +/** + * @typedef {import('./transformer-impl.js').TransformerImplOptions} TransformerOptions + * @typedef {ReturnType} MetroCompilerHandle + * @typedef {{ + * filename: string + * src: string + * options?: Record + * plugins?: Array + * }} TransformArgs + * @typedef {{ transform: (args: TransformArgs) => Promise | unknown }} OriginalTransformer + * @typedef {{ + * createCompilerHandle: (options: TransformerOptions) => MetroCompilerHandle + * runTransform: (input: { + * args: TransformArgs + * compiler: MetroCompilerHandle + * originalTransformer: OriginalTransformer + * options: TransformerOptions + * }) => Promise + * }} TransformerImpl + */ + +/** @type {Promise | null} */ +let _ready = null +/** @type {OriginalTransformer | null} */ +let _originalTransformer = null +/** @type {TransformerOptions | null} */ +let _options = null +/** @type {TransformerImpl | null} */ +let _impl = null +/** @type {MetroCompilerHandle | null} */ +let _compilerHandle = null + +/** + * @param {unknown} value + * @returns {value is Record} + */ +function isRecord(value) { + return value !== null && typeof value === 'object' +} + +/** @returns {TransformerOptions} */ +function readOptionsFromEnv() { + const raw = process.env[ENV_KEY] + if (!raw) { + throw new Error( + `[@tanstack/start-plugin-core/metro] transformer.cjs was loaded by Metro but ${ENV_KEY} is unset. Did you wrap your config with \`withTanStackStart()\`?`, + ) + } + /** @type {unknown} */ + let parsed + try { + parsed = JSON.parse(raw) + } catch (err) { + const message = err instanceof Error ? err.message : String(err) + throw new Error( + `[@tanstack/start-plugin-core/metro] could not parse ${ENV_KEY} as JSON: ${message}`, + ) + } + if (!isRecord(parsed)) { + throw new Error( + `[@tanstack/start-plugin-core/metro] ${ENV_KEY} must be a JSON object.`, + ) + } + if (typeof parsed.root !== 'string' || !parsed.root) { + throw new Error( + `[@tanstack/start-plugin-core/metro] ${ENV_KEY}.root is required.`, + ) + } + if ( + parsed.framework !== 'react' && + parsed.framework !== 'solid' && + parsed.framework !== 'vue' + ) { + throw new Error( + `[@tanstack/start-plugin-core/metro] ${ENV_KEY}.framework is required ('react' | 'solid' | 'vue').`, + ) + } + return /** @type {TransformerOptions} */ (/** @type {unknown} */ (parsed)) +} + +/** @returns {Promise} */ +function init() { + if (_ready) return _ready + _ready = (async () => { + const options = readOptionsFromEnv() + _options = options + const originalPath = + options.originalTransformerPath || + require.resolve('@react-native/metro-babel-transformer') + _originalTransformer = /** @type {OriginalTransformer} */ ( + require(originalPath) + ) + _impl = /** @type {TransformerImpl} */ ( + await import('./transformer-impl.js') + ) + _compilerHandle = _impl.createCompilerHandle(options) + })() + return _ready +} + +// Called by `withTanStackStart()` in the user's metro.config.js. Stores +// options into process.env so Metro worker processes can read them on +// first transform call. +/** @param {Partial | null | undefined} options */ +function setup(options) { + if (!options || typeof options !== 'object') { + throw new Error( + '[@tanstack/start-plugin-core/metro] setup() requires an options object.', + ) + } + if (!options.root) { + throw new Error( + '[@tanstack/start-plugin-core/metro] setup() options.root is required.', + ) + } + if (!options.framework) { + throw new Error( + '[@tanstack/start-plugin-core/metro] setup() options.framework is required.', + ) + } + process.env[ENV_KEY] = JSON.stringify(options) +} + +/** @param {TransformArgs} args */ +async function transform(args) { + await init() + const impl = _impl + const compilerHandle = _compilerHandle + const originalTransformer = _originalTransformer + const options = _options + + if (!impl || !compilerHandle || !originalTransformer || !options) { + throw new Error( + '[@tanstack/start-plugin-core/metro] transformer failed to initialize.', + ) + } + + return impl.runTransform({ + args, + compiler: compilerHandle, + originalTransformer, + options, + }) +} + +module.exports = { setup, transform } diff --git a/packages/start-plugin-core/vite.config.ts b/packages/start-plugin-core/vite.config.ts index 5f52ed13b3..65c8c14817 100644 --- a/packages/start-plugin-core/vite.config.ts +++ b/packages/start-plugin-core/vite.config.ts @@ -1,5 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/vite-config' +import { copyFilesPlugin } from '@tanstack/router-utils' import packageJson from './package.json' const config = defineConfig({ @@ -9,6 +10,13 @@ const config = defineConfig({ watch: false, typecheck: { enabled: true }, }, + plugins: [ + copyFilesPlugin({ + pattern: ['*.cjs'], + fromDir: 'src/metro', + toDir: 'dist/esm/metro', + }), + ], }) export default mergeConfig( @@ -21,6 +29,8 @@ export default mergeConfig( './src/vite/index.ts', './src/rsbuild/index.ts', './src/rsbuild/types.ts', + './src/metro/index.ts', + './src/metro/transformer-impl.ts', ], srcDir: './src', outDir: './dist', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3636c5faf5..4e95338d1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,8 @@ overrides: react-dom: ^19.2.3 '@types/react': ^19.2.8 '@types/react-dom': ^19.2.3 + tanstack-router-react-native-example>react: 19.1.0 + tanstack-router-react-native-example>@types/react: ~19.1.0 eslint: ^9.22.0 vite: ^8.0.0 '@types/node': 25.0.9 @@ -23,6 +25,7 @@ overrides: '@tanstack/history': workspace:* '@tanstack/router-core': workspace:* '@tanstack/react-router': workspace:* + '@tanstack/react-native-router': workspace:* '@tanstack/router-cli': workspace:* '@tanstack/router-devtools': workspace:* '@tanstack/router-devtools-core': workspace:^ @@ -232,7 +235,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.25(typescript@6.0.2)) @@ -290,7 +293,7 @@ importers: version: 28.0.0 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.25(typescript@6.0.2)) @@ -348,7 +351,7 @@ importers: version: 5.2.0(tinybench@2.9.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.4) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.25(typescript@6.0.2)) @@ -442,7 +445,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -485,7 +488,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -580,7 +583,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -629,7 +632,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -678,7 +681,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -733,7 +736,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -779,7 +782,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ~5.9.0 version: 5.9.3 @@ -834,7 +837,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -886,7 +889,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -920,7 +923,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -966,7 +969,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -1012,7 +1015,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -1061,7 +1064,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -1248,7 +1251,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -1300,7 +1303,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) vite: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -1349,7 +1352,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -1422,7 +1425,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -1498,7 +1501,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -1553,7 +1556,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -1626,7 +1629,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -1724,7 +1727,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -1816,7 +1819,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -1859,7 +1862,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -1926,7 +1929,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) cross-env: specifier: ^10.0.0 version: 10.0.0 @@ -2039,7 +2042,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -2091,7 +2094,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) node-forge: specifier: ^1.3.1 version: 1.3.1 @@ -2131,7 +2134,7 @@ importers: version: 1.6.0 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) autocannon: specifier: ^8.0.0 version: 8.0.0 @@ -2192,7 +2195,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2244,7 +2247,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2299,7 +2302,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2403,7 +2406,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2458,7 +2461,7 @@ importers: version: 8.44.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-rsc': specifier: ^0.5.20 version: 0.5.20(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -2519,7 +2522,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-rsc': specifier: ^0.5.20 version: 0.5.20(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -2586,7 +2589,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -2641,7 +2644,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2693,7 +2696,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2775,7 +2778,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -2827,7 +2830,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2900,7 +2903,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -2952,7 +2955,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3041,7 +3044,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3084,7 +3087,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -3133,7 +3136,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -3222,7 +3225,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3286,7 +3289,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3347,7 +3350,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -6833,6 +6836,217 @@ importers: specifier: ^6.0.2 version: 6.0.2 + examples/react-native/_start-server: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@tanstack/router-cli': + specifier: workspace:* + version: link:../../../packages/router-cli + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.7.0(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^8.0.0 + version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) + + examples/react-native/bare: + dependencies: + '@tanstack/react-native-router': + specifier: workspace:* + version: link:../../../packages/react-native-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + '@tanstack/router-core': + specifier: workspace:* + version: link:../../../packages/router-core + react: + specifier: ^19.2.3 + version: 19.2.3 + react-native: + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-gesture-handler: + specifier: ~2.28.0 + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: + specifier: ~5.6.2 + version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-screens: + specifier: ~4.16.0 + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-url-polyfill: + specifier: ^3.0.0 + version: 3.0.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + devDependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.29.0 + '@babel/preset-env': + specifier: ^7.25.3 + version: 7.29.3(@babel/core@7.29.0) + '@babel/runtime': + specifier: ^7.25.0 + version: 7.26.7 + '@react-native-community/cli': + specifier: 20.0.2 + version: 20.0.2(typescript@5.9.3) + '@react-native-community/cli-platform-android': + specifier: 20.0.2 + version: 20.0.2 + '@react-native-community/cli-platform-ios': + specifier: 20.0.2 + version: 20.0.2 + '@react-native/babel-preset': + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0) + '@react-native/metro-config': + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0) + '@react-native/typescript-config': + specifier: 0.81.5 + version: 0.81.5 + '@tanstack/router-cli': + specifier: workspace:* + version: link:../../../packages/router-cli + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + examples/react-native/expo-dev-client: + dependencies: + '@tanstack/react-native-router': + specifier: workspace:* + version: link:../../../packages/react-native-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + '@tanstack/router-core': + specifier: workspace:* + version: link:../../../packages/router-core + expo: + specifier: ~54.0.0 + version: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + expo-status-bar: + specifier: ~3.0.9 + version: 3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react: + specifier: ^19.2.3 + version: 19.2.3 + react-native: + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-gesture-handler: + specifier: ~2.28.0 + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: + specifier: ~5.6.2 + version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-screens: + specifier: ~4.16.0 + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-url-polyfill: + specifier: ^3.0.0 + version: 3.0.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + react-native-web: + specifier: ^0.21.2 + version: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + devDependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.29.0 + '@babel/runtime': + specifier: ^7.25.0 + version: 7.26.7 + '@tanstack/router-cli': + specifier: workspace:* + version: link:../../../packages/router-cli + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + examples/react-native/expo-go: + dependencies: + '@tanstack/react-native-router': + specifier: workspace:* + version: link:../../../packages/react-native-router + '@tanstack/router-core': + specifier: workspace:* + version: link:../../../packages/router-core + expo: + specifier: ~54.0.0 + version: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + expo-status-bar: + specifier: ~3.0.9 + version: 3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react: + specifier: ^19.2.3 + version: 19.2.3 + react-native: + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-gesture-handler: + specifier: ~2.28.0 + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: + specifier: ~5.6.2 + version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-screens: + specifier: ~4.16.0 + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-url-polyfill: + specifier: ^3.0.0 + version: 3.0.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + devDependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.29.0 + '@babel/runtime': + specifier: ^7.25.0 + version: 7.26.7 + '@tanstack/router-cli': + specifier: workspace:* + version: link:../../../packages/router-cli + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + examples/react/authenticated-routes: dependencies: '@tailwindcss/vite': @@ -6871,7 +7085,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -6923,7 +7137,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -6963,7 +7177,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7009,7 +7223,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7052,7 +7266,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7098,7 +7312,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7138,7 +7352,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7184,7 +7398,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7236,7 +7450,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7285,7 +7499,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7334,7 +7548,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7383,7 +7597,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7432,7 +7646,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7475,7 +7689,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7518,7 +7732,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7564,7 +7778,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7613,7 +7827,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7665,7 +7879,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7720,7 +7934,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7769,7 +7983,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7815,7 +8029,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7858,7 +8072,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7895,7 +8109,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -7975,7 +8189,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8113,7 +8327,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8156,7 +8370,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -8196,7 +8410,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8221,7 +8435,7 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8267,7 +8481,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8310,7 +8524,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8353,7 +8567,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8393,7 +8607,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -8430,7 +8644,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8473,7 +8687,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8513,7 +8727,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -8547,7 +8761,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8590,7 +8804,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8633,7 +8847,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8700,7 +8914,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8740,7 +8954,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -8786,7 +9000,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -8847,7 +9061,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -8905,7 +9119,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -8951,7 +9165,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9012,7 +9226,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9039,7 +9253,7 @@ importers: version: link:../../../packages/start-static-server-functions '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) react: specifier: ^19.2.3 version: 19.2.3 @@ -9131,7 +9345,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) jsdom: specifier: ^27.0.0 version: 27.0.0(postcss@8.5.8) @@ -9167,7 +9381,7 @@ importers: version: link:../../../packages/react-start '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) react: specifier: ^19.2.3 version: 19.2.3 @@ -9274,7 +9488,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9314,7 +9528,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9360,7 +9574,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9415,7 +9629,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9473,7 +9687,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9525,7 +9739,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-rsc': specifier: ^0.5.20 version: 0.5.20(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -9574,7 +9788,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9620,7 +9834,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9669,7 +9883,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9739,7 +9953,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9782,7 +9996,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9828,7 +10042,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9874,7 +10088,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)) typescript: specifier: ^6.0.2 version: 6.0.2 @@ -9932,7 +10146,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -9999,7 +10213,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -12313,6 +12527,43 @@ importers: specifier: ^8.0.0 version: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) + packages/react-native-router: + dependencies: + '@tanstack/history': + specifier: workspace:* + version: link:../history + '@tanstack/react-store': + specifier: ^0.9.1 + version: 0.9.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': + specifier: workspace:* + version: link:../router-core + react: + specifier: ^19.2.3 + version: 19.2.3 + react-native: + specifier: '>=0.72.0' + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-gesture-handler: + specifier: '>=2.0.0' + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react-native-screens: + specifier: '>=3.0.0' + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + tiny-warning: + specifier: ^1.0.3 + version: 1.0.3 + devDependencies: + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-native': + specifier: ^0.72.0 + version: 0.72.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + packages/react-router: dependencies: '@tanstack/history': @@ -13514,6 +13765,14 @@ importers: packages: + '@0no-co/graphql.web@1.2.0': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + '@adobe/css-tools@4.4.1': resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} @@ -13568,6 +13827,9 @@ packages: nodemailer: optional: true + '@babel/code-frame@7.10.4': + resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -13576,14 +13838,14 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.5': resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} @@ -13630,6 +13892,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -13678,8 +13951,8 @@ packages: resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -13706,6 +13979,10 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} @@ -13714,6 +13991,10 @@ packages: resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -13724,6 +14005,42 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3': + resolution: {integrity: sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/plugin-proposal-decorators@7.28.0': resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} engines: {node: '>=6.9.0'} @@ -13736,6 +14053,39 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-export-default-from@7.27.1': + resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.27.1': resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} @@ -13748,12 +14098,99 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-default-from@7.28.6': + resolution: {integrity: sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.28.6': + resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.27.1': resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} @@ -13766,6 +14203,42 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.27.1': resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} @@ -13778,12 +14251,228 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.27.1': resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -13808,6 +14497,72 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.29.0': + resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.27.1': resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} @@ -13826,6 +14581,47 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.29.3': + resolution: {integrity: sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.27.1': resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} @@ -14201,6 +14997,10 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@egjs/hammerjs@2.0.17': + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + '@electric-sql/pglite-socket@0.0.6': resolution: {integrity: sha512-6RjmgzphIHIBA4NrMGJsjNWK4pu+bCWJlEWlwcxFTVY3WT86dFpKwbZaGWZV6C5Rd7sCk1Z0CI76QEfukLAUXw==} hasBin: true @@ -15154,6 +15954,119 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@expo/cli@54.0.24': + resolution: {integrity: sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==} + hasBin: true + peerDependencies: + expo: '*' + expo-router: '*' + react-native: '*' + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true + + '@expo/code-signing-certificates@0.0.6': + resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} + + '@expo/config-plugins@54.0.4': + resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==} + + '@expo/config-types@54.0.10': + resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} + + '@expo/config@12.0.13': + resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} + + '@expo/devcert@1.2.1': + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} + + '@expo/devtools@0.1.8': + resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + + '@expo/env@2.0.11': + resolution: {integrity: sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==} + + '@expo/fingerprint@0.15.5': + resolution: {integrity: sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==} + hasBin: true + + '@expo/image-utils@0.8.13': + resolution: {integrity: sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA==} + + '@expo/json-file@10.0.13': + resolution: {integrity: sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==} + + '@expo/metro-config@54.0.15': + resolution: {integrity: sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==} + peerDependencies: + expo: '*' + peerDependenciesMeta: + expo: + optional: true + + '@expo/metro@54.2.0': + resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==} + + '@expo/osascript@2.4.2': + resolution: {integrity: sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==} + engines: {node: '>=12'} + + '@expo/package-manager@1.10.4': + resolution: {integrity: sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ==} + + '@expo/plist@0.4.8': + resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} + + '@expo/prebuild-config@54.0.8': + resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==} + peerDependencies: + expo: '*' + + '@expo/require-utils@55.0.4': + resolution: {integrity: sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA==} + peerDependencies: + typescript: ^5.0.0 || ^5.0.0-0 + peerDependenciesMeta: + typescript: + optional: true + + '@expo/schema-utils@0.1.8': + resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==} + + '@expo/sdk-runtime-versions@1.0.0': + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + + '@expo/spawn-async@1.7.2': + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + + '@expo/sudo-prompt@9.3.2': + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + + '@expo/vector-icons@15.1.1': + resolution: {integrity: sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==} + peerDependencies: + expo-font: '>=14.0.4' + react: ^19.2.3 + react-native: '*' + + '@expo/ws-tunnel@1.0.6': + resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} + + '@expo/xcpretty@4.4.3': + resolution: {integrity: sha512-wC562eD3gS6vO2tWHToFhlFnmHKfKHgF1oyvojeSkLK/ZYop1bMU+7cOMiF9Sq70CzcsLy/EMRy/uRc76QmNRw==} + hasBin: true + '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} @@ -15415,6 +16328,12 @@ packages: engines: {node: '>=6'} hasBin: true + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} @@ -15767,18 +16686,54 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + engines: {node: '>=8'} + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/get-type@30.0.1': resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.5': resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -17605,6 +18560,127 @@ packages: '@types/react-dom': optional: true + '@react-native-community/cli-clean@20.0.2': + resolution: {integrity: sha512-hfbC69fTD0fqZCCep8aqnVztBXUhAckNhi76lEV7USENtgBRwNq2s1wATgKAzOhxKuAL9TEkf5TZ/Dhp/YLhCQ==} + + '@react-native-community/cli-config-android@20.0.2': + resolution: {integrity: sha512-5yZ2Grr89omnMptV36ilV4EIrRLrIYQAsTTVU/hNI2vL7lz6WB8rPhP5QuovXk3TIjl1Wz2r9A6ZNO2SNJ8nig==} + + '@react-native-community/cli-config-apple@20.0.2': + resolution: {integrity: sha512-6MLL9Duu/JytqI6XfYuc78LSkRGfJoCqTSfqTJzBNSnz6S7XJps9spGBlgvrGh/j0howBpQlFH0J8Ws4N4mCxA==} + + '@react-native-community/cli-config@20.0.2': + resolution: {integrity: sha512-OuSAyqTv0MBbRqSyO+80IKasHnwLESydZBTrLjIGwGhDokMH07mZo8Io2H8X300WWa57LC2L8vQf73TzGS3ikQ==} + + '@react-native-community/cli-doctor@20.0.2': + resolution: {integrity: sha512-PQ8BdoNDE2OaMGLH66HZE7FV4qj0iWBHi0lkPUTb8eJJ+vlvzUtBf0N9QSv2TAzFjA59a2FElk6jBWnDC/ql1A==} + + '@react-native-community/cli-platform-android@20.0.2': + resolution: {integrity: sha512-Wo2AIkdv3PMEMT4k7QiNm3smNpWK6rd+glVH4Nm6Hco1EgLQ4I9x+gwcS1yN53UHYtq9YnguDCXk2L8duUESDQ==} + + '@react-native-community/cli-platform-apple@20.0.2': + resolution: {integrity: sha512-PdsQVFLY+wGnAN1kZ38XzzWiUlqaG1cXdpkQ1rYaiiNu3PVTc2/KtteLcPG/wbApbfoPggQ/ffh+JGg7NL+HNw==} + + '@react-native-community/cli-platform-ios@20.0.2': + resolution: {integrity: sha512-bVOqLsBztT+xVV65uztJ7R/dtjj4vaPXJU1RLi35zLtr1APAxzf+2ydiixxtBjNFylM3AZlF8iL5WXjeWVqrmA==} + + '@react-native-community/cli-server-api@20.0.2': + resolution: {integrity: sha512-u4tUzWnc+qthaDvd1NxdCqCNMY7Px6dAH1ODAXMtt+N27llGMJOl0J3slMx03dScftOWbGM61KA5cCpaxphYVQ==} + + '@react-native-community/cli-tools@20.0.2': + resolution: {integrity: sha512-bPYhRYggW9IIM8pvrZF/0r6HaxCyEWDn6zfPQPMWlkQUwkzFZ8GBY/M7yiHgDzozWKPT4DqZPumrq806Vcksow==} + + '@react-native-community/cli-types@20.0.2': + resolution: {integrity: sha512-OZzy6U4M8Szg8iiF459OoTjRKggxLrdhZVHKfRhrAUfojhjRiWbJNkkPxJtOIPeNSgsB0heizgpE4QwCgnYeuQ==} + + '@react-native-community/cli@20.0.2': + resolution: {integrity: sha512-ocgRFKRLX8b5rEK38SJfpr0AMl6SqseWljk6c5LxCG/zpCfPPNQdXq1OsDvmEwsqO4OEQ6tmOaSm9OgTm6FhbQ==} + engines: {node: '>=20.19.4'} + hasBin: true + + '@react-native/assets-registry@0.81.5': + resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-plugin-codegen@0.81.5': + resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-preset@0.81.5': + resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.81.5': + resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.81.5': + resolution: {integrity: sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': '*' + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.81.5': + resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==} + engines: {node: '>= 20.19.4'} + + '@react-native/dev-middleware@0.81.5': + resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==} + engines: {node: '>= 20.19.4'} + + '@react-native/gradle-plugin@0.81.5': + resolution: {integrity: sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==} + engines: {node: '>= 20.19.4'} + + '@react-native/js-polyfills@0.81.5': + resolution: {integrity: sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==} + engines: {node: '>= 20.19.4'} + + '@react-native/metro-babel-transformer@0.81.5': + resolution: {integrity: sha512-Vwm6gJ3VlP+QKAEU98v1dwZKqbUcIYP47K614SktA9dYDOtw+rEBjyzvNf69S4YG5JRvDmzw36E9zxtcg6ABOw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/metro-config@0.81.5': + resolution: {integrity: sha512-3Q0jQt5Zcen4+udkE0XQIS8VmI+vx3sWl5R2o36vHkg8eXpiQjvz/jY0sZmC8ahailiEWEscFklQzhTmizhdPQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/normalize-colors@0.74.89': + resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} + + '@react-native/normalize-colors@0.81.5': + resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==} + + '@react-native/typescript-config@0.81.5': + resolution: {integrity: sha512-NeCecPmlW+fcwFKzDzT1GcEQmJSE6tLz9Fg6wGjKL1l7pqUzpQIQg1iF3OovHOlyfPiB98+XRHnIBvlTSJ5R0w==} + + '@react-native/virtualized-lists@0.72.8': + resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} + peerDependencies: + react-native: '*' + + '@react-native/virtualized-lists@0.81.5': + resolution: {integrity: sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@types/react': ^19.2.8 + react: ^19.2.3 + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.15': resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18371,6 +19447,15 @@ packages: pinia: optional: true + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@simplewebauthn/browser@13.2.2': resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} @@ -18378,6 +19463,9 @@ packages: resolution: {integrity: sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==} engines: {node: '>=20.0.0'} + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sinclair/typebox@0.31.28': resolution: {integrity: sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==} @@ -18396,6 +19484,12 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} @@ -19123,6 +20217,12 @@ packages: '@types/express@5.0.3': resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} @@ -19132,6 +20232,15 @@ packages: '@types/http-proxy@1.17.15': resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-cookie@3.0.6': resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} @@ -19179,6 +20288,9 @@ packages: peerDependencies: '@types/react': ^19.2.8 + '@types/react-native@0.72.8': + resolution: {integrity: sha512-St6xA7+EoHN5mEYfdWnfYt0e8u6k2FR0P9s2arYgakQGFgU1f9FlPrIEcj0X24pLCF5c5i3WVuLCUdiCYHmOoA==} + '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: @@ -19205,6 +20317,9 @@ packages: '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} @@ -19432,6 +20547,9 @@ packages: resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -19527,6 +20645,14 @@ packages: cpu: [x64] os: [win32] + '@urql/core@5.2.0': + resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} + + '@urql/exchange-retry@1.3.2': + resolution: {integrity: sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==} + peerDependencies: + '@urql/core': ^5.0.0 + '@vercel/nft@0.29.4': resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} engines: {node: '>=18'} @@ -19664,6 +20790,9 @@ packages: '@volar/typescript@2.4.26': resolution: {integrity: sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==} + '@vscode/sudo-prompt@9.3.2': + resolution: {integrity: sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==} + '@vue/babel-helper-vue-transform-on@1.5.0': resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} @@ -19865,6 +20994,14 @@ packages: react: ^19.2.3 react-dom: ^19.2.3 + '@xmldom/xmldom@0.8.13': + resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} + engines: {node: '>=10.0.0'} + + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -19993,6 +21130,9 @@ packages: alien-signals@3.1.1: resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -20005,11 +21145,18 @@ packages: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} + ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} + ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -20018,6 +21165,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -20041,6 +21192,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -20049,6 +21203,9 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -20086,6 +21243,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1js@3.0.6: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} @@ -20094,6 +21254,13 @@ packages: resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} engines: {node: '>=18'} + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -20137,6 +21304,12 @@ packages: babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + babel-loader@10.0.0: resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} @@ -20144,6 +21317,14 @@ packages: '@babel/core': ^7.12.0 webpack: '>=5.61.0' + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jsx-dom-expressions@0.40.3: resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} peerDependencies: @@ -20153,9 +21334,64 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + babel-plugin-react-native-web@0.21.2: + resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} + + babel-plugin-syntax-hermes-parser@0.29.1: + resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + babel-plugin-vue-jsx-hmr@1.0.0: resolution: {integrity: sha512-XRq+XTD4bub6HkavELMhihvLX2++JkSBAxRXlqQK32b+Tb0S9PEqxrDSMpOEZ1iGyOaJZj9Y0uU/FzICdyL9MA==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-expo@54.0.10: + resolution: {integrity: sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==} + peerDependencies: + '@babel/runtime': ^7.20.0 + expo: '*' + react-refresh: '>=0.14.0 <1.0.0' + peerDependenciesMeta: + '@babel/runtime': + optional: true + expo: + optional: true + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + babel-preset-solid@1.9.10: resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} peerDependencies: @@ -20223,6 +21459,10 @@ packages: better-call@1.0.19: resolution: {integrity: sha512-sI3GcA1SCVa3H+CDHl8W8qzhlrckwXOTKhqq3OOPXjgn5aTOMIqGY34zLY/pHA6tRRMjTUC3lz5Mi7EbDA24Kw==} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -20230,6 +21470,10 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -20260,6 +21504,17 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bplist-creator@0.1.0: + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + + bplist-parser@0.3.1: + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + + bplist-parser@0.3.2: + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -20284,6 +21539,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-builder@0.2.0: resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} @@ -20357,6 +21615,14 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001696: resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} @@ -20367,6 +21633,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -20415,10 +21685,25 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + chromium-edge-launcher@0.2.0: + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -20432,6 +21717,10 @@ packages: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -20457,6 +21746,9 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -20480,6 +21772,9 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -20488,6 +21783,9 @@ packages: resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} engines: {node: '>=14.6'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -20507,6 +21805,9 @@ packages: resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} engines: {node: '>=18'} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -20520,6 +21821,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -20535,10 +21839,22 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + comment-json@4.2.5: resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} @@ -20604,6 +21920,10 @@ packages: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -20725,6 +22045,9 @@ packages: resolution: {integrity: sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==} engines: {node: '>=18'} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js@3.40.0: resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} @@ -20769,6 +22092,9 @@ packages: engines: {node: '>=20'} hasBin: true + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -20792,6 +22118,9 @@ packages: srvx: optional: true + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-loader@7.1.2: resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} engines: {node: '>= 18.12.0'} @@ -20870,6 +22199,9 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + db0@0.3.4: resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} peerDependencies: @@ -20924,6 +22256,10 @@ packages: decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} @@ -20947,6 +22283,10 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -21264,6 +22604,10 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} + env-editor@0.4.2: + resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} + engines: {node: '>=8'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -21308,6 +22652,13 @@ packages: error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + errorhandler@1.5.2: + resolution: {integrity: sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==} + engines: {node: '>= 0.8'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -21396,6 +22747,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -21637,6 +22992,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -21645,6 +23004,78 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + expo-asset@12.0.13: + resolution: {integrity: sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ==} + peerDependencies: + expo: '*' + react: ^19.2.3 + react-native: '*' + + expo-constants@18.0.13: + resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-file-system@19.0.22: + resolution: {integrity: sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-font@14.0.11: + resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==} + peerDependencies: + expo: '*' + react: ^19.2.3 + react-native: '*' + + expo-keep-awake@15.0.8: + resolution: {integrity: sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==} + peerDependencies: + expo: '*' + react: ^19.2.3 + + expo-modules-autolinking@3.0.25: + resolution: {integrity: sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==} + hasBin: true + + expo-modules-core@3.0.30: + resolution: {integrity: sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + expo-server@1.0.6: + resolution: {integrity: sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA==} + engines: {node: '>=20.16.0'} + + expo-status-bar@3.0.9: + resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + expo@54.0.34: + resolution: {integrity: sha512-XkVHguZZDC8BcTQxHAd14/TQFbDp1Wt0Z/KApO9t68Ll5A127hLCPzU+a9gytfCIiyL/V1IpF1vIcOLKEVAoNQ==} + hasBin: true + peerDependencies: + '@expo/dom-webview': '*' + '@expo/metro-runtime': '*' + react: ^19.2.3 + react-native: '*' + react-native-webview: '*' + peerDependenciesMeta: + '@expo/dom-webview': + optional: true + '@expo/metro-runtime': + optional: true + react-native-webview: + optional: true + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} @@ -21705,6 +23136,10 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-xml-parser@4.5.6: + resolution: {integrity: sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -21719,6 +23154,15 @@ packages: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -21767,6 +23211,10 @@ packages: resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} engines: {node: '>=18'} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -21819,6 +23267,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -21840,6 +23291,9 @@ packages: debug: optional: true + fontfaceobserver@2.3.0: + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -21878,6 +23332,10 @@ packages: react-dom: optional: true + freeport-async@2.0.0: + resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==} + engines: {node: '>=8'} + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -21904,6 +23362,9 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -21943,6 +23404,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} @@ -21961,6 +23426,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -21968,6 +23437,10 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + getenv@2.0.0: + resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} + engines: {node: '>=6'} + giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true @@ -21994,6 +23467,10 @@ packages: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob 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 exorbitant rates) by contacting i@izs.me + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -22099,6 +23576,10 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -22136,6 +23617,24 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + + hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + + hermes-estree@0.35.0: + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + + hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + + hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + + hermes-parser@0.35.0: + resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -22262,6 +23761,10 @@ packages: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -22273,6 +23776,9 @@ packages: hyperid@3.3.0: resolution: {integrity: sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -22308,6 +23814,11 @@ packages: image-meta@0.2.2: resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + image-size@2.0.2: resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} engines: {node: '>=16.x'} @@ -22351,6 +23862,10 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -22363,6 +23878,9 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -22371,6 +23889,9 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ioredis@5.9.2: resolution: {integrity: sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==} engines: {node: '>=12.22.0'} @@ -22442,6 +23963,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -22597,6 +24122,10 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -22626,6 +24155,14 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -22633,10 +24170,49 @@ packages: resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jimp-compact@0.16.1: + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -22644,6 +24220,9 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@6.1.0: resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} @@ -22681,14 +24260,13 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + jsdom@25.0.1: resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} @@ -22779,6 +24357,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -22816,6 +24398,10 @@ packages: engines: {node: '>=8'} hasBin: true + lan-network@0.2.1: + resolution: {integrity: sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==} + hasBin: true + launch-editor@2.9.1: resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} @@ -22844,6 +24430,9 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -22966,6 +24555,9 @@ packages: lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -23002,9 +24594,16 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -23013,6 +24612,10 @@ packages: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} + logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true + long@5.3.1: resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} @@ -23066,6 +24669,9 @@ packages: magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + manage-path@2.0.0: resolution: {integrity: sha512-NJhyB+PJYTpxhxZJ3lecIGgh4kwIY2RAh44XvAz9UlqthlQwtPBf62uBVR8XaD8CRuSjQ6TnZH2lNJkbLPZM2A==} @@ -23092,6 +24698,9 @@ packages: engines: {node: '>= 16'} hasBin: true + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -23114,6 +24723,12 @@ packages: resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} engines: {node: '>= 4.0.0'} + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -23140,6 +24755,122 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + metro-babel-transformer@0.83.3: + resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} + engines: {node: '>=20.19.4'} + + metro-babel-transformer@0.83.7: + resolution: {integrity: sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==} + engines: {node: '>=20.19.4'} + + metro-cache-key@0.83.3: + resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} + engines: {node: '>=20.19.4'} + + metro-cache-key@0.83.7: + resolution: {integrity: sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==} + engines: {node: '>=20.19.4'} + + metro-cache@0.83.3: + resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} + engines: {node: '>=20.19.4'} + + metro-cache@0.83.7: + resolution: {integrity: sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==} + engines: {node: '>=20.19.4'} + + metro-config@0.83.3: + resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} + engines: {node: '>=20.19.4'} + + metro-config@0.83.7: + resolution: {integrity: sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==} + engines: {node: '>=20.19.4'} + + metro-core@0.83.3: + resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} + engines: {node: '>=20.19.4'} + + metro-core@0.83.7: + resolution: {integrity: sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==} + engines: {node: '>=20.19.4'} + + metro-file-map@0.83.3: + resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} + engines: {node: '>=20.19.4'} + + metro-file-map@0.83.7: + resolution: {integrity: sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw==} + engines: {node: '>=20.19.4'} + + metro-minify-terser@0.83.3: + resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} + engines: {node: '>=20.19.4'} + + metro-minify-terser@0.83.7: + resolution: {integrity: sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==} + engines: {node: '>=20.19.4'} + + metro-resolver@0.83.3: + resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} + engines: {node: '>=20.19.4'} + + metro-resolver@0.83.7: + resolution: {integrity: sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==} + engines: {node: '>=20.19.4'} + + metro-runtime@0.83.3: + resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} + engines: {node: '>=20.19.4'} + + metro-runtime@0.83.7: + resolution: {integrity: sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==} + engines: {node: '>=20.19.4'} + + metro-source-map@0.83.3: + resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} + engines: {node: '>=20.19.4'} + + metro-source-map@0.83.7: + resolution: {integrity: sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==} + engines: {node: '>=20.19.4'} + + metro-symbolicate@0.83.3: + resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==} + engines: {node: '>=20.19.4'} + hasBin: true + + metro-symbolicate@0.83.7: + resolution: {integrity: sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==} + engines: {node: '>=20.19.4'} + hasBin: true + + metro-transform-plugins@0.83.3: + resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} + engines: {node: '>=20.19.4'} + + metro-transform-plugins@0.83.7: + resolution: {integrity: sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==} + engines: {node: '>=20.19.4'} + + metro-transform-worker@0.83.3: + resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} + engines: {node: '>=20.19.4'} + + metro-transform-worker@0.83.7: + resolution: {integrity: sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==} + engines: {node: '>=20.19.4'} + + metro@0.83.3: + resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==} + engines: {node: '>=20.19.4'} + hasBin: true + + metro@0.83.7: + resolution: {integrity: sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==} + engines: {node: '>=20.19.4'} + hasBin: true + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -23165,11 +24896,20 @@ packages: engines: {node: '>=4'} hasBin: true + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} hasBin: true + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -23223,12 +24963,12 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true @@ -23324,6 +25064,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nested-error-stacks@2.0.1: + resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} + netlify-redirector@0.5.0: resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} @@ -23424,6 +25167,10 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} @@ -23456,6 +25203,10 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + node-gyp-build@3.9.0: resolution: {integrity: sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==} hasBin: true @@ -23464,6 +25215,9 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} @@ -23503,6 +25257,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -23514,6 +25272,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} @@ -23537,6 +25298,14 @@ packages: oauth4webapi@3.8.3: resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==} + ob1@0.83.3: + resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} + engines: {node: '>=20.19.4'} + + ob1@0.83.7: + resolution: {integrity: sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==} + engines: {node: '>=20.19.4'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -23585,6 +25354,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -23603,6 +25376,10 @@ packages: one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -23615,6 +25392,14 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -23623,10 +25408,18 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@3.4.0: + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} + ora@5.3.0: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -23735,6 +25528,10 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-png@2.1.0: + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -23771,6 +25568,10 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -23877,6 +25678,14 @@ packages: engines: {node: '>=18'} hasBin: true + plist@3.1.1: + resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} + engines: {node: '>=10.4.0'} + + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} @@ -23939,6 +25748,10 @@ packages: peerDependencies: postcss: ^8.2.9 + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -24020,6 +25833,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.0.5: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -24037,6 +25854,10 @@ packages: typescript: optional: true + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -24057,6 +25878,16 @@ packages: promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -24110,6 +25941,10 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} + qrcode-terminal@0.11.0: + resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} + hasBin: true + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -24127,6 +25962,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -24167,11 +26005,24 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-dom@19.2.3: resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: react: ^19.2.3 + react-freeze@1.0.4: + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: ^19.2.3 + react-hot-toast@2.5.1: resolution: {integrity: sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==} engines: {node: '>=10'} @@ -24191,6 +26042,52 @@ packages: react-is@19.0.0: resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + react-native-gesture-handler@2.28.0: + resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + react-native-is-edge-to-edge@1.3.1: + resolution: {integrity: sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + react-native-safe-area-context@5.6.2: + resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + react-native-screens@4.16.0: + resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==} + peerDependencies: + react: ^19.2.3 + react-native: '*' + + react-native-url-polyfill@3.0.0: + resolution: {integrity: sha512-aA5CiuUCUb/lbrliVCJ6lZ17/RpNJzvTO/C7gC/YmDQhTUoRD5q5HlJfwLWcxz4VgAhHwXKzhxH+wUN24tAdqg==} + peerDependencies: + react-native: '*' + + react-native-web@0.21.2: + resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} + peerDependencies: + react: ^19.2.3 + react-dom: ^19.2.3 + + react-native@0.81.5: + resolution: {integrity: sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==} + engines: {node: '>= 20.19.4'} + hasBin: true + peerDependencies: + '@types/react': ^19.2.8 + react: ^19.2.3 + peerDependenciesMeta: + '@types/react': + optional: true + react-pprof@1.4.0: resolution: {integrity: sha512-bYXfxuIVt49+VrmqxUNxjDSbFCUmG85IxH2yc7h5sddlUrVvosOTgOphMvWtBSz39VYZByTBRAE6uKAsHoz0gg==} hasBin: true @@ -24328,6 +26225,16 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -24338,6 +26245,17 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + hasBin: true + reinterval@1.1.0: resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} @@ -24372,9 +26290,16 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + require-package-name@2.0.1: resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + requireg@0.2.2: + resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} + engines: {node: '>= 4.0.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -24393,6 +26318,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-workspace-root@2.0.1: + resolution: {integrity: sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==} + resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -24407,10 +26335,17 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.7.1: + resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} + resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -24437,8 +26372,9 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@6.1.2: @@ -24677,6 +26613,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -24735,6 +26674,10 @@ packages: seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -24767,6 +26710,9 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -24778,6 +26724,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -24842,10 +26791,16 @@ packages: resolution: {integrity: sha512-d3nebH+gVXaEsHEy3juuX2EJ9H3Es6gHJTyz58Vcx33zAoCwWPQiOC0ONsEHOg7ciwZanFH1FEnJFB4OKzWrdw==} engines: {node: '>=0.12.18'} + simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -24861,6 +26816,14 @@ packages: slashes@3.0.12: resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} @@ -24979,9 +26942,20 @@ packages: stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -25015,6 +26989,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-buffers@2.2.0: + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} @@ -25042,6 +27020,10 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -25054,6 +27036,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -25062,6 +27048,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -25069,6 +27059,12 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + structured-headers@0.4.1: + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + style-loader@4.0.0: resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} engines: {node: '>= 18.12.0'} @@ -25078,13 +27074,25 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styleq@0.1.3: + resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@10.0.0: resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} engines: {node: '>=18'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -25093,6 +27101,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + supports-hyperlinks@3.1.0: resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} engines: {node: '>=14.18'} @@ -25160,14 +27172,18 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + terser-webpack-plugin@5.3.11: resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} engines: {node: '>= 10.13.0'} @@ -25205,6 +27221,10 @@ packages: engines: {node: '>=10'} hasBin: true + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -25228,6 +27248,9 @@ packages: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -25235,6 +27258,12 @@ packages: resolution: {integrity: sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==} engines: {node: '>=8'} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -25274,6 +27303,9 @@ packages: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -25355,6 +27387,9 @@ packages: peerDependencies: typescript: '>=4.0.0' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-pattern@5.6.2: resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} @@ -25399,6 +27434,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -25407,6 +27446,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -25487,6 +27530,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -25527,10 +27574,26 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -25953,6 +28016,11 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -26123,6 +28191,9 @@ packages: jsdom: optional: true + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -26182,6 +28253,12 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -26209,6 +28286,10 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -26306,10 +28387,17 @@ packages: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url-without-unicode@8.0.0-3: + resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==} + engines: {node: '>=10'} + whatwg-url@14.1.0: resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} engines: {node: '>=18'} @@ -26329,6 +28417,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -26354,6 +28445,9 @@ packages: resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} engines: {node: '>= 12.0.0'} + wonka@6.3.6: + resolution: {integrity: sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -26388,10 +28482,37 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -26428,6 +28549,10 @@ packages: utf-8-validate: optional: true + xcode@3.0.1: + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -26436,10 +28561,22 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + xmlbuilder2@4.0.3: resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} engines: {node: '>=20.0'} + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -26448,6 +28585,9 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -26471,6 +28611,10 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -26479,6 +28623,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -26547,6 +28695,10 @@ packages: snapshots: + '@0no-co/graphql.web@1.2.0(graphql@16.10.0)': + optionalDependencies: + graphql: 16.10.0 + '@adobe/css-tools@4.4.1': {} '@alloc/quick-lru@5.2.0': {} @@ -26616,6 +28768,10 @@ snapshots: preact: 10.24.3 preact-render-to-string: 6.5.11(preact@10.24.3) + '@babel/code-frame@7.10.4': + dependencies: + '@babel/highlight': 7.25.9 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -26628,10 +28784,10 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.29.3': {} + '@babel/core@7.28.5': dependencies: '@babel/code-frame': 7.27.1 @@ -26694,9 +28850,9 @@ snapshots: '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -26714,9 +28870,9 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -26727,9 +28883,9 @@ snapshots: '@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.27.1(@babel/core@7.28.5) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -26740,9 +28896,22 @@ snapshots: '@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.27.1(@babel/core@7.29.0) + '@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.5 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@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.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -26760,11 +28929,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@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.8(@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.27.1': dependencies: - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -26782,7 +28969,7 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -26797,18 +28984,18 @@ snapshots: '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -26829,21 +29016,21 @@ snapshots: '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.5 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -26858,7 +29045,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -26869,9 +29056,17 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-wrap-function@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 '@babel/types': 7.29.0 '@babel/helpers@7.29.2': @@ -26879,6 +29074,13 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/parser@7.28.5': dependencies: '@babel/types': 7.29.0 @@ -26887,11 +29089,54 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@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-bugfix-v8-spread-parameters-in-optional-chaining@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 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color @@ -26905,6 +29150,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@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.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@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.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.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.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.5)': dependencies: '@babel/core': 7.28.5 @@ -26915,6 +29189,41 @@ snapshots: '@babel/core': 7.29.0 '@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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-flow@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-assertions@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-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.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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -26925,6 +29234,51 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 + '@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.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.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.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.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.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.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.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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -26935,16 +29289,60 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@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.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-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.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 + + '@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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@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.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -26956,45 +29354,278 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-static-block@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-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.29.0 + transitivePeerDependencies: + - supports-color + + '@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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.28.6(@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-duplicate-keys@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-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 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-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-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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.29.0) + + '@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.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.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@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.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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-amd@7.27.1(@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-commonjs@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.27.1 + '@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-react-jsx-self@7.25.9(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@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-react-jsx-self@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-umd@7.27.1(@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-react-jsx-source@7.25.9(@babel/core@7.28.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@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-react-jsx-source@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 + '@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.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.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.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@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.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.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.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.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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@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.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.25.9(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@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.25.9(@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.29.0)': @@ -27002,22 +29633,84 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@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 + + '@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.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@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-reserved-words@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@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.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@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.29.0)': + dependencies: + '@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.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + '@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.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) @@ -27035,6 +29728,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) + '@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.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -27046,6 +29750,125 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@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-unicode-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-unicode-sets-regex@7.28.6(@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/preset-env@7.29.3(@babel/core@7.29.0)': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.3(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@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-scoped-functions': 7.27.1(@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-class-static-block': 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-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 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-json-strings': 7.28.6(@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-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 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-object-super': 7.27.1(@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-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@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-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 + esutils: 2.0.3 + + '@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.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -27060,22 +29883,22 @@ snapshots: '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.5) 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.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -27574,6 +30397,10 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@egjs/hammerjs@2.0.17': + dependencies: + '@types/hammerjs': 2.0.46 + '@electric-sql/pglite-socket@0.0.6(@electric-sql/pglite@0.3.2)': dependencies: '@electric-sql/pglite': 0.3.2 @@ -27610,7 +30437,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/runtime': 7.26.7 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -28234,6 +31061,303 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@expo/cli@54.0.24(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(typescript@5.9.3)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.10.0) + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devcert': 1.2.1 + '@expo/env': 2.0.11 + '@expo/image-utils': 0.8.13(typescript@5.9.3) + '@expo/json-file': 10.0.13 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.15(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3)) + '@expo/osascript': 2.4.2 + '@expo/package-manager': 1.10.4 + '@expo/plist': 0.4.8 + '@expo/prebuild-config': 54.0.8(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3) + '@expo/schema-utils': 0.1.8 + '@expo/spawn-async': 1.7.2 + '@expo/ws-tunnel': 1.0.6 + '@expo/xcpretty': 4.4.3 + '@react-native/dev-middleware': 0.81.5 + '@urql/core': 5.2.0(graphql@16.10.0) + '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0(graphql@16.10.0)) + accepts: 1.3.8 + arg: 5.0.2 + better-opn: 3.0.2 + bplist-creator: 0.1.0 + bplist-parser: 0.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + compression: 1.8.0 + connect: 3.7.0 + debug: 4.4.3 + env-editor: 0.4.2 + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + expo-server: 1.0.6 + freeport-async: 2.0.0 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.2.1 + minimatch: 9.0.5 + node-forge: 1.4.0 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 4.0.3 + pretty-bytes: 5.6.0 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + qrcode-terminal: 0.11.0 + require-from-string: 2.0.2 + requireg: 0.2.2 + resolve: 1.22.11 + resolve-from: 5.0.0 + resolve.exports: 2.0.3 + semver: 7.7.3 + send: 0.19.0 + slugify: 1.6.9 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + tar: 7.5.13 + terminal-link: 2.1.1 + undici: 6.21.2 + wrap-ansi: 7.0.0 + ws: 8.20.0 + optionalDependencies: + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + transitivePeerDependencies: + - bufferutil + - graphql + - supports-color + - typescript + - utf-8-validate + + '@expo/code-signing-certificates@0.0.6': + dependencies: + node-forge: 1.4.0 + + '@expo/config-plugins@54.0.4': + dependencies: + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.13 + '@expo/plist': 0.4.8 + '@expo/sdk-runtime-versions': 1.0.0 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + resolve-from: 5.0.0 + semver: 7.7.3 + slash: 3.0.0 + slugify: 1.6.9 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + + '@expo/config-types@54.0.10': {} + + '@expo/config@12.0.13': + dependencies: + '@babel/code-frame': 7.10.4 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.13 + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + resolve-workspace-root: 2.0.1 + semver: 7.7.3 + slugify: 1.6.9 + sucrase: 3.35.1 + transitivePeerDependencies: + - supports-color + + '@expo/devcert@1.2.1': + dependencies: + '@expo/sudo-prompt': 9.3.2 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)': + dependencies: + chalk: 4.1.2 + optionalDependencies: + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + '@expo/env@2.0.11': + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + transitivePeerDependencies: + - supports-color + + '@expo/fingerprint@0.15.5': + dependencies: + '@expo/spawn-async': 1.7.2 + arg: 5.0.2 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + ignore: 5.3.2 + minimatch: 10.2.4 + p-limit: 3.1.0 + resolve-from: 5.0.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + '@expo/image-utils@0.8.13(typescript@5.9.3)': + dependencies: + '@expo/require-utils': 55.0.4(typescript@5.9.3) + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + getenv: 2.0.0 + jimp-compact: 0.16.1 + parse-png: 2.1.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/json-file@10.0.13': + dependencies: + '@babel/code-frame': 7.27.1 + json5: 2.2.3 + + '@expo/metro-config@54.0.15(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@expo/config': 12.0.13 + '@expo/env': 2.0.11 + '@expo/json-file': 10.0.13 + '@expo/metro': 54.2.0 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.29.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.32.0 + picomatch: 4.0.3 + postcss: 8.4.49 + resolve-from: 5.0.0 + optionalDependencies: + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/metro@54.2.0': + dependencies: + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-minify-terser: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/osascript@2.4.2': + dependencies: + '@expo/spawn-async': 1.7.2 + + '@expo/package-manager@1.10.4': + dependencies: + '@expo/json-file': 10.0.13 + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + npm-package-arg: 11.0.3 + ora: 3.4.0 + resolve-workspace-root: 2.0.1 + + '@expo/plist@0.4.8': + dependencies: + '@xmldom/xmldom': 0.8.13 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + '@expo/prebuild-config@54.0.8(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/image-utils': 0.8.13(typescript@5.9.3) + '@expo/json-file': 10.0.13 + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + resolve-from: 5.0.0 + semver: 7.7.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/require-utils@55.0.4(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@expo/schema-utils@0.1.8': {} + + '@expo/sdk-runtime-versions@1.0.0': {} + + '@expo/spawn-async@1.7.2': + dependencies: + cross-spawn: 7.0.6 + + '@expo/sudo-prompt@9.3.2': {} + + '@expo/vector-icons@15.1.1(expo-font@14.0.11(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)': + dependencies: + expo-font: 14.0.11(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + '@expo/ws-tunnel@1.0.6': {} + + '@expo/xcpretty@4.4.3': + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + js-yaml: 4.1.1 + '@fastify/accept-negotiator@2.0.1': {} '@fastify/ajv-compiler@4.0.5': @@ -28610,6 +31734,12 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@hexagon/base64@1.1.28': {} '@hono/node-server@1.14.2(hono@4.7.10)': @@ -28890,14 +32020,79 @@ snapshots: dependencies: minipass: 7.1.2 + '@isaacs/ttlcache@1.4.1': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.6': {} + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@jest/diff-sequences@30.0.1': {} + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 25.0.9 + jest-mock: 29.7.0 + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 25.0.9 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + '@jest/get-type@30.0.1': {} + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + '@jest/schemas@30.0.5': dependencies: '@sinclair/typebox': 0.34.38 + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.0.9 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -29099,7 +32294,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 semver: 7.7.3 - tar: 7.4.3 + tar: 7.5.13 transitivePeerDependencies: - encoding - supports-color @@ -29460,7 +32655,7 @@ snapshots: parse-imports: 2.2.1 path-key: 4.0.0 semver: 7.7.3 - tar: 7.4.3 + tar: 7.5.13 tmp-promise: 3.0.3 urlpattern-polyfill: 8.0.2 uuid: 11.1.0 @@ -29637,7 +32832,7 @@ snapshots: '@netlify/zip-it-and-ship-it@14.1.11(encoding@0.1.13)(rollup@4.56.0)': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.7.1 @@ -30980,6 +34175,371 @@ snapshots: '@types/react': 19.2.9 '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@react-native-community/cli-clean@20.0.2': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.3 + + '@react-native-community/cli-config-android@20.0.2': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + fast-glob: 3.3.3 + fast-xml-parser: 4.5.6 + + '@react-native-community/cli-config-apple@20.0.2': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.3 + + '@react-native-community/cli-config@20.0.2(typescript@5.9.3)': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + cosmiconfig: 9.0.0(typescript@5.9.3) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.3 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-config@20.0.2(typescript@6.0.2)': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + cosmiconfig: 9.0.0(typescript@6.0.2) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.3 + transitivePeerDependencies: + - typescript + optional: true + + '@react-native-community/cli-doctor@20.0.2(typescript@5.9.3)': + dependencies: + '@react-native-community/cli-config': 20.0.2(typescript@5.9.3) + '@react-native-community/cli-platform-android': 20.0.2 + '@react-native-community/cli-platform-apple': 20.0.2 + '@react-native-community/cli-platform-ios': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.14.0 + execa: 5.1.1 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.7.3 + wcwidth: 1.0.1 + yaml: 2.8.1 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-doctor@20.0.2(typescript@6.0.2)': + dependencies: + '@react-native-community/cli-config': 20.0.2(typescript@6.0.2) + '@react-native-community/cli-platform-android': 20.0.2 + '@react-native-community/cli-platform-apple': 20.0.2 + '@react-native-community/cli-platform-ios': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.14.0 + execa: 5.1.1 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.7.3 + wcwidth: 1.0.1 + yaml: 2.8.1 + transitivePeerDependencies: + - typescript + optional: true + + '@react-native-community/cli-platform-android@20.0.2': + dependencies: + '@react-native-community/cli-config-android': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + execa: 5.1.1 + logkitty: 0.7.1 + + '@react-native-community/cli-platform-apple@20.0.2': + dependencies: + '@react-native-community/cli-config-apple': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + chalk: 4.1.2 + execa: 5.1.1 + fast-xml-parser: 4.5.6 + + '@react-native-community/cli-platform-ios@20.0.2': + dependencies: + '@react-native-community/cli-platform-apple': 20.0.2 + + '@react-native-community/cli-server-api@20.0.2': + dependencies: + '@react-native-community/cli-tools': 20.0.2 + body-parser: 1.20.3 + compression: 1.8.0 + connect: 3.7.0 + errorhandler: 1.5.2 + nocache: 3.0.4 + open: 6.4.0 + pretty-format: 29.7.0 + serve-static: 1.16.2 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native-community/cli-tools@20.0.2': + dependencies: + '@vscode/sudo-prompt': 9.3.2 + appdirsjs: 1.2.7 + chalk: 4.1.2 + execa: 5.1.1 + find-up: 5.0.0 + launch-editor: 2.9.1 + mime: 2.6.0 + ora: 5.4.1 + prompts: 2.4.2 + semver: 7.7.3 + + '@react-native-community/cli-types@20.0.2': + dependencies: + joi: 17.13.3 + + '@react-native-community/cli@20.0.2(typescript@5.9.3)': + dependencies: + '@react-native-community/cli-clean': 20.0.2 + '@react-native-community/cli-config': 20.0.2(typescript@5.9.3) + '@react-native-community/cli-doctor': 20.0.2(typescript@5.9.3) + '@react-native-community/cli-server-api': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + '@react-native-community/cli-types': 20.0.2 + chalk: 4.1.2 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@react-native-community/cli@20.0.2(typescript@6.0.2)': + dependencies: + '@react-native-community/cli-clean': 20.0.2 + '@react-native-community/cli-config': 20.0.2(typescript@6.0.2) + '@react-native-community/cli-doctor': 20.0.2(typescript@6.0.2) + '@react-native-community/cli-server-api': 20.0.2 + '@react-native-community/cli-tools': 20.0.2 + '@react-native-community/cli-types': 20.0.2 + chalk: 4.1.2 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + optional: true + + '@react-native/assets-registry@0.81.5': {} + + '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/traverse': 7.29.0 + '@react-native/codegen': 0.81.5(@babel/core@7.29.0) + transitivePeerDependencies: + - '@babel/core' + - 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.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.27.1(@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.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/codegen@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + glob: 7.2.3 + hermes-parser: 0.29.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.81.5(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))': + dependencies: + '@react-native/dev-middleware': 0.81.5 + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.83.7 + metro-config: 0.83.7 + metro-core: 0.83.7 + semver: 7.7.3 + optionalDependencies: + '@react-native-community/cli': 20.0.2(typescript@5.9.3) + '@react-native/metro-config': 0.81.5(@babel/core@7.29.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/community-cli-plugin@0.81.5(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))': + dependencies: + '@react-native/dev-middleware': 0.81.5 + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.83.7 + metro-config: 0.83.7 + metro-core: 0.83.7 + semver: 7.7.3 + optionalDependencies: + '@react-native-community/cli': 20.0.2(typescript@6.0.2) + '@react-native/metro-config': 0.81.5(@babel/core@7.29.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.81.5': {} + + '@react-native/dev-middleware@0.81.5': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.81.5 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.2.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.2 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.81.5': {} + + '@react-native/js-polyfills@0.81.5': {} + + '@react-native/metro-babel-transformer@0.81.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@react-native/babel-preset': 0.81.5(@babel/core@7.29.0) + hermes-parser: 0.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@react-native/metro-config@0.81.5(@babel/core@7.29.0)': + dependencies: + '@react-native/js-polyfills': 0.81.5 + '@react-native/metro-babel-transformer': 0.81.5(@babel/core@7.29.0) + metro-config: 0.83.7 + metro-runtime: 0.83.7 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/normalize-colors@0.74.89': {} + + '@react-native/normalize-colors@0.81.5': {} + + '@react-native/typescript-config@0.81.5': {} + + '@react-native/virtualized-lists@0.72.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + '@react-native/virtualized-lists@0.81.5(@types/react@19.2.9)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + + '@react-native/virtualized-lists@0.81.5(@types/react@19.2.9)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@rolldown/binding-android-arm64@1.0.0-rc.15': optional: true @@ -31521,7 +35081,7 @@ snapshots: '@sentry/bundler-plugin-core@4.6.1(encoding@0.1.13)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@sentry/babel-plugin-component-annotate': 4.6.1 '@sentry/cli': 2.58.4(encoding@0.1.13) dotenv: 16.6.1 @@ -31625,6 +35185,14 @@ snapshots: optionalDependencies: '@tanstack/vue-router': link:packages/vue-router + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@simplewebauthn/browser@13.2.2': {} '@simplewebauthn/server@13.2.2': @@ -31638,6 +35206,8 @@ snapshots: '@peculiar/asn1-x509': 2.5.0 '@peculiar/x509': 1.14.0 + '@sinclair/typebox@0.27.10': {} + '@sinclair/typebox@0.31.28': {} '@sinclair/typebox@0.34.38': {} @@ -31648,6 +35218,14 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@so-ric/colorspace@1.1.6': dependencies: color: 5.0.2 @@ -31875,7 +35453,7 @@ snapshots: '@supabase/node-fetch': 2.6.15 '@types/phoenix': 1.6.6 '@types/ws': 8.5.14 - ws: 8.18.3 + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -32512,6 +36090,12 @@ snapshots: '@types/express-serve-static-core': 5.0.6 '@types/serve-static': 1.15.7 + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 25.0.9 + + '@types/hammerjs@2.0.46': {} + '@types/html-minifier-terser@6.1.0': {} '@types/http-errors@2.0.4': {} @@ -32520,6 +36104,16 @@ snapshots: dependencies: '@types/node': 25.0.9 + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/js-cookie@3.0.6': {} '@types/jsdom@28.0.0': @@ -32561,6 +36155,13 @@ snapshots: dependencies: '@types/react': 19.2.9 + '@types/react-native@0.72.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))': + dependencies: + '@react-native/virtualized-lists': 0.72.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + '@types/react': 19.2.9 + transitivePeerDependencies: + - react-native + '@types/react-transition-group@4.4.12(@types/react@19.2.9)': dependencies: '@types/react': 19.2.9 @@ -32592,6 +36193,8 @@ snapshots: dependencies: '@types/node': 25.0.9 + '@types/stack-utils@2.0.3': {} + '@types/statuses@2.0.5': {} '@types/tough-cookie@4.0.5': {} @@ -33128,6 +36731,8 @@ snapshots: '@typescript-eslint/types': 8.57.1 eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -33187,6 +36792,18 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true + '@urql/core@5.2.0(graphql@16.10.0)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.10.0) + wonka: 6.3.6 + transitivePeerDependencies: + - graphql + + '@urql/exchange-retry@1.3.2(@urql/core@5.2.0(graphql@16.10.0))': + dependencies: + '@urql/core': 5.2.0(graphql@16.10.0) + wonka: 6.3.6 + '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.56.0)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) @@ -33227,9 +36844,9 @@ snapshots: '@vitejs/plugin-react@4.3.4(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.28.5) + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.29.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 vite: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) @@ -33238,9 +36855,9 @@ snapshots: '@vitejs/plugin-react@4.6.0(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@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-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 @@ -33260,15 +36877,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-react@6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 vite: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + optionalDependencies: + babel-plugin-react-compiler: 1.0.0 - '@vitejs/plugin-react@6.0.1(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-react@6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 vite: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) + optionalDependencies: + babel-plugin-react-compiler: 1.0.0 '@vitejs/plugin-rsc@0.5.20(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: @@ -33287,10 +36908,10 @@ snapshots: '@vitejs/plugin-vue-jsx@4.2.0(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1))(vue@3.5.25(typescript@6.0.2))': dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/core': 7.29.0 + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.29.0) '@rolldown/pluginutils': 1.0.0-beta.40 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) vite: 8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1) vue: 3.5.25(typescript@6.0.2) transitivePeerDependencies: @@ -33476,33 +37097,19 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.0.8 + '@vscode/sudo-prompt@9.3.2': {} + '@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-helper-vue-transform-on@2.0.1': {} - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.29.0 - '@vue/babel-helper-vue-transform-on': 1.5.0 - '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.5) - '@vue/shared': 3.5.25 - optionalDependencies: - '@babel/core': 7.28.5 - transitivePeerDependencies: - - supports-color - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.0)': dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 '@vue/babel-helper-vue-transform-on': 1.5.0 '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) @@ -33528,24 +37135,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.5)': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.28.5 - '@vue/compiler-sfc': 3.5.25 - transitivePeerDependencies: - - supports-color - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.0)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@vue/compiler-sfc': 3.5.25 transitivePeerDependencies: - supports-color @@ -33554,16 +37150,16 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@vue/compiler-sfc': 3.5.25 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.25': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@vue/shared': 3.5.25 entities: 4.5.0 estree-walker: 2.0.2 @@ -33841,6 +37437,10 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) + '@xmldom/xmldom@0.8.13': {} + + '@xmldom/xmldom@0.9.10': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -33959,6 +37559,8 @@ snapshots: alien-signals@3.1.1: {} + anser@1.4.10: {} + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -33969,12 +37571,24 @@ snapshots: dependencies: environment: 1.1.0 + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + ansi-html-community@0.0.8: {} + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -33992,6 +37606,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + appdirsjs@1.2.7: {} + archiver-utils@5.0.2: dependencies: glob: 10.5.0 @@ -34012,6 +37628,8 @@ snapshots: tar-stream: 3.1.7 zip-stream: 6.0.1 + arg@5.0.2: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -34048,6 +37666,8 @@ snapshots: array-union@2.1.0: {} + asap@2.0.6: {} + asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 @@ -34056,6 +37676,10 @@ snapshots: ast-module-types@6.0.1: {} + astral-regex@1.0.0: {} + + async-limiter@1.0.1: {} + async-mutex@0.5.0: dependencies: tslib: 2.8.1 @@ -34125,19 +37749,49 @@ snapshots: babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@babel/parser': 7.28.5 '@babel/traverse': 7.28.5 '@babel/types': 7.29.0 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-loader@10.0.0(@babel/core@7.28.5)(webpack@5.97.1): dependencies: '@babel/core': 7.28.5 find-up: 5.0.0 webpack: 5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.21))(esbuild@0.27.4)(webpack-cli@5.1.4) + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -34162,13 +37816,118 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.11 + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + 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.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.0 + + babel-plugin-react-native-web@0.21.2: {} + + babel-plugin-syntax-hermes-parser@0.29.1: + dependencies: + hermes-parser: 0.29.1 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.0): + dependencies: + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - '@babel/core' + babel-plugin-vue-jsx-hmr@1.0.0: dependencies: - '@babel/core': 7.28.5 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@babel/core': 7.29.0 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) transitivePeerDependencies: - supports-color + 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.29.0)(@babel/runtime@7.26.7)(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-refresh@0.14.2): + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.29.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.6(@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.27.1(@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.29.0(@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.26.7 + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + 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.10(@babel/core@7.28.5)(solid-js@1.9.12): dependencies: '@babel/core': 7.28.5 @@ -34234,6 +37993,10 @@ snapshots: set-cookie-parser: 2.7.2 uncrypto: 0.1.3 + better-opn@3.0.2: + dependencies: + open: 8.4.2 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -34242,6 +38005,8 @@ snapshots: dependencies: require-from-string: 2.0.2 + big-integer@1.6.52: {} + binary-extensions@2.3.0: {} bindings@1.5.0: @@ -34296,6 +38061,18 @@ snapshots: boolbase@1.0.0: {} + bplist-creator@0.1.0: + dependencies: + stream-buffers: 2.2.0 + + bplist-parser@0.3.1: + dependencies: + big-integer: 1.6.52 + + bplist-parser@0.3.2: + dependencies: + big-integer: 1.6.52 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -34328,6 +38105,10 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-builder@0.2.0: optional: true @@ -34420,12 +38201,22 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-lite@1.0.30001696: {} caniuse-lite@1.0.30001760: {} chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -34498,8 +38289,32 @@ snapshots: chownr@3.0.0: {} + chrome-launcher@0.15.2: + dependencies: + '@types/node': 25.0.9 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + chrome-trace-event@1.0.4: {} + chromium-edge-launcher@0.2.0: + dependencies: + '@types/node': 25.0.9 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + citty@0.1.6: dependencies: consola: 3.4.2 @@ -34512,6 +38327,10 @@ snapshots: dependencies: source-map: 0.6.1 + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -34541,6 +38360,12 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -34565,6 +38390,10 @@ snapshots: cluster-key-slot@1.1.2: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -34573,6 +38402,8 @@ snapshots: dependencies: color-name: 2.0.2 + color-name@1.1.3: {} + color-name@1.1.4: {} color-name@2.0.2: {} @@ -34588,6 +38419,8 @@ snapshots: color-convert: 3.1.2 color-string: 2.1.2 + colorette@1.4.0: {} + colorette@2.0.20: {} colorjs.io@0.5.2: @@ -34599,6 +38432,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + command-exists@1.2.9: {} + commander@10.0.1: {} commander@11.1.0: {} @@ -34607,8 +38442,14 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + + commander@7.2.0: {} + commander@8.3.0: {} + commander@9.5.0: {} + comment-json@4.2.5: dependencies: array-timsort: 1.0.3 @@ -34689,6 +38530,15 @@ snapshots: connect-history-api-fallback@2.0.0: {} + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + consola@3.4.0: {} consola@3.4.2: {} @@ -34766,6 +38616,10 @@ snapshots: graceful-fs: 4.2.11 p-event: 6.0.1 + core-js-compat@3.49.0: + dependencies: + browserslist: 4.28.1 + core-js@3.40.0: optional: true @@ -34779,11 +38633,20 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + cosmiconfig@9.0.0(typescript@6.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 6.0.2 @@ -34808,6 +38671,12 @@ snapshots: '@epic-web/invariant': 1.0.0 cross-spawn: 7.0.6 + cross-fetch@3.2.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -34826,6 +38695,10 @@ snapshots: optionalDependencies: srvx: 0.11.15 + css-in-js-utils@3.1.0: + dependencies: + hyphenate-style-name: 1.1.0 + css-loader@7.1.2(@rspack/core@1.7.11(@swc/helpers@0.5.21))(webpack@5.97.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) @@ -34913,6 +38786,8 @@ snapshots: dependencies: '@babel/runtime': 7.26.7 + dayjs@1.11.20: {} + db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3): optionalDependencies: '@electric-sql/pglite': 0.3.2 @@ -34928,7 +38803,6 @@ snapshots: debug@3.2.7: dependencies: ms: 2.1.3 - optional: true debug@4.4.3: dependencies: @@ -34938,6 +38812,8 @@ snapshots: dependencies: callsite: 1.0.0 + decamelize@1.2.0: {} + decimal.js@10.5.0: {} dedent@1.5.1(babel-plugin-macros@3.1.0): @@ -34969,6 +38845,8 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.19 + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge-ts@7.1.5: {} @@ -35264,6 +39142,8 @@ snapshots: entities@6.0.0: {} + env-editor@0.4.2: {} + env-paths@2.2.1: {} env-paths@3.0.0: {} @@ -35295,6 +39175,15 @@ snapshots: error-stack-parser-es@1.0.5: {} + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + errorhandler@1.5.2: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -35494,6 +39383,8 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -35845,6 +39736,18 @@ snapshots: events@3.3.0: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -35859,6 +39762,101 @@ snapshots: expect-type@1.3.0: {} + expo-asset@12.0.13(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3): + dependencies: + '@expo/image-utils': 0.8.13(typescript@5.9.3) + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + expo-constants: 18.0.13(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + transitivePeerDependencies: + - supports-color + - typescript + + expo-constants@18.0.13(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)): + dependencies: + '@expo/config': 12.0.13 + '@expo/env': 2.0.11 + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + transitivePeerDependencies: + - supports-color + + expo-file-system@19.0.22(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)): + dependencies: + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + expo-font@14.0.11(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + fontfaceobserver: 2.3.0 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + expo-keep-awake@15.0.8(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react@19.2.3): + dependencies: + expo: 54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + react: 19.2.3 + + expo-modules-autolinking@3.0.25: + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + commander: 7.2.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + + expo-modules-core@3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + expo-server@1.0.6: {} + + expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + + expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.26.7 + '@expo/cli': 54.0.24(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(typescript@5.9.3) + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + '@expo/fingerprint': 0.15.5 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.15(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3)) + '@expo/vector-icons': 15.1.1(expo-font@14.0.11(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.26.7)(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-refresh@0.14.2) + expo-asset: 12.0.13(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + expo-constants: 18.0.13(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + expo-file-system: 19.0.22(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)) + expo-font: 14.0.11(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + expo-keep-awake: 15.0.8(expo@54.0.34(@babel/core@7.29.0)(graphql@16.10.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react@19.2.3) + expo-modules-autolinking: 3.0.25 + expo-modules-core: 3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + pretty-format: 29.7.0 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-refresh: 0.14.2 + whatwg-url-without-unicode: 8.0.0-3 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - graphql + - supports-color + - typescript + - utf-8-validate + + exponential-backoff@3.1.3: {} + express@4.21.2: dependencies: accepts: 1.3.8 @@ -35984,6 +39982,10 @@ snapshots: fast-uri@3.0.6: {} + fast-xml-parser@4.5.6: + dependencies: + strnum: 1.1.2 + fastest-levenshtein@1.0.16: {} fastify@5.7.1: @@ -36012,6 +40014,24 @@ snapshots: dependencies: websocket-driver: 0.7.4 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5(encoding@0.1.13): + dependencies: + 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 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -36051,6 +40071,18 @@ snapshots: filter-obj@6.1.0: {} + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -36149,6 +40181,8 @@ snapshots: flatted@3.4.2: {} + flow-enums-runtime@0.0.6: {} + fn.name@1.1.0: {} follow-redirects@1.15.9(debug@4.4.3): @@ -36157,6 +40191,8 @@ snapshots: follow-redirects@1.16.0: {} + fontfaceobserver@2.3.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -36196,6 +40232,8 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) + freeport-async@2.0.0: {} + fresh@0.5.2: {} fresh@2.0.0: {} @@ -36224,6 +40262,8 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + fsevents@2.3.2: optional: true @@ -36262,6 +40302,8 @@ snapshots: get-nonce@1.0.1: {} + get-package-type@0.1.0: {} + get-port-please@3.1.2: {} get-port-please@3.2.0: {} @@ -36277,12 +40319,16 @@ snapshots: dependencies: pump: 3.0.3 + get-stream@6.0.1: {} + get-stream@8.0.1: {} get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 + getenv@2.0.0: {} + giget@2.0.0: dependencies: citty: 0.1.6 @@ -36319,6 +40365,15 @@ snapshots: minipass: 7.1.2 path-scurry: 2.0.0 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -36416,6 +40471,8 @@ snapshots: has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-own-prop@2.0.0: {} @@ -36446,6 +40503,24 @@ snapshots: headers-polyfill@4.0.3: {} + hermes-estree@0.29.1: {} + + hermes-estree@0.32.0: {} + + hermes-estree@0.35.0: {} + + hermes-parser@0.29.1: + dependencies: + hermes-estree: 0.29.1 + + hermes-parser@0.32.0: + dependencies: + hermes-estree: 0.32.0 + + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + hey-listen@1.0.8: {} highlight.js@10.7.3: {} @@ -36601,6 +40676,8 @@ snapshots: human-id@4.1.1: {} + human-signals@2.1.0: {} + human-signals@5.0.0: {} hyperdyperid@1.2.0: {} @@ -36611,6 +40688,8 @@ snapshots: uuid: 8.3.2 uuid-parse: 1.1.0 + hyphenate-style-name@1.1.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -36637,6 +40716,10 @@ snapshots: image-meta@0.2.2: {} + image-size@1.2.1: + dependencies: + queue: 6.0.2 + image-size@2.0.2: {} immer@10.1.1: {} @@ -36665,6 +40748,11 @@ snapshots: index-to-position@1.2.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.3: {} inherits@2.0.4: {} @@ -36673,6 +40761,10 @@ snapshots: inline-style-parser@0.2.4: {} + inline-style-prefixer@7.0.1: + dependencies: + css-in-js-utils: 3.1.0 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -36681,6 +40773,10 @@ snapshots: interpret@3.1.1: {} + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ioredis@5.9.2: dependencies: '@ioredis/commands': 1.5.0 @@ -36787,6 +40883,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-glob@4.0.3: @@ -36909,6 +41007,8 @@ snapshots: is-windows@1.0.2: {} + is-wsl@1.1.0: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -36931,6 +41031,18 @@ snapshots: isobject@3.0.1: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -36944,16 +41056,98 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 25.0.9 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 25.0.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.0.9 + jest-util: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.0.9 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + jest-worker@27.5.1: dependencies: '@types/node': 25.0.9 merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@29.7.0: + dependencies: + '@types/node': 25.0.9 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jimp-compact@0.16.1: {} + jiti@2.6.1: {} jju@1.4.0: {} + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + jose@6.1.0: {} jose@6.1.3: {} @@ -36987,14 +41181,12 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - js-yaml@4.1.1: dependencies: argparse: 2.0.1 + jsc-safe-url@0.2.4: {} + jsdom@25.0.1: dependencies: cssstyle: 4.2.1 @@ -37121,6 +41313,8 @@ snapshots: kind-of@6.0.3: {} + kleur@3.0.3: {} + kleur@4.1.5: {} klona@2.0.6: {} @@ -37145,6 +41339,8 @@ snapshots: dotenv: 16.6.1 winston: 3.18.3 + lan-network@0.2.1: {} + launch-editor@2.9.1: dependencies: picocolors: 1.1.1 @@ -37195,6 +41391,13 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.32.0: optional: true @@ -37304,6 +41507,8 @@ snapshots: lodash.clonedeep@4.5.0: {} + lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: {} lodash.flatten@4.4.0: {} @@ -37328,8 +41533,14 @@ snapshots: lodash.startcase@4.4.0: {} + lodash.throttle@4.1.1: {} + lodash@4.17.21: {} + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -37344,6 +41555,12 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.20 + yargs: 15.4.1 + long@5.3.1: {} loose-envify@1.4.0: @@ -37391,10 +41608,14 @@ snapshots: magicast@0.5.1: dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + manage-path@2.0.0: {} map-obj@5.0.2: {} @@ -37419,6 +41640,8 @@ snapshots: marked@9.1.6: {} + marky@1.3.0: {} + math-intrinsics@1.1.0: {} mdn-data@2.0.28: {} @@ -37436,6 +41659,10 @@ snapshots: tree-dump: 1.0.2(tslib@2.8.1) tslib: 2.8.1 + memoize-one@5.2.1: {} + + memoize-one@6.0.0: {} + merge-anything@5.1.7: dependencies: is-what: 4.1.16 @@ -37454,6 +41681,355 @@ snapshots: methods@1.1.2: {} + metro-babel-transformer@0.83.3: + dependencies: + '@babel/core': 7.29.0 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.32.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-babel-transformer@0.83.7: + dependencies: + '@babel/core': 7.29.0 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.83.7 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache-key@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.83.3: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.3 + transitivePeerDependencies: + - supports-color + + metro-cache@0.83.7: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.7 + transitivePeerDependencies: + - supports-color + + metro-config@0.83.3: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.3 + metro-cache: 0.83.3 + metro-core: 0.83.3 + metro-runtime: 0.83.3 + yaml: 2.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-config@0.83.7: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.7 + metro-cache: 0.83.7 + metro-core: 0.83.7 + metro-runtime: 0.83.7 + yaml: 2.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.3 + + metro-core@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.7 + + metro-file-map@0.83.3: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-file-map@0.83.7: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.37.0 + + metro-minify-terser@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.37.0 + + metro-resolver@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-resolver@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.83.3: + dependencies: + '@babel/runtime': 7.26.7 + flow-enums-runtime: 0.0.6 + + metro-runtime@0.83.7: + dependencies: + '@babel/runtime': 7.26.7 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.83.3: + dependencies: + '@babel/traverse': 7.29.0 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.0' + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.3 + nullthrows: 1.1.1 + ob1: 0.83.3 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-source-map@0.83.7: + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.7 + nullthrows: 1.1.1 + ob1: 0.83.7 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.3 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.7 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.83.3: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.83.7: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.83.3: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-minify-terser: 0.83.3 + metro-source-map: 0.83.3 + metro-transform-plugins: 0.83.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-transform-worker@0.83.7: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + metro: 0.83.7 + metro-babel-transformer: 0.83.7 + metro-cache: 0.83.7 + metro-cache-key: 0.83.7 + metro-minify-terser: 0.83.7 + metro-source-map: 0.83.7 + metro-transform-plugins: 0.83.7 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.83.3: + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.32.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.83.7: + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.7 + metro-cache: 0.83.7 + metro-cache-key: 0.83.7 + metro-config: 0.83.7 + metro-core: 0.83.7 + metro-file-map: 0.83.7 + metro-resolver: 0.83.7 + metro-runtime: 0.83.7 + metro-source-map: 0.83.7 + metro-symbolicate: 0.83.7 + metro-transform-plugins: 0.83.7 + metro-transform-worker: 0.83.7 + mime-types: 3.0.1 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -37473,8 +42049,12 @@ snapshots: mime@1.6.0: {} + mime@2.6.0: {} + mime@4.1.0: {} + mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -37527,12 +42107,11 @@ snapshots: minipass@7.1.2: {} - minizlib@3.0.1: + minizlib@3.1.0: dependencies: minipass: 7.1.2 - rimraf: 5.0.10 - mkdirp@3.0.1: {} + mkdirp@1.0.4: {} mlly@1.8.0: dependencies: @@ -37658,6 +42237,8 @@ snapshots: neo-async@2.6.2: {} + nested-error-stacks@2.0.1: {} + netlify-redirector@0.5.0: {} nf3@0.3.11: {} @@ -37927,6 +42508,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + nocache@3.0.4: {} + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} @@ -37954,10 +42537,14 @@ snapshots: node-forge@1.3.1: {} + node-forge@1.4.0: {} + node-gyp-build@3.9.0: {} node-gyp-build@4.8.4: {} + node-int64@0.4.0: {} + node-mock-http@1.0.4: {} node-releases@2.0.19: {} @@ -37966,7 +42553,7 @@ snapshots: node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.2 node-stream-zip@1.15.0: {} @@ -37990,6 +42577,13 @@ snapshots: normalize-path@3.0.0: {} + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.3 + validate-npm-package-name: 5.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -38002,6 +42596,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nullthrows@1.1.1: {} + nwsapi@2.2.16: {} nx@22.6.5(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.10.15(@swc/helpers@0.5.21))(@swc/types@0.1.17)(typescript@6.0.2))(@swc/core@1.10.15(@swc/helpers@0.5.21)): @@ -38068,6 +42664,14 @@ snapshots: oauth4webapi@3.8.3: {} + ob1@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + + ob1@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-inspect@1.13.3: {} @@ -38114,6 +42718,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -38130,6 +42738,10 @@ snapshots: dependencies: fn.name: 1.1.0 + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -38145,6 +42757,15 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -38160,6 +42781,15 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@3.4.0: + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.6.1 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + ora@5.3.0: dependencies: bl: 4.1.0 @@ -38171,6 +42801,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + outdent@0.5.0: {} outvariant@1.4.3: {} @@ -38342,6 +42984,10 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 + parse-png@2.1.0: + dependencies: + pngjs: 3.4.0 + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -38376,6 +43022,8 @@ snapshots: path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -38474,6 +43122,14 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + plist@3.1.1: + dependencies: + '@xmldom/xmldom': 0.9.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + pngjs@3.4.0: {} + pngjs@7.0.0: {} possible-typed-array-names@1.1.0: {} @@ -38530,6 +43186,12 @@ snapshots: postcss: 8.5.8 quote-unquote: 1.0.0 + postcss@8.4.49: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.3: dependencies: nanoid: 3.3.11 @@ -38609,6 +43271,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-format@30.0.5: dependencies: '@jest/schemas': 30.0.5 @@ -38631,6 +43299,8 @@ snapshots: - react - react-dom + proc-log@4.2.0: {} + process-nextick-args@2.0.1: {} process-warning@4.0.1: {} @@ -38643,6 +43313,19 @@ snapshots: promise-limit@2.7.0: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -38722,6 +43405,8 @@ snapshots: pvutils@1.1.3: {} + qrcode-terminal@0.11.0: {} + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -38736,6 +43421,10 @@ snapshots: queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} quote-unquote@1.0.0: {} @@ -38825,11 +43514,30 @@ snapshots: defu: 6.1.4 destr: 2.0.5 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 scheduler: 0.27.0 + react-freeze@1.0.4(react@19.2.3): + dependencies: + react: 19.2.3 + react-hot-toast@2.5.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: csstype: 3.1.3 @@ -38845,6 +43553,167 @@ snapshots: react-is@19.0.0: {} + react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + + react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-freeze: 1.0.4(react@19.2.3) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + warn-once: 0.1.1 + + react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-freeze: 1.0.4(react@19.2.3) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + warn-once: 0.1.1 + + react-native-url-polyfill@3.0.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3)): + dependencies: + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3) + whatwg-url-without-unicode: 8.0.0-3 + + react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@babel/runtime': 7.26.7 + '@react-native/normalize-colors': 0.74.89 + fbjs: 3.0.5(encoding@0.1.13) + inline-style-prefixer: 7.0.1 + memoize-one: 6.0.0 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styleq: 0.1.3 + transitivePeerDependencies: + - encoding + + react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.81.5 + '@react-native/codegen': 0.81.5(@babel/core@7.29.0) + '@react-native/community-cli-plugin': 0.81.5(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0)) + '@react-native/gradle-plugin': 0.81.5 + '@react-native/js-polyfills': 0.81.5 + '@react-native/normalize-colors': 0.81.5 + '@react-native/virtualized-lists': 0.81.5(@types/react@19.2.9)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@5.9.3))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.29.0) + babel-plugin-syntax-hermes-parser: 0.29.1 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.83.7 + metro-source-map: 0.83.7 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.3 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.26.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 6.2.3 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.9 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + + react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.81.5 + '@react-native/codegen': 0.81.5(@babel/core@7.29.0) + '@react-native/community-cli-plugin': 0.81.5(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0)) + '@react-native/gradle-plugin': 0.81.5 + '@react-native/js-polyfills': 0.81.5 + '@react-native/normalize-colors': 0.81.5 + '@react-native/virtualized-lists': 0.81.5(@types/react@19.2.9)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.0.2(typescript@6.0.2))(@react-native/metro-config@0.81.5(@babel/core@7.29.0))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.29.0) + babel-plugin-syntax-hermes-parser: 0.29.1 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.83.7 + metro-source-map: 0.83.7 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.3 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.26.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 6.2.3 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.9 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + react-pprof@1.4.0: dependencies: gl-matrix: 3.4.4 @@ -38991,6 +43860,14 @@ snapshots: reflect-metadata@0.2.2: {} + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + regenerator-runtime@0.14.1: {} regexp-to-ast@0.5.0: {} @@ -39004,6 +43881,21 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.1: + dependencies: + jsesc: 3.1.0 + reinterval@1.1.0: {} relateurl@0.2.7: {} @@ -39034,8 +43926,16 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + require-package-name@2.0.1: {} + requireg@0.2.2: + dependencies: + nested-error-stacks: 2.0.1 + rc: 1.2.8 + resolve: 1.7.1 + requires-port@1.0.0: {} resolve-cwd@3.0.0: @@ -39048,6 +43948,8 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve-workspace-root@2.0.1: {} + resolve.exports@2.0.3: {} resolve@1.22.10: @@ -39062,12 +43964,21 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.7.1: + dependencies: + path-parse: 1.0.7 + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -39085,9 +43996,9 @@ snapshots: rfdc@1.4.1: {} - rimraf@5.0.10: + rimraf@3.0.2: dependencies: - glob: 10.5.0 + glob: 7.2.3 rimraf@6.1.2: dependencies: @@ -39355,6 +44266,8 @@ snapshots: dependencies: xmlchars: 2.2.0 + scheduler@0.26.0: {} + scheduler@0.27.0: {} schema-utils@3.3.0: @@ -39434,6 +44347,8 @@ snapshots: seq-queue@0.0.5: {} + serialize-error@2.1.0: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -39487,6 +44402,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -39505,6 +44422,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + setprototypeof@1.1.0: {} setprototypeof@1.2.0: {} @@ -39619,12 +44538,20 @@ snapshots: simple-icons@14.9.0: {} + simple-plist@1.3.1: + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.1 + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.28 mrmime: 2.0.0 totalist: 3.0.1 + sisteransi@1.0.5: {} + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 @@ -39635,6 +44562,14 @@ snapshots: slashes@3.0.12: {} + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + + slugify@1.6.9: {} + smob@1.5.0: {} smol-toml@1.6.1: {} @@ -39758,8 +44693,18 @@ snapshots: stack-trace@0.0.10: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + standard-as-callback@2.1.0: {} standardwebhooks@1.0.0: @@ -39787,6 +44732,8 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-buffers@2.2.0: {} + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 @@ -39820,6 +44767,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -39830,18 +44781,26 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} strip-indent@3.0.0: dependencies: min-indent: 1.0.1 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 + strnum@1.1.2: {} + + structured-headers@0.4.1: {} + style-loader@4.0.0(webpack@5.97.1): dependencies: webpack: 5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.21))(esbuild@0.27.4)(webpack-cli@5.1.4) @@ -39850,10 +44809,26 @@ snapshots: dependencies: inline-style-parser: 0.2.4 + styleq@0.1.3: {} + stylis@4.2.0: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + supports-color@10.0.0: {} + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -39862,6 +44837,11 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-hyperlinks@3.1.0: dependencies: has-flag: 4.0.0 @@ -39929,17 +44909,21 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.0 - tar@7.4.3: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 + minizlib: 3.1.0 yallist: 5.0.0 term-size@2.2.1: {} + terminal-link@2.1.1: + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.11(@swc/core@1.10.15(@swc/helpers@0.5.21))(esbuild@0.27.4)(webpack@5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.21))(esbuild@0.27.4)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -39983,6 +44967,12 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 7.2.3 + minimatch: 3.1.2 + text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -40005,10 +44995,16 @@ snapshots: dependencies: real-require: 0.2.0 + throat@5.0.0: {} + thunky@1.1.0: {} timestring@6.0.0: {} + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -40040,6 +45036,8 @@ snapshots: tmp@0.2.3: {} + tmpl@1.0.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -40121,6 +45119,8 @@ snapshots: picomatch: 4.0.3 typescript: 6.0.2 + ts-interface-checker@0.1.13: {} + ts-pattern@5.6.2: {} tsconfck@3.1.4(typescript@6.0.2): @@ -40162,10 +45162,14 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.20.2: {} type-fest@0.21.3: {} + type-fest@0.7.1: {} + type-fest@4.41.0: {} type-fest@5.4.1: @@ -40225,6 +45229,8 @@ snapshots: typescript@6.0.2: {} + ua-parser-js@1.0.41: {} + ufo@1.6.1: {} ufo@1.6.3: {} @@ -40256,8 +45262,19 @@ snapshots: dependencies: pathe: 2.0.3 + unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-emoji-modifier-base@1.0.0: {} + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + unicorn-magic@0.1.0: {} unicorn-magic@0.4.0: {} @@ -40461,6 +45478,8 @@ snapshots: uuid@11.1.0: {} + uuid@7.0.3: {} + uuid@8.3.2: {} valibot@1.0.0-beta.15(typescript@6.0.2): @@ -40516,9 +45535,9 @@ snapshots: vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.12)(vite@8.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.6.1)(sass-embedded@1.97.2)(sass@1.97.2)(terser@5.37.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.12) + babel-preset-solid: 1.9.10(@babel/core@7.29.0)(solid-js@1.9.12) merge-anything: 5.1.7 solid-js: 1.9.12 solid-refresh: 0.6.3(solid-js@1.9.12) @@ -40708,6 +45727,8 @@ snapshots: transitivePeerDependencies: - msw + vlq@1.0.1: {} + vscode-uri@3.0.8: {} vue-component-type-helpers@2.2.12: {} @@ -40815,6 +45836,12 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warn-once@0.1.1: {} + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 @@ -40841,6 +45868,8 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@5.0.0: {} + webidl-conversions@7.0.0: {} webidl-conversions@8.0.0: {} @@ -41033,8 +46062,16 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-fetch@3.6.20: {} + whatwg-mimetype@4.0.0: {} + whatwg-url-without-unicode@8.0.0-3: + dependencies: + buffer: 5.7.1 + punycode: 2.3.1 + webidl-conversions: 5.0.0 + whatwg-url@14.1.0: dependencies: tr46: 5.0.0 @@ -41065,6 +46102,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -41106,6 +46145,8 @@ snapshots: triple-beam: 1.4.1 winston-transport: 4.9.0 + wonka@6.3.6: {} + word-wrap@1.2.5: {} workerd@1.20260317.1: @@ -41152,21 +46193,42 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@6.2.3: + dependencies: + async-limiter: 1.0.1 + + ws@7.5.10: {} + ws@8.18.0: {} ws@8.18.3: {} ws@8.20.0: {} + xcode@3.0.1: + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} + xml2js@0.6.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + xmlbuilder2@4.0.3: dependencies: '@oozcitak/dom': 2.0.2 @@ -41174,6 +46236,10 @@ snapshots: '@oozcitak/util': 10.0.0 js-yaml: 4.1.1 + xmlbuilder@11.0.1: {} + + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} xss@1.0.15: @@ -41181,6 +46247,8 @@ snapshots: commander: 2.20.3 cssfilter: 0.0.10 + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -41193,10 +46261,29 @@ snapshots: yaml@2.8.1: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@16.2.0: dependencies: cliui: 7.0.4 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ee13d9493c..fd49443d7c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,6 +6,7 @@ packages: - 'packages/*' - 'benchmarks/*' - 'examples/react/*' + - 'examples/react-native/*' - 'examples/solid/*' - 'examples/vue/*' - 'examples/react/router-monorepo-react-query/packages/*'