From da4db6c4354248b3c82d31a7fe777420c7302087 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Sun, 17 May 2026 18:00:44 +0200 Subject: [PATCH 1/4] wip: expo intl --- .gitignore | 7 +- examples/example-expo-monorepo/README.md | 52 + .../apps/mobile/.gitignore | 6 + .../apps/mobile/app.json | 23 + .../apps/mobile/metro.config.js | 21 + .../apps/mobile/package.json | 37 + .../apps/mobile/scripts/extract-messages.mjs | 18 + .../apps/mobile/src/app/_layout.tsx | 15 + .../apps/mobile/src/app/index.tsx | 66 + .../mobile/src/i18n/intl-provider-shell.tsx | 37 + .../apps/mobile/src/i18n/locale-context.tsx | 29 + .../apps/mobile/src/i18n/po-modules.d.ts | 4 + .../apps/mobile/tsconfig.json | 17 + .../apps/web/next-env.d.ts | 6 + .../apps/web/next.config.ts | 25 + .../apps/web/package.json | 27 + .../apps/web/scripts/extract-messages.mjs | 18 + .../apps/web/src/app/greeting-card.tsx | 14 + .../apps/web/src/app/layout.tsx | 28 + .../apps/web/src/app/locale-switcher-card.tsx | 46 + .../apps/web/src/app/page.tsx | 26 + .../web/src/i18n/locale-action-context.tsx | 45 + .../apps/web/src/i18n/po-modules.d.ts | 4 + .../apps/web/src/i18n/request.ts | 12 + .../apps/web/tsconfig.json | 41 + examples/example-expo-monorepo/messages/de.po | 32 + examples/example-expo-monorepo/messages/en.po | 32 + examples/example-expo-monorepo/package.json | 12 + .../packages/ui/package.json | 21 + .../packages/ui/src/greeting.tsx | 41 + .../packages/ui/src/index.tsx | 3 + .../packages/ui/src/locale-switcher.tsx | 42 + .../packages/ui/tsconfig.json | 16 + .../example-expo-monorepo/scripts/extract.mjs | 21 + packages/expo-intl/.gitignore | 2 + packages/expo-intl/eslint.config.mjs | 10 + packages/expo-intl/extractor.d.ts | 1 + packages/expo-intl/package.json | 103 + packages/expo-intl/plugin.d.cts | 2 + packages/expo-intl/plugin.d.ts | 2 + packages/expo-intl/rollup.config.js | 59 + packages/expo-intl/src/extractor.tsx | 8 + packages/expo-intl/src/index.tsx | 18 + packages/expo-intl/src/plugin.tsx | 2 + .../src/plugin/createExpoIntlPlugin.tsx | 238 + .../extractor/initExtractionCompiler.tsx | 49 + packages/expo-intl/src/plugin/transformer.tsx | 128 + packages/expo-intl/src/plugin/types.tsx | 70 + packages/expo-intl/src/plugin/utils.tsx | 69 + packages/expo-intl/src/types-vendor.d.ts | 11 + packages/expo-intl/transformer.d.cts | 12 + packages/expo-intl/tsconfig.build.json | 10 + packages/expo-intl/tsconfig.json | 16 + packages/intl-extractor/.gitignore | 2 + packages/intl-extractor/eslint.config.mjs | 7 + packages/intl-extractor/package.json | 62 + packages/intl-extractor/rollup.config.js | 30 + .../src}/ExtractionCompiler.test.tsx | 0 .../src}/ExtractionCompiler.tsx | 0 .../src}/catalog/CatalogLocales.tsx | 0 .../src}/catalog/CatalogManager.tsx | 0 .../src}/catalog/CatalogPersister.tsx | 0 .../src}/catalog/SaveScheduler.tsx | 0 .../intl-extractor/src/compile-catalog.tsx | 125 + .../src}/extractMessages.tsx | 3 +- .../src}/extractor/LRUCache.test.tsx | 0 .../src}/extractor/LRUCache.tsx | 0 .../src}/extractor/MessageExtractor.bench.tsx | 0 .../src}/extractor/MessageExtractor.test.tsx | 0 .../src}/extractor/MessageExtractor.tsx | 0 .../src}/format/ExtractorCodec.tsx | 0 .../src}/format/codecs/JSONCodec.tsx | 0 .../src}/format/codecs/POCodec.tsx | 0 .../codecs/fixtures/JSONCodecStructured.tsx | 0 .../fixtures/POCodecSourceMessageKey.tsx | 0 .../src}/format/index.tsx | 2 +- .../src}/format/types.tsx | 0 packages/intl-extractor/src/index.tsx | 29 + .../src}/normalizeExtractorConfig.tsx | 2 +- .../src}/source/SourceFileFilter.tsx | 0 .../src}/source/SourceFileScanner.tsx | 0 .../src}/source/SourceFileWatcher.tsx | 0 .../src}/types.tsx | 0 .../src}/utils.test.tsx | 0 .../src}/utils.tsx | 13 +- packages/intl-extractor/tsconfig.build.json | 10 + packages/intl-extractor/tsconfig.json | 16 + packages/intl-extractor/vitest.config.mts | 7 + packages/next-intl/package.json | 5 +- packages/next-intl/rollup.config.js | 3 +- packages/next-intl/src/extractor.tsx | 5 +- packages/next-intl/src/extractor/index.tsx | 2 - .../src/plugin/catalog/catalogLoader.tsx | 125 +- .../src/plugin/createNextIntlPlugin.tsx | 6 +- .../src/plugin/extractor/extractionLoader.tsx | 3 +- .../extractor/initExtractionCompiler.tsx | 8 +- .../next-intl/src/plugin/getNextConfig.tsx | 11 +- packages/next-intl/src/plugin/types.tsx | 2 +- packages/swc-plugin-extractor/src/lib.rs | 22 +- .../release/swc_plugin_extractor.wasm | Bin 1270681 -> 1271265 bytes pnpm-lock.yaml | 4819 +++++++++++++++-- pnpm-workspace.yaml | 2 + 102 files changed, 6403 insertions(+), 572 deletions(-) create mode 100644 examples/example-expo-monorepo/README.md create mode 100644 examples/example-expo-monorepo/apps/mobile/.gitignore create mode 100644 examples/example-expo-monorepo/apps/mobile/app.json create mode 100644 examples/example-expo-monorepo/apps/mobile/metro.config.js create mode 100644 examples/example-expo-monorepo/apps/mobile/package.json create mode 100644 examples/example-expo-monorepo/apps/mobile/scripts/extract-messages.mjs create mode 100644 examples/example-expo-monorepo/apps/mobile/src/app/_layout.tsx create mode 100644 examples/example-expo-monorepo/apps/mobile/src/app/index.tsx create mode 100644 examples/example-expo-monorepo/apps/mobile/src/i18n/intl-provider-shell.tsx create mode 100644 examples/example-expo-monorepo/apps/mobile/src/i18n/locale-context.tsx create mode 100644 examples/example-expo-monorepo/apps/mobile/src/i18n/po-modules.d.ts create mode 100644 examples/example-expo-monorepo/apps/mobile/tsconfig.json create mode 100644 examples/example-expo-monorepo/apps/web/next-env.d.ts create mode 100644 examples/example-expo-monorepo/apps/web/next.config.ts create mode 100644 examples/example-expo-monorepo/apps/web/package.json create mode 100644 examples/example-expo-monorepo/apps/web/scripts/extract-messages.mjs create mode 100644 examples/example-expo-monorepo/apps/web/src/app/greeting-card.tsx create mode 100644 examples/example-expo-monorepo/apps/web/src/app/layout.tsx create mode 100644 examples/example-expo-monorepo/apps/web/src/app/locale-switcher-card.tsx create mode 100644 examples/example-expo-monorepo/apps/web/src/app/page.tsx create mode 100644 examples/example-expo-monorepo/apps/web/src/i18n/locale-action-context.tsx create mode 100644 examples/example-expo-monorepo/apps/web/src/i18n/po-modules.d.ts create mode 100644 examples/example-expo-monorepo/apps/web/src/i18n/request.ts create mode 100644 examples/example-expo-monorepo/apps/web/tsconfig.json create mode 100644 examples/example-expo-monorepo/messages/de.po create mode 100644 examples/example-expo-monorepo/messages/en.po create mode 100644 examples/example-expo-monorepo/package.json create mode 100644 examples/example-expo-monorepo/packages/ui/package.json create mode 100644 examples/example-expo-monorepo/packages/ui/src/greeting.tsx create mode 100644 examples/example-expo-monorepo/packages/ui/src/index.tsx create mode 100644 examples/example-expo-monorepo/packages/ui/src/locale-switcher.tsx create mode 100644 examples/example-expo-monorepo/packages/ui/tsconfig.json create mode 100644 examples/example-expo-monorepo/scripts/extract.mjs create mode 100644 packages/expo-intl/.gitignore create mode 100644 packages/expo-intl/eslint.config.mjs create mode 100644 packages/expo-intl/extractor.d.ts create mode 100644 packages/expo-intl/package.json create mode 100644 packages/expo-intl/plugin.d.cts create mode 100644 packages/expo-intl/plugin.d.ts create mode 100644 packages/expo-intl/rollup.config.js create mode 100644 packages/expo-intl/src/extractor.tsx create mode 100644 packages/expo-intl/src/index.tsx create mode 100644 packages/expo-intl/src/plugin.tsx create mode 100644 packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx create mode 100644 packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx create mode 100644 packages/expo-intl/src/plugin/transformer.tsx create mode 100644 packages/expo-intl/src/plugin/types.tsx create mode 100644 packages/expo-intl/src/plugin/utils.tsx create mode 100644 packages/expo-intl/src/types-vendor.d.ts create mode 100644 packages/expo-intl/transformer.d.cts create mode 100644 packages/expo-intl/tsconfig.build.json create mode 100644 packages/expo-intl/tsconfig.json create mode 100644 packages/intl-extractor/.gitignore create mode 100644 packages/intl-extractor/eslint.config.mjs create mode 100644 packages/intl-extractor/package.json create mode 100644 packages/intl-extractor/rollup.config.js rename packages/{next-intl/src/extractor => intl-extractor/src}/ExtractionCompiler.test.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/ExtractionCompiler.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/catalog/CatalogLocales.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/catalog/CatalogManager.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/catalog/CatalogPersister.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/catalog/SaveScheduler.tsx (100%) create mode 100644 packages/intl-extractor/src/compile-catalog.tsx rename packages/{next-intl/src/extractor => intl-extractor/src}/extractMessages.tsx (86%) rename packages/{next-intl/src/extractor => intl-extractor/src}/extractor/LRUCache.test.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/extractor/LRUCache.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/extractor/MessageExtractor.bench.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/extractor/MessageExtractor.test.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/extractor/MessageExtractor.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/ExtractorCodec.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/codecs/JSONCodec.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/codecs/POCodec.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/codecs/fixtures/JSONCodecStructured.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/codecs/fixtures/POCodecSourceMessageKey.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/index.tsx (96%) rename packages/{next-intl/src/extractor => intl-extractor/src}/format/types.tsx (100%) create mode 100644 packages/intl-extractor/src/index.tsx rename packages/{next-intl/src/extractor => intl-extractor/src}/normalizeExtractorConfig.tsx (97%) rename packages/{next-intl/src/extractor => intl-extractor/src}/source/SourceFileFilter.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/source/SourceFileScanner.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/source/SourceFileWatcher.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/types.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/utils.test.tsx (100%) rename packages/{next-intl/src/extractor => intl-extractor/src}/utils.tsx (91%) create mode 100644 packages/intl-extractor/tsconfig.build.json create mode 100644 packages/intl-extractor/tsconfig.json create mode 100644 packages/intl-extractor/vitest.config.mts delete mode 100644 packages/next-intl/src/extractor/index.tsx diff --git a/.gitignore b/.gitignore index 0aad80fbd..f1c90c07c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,9 @@ dist/ .next/ tsconfig.tsbuildinfo .turbo -.swc \ No newline at end of file +.swc +/examples/example-expo/.claude +/examples/example-expo-monorepo/apps/mobile/.expo +/examples/example-expo-monorepo/apps/mobile/android +/examples/example-expo-monorepo/apps/mobile/ios +/examples/example-expo/ios diff --git a/examples/example-expo-monorepo/README.md b/examples/example-expo-monorepo/README.md new file mode 100644 index 000000000..98865a51f --- /dev/null +++ b/examples/example-expo-monorepo/README.md @@ -0,0 +1,52 @@ +# example-expo-monorepo + +Two apps + one shared UI package + one shared message catalog: + +- `apps/mobile` — Expo + `expo-intl` +- `apps/web` — Next.js + `next-intl` +- `packages/ui` — shared React component library that uses `useExtracted` +- `messages/{en,de}.po` — single source of truth for every translation + +The shared package imports `_useExtracted as useExtracted` from `use-intl/react`. The SWC plugin recognizes that import source, so calls inside `packages/ui` get the same compile-time rewrite as calls inside the apps themselves. + +``` +examples/example-expo-monorepo/ +├── messages/{en,de}.po # everything lives here +├── scripts/extract.mjs # workspace-wide extraction +├── apps/ +│ ├── mobile/ # no messages dir of its own +│ └── web/ # no messages dir of its own +└── packages/ + └── ui/ # , +``` + +## How catalogs are shared + +Every translation lives in exactly one file: `messages/{en,de}.po` at the workspace root. There are no per-app or per-package catalogs. + +- Each app's bundler plugin is configured with `messages.path: '../../messages'` and `srcPath: ['./src', '..//src', '../../packages/ui/src']`. Because each app's `srcPath` is the union of every source location, both apps produce the same catalog when they extract. +- Each app's runtime imports the single workspace catalog (no merge step). +- `pnpm extract` at the root re-extracts the full set without booting either dev server. + +That means there's exactly one place to translate any string — `messages/de.po` — regardless of which app renders it. + +## Try it + +From the next-intl repo root: + +```bash +pnpm install + +# One-shot: re-extract everything in the workspace +pnpm -F example-expo-monorepo extract + +# Or rely on the per-app dev watchers (either works; they extract the same set) +pnpm -F mobile-app start # expo start +pnpm -F web-app dev # next dev +``` + +The same `` from `packages/ui/src/greeting.tsx` renders translated copy in both apps, driven by the workspace-level catalog. + +## ICU features and React Native + +The demo deliberately uses only placeholders (`{name}`) and rich-text tags (`...`) because they require no `Intl.*` runtime support. If you want to use plural / select / number / date formatting (`{count, plural, ...}`, `{value, number}`, etc.) in your own components, the bundled Hermes engine may need polyfills depending on the platform and SDK version. Install the relevant `@formatjs/intl-*` packages (`intl-pluralrules`, `intl-numberformat`, `intl-datetimeformat`, ...) and import them at the top of your Expo entry file before any component calls `useExtracted`. diff --git a/examples/example-expo-monorepo/apps/mobile/.gitignore b/examples/example-expo-monorepo/apps/mobile/.gitignore new file mode 100644 index 000000000..5873d9abc --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/.gitignore @@ -0,0 +1,6 @@ + +# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb +# The following patterns were generated by expo-cli + +expo-env.d.ts +# @end expo-cli \ No newline at end of file diff --git a/examples/example-expo-monorepo/apps/mobile/app.json b/examples/example-expo-monorepo/apps/mobile/app.json new file mode 100644 index 000000000..246bf6055 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/app.json @@ -0,0 +1,23 @@ +{ + "expo": { + "name": "mobile-app", + "slug": "example-expo-monorepo-mobile", + "version": "1.0.0", + "scheme": "mobileapp", + "orientation": "portrait", + "userInterfaceStyle": "automatic", + "newArchEnabled": true, + "ios": { + "supportsTablet": true, + "bundleIdentifier": "dev.amann.example.expo.monorepo" + }, + "android": { + "edgeToEdgeEnabled": true, + "package": "dev.amann.example.expo.monorepo" + }, + "plugins": ["expo-router"], + "experiments": { + "typedRoutes": true + } + } +} diff --git a/examples/example-expo-monorepo/apps/mobile/metro.config.js b/examples/example-expo-monorepo/apps/mobile/metro.config.js new file mode 100644 index 000000000..3fc7ada56 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/metro.config.js @@ -0,0 +1,21 @@ +// Learn more https://docs.expo.dev/guides/customizing-metro +const {getDefaultConfig} = require('expo/metro-config'); +const createExpoIntlPlugin = require('expo-intl/plugin'); + +const withExpoIntl = createExpoIntlPlugin({ + experimental: { + // Single shared catalog at the workspace root: both apps and the shared + // `packages/ui` write/read from `examples/example-expo-monorepo/messages/`. + extract: {path: '../../messages'}, + srcPath: ['./src', '../web/src', '../../packages/ui/src'], + messages: { + path: '../../messages', + format: 'po', + locales: ['en', 'de'], + sourceLocale: 'en', + precompile: true + } + } +}); + +module.exports = withExpoIntl(getDefaultConfig(__dirname)); diff --git a/examples/example-expo-monorepo/apps/mobile/package.json b/examples/example-expo-monorepo/apps/mobile/package.json new file mode 100644 index 000000000..cd86b0348 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/package.json @@ -0,0 +1,37 @@ +{ + "name": "mobile-app", + "version": "1.0.0", + "private": true, + "main": "expo-router/entry", + "scripts": { + "start": "expo start", + "extract": "node ./scripts/extract-messages.mjs", + "android": "expo run:android", + "ios": "expo run:ios", + "web": "expo start --web" + }, + "dependencies": { + "@example-monorepo/ui": "workspace:*", + "expo": "~55.0.24", + "expo-constants": "~55.0.16", + "expo-intl": "workspace:^", + "expo-linking": "~55.0.15", + "expo-router": "~55.0.14", + "expo-splash-screen": "~55.0.21", + "expo-status-bar": "~55.0.6", + "expo-system-ui": "~55.0.18", + "react": "19.2.0", + "react-dom": "19.2.0", + "react-native": "0.83.6", + "react-native-gesture-handler": "~2.30.0", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", + "react-native-web": "~0.21.0", + "use-intl": "workspace:^" + }, + "devDependencies": { + "@types/react": "~19.2.2", + "intl-extractor": "workspace:^", + "typescript": "~5.9.2" + } +} diff --git a/examples/example-expo-monorepo/apps/mobile/scripts/extract-messages.mjs b/examples/example-expo-monorepo/apps/mobile/scripts/extract-messages.mjs new file mode 100644 index 000000000..a9f8fbb6e --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/scripts/extract-messages.mjs @@ -0,0 +1,18 @@ +#!/usr/bin/env node +// Extracts into the shared workspace catalog. Scans this app's source plus +// the sibling web app and the shared `packages/ui` so a single run produces +// the full set of messages. +import {unstable_extractMessages} from 'intl-extractor'; + +await unstable_extractMessages({ + extract: {path: '../../messages'}, + srcPath: ['./src', '../web/src', '../../packages/ui/src'], + messages: { + path: '../../messages', + format: 'po', + locales: ['en', 'de'], + sourceLocale: 'en' + } +}); + +console.log('Extracted messages into ../../messages/{en,de}.po'); diff --git a/examples/example-expo-monorepo/apps/mobile/src/app/_layout.tsx b/examples/example-expo-monorepo/apps/mobile/src/app/_layout.tsx new file mode 100644 index 000000000..1924d9e12 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/src/app/_layout.tsx @@ -0,0 +1,15 @@ +import {Stack} from 'expo-router'; +import React from 'react'; + +import {IntlProviderShell} from '@/i18n/intl-provider-shell'; +import {LocaleProvider} from '@/i18n/locale-context'; + +export default function RootLayout() { + return ( + + + + + + ); +} diff --git a/examples/example-expo-monorepo/apps/mobile/src/app/index.tsx b/examples/example-expo-monorepo/apps/mobile/src/app/index.tsx new file mode 100644 index 000000000..addcce5f5 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/src/app/index.tsx @@ -0,0 +1,66 @@ +import {useExtracted} from 'expo-intl'; +import {Pressable, StyleSheet, Text, View} from 'react-native'; +import {SafeAreaView} from 'react-native-safe-area-context'; +import {Greeting, LocaleSwitcher} from '@example-monorepo/ui'; + +import {useAppLocale} from '@/i18n/locale-context'; + +export default function HomeScreen() { + const t = useExtracted('home'); + const {locale, setLocale} = useAppLocale(); + + return ( + + + {t('Mobile app — shared UI demo')} + + + {children}} + Strong={({children}) => {children}} + /> + + + + {children}} + Button={({isActive, onPress, children}) => ( + + + {children} + + + )} + /> + + + + ); +} + +const styles = StyleSheet.create({ + safe: {flex: 1, backgroundColor: '#0b1020'}, + container: {flex: 1, padding: 24, gap: 20}, + title: {color: '#fff', fontSize: 24, fontWeight: '600'}, + card: {backgroundColor: '#1c2440', padding: 20, borderRadius: 12}, + body: {color: '#dbe2ff', fontSize: 16, lineHeight: 24}, + strong: {color: '#fff', fontWeight: '700'}, + switcher: {flexDirection: 'row', alignItems: 'center', gap: 12, flexWrap: 'wrap'}, + label: {color: '#aab4d4', fontSize: 14, marginRight: 4}, + chip: { + paddingHorizontal: 14, + paddingVertical: 6, + borderRadius: 999, + borderWidth: 1, + borderColor: '#3a4673' + }, + chipActive: {backgroundColor: '#3c87f7', borderColor: '#3c87f7'}, + chipText: {color: '#dbe2ff', fontSize: 14}, + chipTextActive: {color: '#fff', fontSize: 14, fontWeight: '600'} +}); diff --git a/examples/example-expo-monorepo/apps/mobile/src/i18n/intl-provider-shell.tsx b/examples/example-expo-monorepo/apps/mobile/src/i18n/intl-provider-shell.tsx new file mode 100644 index 000000000..a34a863bf --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/src/i18n/intl-provider-shell.tsx @@ -0,0 +1,37 @@ +import {IntlProvider} from 'expo-intl'; +import React, {useEffect, useState} from 'react'; +import type {SharedLocale} from '@example-monorepo/ui'; + +import {useAppLocale} from './locale-context'; + +type MessageDictionary = Record; + +// Single shared catalog at the workspace root. Both apps and the shared +// `packages/ui` source live in the same .po file. +const loadMessages: Record Promise<{default: MessageDictionary}>> = { + en: () => import('../../../../messages/en.po'), + de: () => import('../../../../messages/de.po') +}; + +export function IntlProviderShell({children}: {readonly children: React.ReactNode}) { + const {locale} = useAppLocale(); + const [messages, setMessages] = useState(null); + + useEffect(() => { + let cancelled = false; + loadMessages[locale]().then((mod) => { + if (!cancelled) setMessages(mod.default); + }); + return () => { + cancelled = true; + }; + }, [locale]); + + if (!messages) return null; + + return ( + + {children} + + ); +} diff --git a/examples/example-expo-monorepo/apps/mobile/src/i18n/locale-context.tsx b/examples/example-expo-monorepo/apps/mobile/src/i18n/locale-context.tsx new file mode 100644 index 000000000..1dc8b6c8e --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/src/i18n/locale-context.tsx @@ -0,0 +1,29 @@ +import React, {createContext, useContext, useMemo, useState} from 'react'; +import type {SharedLocale} from '@example-monorepo/ui'; + +interface LocaleContextValue { + readonly locale: SharedLocale; + readonly setLocale: (locale: SharedLocale) => void; +} + +const LocaleContext = createContext(null); + +export function LocaleProvider({ + children, + initialLocale = 'en' +}: { + readonly children: React.ReactNode; + readonly initialLocale?: SharedLocale; +}) { + const [locale, setLocale] = useState(initialLocale); + const value = useMemo(() => ({locale, setLocale}), [locale]); + return {children}; +} + +export function useAppLocale(): LocaleContextValue { + const ctx = useContext(LocaleContext); + if (!ctx) { + throw new Error('useAppLocale must be used inside '); + } + return ctx; +} diff --git a/examples/example-expo-monorepo/apps/mobile/src/i18n/po-modules.d.ts b/examples/example-expo-monorepo/apps/mobile/src/i18n/po-modules.d.ts new file mode 100644 index 000000000..f129ec233 --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/src/i18n/po-modules.d.ts @@ -0,0 +1,4 @@ +declare module '*.po' { + const messages: Record; + export default messages; +} diff --git a/examples/example-expo-monorepo/apps/mobile/tsconfig.json b/examples/example-expo-monorepo/apps/mobile/tsconfig.json new file mode 100644 index 000000000..b9e90728c --- /dev/null +++ b/examples/example-expo-monorepo/apps/mobile/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "expo-env.d.ts", + ".expo/types/**/*.ts" + ] +} diff --git a/examples/example-expo-monorepo/apps/web/next-env.d.ts b/examples/example-expo-monorepo/apps/web/next-env.d.ts new file mode 100644 index 000000000..c4b7818fb --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +import "./.next/dev/types/routes.d.ts"; + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/example-expo-monorepo/apps/web/next.config.ts b/examples/example-expo-monorepo/apps/web/next.config.ts new file mode 100644 index 000000000..75495ff80 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/next.config.ts @@ -0,0 +1,25 @@ +import type {NextConfig} from 'next'; +import createNextIntlPlugin from 'next-intl/plugin'; + +const withNextIntl = createNextIntlPlugin({ + experimental: { + // Single shared catalog at the workspace root: both apps and the shared + // `packages/ui` write/read from `examples/example-expo-monorepo/messages/`. + extract: {path: '../../messages'}, + srcPath: ['./src', '../mobile/src', '../../packages/ui/src'], + messages: { + path: '../../messages', + format: 'po', + locales: ['en', 'de'], + sourceLocale: 'en', + precompile: true + } + } +}); + +const config: NextConfig = { + // `@example-monorepo/ui` ships TSX directly — let Next.js transpile it. + transpilePackages: ['@example-monorepo/ui'] +}; + +export default withNextIntl(config); diff --git a/examples/example-expo-monorepo/apps/web/package.json b/examples/example-expo-monorepo/apps/web/package.json new file mode 100644 index 000000000..1239d031f --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/package.json @@ -0,0 +1,27 @@ +{ + "name": "web-app", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "extract": "node ./scripts/extract-messages.mjs" + }, + "dependencies": { + "@example-monorepo/ui": "workspace:*", + "next": "^16.2.2", + "next-intl": "workspace:^", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "use-intl": "workspace:^" + }, + "devDependencies": { + "@types/node": "^20.14.5", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "intl-extractor": "workspace:^", + "typescript": "^6.0.0" + } +} diff --git a/examples/example-expo-monorepo/apps/web/scripts/extract-messages.mjs b/examples/example-expo-monorepo/apps/web/scripts/extract-messages.mjs new file mode 100644 index 000000000..9641e6544 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/scripts/extract-messages.mjs @@ -0,0 +1,18 @@ +#!/usr/bin/env node +// Extracts into the shared workspace catalog. Scans this app's source plus +// the sibling mobile app and the shared `packages/ui` so a single run produces +// the full set of messages. +import {unstable_extractMessages} from 'next-intl/extractor'; + +await unstable_extractMessages({ + extract: {path: '../../messages'}, + srcPath: ['./src', '../mobile/src', '../../packages/ui/src'], + messages: { + path: '../../messages', + format: 'po', + locales: ['en', 'de'], + sourceLocale: 'en' + } +}); + +console.log('Extracted messages into ../../messages/{en,de}.po'); diff --git a/examples/example-expo-monorepo/apps/web/src/app/greeting-card.tsx b/examples/example-expo-monorepo/apps/web/src/app/greeting-card.tsx new file mode 100644 index 000000000..716e56d71 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/app/greeting-card.tsx @@ -0,0 +1,14 @@ +'use client'; + +import {Greeting} from '@example-monorepo/ui'; + +export function GreetingCard({name, unreadCount}: {readonly name: string; readonly unreadCount: number}) { + return ( +

{children}

} + Strong={({children}) => {children}} + /> + ); +} diff --git a/examples/example-expo-monorepo/apps/web/src/app/layout.tsx b/examples/example-expo-monorepo/apps/web/src/app/layout.tsx new file mode 100644 index 000000000..356a1a666 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/app/layout.tsx @@ -0,0 +1,28 @@ +import {NextIntlClientProvider} from 'next-intl'; +import {getLocale} from 'next-intl/server'; +import {cookies} from 'next/headers'; +import type {ReactNode} from 'react'; + +import {LocaleActionContextProvider} from '@/i18n/locale-action-context'; + +export default async function RootLayout({children}: {readonly children: ReactNode}) { + const locale = await getLocale(); + + async function setLocaleAction(next: string) { + 'use server'; + const store = await cookies(); + store.set('locale', next === 'de' ? 'de' : 'en'); + } + + return ( + + + + + {children} + + + + + ); +} diff --git a/examples/example-expo-monorepo/apps/web/src/app/locale-switcher-card.tsx b/examples/example-expo-monorepo/apps/web/src/app/locale-switcher-card.tsx new file mode 100644 index 000000000..f5f1dc188 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/app/locale-switcher-card.tsx @@ -0,0 +1,46 @@ +'use client'; + +import {useLocale} from 'next-intl'; +import {LocaleSwitcher, type SharedLocale} from '@example-monorepo/ui'; + +import {useLocaleAction} from '@/i18n/locale-action-context'; + +export function LocaleSwitcherCard() { + const currentLocale = useLocale() as SharedLocale; + const {setLocale, isPending} = useLocaleAction(); + + return ( +
+ ( + {children} + )} + Button={({isActive, onPress, children}) => ( + + )} + /> +
+ ); +} diff --git a/examples/example-expo-monorepo/apps/web/src/app/page.tsx b/examples/example-expo-monorepo/apps/web/src/app/page.tsx new file mode 100644 index 000000000..b6366f9db --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/app/page.tsx @@ -0,0 +1,26 @@ +import {useExtracted} from 'next-intl'; + +import {GreetingCard} from './greeting-card'; +import {LocaleSwitcherCard} from './locale-switcher-card'; + +export default function HomePage() { + const t = useExtracted('home'); + + return ( +
+

{t('Web app — shared UI demo')}

+ +
+ +
+ + +
+ ); +} diff --git a/examples/example-expo-monorepo/apps/web/src/i18n/locale-action-context.tsx b/examples/example-expo-monorepo/apps/web/src/i18n/locale-action-context.tsx new file mode 100644 index 000000000..579109d8e --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/i18n/locale-action-context.tsx @@ -0,0 +1,45 @@ +'use client'; + +import {createContext, useContext, useTransition} from 'react'; +import {useRouter} from 'next/navigation'; +import type {ReactNode} from 'react'; +import type {SharedLocale} from '@example-monorepo/ui'; + +interface LocaleActionContextValue { + readonly setLocale: (next: SharedLocale) => void; + readonly isPending: boolean; +} + +const LocaleActionContext = createContext(null); + +export function LocaleActionContextProvider({ + children, + setLocaleAction +}: { + readonly children: ReactNode; + readonly setLocaleAction: (next: string) => Promise; +}) { + const router = useRouter(); + const [isPending, startTransition] = useTransition(); + + function setLocale(next: SharedLocale): void { + startTransition(async () => { + await setLocaleAction(next); + router.refresh(); + }); + } + + return ( + + {children} + + ); +} + +export function useLocaleAction(): LocaleActionContextValue { + const ctx = useContext(LocaleActionContext); + if (!ctx) { + throw new Error('useLocaleAction must be used inside '); + } + return ctx; +} diff --git a/examples/example-expo-monorepo/apps/web/src/i18n/po-modules.d.ts b/examples/example-expo-monorepo/apps/web/src/i18n/po-modules.d.ts new file mode 100644 index 000000000..f129ec233 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/i18n/po-modules.d.ts @@ -0,0 +1,4 @@ +declare module '*.po' { + const messages: Record; + export default messages; +} diff --git a/examples/example-expo-monorepo/apps/web/src/i18n/request.ts b/examples/example-expo-monorepo/apps/web/src/i18n/request.ts new file mode 100644 index 000000000..e86519c59 --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/src/i18n/request.ts @@ -0,0 +1,12 @@ +import {getRequestConfig} from 'next-intl/server'; +import {cookies} from 'next/headers'; + +export default getRequestConfig(async () => { + const store = await cookies(); + const locale = store.get('locale')?.value === 'de' ? 'de' : 'en'; + + // Single shared catalog at the workspace root. Strings from this app, the + // sibling Expo app, and the shared `packages/ui` all live in one .po file. + const messages = (await import(`../../../../messages/${locale}.po`)).default; + return {locale, messages}; +}); diff --git a/examples/example-expo-monorepo/apps/web/tsconfig.json b/examples/example-expo-monorepo/apps/web/tsconfig.json new file mode 100644 index 000000000..7bbb10fdf --- /dev/null +++ b/examples/example-expo-monorepo/apps/web/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/examples/example-expo-monorepo/messages/de.po b/examples/example-expo-monorepo/messages/de.po new file mode 100644 index 000000000..06f2665ff --- /dev/null +++ b/examples/example-expo-monorepo/messages/de.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Language: de\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: next-intl\n" +"X-Crowdin-SourceKey: msgstr\n" + +#: ../../packages/ui/src/greeting.tsx +msgctxt "shared-ui.greeting" +msgid "Vl1vzv" +msgstr "" + +#: ../../packages/ui/src/greeting.tsx +msgctxt "shared-ui.greeting" +msgid "Wzy5/1" +msgstr "" + +#: ../../packages/ui/src/locale-switcher.tsx +msgctxt "shared-ui.locale-switcher" +msgid "y1Z3or" +msgstr "" + +#: ../mobile/src/app/index.tsx +msgctxt "home" +msgid "QOAwWZ" +msgstr "" + +#: src/app/page.tsx +msgctxt "home" +msgid "7yl+zD" +msgstr "" diff --git a/examples/example-expo-monorepo/messages/en.po b/examples/example-expo-monorepo/messages/en.po new file mode 100644 index 000000000..b03bfaa07 --- /dev/null +++ b/examples/example-expo-monorepo/messages/en.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Language: en\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: next-intl\n" +"X-Crowdin-SourceKey: msgstr\n" + +#: ../../packages/ui/src/greeting.tsx +msgctxt "shared-ui.greeting" +msgid "Vl1vzv" +msgstr "Hej på dig " + +#: ../../packages/ui/src/greeting.tsx +msgctxt "shared-ui.greeting" +msgid "Wzy5/1" +msgstr "Hello {name}, you have {count} unread messages." + +#: ../../packages/ui/src/locale-switcher.tsx +msgctxt "shared-ui.locale-switcher" +msgid "y1Z3or" +msgstr "Language" + +#: ../mobile/src/app/index.tsx +msgctxt "home" +msgid "QOAwWZ" +msgstr "Mobile app — shared UI demo" + +#: src/app/page.tsx +msgctxt "home" +msgid "7yl+zD" +msgstr "Web app — shared UI demo" diff --git a/examples/example-expo-monorepo/package.json b/examples/example-expo-monorepo/package.json new file mode 100644 index 000000000..752ab83e1 --- /dev/null +++ b/examples/example-expo-monorepo/package.json @@ -0,0 +1,12 @@ +{ + "name": "example-expo-monorepo", + "version": "1.0.0", + "private": true, + "description": "Monorepo example: one shared UI package consumed by an Expo (`expo-intl`) app and a Next.js (`next-intl`) app, all extracted by a single SWC pipeline.", + "scripts": { + "extract": "node ./scripts/extract.mjs" + }, + "devDependencies": { + "intl-extractor": "workspace:^" + } +} diff --git a/examples/example-expo-monorepo/packages/ui/package.json b/examples/example-expo-monorepo/packages/ui/package.json new file mode 100644 index 000000000..ccaf0649a --- /dev/null +++ b/examples/example-expo-monorepo/packages/ui/package.json @@ -0,0 +1,21 @@ +{ + "name": "@example-monorepo/ui", + "version": "1.0.0", + "private": true, + "description": "Shared UI components consumed by both the Next.js and Expo apps. Uses `_useExtracted as useExtracted` from `use-intl/react` so it works across bundlers.", + "main": "./src/index.tsx", + "types": "./src/index.tsx", + "exports": { + ".": "./src/index.tsx", + "./greeting": "./src/greeting.tsx", + "./locale-switcher": "./src/locale-switcher.tsx" + }, + "peerDependencies": { + "react": ">=18", + "use-intl": "*" + }, + "devDependencies": { + "@types/react": "^19.2.14", + "typescript": "^6.0.0" + } +} diff --git a/examples/example-expo-monorepo/packages/ui/src/greeting.tsx b/examples/example-expo-monorepo/packages/ui/src/greeting.tsx new file mode 100644 index 000000000..a270084b1 --- /dev/null +++ b/examples/example-expo-monorepo/packages/ui/src/greeting.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { _useExtracted as useExtracted } from 'use-intl/react'; +import type { ReactNode } from 'react'; + +interface GreetingProps { + readonly name: string; + readonly unreadCount?: number; + /** + * The component is renderer-agnostic — the consumer decides what HTML/native + * element a `` chunk becomes. The mobile app passes `` from + * `react-native`; the web app passes ``. + */ + readonly Text: (props: { readonly children: ReactNode }) => ReactNode; + readonly Strong: (props: { readonly children: ReactNode }) => ReactNode; +} + +/** + * Cross-platform greeting card. The strings here are extracted by both apps + * because each `metro.config.js`/`next.config.ts` includes `../../packages/ui/src` + * in its `srcPath`. + */ +export function Greeting({ name, unreadCount = 0, Text, Strong }: GreetingProps) { + const t = useExtracted('shared-ui.greeting'); + + // Note: we deliberately avoid ICU `{count, plural, …}` here because Hermes + // (the JS engine bundled with Expo) ships without `Intl.PluralRules` on + // some platforms — calling plural format would throw a `FORMATTING_ERROR`. + // For apps that need real plural rules, install `@formatjs/intl-pluralrules` + // and import it in your entry before the IntlProvider is rendered. + return ( + + {t("Hej på dig ")} + {t.rich('Hello {name}, you have {count} unread messages.', { + name, + count: unreadCount, + strong: (chunks) => {chunks} + })} + + ); +} diff --git a/examples/example-expo-monorepo/packages/ui/src/index.tsx b/examples/example-expo-monorepo/packages/ui/src/index.tsx new file mode 100644 index 000000000..262c4fe4d --- /dev/null +++ b/examples/example-expo-monorepo/packages/ui/src/index.tsx @@ -0,0 +1,3 @@ +export {Greeting} from './greeting'; +export {LocaleSwitcher} from './locale-switcher'; +export type {SharedLocale} from './locale-switcher'; diff --git a/examples/example-expo-monorepo/packages/ui/src/locale-switcher.tsx b/examples/example-expo-monorepo/packages/ui/src/locale-switcher.tsx new file mode 100644 index 000000000..94555b384 --- /dev/null +++ b/examples/example-expo-monorepo/packages/ui/src/locale-switcher.tsx @@ -0,0 +1,42 @@ +'use client'; + +import {_useExtracted as useExtracted} from 'use-intl/react'; +import type {ReactNode} from 'react'; + +export type SharedLocale = 'en' | 'de'; + +interface LocaleSwitcherProps { + readonly locale: SharedLocale; + readonly setLocale: (next: SharedLocale) => void; + /** Render an option button. Lets each app decide the platform widget. */ + readonly Button: (props: { + readonly isActive: boolean; + readonly onPress: () => void; + readonly children: ReactNode; + }) => ReactNode; + /** Renderer for the surrounding label. */ + readonly Label: (props: {readonly children: ReactNode}) => ReactNode; +} + +const LOCALES: ReadonlyArray<{readonly id: SharedLocale; readonly flag: string}> = [ + {id: 'en', flag: '🇬🇧'}, + {id: 'de', flag: '🇩🇪'} +]; + +export function LocaleSwitcher({locale, setLocale, Button, Label}: LocaleSwitcherProps) { + const t = useExtracted('shared-ui.locale-switcher'); + + return ( + <> + + {LOCALES.map((option) => ( + + ))} + + ); +} diff --git a/examples/example-expo-monorepo/packages/ui/tsconfig.json b/examples/example-expo-monorepo/packages/ui/tsconfig.json new file mode 100644 index 000000000..ee56c515f --- /dev/null +++ b/examples/example-expo-monorepo/packages/ui/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "esnext"], + "module": "esnext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "esModuleInterop": true, + "isolatedModules": true, + "resolveJsonModule": true + }, + "include": ["src"] +} diff --git a/examples/example-expo-monorepo/scripts/extract.mjs b/examples/example-expo-monorepo/scripts/extract.mjs new file mode 100644 index 000000000..35340dfe2 --- /dev/null +++ b/examples/example-expo-monorepo/scripts/extract.mjs @@ -0,0 +1,21 @@ +#!/usr/bin/env node +// Workspace-level extraction. Scans both apps and the shared `packages/ui` +// and writes a single catalog at `examples/example-expo-monorepo/messages/`. +// +// Equivalent to running either app's `pnpm extract` (each app scans the same +// union of sources). This script just gives you a single entry point that +// doesn't depend on which app you happen to have installed. +import {unstable_extractMessages} from 'intl-extractor'; + +await unstable_extractMessages({ + extract: {path: './messages'}, + srcPath: ['apps/mobile/src', 'apps/web/src', 'packages/ui/src'], + messages: { + path: './messages', + format: 'po', + locales: ['en', 'de'], + sourceLocale: 'en' + } +}); + +console.log('Extracted messages into messages/{en,de}.po'); diff --git a/packages/expo-intl/.gitignore b/packages/expo-intl/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/packages/expo-intl/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/expo-intl/eslint.config.mjs b/packages/expo-intl/eslint.config.mjs new file mode 100644 index 000000000..bf53c9626 --- /dev/null +++ b/packages/expo-intl/eslint.config.mjs @@ -0,0 +1,10 @@ +import {getPresets} from 'eslint-config-molindo'; + +export default (await getPresets('typescript')).concat({ + rules: { + '@typescript-eslint/no-explicit-any': 'off', + // Inside `transformer.tsx` we intentionally use a namespace import for + // CJS interop with `@expo/metro-config/babel-transformer`. + 'import/no-namespace': 'off' + } +}); diff --git a/packages/expo-intl/extractor.d.ts b/packages/expo-intl/extractor.d.ts new file mode 100644 index 000000000..6e0958aa9 --- /dev/null +++ b/packages/expo-intl/extractor.d.ts @@ -0,0 +1 @@ +export * from './dist/types/extractor.js'; diff --git a/packages/expo-intl/package.json b/packages/expo-intl/package.json new file mode 100644 index 000000000..bce688d9c --- /dev/null +++ b/packages/expo-intl/package.json @@ -0,0 +1,103 @@ +{ + "name": "expo-intl", + "version": "0.1.0", + "sideEffects": false, + "author": "Hugo Persson", + "description": "Internationalization (i18n) for Expo / React Native, with build-time message extraction via Metro.", + "license": "MIT", + "homepage": "https://next-intl.dev", + "repository": { + "type": "git", + "url": "git+https://github.com/amannn/next-intl.git" + }, + "scripts": { + "build": "rm -rf dist && rollup -c", + "test": "TZ=Europe/Berlin vitest", + "lint": "pnpm run lint:source && pnpm run lint:package", + "lint:source": "eslint src && tsc --noEmit", + "lint:package": "publint", + "prepublishOnly": "turbo build" + }, + "type": "module", + "main": "./dist/esm/production/index.js", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "development": "./dist/esm/development/index.js", + "default": "./dist/esm/production/index.js" + }, + "./plugin": { + "import": { + "types": "./dist/types/plugin.d.ts", + "development": "./dist/esm/development/plugin.js", + "default": "./dist/esm/production/plugin.js" + }, + "require": { + "types": "./plugin.d.cts", + "default": "./dist/cjs/development/plugin.cjs" + }, + "default": "./dist/esm/production/plugin.js" + }, + "./transformer": { + "require": { + "types": "./transformer.d.cts", + "default": "./dist/cjs/production/transformer.cjs" + }, + "default": "./dist/cjs/production/transformer.cjs" + }, + "./extractor": { + "types": "./dist/types/extractor.d.ts", + "development": "./dist/esm/development/extractor.js", + "default": "./dist/esm/production/extractor.js" + } + }, + "files": [ + "dist", + "plugin.d.ts", + "plugin.d.cts", + "transformer.d.cts", + "extractor.d.ts" + ], + "keywords": [ + "react-native", + "expo", + "intl", + "i18n", + "internationalization", + "localization", + "translate", + "translation", + "metro" + ], + "dependencies": { + "icu-minify": "workspace:^", + "intl-extractor": "workspace:^", + "use-intl": "workspace:^" + }, + "peerDependencies": { + "expo": ">=51", + "react": ">=18", + "react-native": ">=0.74" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "react-native": { + "optional": true + } + }, + "devDependencies": { + "@types/node": "^20.14.5", + "eslint": "9.11.1", + "eslint-config-molindo": "^8.0.0", + "publint": "^0.2.8", + "react": "^19.2.3", + "rollup": "^4.18.0", + "tools": "workspace:^", + "typescript": "^6.0.0", + "vitest": "^3.0.8" + }, + "prettier": "eslint-config-molindo/.prettierrc.json" +} diff --git a/packages/expo-intl/plugin.d.cts b/packages/expo-intl/plugin.d.cts new file mode 100644 index 000000000..6cc3f652d --- /dev/null +++ b/packages/expo-intl/plugin.d.cts @@ -0,0 +1,2 @@ +import type {default as createExpoIntlPlugin} from './dist/types/plugin.js'; +export = createExpoIntlPlugin; diff --git a/packages/expo-intl/plugin.d.ts b/packages/expo-intl/plugin.d.ts new file mode 100644 index 000000000..c4713be69 --- /dev/null +++ b/packages/expo-intl/plugin.d.ts @@ -0,0 +1,2 @@ +export * from './dist/types/plugin.js'; +export {default} from './dist/types/plugin.js'; diff --git a/packages/expo-intl/rollup.config.js b/packages/expo-intl/rollup.config.js new file mode 100644 index 000000000..4d946909e --- /dev/null +++ b/packages/expo-intl/rollup.config.js @@ -0,0 +1,59 @@ +import {getBuildConfig} from 'tools'; +import pkg from './package.json' with {type: 'json'}; + +const sharedExternal = [ + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.peerDependencies), + 'react/jsx-runtime', + 'use-intl/core', + 'use-intl/react', + 'icu-minify/compile', + 'intl-extractor', + 'intl-extractor/compile-catalog', + '@expo/metro-config/babel-transformer' +]; + +export default [ + // ESM (runtime + plugin + extractor entry points) + ...getBuildConfig({ + input: { + index: 'src/index.tsx', + plugin: 'src/plugin.tsx', + extractor: 'src/extractor.tsx' + }, + external: sharedExternal, + output: { + preserveModules: true + } + }), + // CJS plugin entry (Metro `metro.config.js` is CJS in Expo apps) + ...getBuildConfig({ + env: ['development'], + input: { + plugin: 'src/plugin.tsx' + }, + external: sharedExternal, + output: { + dir: 'dist/cjs/development', + format: 'cjs', + entryFileNames: '[name].cjs', + chunkFileNames: '[name]-[hash].cjs', + interop: 'compat' + } + }), + // CJS transformer entry (Metro `babelTransformerPath` MUST resolve to CJS) + ...getBuildConfig({ + env: ['production'], + input: { + transformer: 'src/plugin/transformer.tsx' + }, + external: sharedExternal, + output: { + dir: 'dist/cjs/production', + format: 'cjs', + entryFileNames: '[name].cjs', + chunkFileNames: '[name]-[hash].cjs', + interop: 'compat' + } + }) +]; diff --git a/packages/expo-intl/src/extractor.tsx b/packages/expo-intl/src/extractor.tsx new file mode 100644 index 000000000..28c23af23 --- /dev/null +++ b/packages/expo-intl/src/extractor.tsx @@ -0,0 +1,8 @@ +/** + * Re-exports the build-time extraction API so workspace packages can run + * extraction without going through Metro (e.g. in a shared UI package + * with its own messages catalog). + * + * Matches `next-intl/extractor`. + */ +export {defineCodec, unstable_extractMessages} from 'intl-extractor'; diff --git a/packages/expo-intl/src/index.tsx b/packages/expo-intl/src/index.tsx new file mode 100644 index 000000000..ac889893c --- /dev/null +++ b/packages/expo-intl/src/index.tsx @@ -0,0 +1,18 @@ +/** + * Runtime entry for `expo-intl`. Mirrors `next-intl`'s react-client surface + * (https://github.com/amannn/next-intl/blob/main/packages/next-intl/src/react-client/index.tsx), + * minus the Next.js-specific provider — Expo Router renders all code as + * client components, so `IntlProvider` from `use-intl/react` is sufficient. + */ + +export * from 'use-intl/core'; +export { + IntlProvider, + useFormatter, + useLocale, + useMessages, + useNow, + useTimeZone, + useTranslations +} from 'use-intl/react'; +export {_useExtracted as useExtracted} from 'use-intl/react'; diff --git a/packages/expo-intl/src/plugin.tsx b/packages/expo-intl/src/plugin.tsx new file mode 100644 index 000000000..56767e443 --- /dev/null +++ b/packages/expo-intl/src/plugin.tsx @@ -0,0 +1,2 @@ +export {default} from './plugin/createExpoIntlPlugin.js'; +export type {MetroConfig, PluginConfig} from './plugin/types.js'; diff --git a/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx new file mode 100644 index 000000000..6d45a66ef --- /dev/null +++ b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx @@ -0,0 +1,238 @@ +import {createRequire} from 'module'; +import path from 'path'; +import { + type ExtractorConfig, + getFormatExtension, + normalizeExtractorConfig, + normalizeMessagesCatalogPaths +} from 'intl-extractor'; +import initExtractionCompiler from './extractor/initExtractionCompiler.js'; +import type { + MetroConfig, + PluginConfig, + SerializedTransformerOptions +} from './types.js'; +import {findWorkspaceRoot, throwError, warn} from './utils.js'; + +const requireFn = createRequire(import.meta.url); + +const TRANSFORMER_ENV_VAR = '_EXPO_INTL_TRANSFORMER_OPTIONS'; +const TRANSFORMER_REQUIRE_PATH = 'expo-intl/transformer'; + +/** + * When `precompile: true`, catalogs are compiled to ICU ASTs at build time. + * The standard `use-intl/format-message` runtime expects raw strings and + * throws `INVALID_MESSAGE` on arrays, so we redirect to the lightweight + * `format-only` runtime that knows how to render precompiled ASTs. + * + * Mirrors the alias set up by `next-intl`'s `getNextConfig` for Webpack/Turbopack. + */ +const FORMAT_MESSAGE_SPECIFIER = 'use-intl/format-message'; +const FORMAT_ONLY_SPECIFIER = 'use-intl/format-message/format-only'; + +/** + * Creates an Expo / Metro plugin for `expo-intl`. Signature mirrors + * `createNextIntlPlugin` so configs are portable between Next.js and Expo. + * + * Usage in `metro.config.js`: + * + * ```js + * const { getDefaultConfig } = require('expo/metro-config'); + * const createExpoIntlPlugin = require('expo-intl/plugin').default; + * + * const withExpoIntl = createExpoIntlPlugin({ + * experimental: { + * extract: true, + * srcPath: './src', + * messages: { + * path: './messages', + * format: 'po', + * locales: ['en', 'de'], + * sourceLocale: 'en', + * precompile: true + * } + * } + * }); + * + * module.exports = withExpoIntl(getDefaultConfig(__dirname)); + * ``` + */ +export default function createExpoIntlPlugin( + pluginConfig: PluginConfig = {} +): (metroConfig: MetroConfig) => MetroConfig { + return function withExpoIntl(metroConfig: MetroConfig): MetroConfig { + const projectRoot = process.cwd(); + const isDevelopment = process.env['NODE_ENV'] !== 'production'; + + let extractorConfig: ExtractorConfig | undefined; + const experimental = pluginConfig.experimental; + if (experimental?.extract) { + extractorConfig = normalizeExtractorConfig({ + extract: experimental.extract, + messages: experimental.messages, + srcPath: experimental.srcPath + }); + } + + initExtractionCompiler(extractorConfig, {projectRoot, isDevelopment}); + + return applyMetroConfig({ + metroConfig, + pluginConfig, + extractorConfig, + projectRoot, + isDevelopment + }); + }; +} + +function applyMetroConfig(args: { + metroConfig: MetroConfig; + pluginConfig: PluginConfig; + extractorConfig: ExtractorConfig | undefined; + projectRoot: string; + isDevelopment: boolean; +}): MetroConfig { + const {metroConfig, pluginConfig, projectRoot, isDevelopment} = args; + const messages = pluginConfig.experimental?.messages; + if (!messages) { + warn( + "`experimental.messages` is not configured — `expo-intl` won't transform catalog files. " + + 'Add `messages: { path, format, locales, sourceLocale }` to enable.' + ); + return metroConfig; + } + + if (metroConfig.transformer?.babelTransformerPath != null) { + warn( + 'A custom `transformer.babelTransformerPath` is already configured. ' + + '`expo-intl` will replace it and delegate to `@expo/metro-config/babel-transformer`. ' + + 'If you need to chain a different transformer, copy our transformer source into your project.' + ); + } + + const extension = getFormatExtension(messages.format); + const messagesPaths = normalizeMessagesCatalogPaths(messages.path).map( + (dirPath) => path.resolve(projectRoot, dirPath) + ); + + const serialized: SerializedTransformerOptions = { + extract: pluginConfig.experimental?.extract != null, + precompile: messages.precompile === true, + format: typeof messages.format === 'string' ? messages.format : 'custom', + customFormat: + typeof messages.format === 'string' + ? undefined + : { + codec: messages.format.codec, + extension: messages.format.extension + }, + messagesPaths, + extension, + projectRoot, + isDevelopment + }; + + process.env[TRANSFORMER_ENV_VAR] = JSON.stringify(serialized); + + const next: MetroConfig = {...metroConfig}; + + // 1) Wire our custom Babel transformer. + next.transformer = { + ...metroConfig.transformer, + babelTransformerPath: requireTransformerPath() + }; + + // 2) Register the catalog extension (e.g. `po`) so Metro tries to resolve it. + const extWithoutDot = extension.replace(/^\./, ''); + const existingSourceExts = metroConfig.resolver?.sourceExts ?? []; + const sourceExts = existingSourceExts.includes(extWithoutDot) + ? existingSourceExts + : [...existingSourceExts, extWithoutDot]; + + // 3) For monorepos, watch the workspace root + ensure node_modules resolves + // against the repo root as well as the project root. + const watchFolders = new Set(metroConfig.watchFolders ?? []); + const nodeModulesPaths = new Set(metroConfig.resolver?.nodeModulesPaths ?? []); + + const workspaceRoot = findWorkspaceRoot(projectRoot); + if (workspaceRoot && workspaceRoot !== projectRoot) { + watchFolders.add(workspaceRoot); + nodeModulesPaths.add(path.join(workspaceRoot, 'node_modules')); + } + + next.resolver = { + ...metroConfig.resolver, + sourceExts, + nodeModulesPaths: [...nodeModulesPaths] + }; + + // 4) When `precompile: true`, swap `use-intl/format-message` for the + // `format-only` runtime that understands precompiled ICU ASTs. + if (messages.precompile) { + const previousResolveRequest = metroConfig.resolver?.resolveRequest as + | MetroResolveRequest + | undefined; + next.resolver.resolveRequest = createFormatMessageRedirect({ + previousResolveRequest + }); + } + + next.watchFolders = [...watchFolders]; + + if (isDevelopment) { + // No-op; reserved for future dev-mode wiring (e.g. publishing watcher + // events through Metro's HMR channel). + } + + return next; +} + +function requireTransformerPath(): string { + try { + return requireFn.resolve(TRANSFORMER_REQUIRE_PATH); + } catch (error) { + throwError( + `Could not resolve '${TRANSFORMER_REQUIRE_PATH}'. ` + + `Make sure 'expo-intl' is installed.\n${(error as Error).message}` + ); + } +} + +interface MetroResolutionResult { + readonly type: string; + readonly filePath?: string; +} + +interface MetroResolveContext { + readonly originModulePath: string; + /** + * Metro's built-in resolver. Always present inside a `resolveRequest` + * callback; calling it delegates to the default behavior without recursing + * into the user-installed `resolveRequest`. + */ + readonly resolveRequest: MetroResolveRequest; + readonly [key: string]: unknown; +} + +type MetroResolveRequest = ( + context: MetroResolveContext, + moduleName: string, + platform: string | null +) => MetroResolutionResult; + +function createFormatMessageRedirect({ + previousResolveRequest +}: { + readonly previousResolveRequest: MetroResolveRequest | undefined; +}): MetroResolveRequest { + return function resolveRequest(context, moduleName, platform) { + const effectiveName = + moduleName === FORMAT_MESSAGE_SPECIFIER ? FORMAT_ONLY_SPECIFIER : moduleName; + + if (previousResolveRequest) { + return previousResolveRequest(context, effectiveName, platform); + } + return context.resolveRequest(context, effectiveName, platform); + }; +} diff --git a/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx new file mode 100644 index 000000000..96fb00c21 --- /dev/null +++ b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx @@ -0,0 +1,49 @@ +import { + ExtractionCompiler, + type ExtractorConfig, + hasLocalesToExtract +} from 'intl-extractor'; +import {once} from '../utils.js'; + +let compiler: ExtractionCompiler | undefined; + +const runOnce = once('_EXPO_INTL_EXTRACT'); + +/** + * Starts the message extraction watcher in the Metro host process. + * + * In dev: spawns a file watcher that updates message catalogs on save. + * In production builds (`expo export`): runs a single extraction pass. + * + * Mirrors `next-intl/src/plugin/extractor/initExtractionCompiler.tsx` — + * the file watcher is implemented in `intl-extractor` and is bundler + * agnostic, so no Metro-specific wiring is needed here. + */ +export default function initExtractionCompiler( + extractorConfig: ExtractorConfig | undefined, + options: {readonly projectRoot: string; readonly isDevelopment: boolean} +): void { + if (!extractorConfig || !hasLocalesToExtract(extractorConfig)) { + return; + } + + runOnce(() => { + compiler = new ExtractionCompiler(extractorConfig, { + isDevelopment: options.isDevelopment, + projectRoot: options.projectRoot + }); + + // Fire-and-forget: don't block Metro config evaluation. + compiler.extractAll(); + + function cleanup(): void { + if (compiler) { + compiler[Symbol.dispose](); + compiler = undefined; + } + } + process.on('exit', cleanup); + process.on('SIGINT', cleanup); + process.on('SIGTERM', cleanup); + }); +} diff --git a/packages/expo-intl/src/plugin/transformer.tsx b/packages/expo-intl/src/plugin/transformer.tsx new file mode 100644 index 000000000..b78a9aa4c --- /dev/null +++ b/packages/expo-intl/src/plugin/transformer.tsx @@ -0,0 +1,128 @@ +/** + * Metro `babelTransformerPath` target. Chains the upstream Expo babel + * transformer with two extra passes: + * + * 1. If the file is a source file containing a `useExtracted` / + * `getExtracted` call, run `MessageExtractor` (SWC plugin) on it to + * assign stable IDs and rewrite to `useTranslations` calls. + * 2. If the file is a catalog file (`.po` / `.json` inside the configured + * `messages.path`), run `precompileCatalog` to emit a JS module that + * exports the precompiled ICU messages. + * + * Built as CJS so Metro can `require()` it directly. Reads its config from + * `process.env._EXPO_INTL_TRANSFORMER_OPTIONS` because Metro spawns workers + * that don't share closures with the host process. + */ + +import path from 'path'; +import {MessageExtractor} from 'intl-extractor'; +import {precompileCatalog} from 'intl-extractor/compile-catalog'; +import type {SerializedTransformerOptions} from './types.js'; + +// Imported via subpath; resolved by Metro/Node at runtime. +// Namespace import so the CJS module.exports shape is preserved. +import * as upstream from '@expo/metro-config/babel-transformer'; + +interface MetroTransformInput { + readonly src: string; + readonly filename: string; + readonly options: { + readonly sourceMap?: boolean; + readonly [key: string]: unknown; + }; +} + +interface MetroTransformResult { + readonly ast?: unknown; + readonly code?: string; + readonly map?: unknown; +} + +const ENV_VAR = '_EXPO_INTL_TRANSFORMER_OPTIONS'; +const SOURCE_FILE_REGEX = /\.(?:tsx?|jsx?|mjs|cjs)$/; +const NEEDLE_REGEX = /(?:useExtracted|getExtracted)/; + +let cachedOptions: SerializedTransformerOptions | null = null; +let cachedExtractor: MessageExtractor | undefined; + +function getOptions(): SerializedTransformerOptions | null { + if (cachedOptions !== null) return cachedOptions; + const raw = process.env[ENV_VAR]; + if (!raw) return null; + try { + cachedOptions = JSON.parse(raw) as SerializedTransformerOptions; + return cachedOptions; + } catch { + return null; + } +} + +function isCatalogPath( + filename: string, + options: SerializedTransformerOptions +): boolean { + if (!filename.endsWith(options.extension)) return false; + const normalized = path.resolve(filename); + return options.messagesPaths.some((messagesPath) => { + const root = path.resolve(messagesPath); + return normalized === root || normalized.startsWith(root + path.sep); + }); +} + +export async function transform( + input: MetroTransformInput +): Promise { + const options = getOptions(); + if (!options) { + return upstream.transform(input); + } + + // 1) Catalog file → precompile to an ES module via the shared helper. + if (isCatalogPath(input.filename, options)) { + const messages = options.customFormat + ? { + format: { + codec: options.customFormat.codec, + extension: options.customFormat.extension as `.${string}` + }, + precompile: options.precompile + } + : { + format: options.format as 'po' | 'json', + precompile: options.precompile + }; + + const compiledSource = await precompileCatalog(input.src, { + messages, + resourcePath: input.filename, + projectRoot: options.projectRoot + }); + + return upstream.transform({ + ...input, + src: compiledSource + }); + } + + // 2) Source file with useExtracted/getExtracted → run SWC plugin. + if ( + options.extract && + SOURCE_FILE_REGEX.test(input.filename) && + NEEDLE_REGEX.test(input.src) + ) { + cachedExtractor ??= new MessageExtractor({ + isDevelopment: options.isDevelopment, + projectRoot: options.projectRoot, + sourceMap: input.options.sourceMap === true + }); + + const result = await cachedExtractor.extract(input.filename, input.src); + return upstream.transform({ + ...input, + src: result.code + }); + } + + // Default: pass-through. + return upstream.transform(input); +} diff --git a/packages/expo-intl/src/plugin/types.tsx b/packages/expo-intl/src/plugin/types.tsx new file mode 100644 index 000000000..aa2d3fa6b --- /dev/null +++ b/packages/expo-intl/src/plugin/types.tsx @@ -0,0 +1,70 @@ +import type {ExtractorConfigInput} from 'intl-extractor'; + +export interface PluginConfig { + /** + * Configuration for build-time message extraction and runtime catalog + * loading. Mirrors `next-intl`'s `createNextIntlPlugin` shape so that + * configs can be copied directly between Next.js and Expo projects. + */ + experimental?: { + /** + * Relative path(s) to your source code files. Defaults to `./src`. + * Pass an array to include workspace packages, e.g. + * `['./src', '../shared-ui/src']`. + */ + srcPath?: string | Array; + + /** Configuration about your catalogs of messages. */ + messages?: ExtractorConfigInput['messages'] & { + /** + * When enabled, ICU messages are precompiled at build time, resulting + * in smaller bundles and faster message formatting at runtime. + */ + precompile?: boolean; + }; + + /** + * Enables the usage of [`useExtracted`](https://next-intl.dev/docs/usage/extraction). + */ + extract?: ExtractorConfigInput['extract']; + }; +} + +/** + * The subset of the Metro config that we read and mutate. We intentionally + * type this loosely so users do not need to install `metro-config` types + * just to consume `withExpoIntl`. + */ +export type MetroConfig = { + transformer?: { + babelTransformerPath?: string; + [key: string]: unknown; + }; + resolver?: { + sourceExts?: Array; + nodeModulesPaths?: Array; + resolveRequest?: unknown; + [key: string]: unknown; + }; + watchFolders?: Array; + [key: string]: unknown; +}; + +/** + * Serialized plugin state forwarded to Metro worker processes via env vars. + * Workers cannot read closures from the host process, so the transformer + * reconstitutes its config from this payload on first call. + */ +export interface SerializedTransformerOptions { + readonly extract: boolean; + readonly precompile: boolean; + readonly format: string; + readonly customFormat?: { + readonly codec: string; + readonly extension: string; + }; + readonly messagesPaths: ReadonlyArray; + readonly extension: string; + readonly projectRoot: string; + readonly isDevelopment: boolean; +} diff --git a/packages/expo-intl/src/plugin/utils.tsx b/packages/expo-intl/src/plugin/utils.tsx new file mode 100644 index 000000000..6b2543876 --- /dev/null +++ b/packages/expo-intl/src/plugin/utils.tsx @@ -0,0 +1,69 @@ +import fs from 'fs'; +import path from 'path'; + +function formatMessage(message: string): string { + return `\n[expo-intl] ${message}\n`; +} + +export function throwError(message: string): never { + throw new Error(formatMessage(message)); +} + +export function warn(message: string): void { + // eslint-disable-next-line no-console + console.warn(formatMessage(message)); +} + +/** + * Returns a function that runs the provided callback only once per process. + * Metro can evaluate `metro.config.js` multiple times across reloads — this + * guard ensures we only kick off the extraction watcher once. Uses an + * environment variable so it survives module reloads. + */ +export function once(namespace: string): (fn: () => void) => void { + return function runOnce(fn: () => void): void { + if (process.env[namespace] === '1') { + return; + } + process.env[namespace] = '1'; + fn(); + }; +} + +/** + * Walks up from `startDir` looking for a `pnpm-workspace.yaml`, `package.json` + * with a `workspaces` field, or a `lerna.json`. Returns the directory that + * contains the workspace root, or `null` if none is found. + * + * Used to set Metro's `watchFolders` correctly inside a monorepo so symlinked + * workspace packages get watched for changes. + */ +export function findWorkspaceRoot(startDir: string): string | null { + let current = path.resolve(startDir); + const {root} = path.parse(current); + + while (current !== root) { + if ( + fs.existsSync(path.join(current, 'pnpm-workspace.yaml')) || + fs.existsSync(path.join(current, 'lerna.json')) + ) { + return current; + } + + const pkgPath = path.join(current, 'package.json'); + if (fs.existsSync(pkgPath)) { + try { + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { + workspaces?: unknown; + }; + if (pkg.workspaces) return current; + } catch { + // Ignore malformed package.json on the way up. + } + } + + current = path.dirname(current); + } + + return null; +} diff --git a/packages/expo-intl/src/types-vendor.d.ts b/packages/expo-intl/src/types-vendor.d.ts new file mode 100644 index 000000000..ee10b2884 --- /dev/null +++ b/packages/expo-intl/src/types-vendor.d.ts @@ -0,0 +1,11 @@ +declare module '@expo/metro-config/babel-transformer' { + export function transform(input: { + readonly src: string; + readonly filename: string; + readonly options: Record; + }): Promise<{ + readonly ast?: unknown; + readonly code?: string; + readonly map?: unknown; + }>; +} diff --git a/packages/expo-intl/transformer.d.cts b/packages/expo-intl/transformer.d.cts new file mode 100644 index 000000000..6b42a8be4 --- /dev/null +++ b/packages/expo-intl/transformer.d.cts @@ -0,0 +1,12 @@ +declare const transformer: { + transform(input: { + src: string; + filename: string; + options: Record; + }): Promise<{ + ast?: unknown; + code?: string; + map?: unknown; + }>; +}; +export = transformer; diff --git a/packages/expo-intl/tsconfig.build.json b/packages/expo-intl/tsconfig.build.json new file mode 100644 index 000000000..407c2ebcb --- /dev/null +++ b/packages/expo-intl/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.test.tsx", "test"], + "compilerOptions": { + "rootDir": "src", + "noEmit": false, + "outDir": "dist/types", + "emitDeclarationOnly": true + } +} diff --git a/packages/expo-intl/tsconfig.json b/packages/expo-intl/tsconfig.json new file mode 100644 index 000000000..cf4e20f44 --- /dev/null +++ b/packages/expo-intl/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "eslint-config-molindo/tsconfig.json", + "include": ["src", "src/types-vendor.d.ts", "test"], + "compilerOptions": { + "lib": ["dom", "esnext"], + "types": ["node"], + "target": "ES2020", + "declaration": true, + "rootDir": ".", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "jsx": "react-jsx", + "skipLibCheck": true, + "noEmit": true + } +} diff --git a/packages/intl-extractor/.gitignore b/packages/intl-extractor/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/packages/intl-extractor/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/intl-extractor/eslint.config.mjs b/packages/intl-extractor/eslint.config.mjs new file mode 100644 index 000000000..2f6724fc0 --- /dev/null +++ b/packages/intl-extractor/eslint.config.mjs @@ -0,0 +1,7 @@ +import {getPresets} from 'eslint-config-molindo'; + +export default (await getPresets('typescript')).concat({ + rules: { + '@typescript-eslint/no-explicit-any': 'off' + } +}); diff --git a/packages/intl-extractor/package.json b/packages/intl-extractor/package.json new file mode 100644 index 000000000..0fde7085d --- /dev/null +++ b/packages/intl-extractor/package.json @@ -0,0 +1,62 @@ +{ + "name": "intl-extractor", + "version": "4.12.0", + "sideEffects": false, + "author": "Jan Amann ", + "description": "Framework-agnostic message extraction core for next-intl / expo-intl.", + "license": "MIT", + "homepage": "https://next-intl.dev", + "repository": { + "type": "git", + "url": "git+https://github.com/amannn/next-intl.git" + }, + "scripts": { + "build": "rm -rf dist && rollup -c", + "test": "TZ=Europe/Berlin vitest", + "lint": "pnpm run lint:source && pnpm run lint:package", + "lint:source": "eslint src && tsc --noEmit", + "lint:package": "publint", + "prepublishOnly": "turbo build" + }, + "type": "module", + "main": "./dist/esm/production/index.js", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "development": "./dist/esm/development/index.js", + "default": "./dist/esm/production/index.js" + }, + "./compile-catalog": { + "types": "./dist/types/compile-catalog.d.ts", + "development": "./dist/esm/development/compile-catalog.js", + "default": "./dist/esm/production/compile-catalog.js" + } + }, + "files": [ + "dist" + ], + "keywords": [ + "intl", + "i18n", + "extraction" + ], + "dependencies": { + "@parcel/watcher": "^2.4.1", + "@swc/core": "^1.15.2", + "icu-minify": "workspace:^", + "next-intl-swc-plugin-extractor": "workspace:^", + "po-parser": "^2.1.1" + }, + "devDependencies": { + "@types/node": "^20.14.5", + "eslint": "9.11.1", + "eslint-config-molindo": "^8.0.0", + "publint": "^0.2.8", + "rollup": "^4.18.0", + "tools": "workspace:^", + "typescript": "^6.0.0", + "vitest": "^3.0.8" + }, + "prettier": "eslint-config-molindo/.prettierrc.json" +} diff --git a/packages/intl-extractor/rollup.config.js b/packages/intl-extractor/rollup.config.js new file mode 100644 index 000000000..fdc5f1ca6 --- /dev/null +++ b/packages/intl-extractor/rollup.config.js @@ -0,0 +1,30 @@ +import {getBuildConfig} from 'tools'; +import pkg from './package.json' with {type: 'json'}; + +export default getBuildConfig({ + input: { + index: 'src/index.tsx', + 'compile-catalog': 'src/compile-catalog.tsx' + }, + external: [ + ...Object.keys(pkg.dependencies), + 'icu-minify/compile', + 'node:fs', + 'node:fs/promises', + 'node:path', + 'node:url', + 'node:module', + 'node:crypto', + 'node:os', + 'fs', + 'fs/promises', + 'path', + 'url', + 'module', + 'crypto', + 'os' + ], + output: { + preserveModules: true + } +}); diff --git a/packages/next-intl/src/extractor/ExtractionCompiler.test.tsx b/packages/intl-extractor/src/ExtractionCompiler.test.tsx similarity index 100% rename from packages/next-intl/src/extractor/ExtractionCompiler.test.tsx rename to packages/intl-extractor/src/ExtractionCompiler.test.tsx diff --git a/packages/next-intl/src/extractor/ExtractionCompiler.tsx b/packages/intl-extractor/src/ExtractionCompiler.tsx similarity index 100% rename from packages/next-intl/src/extractor/ExtractionCompiler.tsx rename to packages/intl-extractor/src/ExtractionCompiler.tsx diff --git a/packages/next-intl/src/extractor/catalog/CatalogLocales.tsx b/packages/intl-extractor/src/catalog/CatalogLocales.tsx similarity index 100% rename from packages/next-intl/src/extractor/catalog/CatalogLocales.tsx rename to packages/intl-extractor/src/catalog/CatalogLocales.tsx diff --git a/packages/next-intl/src/extractor/catalog/CatalogManager.tsx b/packages/intl-extractor/src/catalog/CatalogManager.tsx similarity index 100% rename from packages/next-intl/src/extractor/catalog/CatalogManager.tsx rename to packages/intl-extractor/src/catalog/CatalogManager.tsx diff --git a/packages/next-intl/src/extractor/catalog/CatalogPersister.tsx b/packages/intl-extractor/src/catalog/CatalogPersister.tsx similarity index 100% rename from packages/next-intl/src/extractor/catalog/CatalogPersister.tsx rename to packages/intl-extractor/src/catalog/CatalogPersister.tsx diff --git a/packages/next-intl/src/extractor/catalog/SaveScheduler.tsx b/packages/intl-extractor/src/catalog/SaveScheduler.tsx similarity index 100% rename from packages/next-intl/src/extractor/catalog/SaveScheduler.tsx rename to packages/intl-extractor/src/catalog/SaveScheduler.tsx diff --git a/packages/intl-extractor/src/compile-catalog.tsx b/packages/intl-extractor/src/compile-catalog.tsx new file mode 100644 index 000000000..c62b3bd46 --- /dev/null +++ b/packages/intl-extractor/src/compile-catalog.tsx @@ -0,0 +1,125 @@ +import path from 'path'; +import compile from 'icu-minify/compile'; +import type ExtractorCodec from './format/ExtractorCodec.js'; +import {getFormatExtension, resolveCodec} from './format/index.js'; +import type {CatalogLoaderConfig, ExtractorMessage} from './types.js'; +import {setNestedProperty} from './utils.js'; + +type CompiledMessageCacheEntry = { + compiledMessage: unknown; + messageValue: string; +}; + +const messageCacheByCatalog = new Map< + string, + Map +>(); + +function getMessageCache(catalogId: string) { + let cache = messageCacheByCatalog.get(catalogId); + if (!cache) { + cache = new Map(); + messageCacheByCatalog.set(catalogId, cache); + } + return cache; +} + +const codecCacheByProjectRoot = new Map< + string, + Promise +>(); + +async function getCodec( + options: CatalogLoaderConfig, + projectRoot: string +): Promise { + const cacheKey = projectRoot + '::' + JSON.stringify(options.messages.format); + let promise = codecCacheByProjectRoot.get(cacheKey); + if (!promise) { + promise = resolveCodec(options.messages.format, projectRoot); + codecCacheByProjectRoot.set(cacheKey, promise); + } + return promise; +} + +export type PrecompileCatalogOptions = CatalogLoaderConfig & { + /** Absolute path of the catalog file being compiled. */ + resourcePath: string; + /** Project root used to resolve custom codec modules. */ + projectRoot: string; +}; + +/** + * Bundler-agnostic catalog precompile. Mirrors the logic previously inlined + * in next-intl's Webpack/Turbopack `catalogLoader`. Returns the JS module + * source string that should be served in place of the raw catalog file. + */ +export async function precompileCatalog( + source: string, + options: PrecompileCatalogOptions +): Promise { + const codec = await getCodec(options, options.projectRoot); + const extension = getFormatExtension(options.messages.format); + const locale = path.basename(options.resourcePath, extension); + let outputString: string; + + if (options.messages.precompile) { + const decoded = codec.decode(source, {locale}); + const cache = getMessageCache(options.resourcePath); + const precompiled = precompileMessages(decoded, cache); + outputString = JSON.stringify(precompiled); + } else { + outputString = codec.toJSONString(source, {locale}); + } + + // https://v8.dev/blog/cost-of-javascript-2019#json + return `export default JSON.parse(${JSON.stringify(outputString)});`; +} + +/** + * Recursively precompiles all ICU message strings in a messages array + * using icu-minify/compile for smaller runtime bundles. + */ +function precompileMessages( + messages: Array, + cache: Map +): Record { + const result = Object.create(null) as Record; + const cacheKeysToEvict = new Set(cache.keys()); + + for (const message of messages) { + cacheKeysToEvict.delete(message.id); + const messageValue = message.message; + + if (Array.isArray(messageValue)) { + throw new Error( + `Message at \`${message.id}\` resolved to an array, but only strings are supported. See https://next-intl.dev/docs/usage/translations#arrays-of-messages` + ); + } + + if (typeof messageValue === 'object') { + throw new Error( + `Message at \`${message.id}\` resolved to \`${typeof messageValue}\`, but only strings are supported. Use a \`.\` to retrieve nested messages. See https://next-intl.dev/docs/usage/translations#structuring-messages` + ); + } + + const cachedEntry = cache.get(message.id); + const hasCacheMatch = cachedEntry?.messageValue === messageValue; + + let compiledMessage; + if (hasCacheMatch) { + compiledMessage = cachedEntry.compiledMessage; + } else { + compiledMessage = compile(messageValue); + cache.set(message.id, {compiledMessage, messageValue}); + } + + setNestedProperty(result, message.id, compiledMessage); + } + + for (const cachedId of cacheKeysToEvict) { + cache.delete(cachedId); + } + + return result; +} diff --git a/packages/next-intl/src/extractor/extractMessages.tsx b/packages/intl-extractor/src/extractMessages.tsx similarity index 86% rename from packages/next-intl/src/extractor/extractMessages.tsx rename to packages/intl-extractor/src/extractMessages.tsx index db8f89966..5fb68d072 100644 --- a/packages/next-intl/src/extractor/extractMessages.tsx +++ b/packages/intl-extractor/src/extractMessages.tsx @@ -1,9 +1,8 @@ -import {warn} from '../plugin/utils.js'; import ExtractionCompiler from './ExtractionCompiler.js'; import MessageExtractor from './extractor/MessageExtractor.js'; import normalizeExtractorConfig from './normalizeExtractorConfig.js'; import type {ExtractorConfigInput} from './types.js'; -import {getDefaultProjectRoot, hasLocalesToExtract} from './utils.js'; +import {getDefaultProjectRoot, hasLocalesToExtract, warn} from './utils.js'; export default async function extractMessages(params: ExtractorConfigInput) { const config = normalizeExtractorConfig(params); diff --git a/packages/next-intl/src/extractor/extractor/LRUCache.test.tsx b/packages/intl-extractor/src/extractor/LRUCache.test.tsx similarity index 100% rename from packages/next-intl/src/extractor/extractor/LRUCache.test.tsx rename to packages/intl-extractor/src/extractor/LRUCache.test.tsx diff --git a/packages/next-intl/src/extractor/extractor/LRUCache.tsx b/packages/intl-extractor/src/extractor/LRUCache.tsx similarity index 100% rename from packages/next-intl/src/extractor/extractor/LRUCache.tsx rename to packages/intl-extractor/src/extractor/LRUCache.tsx diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx b/packages/intl-extractor/src/extractor/MessageExtractor.bench.tsx similarity index 100% rename from packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx rename to packages/intl-extractor/src/extractor/MessageExtractor.bench.tsx diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx b/packages/intl-extractor/src/extractor/MessageExtractor.test.tsx similarity index 100% rename from packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx rename to packages/intl-extractor/src/extractor/MessageExtractor.test.tsx diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.tsx b/packages/intl-extractor/src/extractor/MessageExtractor.tsx similarity index 100% rename from packages/next-intl/src/extractor/extractor/MessageExtractor.tsx rename to packages/intl-extractor/src/extractor/MessageExtractor.tsx diff --git a/packages/next-intl/src/extractor/format/ExtractorCodec.tsx b/packages/intl-extractor/src/format/ExtractorCodec.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/ExtractorCodec.tsx rename to packages/intl-extractor/src/format/ExtractorCodec.tsx diff --git a/packages/next-intl/src/extractor/format/codecs/JSONCodec.tsx b/packages/intl-extractor/src/format/codecs/JSONCodec.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/codecs/JSONCodec.tsx rename to packages/intl-extractor/src/format/codecs/JSONCodec.tsx diff --git a/packages/next-intl/src/extractor/format/codecs/POCodec.tsx b/packages/intl-extractor/src/format/codecs/POCodec.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/codecs/POCodec.tsx rename to packages/intl-extractor/src/format/codecs/POCodec.tsx diff --git a/packages/next-intl/src/extractor/format/codecs/fixtures/JSONCodecStructured.tsx b/packages/intl-extractor/src/format/codecs/fixtures/JSONCodecStructured.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/codecs/fixtures/JSONCodecStructured.tsx rename to packages/intl-extractor/src/format/codecs/fixtures/JSONCodecStructured.tsx diff --git a/packages/next-intl/src/extractor/format/codecs/fixtures/POCodecSourceMessageKey.tsx b/packages/intl-extractor/src/format/codecs/fixtures/POCodecSourceMessageKey.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/codecs/fixtures/POCodecSourceMessageKey.tsx rename to packages/intl-extractor/src/format/codecs/fixtures/POCodecSourceMessageKey.tsx diff --git a/packages/next-intl/src/extractor/format/index.tsx b/packages/intl-extractor/src/format/index.tsx similarity index 96% rename from packages/next-intl/src/extractor/format/index.tsx rename to packages/intl-extractor/src/format/index.tsx index 7b008d1de..1044261eb 100644 --- a/packages/next-intl/src/extractor/format/index.tsx +++ b/packages/intl-extractor/src/format/index.tsx @@ -1,7 +1,7 @@ import path from 'path'; -import {throwError} from '../../plugin/utils.js'; import type ExtractorCodec from './ExtractorCodec.js'; import type {BuiltInMessagesFormat, MessagesFormat} from './types.js'; +import {throwError} from '../utils.js'; const formats = { json: {codec: () => import('./codecs/JSONCodec.js'), extension: '.json'}, diff --git a/packages/next-intl/src/extractor/format/types.tsx b/packages/intl-extractor/src/format/types.tsx similarity index 100% rename from packages/next-intl/src/extractor/format/types.tsx rename to packages/intl-extractor/src/format/types.tsx diff --git a/packages/intl-extractor/src/index.tsx b/packages/intl-extractor/src/index.tsx new file mode 100644 index 000000000..f260fdeb1 --- /dev/null +++ b/packages/intl-extractor/src/index.tsx @@ -0,0 +1,29 @@ +export {default as ExtractionCompiler} from './ExtractionCompiler.js'; +export {default as MessageExtractor} from './extractor/MessageExtractor.js'; +export {default as normalizeExtractorConfig} from './normalizeExtractorConfig.js'; +export {normalizeMessagesCatalogPaths} from './normalizeExtractorConfig.js'; +export {default as unstable_extractMessages} from './extractMessages.js'; +export {default as SourceFileFilter} from './source/SourceFileFilter.js'; +export {defineCodec} from './format/ExtractorCodec.js'; +export {getFormatExtension, resolveCodec} from './format/index.js'; +export { + getDefaultProjectRoot, + hasLocalesToExtract, + setNestedProperty, + throwError, + warn +} from './utils.js'; +export type { + CatalogLoaderConfig, + ExtractorConfig, + ExtractorConfigInput, + ExtractorMessage, + ExtractorMessageReference, + Locale, + SourceMessage +} from './types.js'; +export type { + BuiltInMessagesFormat, + MessagesFormat +} from './format/types.js'; +export type {default as ExtractorCodec} from './format/ExtractorCodec.js'; diff --git a/packages/next-intl/src/extractor/normalizeExtractorConfig.tsx b/packages/intl-extractor/src/normalizeExtractorConfig.tsx similarity index 97% rename from packages/next-intl/src/extractor/normalizeExtractorConfig.tsx rename to packages/intl-extractor/src/normalizeExtractorConfig.tsx index d70f9fef3..c02e545e5 100644 --- a/packages/next-intl/src/extractor/normalizeExtractorConfig.tsx +++ b/packages/intl-extractor/src/normalizeExtractorConfig.tsx @@ -1,5 +1,5 @@ -import {throwError, warn} from '../plugin/utils.js'; import type {ExtractorConfig, ExtractorConfigInput} from './types.js'; +import {throwError, warn} from './utils.js'; function stripTrailingSlash(dirPath: string): string { if (dirPath.endsWith('/')) { diff --git a/packages/next-intl/src/extractor/source/SourceFileFilter.tsx b/packages/intl-extractor/src/source/SourceFileFilter.tsx similarity index 100% rename from packages/next-intl/src/extractor/source/SourceFileFilter.tsx rename to packages/intl-extractor/src/source/SourceFileFilter.tsx diff --git a/packages/next-intl/src/extractor/source/SourceFileScanner.tsx b/packages/intl-extractor/src/source/SourceFileScanner.tsx similarity index 100% rename from packages/next-intl/src/extractor/source/SourceFileScanner.tsx rename to packages/intl-extractor/src/source/SourceFileScanner.tsx diff --git a/packages/next-intl/src/extractor/source/SourceFileWatcher.tsx b/packages/intl-extractor/src/source/SourceFileWatcher.tsx similarity index 100% rename from packages/next-intl/src/extractor/source/SourceFileWatcher.tsx rename to packages/intl-extractor/src/source/SourceFileWatcher.tsx diff --git a/packages/next-intl/src/extractor/types.tsx b/packages/intl-extractor/src/types.tsx similarity index 100% rename from packages/next-intl/src/extractor/types.tsx rename to packages/intl-extractor/src/types.tsx diff --git a/packages/next-intl/src/extractor/utils.test.tsx b/packages/intl-extractor/src/utils.test.tsx similarity index 100% rename from packages/next-intl/src/extractor/utils.test.tsx rename to packages/intl-extractor/src/utils.test.tsx diff --git a/packages/next-intl/src/extractor/utils.tsx b/packages/intl-extractor/src/utils.tsx similarity index 91% rename from packages/next-intl/src/extractor/utils.tsx rename to packages/intl-extractor/src/utils.tsx index 25955dfbb..2e1d983ed 100644 --- a/packages/next-intl/src/extractor/utils.tsx +++ b/packages/intl-extractor/src/utils.tsx @@ -1,11 +1,22 @@ import path from 'path'; -import {warn} from '../plugin/utils.js'; import type { ExtractorConfig, ExtractorMessage, ExtractorMessageReference } from './types.js'; +function formatMessage(message: string) { + return `\n[intl-extractor] ${message}\n`; +} + +export function throwError(message: string): never { + throw new Error(formatMessage(message)); +} + +export function warn(message: string): void { + console.warn(formatMessage(message)); +} + export function normalizePathToPosix(filePath: string): string { // `path.relative` uses OS-specific separators. For stable `.po` references we // always use POSIX separators, regardless of the OS that ran extraction. diff --git a/packages/intl-extractor/tsconfig.build.json b/packages/intl-extractor/tsconfig.build.json new file mode 100644 index 000000000..d8350f979 --- /dev/null +++ b/packages/intl-extractor/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.test.tsx", "src/**/*.bench.tsx"], + "compilerOptions": { + "rootDir": "src", + "noEmit": false, + "outDir": "dist/types", + "emitDeclarationOnly": true + } +} diff --git a/packages/intl-extractor/tsconfig.json b/packages/intl-extractor/tsconfig.json new file mode 100644 index 000000000..e19f71ed7 --- /dev/null +++ b/packages/intl-extractor/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "eslint-config-molindo/tsconfig.json", + "include": ["src"], + "compilerOptions": { + "lib": ["esnext"], + "types": ["node"], + "target": "ES2020", + "declaration": true, + "rootDir": ".", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "jsx": "react-jsx", + "skipLibCheck": true, + "noEmit": true + } +} diff --git a/packages/intl-extractor/vitest.config.mts b/packages/intl-extractor/vitest.config.mts new file mode 100644 index 000000000..138ec023c --- /dev/null +++ b/packages/intl-extractor/vitest.config.mts @@ -0,0 +1,7 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node' + } +}); diff --git a/packages/next-intl/package.json b/packages/next-intl/package.json index d294a8834..bf8b9c0e9 100644 --- a/packages/next-intl/package.json +++ b/packages/next-intl/package.json @@ -125,12 +125,9 @@ ], "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", - "@parcel/watcher": "^2.4.1", - "@swc/core": "^1.15.2", "icu-minify": "workspace:^", + "intl-extractor": "workspace:^", "negotiator": "^1.0.0", - "next-intl-swc-plugin-extractor": "workspace:^", - "po-parser": "^2.1.1", "use-intl": "workspace:^" }, "peerDependencies": { diff --git a/packages/next-intl/rollup.config.js b/packages/next-intl/rollup.config.js index 97bf0fb58..5e337107f 100644 --- a/packages/next-intl/rollup.config.js +++ b/packages/next-intl/rollup.config.js @@ -44,7 +44,8 @@ export default [ 'next-intl/config', 'use-intl/core', 'use-intl/react', - 'icu-minify/compile' + 'icu-minify/compile', + 'intl-extractor/compile-catalog' ], output: { preserveModules: true diff --git a/packages/next-intl/src/extractor.tsx b/packages/next-intl/src/extractor.tsx index 23abe3428..8de2734a1 100644 --- a/packages/next-intl/src/extractor.tsx +++ b/packages/next-intl/src/extractor.tsx @@ -1 +1,4 @@ -export * from './extractor/index.js'; +export { + unstable_extractMessages, + defineCodec +} from 'intl-extractor'; diff --git a/packages/next-intl/src/extractor/index.tsx b/packages/next-intl/src/extractor/index.tsx deleted file mode 100644 index 30e43bb47..000000000 --- a/packages/next-intl/src/extractor/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export {default as unstable_extractMessages} from './extractMessages.js'; -export {defineCodec} from './format/ExtractorCodec.js'; diff --git a/packages/next-intl/src/plugin/catalog/catalogLoader.tsx b/packages/next-intl/src/plugin/catalog/catalogLoader.tsx index fa2e83233..1d8cd7bdc 100644 --- a/packages/next-intl/src/plugin/catalog/catalogLoader.tsx +++ b/packages/next-intl/src/plugin/catalog/catalogLoader.tsx @@ -1,50 +1,7 @@ -import path from 'path'; -import compile from 'icu-minify/compile'; -import type ExtractorCodec from '../../extractor/format/ExtractorCodec.js'; -import { - getFormatExtension, - resolveCodec -} from '../../extractor/format/index.js'; -import type { - CatalogLoaderConfig, - ExtractorMessage -} from '../../extractor/types.js'; -import {setNestedProperty} from '../../extractor/utils.js'; +import {type CatalogLoaderConfig} from 'intl-extractor'; +import {precompileCatalog} from 'intl-extractor/compile-catalog'; import type {TurbopackLoaderContext} from '../types.js'; -// The module scope is safe for some caching, but Next.js can -// create multiple loader instances so don't expect a singleton. -let cachedCodec: ExtractorCodec | null = null; - -type CompiledMessageCacheEntry = { - compiledMessage: unknown; - messageValue: string; -}; - -const messageCacheByCatalog = new Map< - string, - Map ->(); - -function getMessageCache(catalogId: string) { - let cache = messageCacheByCatalog.get(catalogId); - if (!cache) { - cache = new Map(); - messageCacheByCatalog.set(catalogId, cache); - } - return cache; -} - -async function getCodec( - options: CatalogLoaderConfig, - projectRoot: string -): Promise { - if (!cachedCodec) { - cachedCodec = await resolveCodec(options.messages.format, projectRoot); - } - return cachedCodec; -} - /** * Parses and optimizes catalog files. * @@ -58,75 +15,15 @@ export default function catalogLoader( ) { const options = this.getOptions(); const callback = this.async(); - const extension = getFormatExtension(options.messages.format); - - getCodec(options, this.rootContext) - .then((codec) => { - const locale = path.basename(this.resourcePath, extension); - let outputString: string; - - if (options.messages.precompile) { - const decoded = codec.decode(source, {locale}); - const cache = getMessageCache(this.resourcePath); - const precompiled = precompileMessages(decoded, cache); - outputString = JSON.stringify(precompiled); - } else { - outputString = codec.toJSONString(source, {locale}); - } - // https://v8.dev/blog/cost-of-javascript-2019#json - const result = `export default JSON.parse(${JSON.stringify(outputString)});`; - - callback(null, result); - }) + precompileCatalog(source, { + messages: { + format: options.messages.format, + precompile: options.messages.precompile + }, + resourcePath: this.resourcePath, + projectRoot: this.rootContext + }) + .then((result) => callback(null, result)) .catch(callback); } - -/** - * Recursively precompiles all ICU message strings in a messages object - * using icu-minify/compile for smaller runtime bundles. - */ -function precompileMessages( - messages: Array, - cache: Map -): Record { - const result = Object.create(null) as Record; - const cacheKeysToEvict = new Set(cache.keys()); - - for (const message of messages) { - cacheKeysToEvict.delete(message.id); - const messageValue = message.message; - - if (Array.isArray(messageValue)) { - throw new Error( - `Message at \`${message.id}\` resolved to an array, but only strings are supported. See https://next-intl.dev/docs/usage/translations#arrays-of-messages` - ); - } - - if (typeof messageValue === 'object') { - throw new Error( - `Message at \`${message.id}\` resolved to \`${typeof messageValue}\`, but only strings are supported. Use a \`.\` to retrieve nested messages. See https://next-intl.dev/docs/usage/translations#structuring-messages` - ); - } - - const cachedEntry = cache.get(message.id); - const hasCacheMatch = cachedEntry?.messageValue === messageValue; - - let compiledMessage; - if (hasCacheMatch) { - compiledMessage = cachedEntry.compiledMessage; - } else { - compiledMessage = compile(messageValue); - cache.set(message.id, {compiledMessage, messageValue}); - } - - setNestedProperty(result, message.id, compiledMessage); - } - - // Evict unused cache entries - for (const cachedId of cacheKeysToEvict) { - cache.delete(cachedId); - } - - return result; -} diff --git a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx index 4d356be1d..61397f8d4 100644 --- a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx +++ b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx @@ -1,6 +1,8 @@ +import { + type ExtractorConfig, + normalizeExtractorConfig +} from 'intl-extractor'; import type {NextConfig} from 'next'; -import normalizeExtractorConfig from '../extractor/normalizeExtractorConfig.js'; -import type {ExtractorConfig} from '../extractor/types.js'; import createMessagesDeclaration from './declaration/index.js'; import initExtractionCompiler from './extractor/initExtractionCompiler.js'; import getNextConfig from './getNextConfig.js'; diff --git a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx index 1e4dd847a..28de3245d 100644 --- a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx +++ b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx @@ -1,5 +1,4 @@ -import MessageExtractor from '../../extractor/extractor/MessageExtractor.js'; -import type {ExtractorConfig} from '../../extractor/types.js'; +import {type ExtractorConfig, MessageExtractor} from 'intl-extractor'; import type {TurbopackLoaderContext} from '../types.js'; // Module-level extractor instance for transformation caching. diff --git a/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx b/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx index 1c610414a..8bf0541a1 100644 --- a/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx +++ b/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx @@ -1,6 +1,8 @@ -import ExtractionCompiler from '../../extractor/ExtractionCompiler.js'; -import type {ExtractorConfig} from '../../extractor/types.js'; -import {hasLocalesToExtract} from '../../extractor/utils.js'; +import { + ExtractionCompiler, + type ExtractorConfig, + hasLocalesToExtract +} from 'intl-extractor'; import {isDevelopment, isNextBuild} from '../config.js'; import {once} from '../utils.js'; diff --git a/packages/next-intl/src/plugin/getNextConfig.tsx b/packages/next-intl/src/plugin/getNextConfig.tsx index c1d92a0c6..7b4e94a77 100644 --- a/packages/next-intl/src/plugin/getNextConfig.tsx +++ b/packages/next-intl/src/plugin/getNextConfig.tsx @@ -1,6 +1,13 @@ import fs from 'fs'; import {createRequire} from 'module'; import path from 'path'; +import { + type CatalogLoaderConfig, + type ExtractorConfig, + getFormatExtension, + normalizeMessagesCatalogPaths, + SourceFileFilter +} from 'intl-extractor'; import type {NextConfig} from 'next'; import type { TurbopackLoaderOptions, @@ -8,10 +15,6 @@ import type { TurbopackRuleConfigItem } from 'next/dist/server/config-shared.js'; import type {Configuration} from 'webpack'; -import {getFormatExtension} from '../extractor/format/index.js'; -import {normalizeMessagesCatalogPaths} from '../extractor/normalizeExtractorConfig.js'; -import SourceFileFilter from '../extractor/source/SourceFileFilter.js'; -import type {CatalogLoaderConfig, ExtractorConfig} from '../extractor/types.js'; import {isDevelopmentOrNextBuild} from './config.js'; import {hasStableTurboConfig, isNextJs16OrHigher} from './nextFlags.js'; import type {PluginConfig} from './types.js'; diff --git a/packages/next-intl/src/plugin/types.tsx b/packages/next-intl/src/plugin/types.tsx index ea0fb5c50..ecb2a7878 100644 --- a/packages/next-intl/src/plugin/types.tsx +++ b/packages/next-intl/src/plugin/types.tsx @@ -1,5 +1,5 @@ +import type {ExtractorConfigInput} from 'intl-extractor'; import type {LoaderContext} from 'webpack'; -import type {ExtractorConfigInput} from '../extractor/types.js'; export type PluginConfig = { requestConfig?: string; diff --git a/packages/swc-plugin-extractor/src/lib.rs b/packages/swc-plugin-extractor/src/lib.rs index fc3834681..4091a15ef 100644 --- a/packages/swc-plugin-extractor/src/lib.rs +++ b/packages/swc-plugin-extractor/src/lib.rs @@ -347,7 +347,25 @@ impl VisitMut for TransformVisitor { for import in module.body.iter_mut() { if let ModuleItem::ModuleDecl(ModuleDecl::Import(import)) = import { match import.src.value.as_bytes() { - b"next-intl" => { + // `next-intl` (React/Next.js) and `expo-intl` (Expo/Metro) share the + // same client-side `useExtracted` surface. Both are recognized here so + // calls in Expo code paths get the same compile-time rewrite. + // + // `use-intl` / `use-intl/react` are also recognized: they expose the + // primitive as `_useExtracted`. This lets cross-platform packages + // (e.g. a shared UI library that has to work in both Next.js and + // Expo apps) import directly from the framework-agnostic core. + b"next-intl" | b"expo-intl" | b"use-intl" | b"use-intl/react" => { + let is_use_intl = matches!( + import.src.value.as_bytes(), + b"use-intl" | b"use-intl/react" + ); + let expected_name = if is_use_intl { + "_useExtracted" + } else { + HookType::UseTranslation.extracted_name() + }; + for specifier in &mut import.specifiers { if let ImportSpecifier::Named(named_spec) = specifier { let orig_name = named_spec @@ -360,7 +378,7 @@ impl VisitMut for TransformVisitor { .unwrap_or_else(|| named_spec.local.sym.clone()) .clone(); - if orig_name == HookType::UseTranslation.extracted_name() { + if orig_name == expected_name { self.hook_local_names .insert(named_spec.local.to_id(), HookType::UseTranslation); diff --git a/packages/swc-plugin-extractor/target/wasm32-wasip1/release/swc_plugin_extractor.wasm b/packages/swc-plugin-extractor/target/wasm32-wasip1/release/swc_plugin_extractor.wasm index aadc85e3ec8dc8336a50ab1416121d05b9411aed..ad031dd1a039af6be2734538b5afc0bc9807a9f2 100755 GIT binary patch delta 64957 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 P_2iNpFN`__Fe5pFN0nJbi< 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 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 702c28688..6ca3ea312 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,7 +121,7 @@ importers: version: link:../utils next: specifier: ^16.0.10 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: workspace:* version: link:../../packages/next-intl @@ -170,7 +170,7 @@ importers: version: link:../shared-ui next: specifier: ^16.0.10 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: workspace:* version: link:../../packages/next-intl @@ -216,7 +216,7 @@ importers: version: link:../utils next: specifier: ^16.0.10 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: workspace:* version: link:../../packages/next-intl @@ -300,7 +300,7 @@ importers: version: 2.1.1 next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -367,7 +367,7 @@ importers: dependencies: next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -410,7 +410,7 @@ importers: dependencies: next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -459,7 +459,7 @@ importers: version: 2.1.3 next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -496,7 +496,7 @@ importers: version: 1.57.0 '@storybook/nextjs': specifier: ^8.6.4 - version: 8.6.15(@types/webpack@5.28.5(esbuild@0.25.1))(esbuild@0.25.1)(next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sockjs-client@1.6.1)(storybook@8.6.15(prettier@3.8.0))(type-fest@4.41.0)(typescript@6.0.2)(webpack-dev-server@5.2.3(webpack@5.104.1(esbuild@0.25.1)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.1)) + version: 8.6.15(@types/webpack@5.28.5(esbuild@0.25.1))(esbuild@0.25.1)(next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sockjs-client@1.6.1)(storybook@8.6.15(prettier@3.8.0))(type-fest@4.41.0)(typescript@6.0.2)(webpack-dev-server@5.2.3(webpack@5.104.1(esbuild@0.25.1)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.1)) '@storybook/react': specifier: ^8.6.4 version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.8.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@8.6.15(prettier@3.8.0))(typescript@6.0.2) @@ -556,7 +556,7 @@ importers: dependencies: next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -589,6 +589,223 @@ importers: specifier: ^6.0.0 version: 6.0.2 + examples/example-expo: + dependencies: + '@react-navigation/bottom-tabs': + specifier: ^7.15.5 + version: 7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/elements': + specifier: ^2.9.10 + version: 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/native': + specifier: ^7.1.33 + version: 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo: + specifier: ~55.0.24 + version: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: + specifier: ~55.0.16 + version: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-device: + specifier: ~55.0.17 + version: 55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)) + expo-font: + specifier: ~55.0.7 + version: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-glass-effect: + specifier: ~55.0.11 + version: 55.0.11(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-image: + specifier: ~55.0.10 + version: 55.0.10(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-intl: + specifier: workspace:^ + version: link:../../packages/expo-intl + expo-linking: + specifier: ~55.0.15 + version: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-router: + specifier: ~55.0.14 + version: 55.0.14(bls4af4uxyiaulbxq3gobnrtf4) + expo-splash-screen: + specifier: ~55.0.21 + version: 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + expo-status-bar: + specifier: ~55.0.6 + version: 55.0.6(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-symbols: + specifier: ~55.0.8 + version: 55.0.8(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-system-ui: + specifier: ~55.0.18 + version: 55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-web-browser: + specifier: ~55.0.16 + version: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + react: + specifier: 19.2.0 + version: 19.2.0 + react-dom: + specifier: 19.2.0 + version: 19.2.0(react@19.2.0) + react-native: + specifier: 0.83.6 + version: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-gesture-handler: + specifier: ~2.30.0 + version: 2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-reanimated: + specifier: 4.2.1 + version: 4.2.1(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-safe-area-context: + specifier: ~5.6.2 + version: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-screens: + specifier: ~4.23.0 + version: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-web: + specifier: ~0.21.0 + version: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-native-worklets: + specifier: 0.7.4 + version: 0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + use-intl: + specifier: workspace:^ + version: link:../../packages/use-intl + devDependencies: + '@types/react': + specifier: ~19.2.2 + version: 19.2.14 + intl-extractor: + specifier: workspace:^ + version: link:../../packages/intl-extractor + typescript: + specifier: ~5.9.2 + version: 5.9.3 + + examples/example-expo-monorepo: + devDependencies: + intl-extractor: + specifier: workspace:^ + version: link:../../packages/intl-extractor + + examples/example-expo-monorepo/apps/mobile: + dependencies: + '@example-monorepo/ui': + specifier: workspace:* + version: link:../../packages/ui + expo: + specifier: ~55.0.24 + version: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: + specifier: ~55.0.16 + version: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-intl: + specifier: workspace:^ + version: link:../../../../packages/expo-intl + expo-linking: + specifier: ~55.0.15 + version: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-router: + specifier: ~55.0.14 + version: 55.0.14(bls4af4uxyiaulbxq3gobnrtf4) + expo-splash-screen: + specifier: ~55.0.21 + version: 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + expo-status-bar: + specifier: ~55.0.6 + version: 55.0.6(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-system-ui: + specifier: ~55.0.18 + version: 55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + react: + specifier: 19.2.0 + version: 19.2.0 + react-dom: + specifier: 19.2.0 + version: 19.2.0(react@19.2.0) + react-native: + specifier: 0.83.6 + version: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-gesture-handler: + specifier: ~2.30.0 + version: 2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-safe-area-context: + specifier: ~5.6.2 + version: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-screens: + specifier: ~4.23.0 + version: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-web: + specifier: ~0.21.0 + version: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + use-intl: + specifier: workspace:^ + version: link:../../../../packages/use-intl + devDependencies: + '@types/react': + specifier: ~19.2.2 + version: 19.2.14 + intl-extractor: + specifier: workspace:^ + version: link:../../../../packages/intl-extractor + typescript: + specifier: ~5.9.2 + version: 5.9.3 + + examples/example-expo-monorepo/apps/web: + dependencies: + '@example-monorepo/ui': + specifier: workspace:* + version: link:../../packages/ui + next: + specifier: ^16.2.2 + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next-intl: + specifier: workspace:^ + version: link:../../../../packages/next-intl + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + use-intl: + specifier: workspace:^ + version: link:../../../../packages/use-intl + devDependencies: + '@types/node': + specifier: ^20.14.5 + version: 20.19.29 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + intl-extractor: + specifier: workspace:^ + version: link:../../../../packages/intl-extractor + typescript: + specifier: ^6.0.0 + version: 6.0.2 + + examples/example-expo-monorepo/packages/ui: + dependencies: + react: + specifier: '>=18' + version: 19.2.3 + use-intl: + specifier: '*' + version: link:../../../../packages/use-intl + devDependencies: + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + typescript: + specifier: ^6.0.0 + version: 6.0.2 + examples/example-pages-router: dependencies: date-fns: @@ -596,7 +813,7 @@ importers: version: 4.1.0 next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -682,6 +899,52 @@ importers: specifier: ^6.2.1 version: 6.2.1(@types/node@25.0.8)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2) + packages/expo-intl: + dependencies: + expo: + specifier: '>=51' + version: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + icu-minify: + specifier: workspace:^ + version: link:../icu-minify + intl-extractor: + specifier: workspace:^ + version: link:../intl-extractor + react-native: + specifier: '>=0.74' + version: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + use-intl: + specifier: workspace:^ + version: link:../use-intl + devDependencies: + '@types/node': + specifier: ^20.14.5 + version: 20.19.29 + eslint: + specifier: 9.11.1 + version: 9.11.1(jiti@2.6.1) + eslint-config-molindo: + specifier: ^8.0.0 + version: 8.0.0(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(@typescript-eslint/parser@8.53.0(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(eslint@9.11.1(jiti@2.6.1))(jest@30.2.0(@types/node@20.19.29)(esbuild-register@3.6.0(esbuild@0.27.2)))(tailwindcss@4.2.4)(typescript@6.0.2)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.19.29)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2)) + publint: + specifier: ^0.2.8 + version: 0.2.12 + react: + specifier: ^19.2.3 + version: 19.2.3 + rollup: + specifier: ^4.18.0 + version: 4.55.1 + tools: + specifier: workspace:^ + version: link:../../tools + typescript: + specifier: ^6.0.0 + version: 6.0.2 + vitest: + specifier: ^3.0.8 + version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.19.29)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2) + packages/icu-minify: dependencies: '@formatjs/icu-messageformat-parser': @@ -728,11 +991,8 @@ importers: specifier: ^3.0.8 version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.19.29)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2) - packages/next-intl: + packages/intl-extractor: dependencies: - '@formatjs/intl-localematcher': - specifier: ^0.8.1 - version: 0.8.1 '@parcel/watcher': specifier: ^2.4.1 version: 2.5.4 @@ -742,15 +1002,52 @@ importers: icu-minify: specifier: workspace:^ version: link:../icu-minify - negotiator: - specifier: ^1.0.0 - version: 1.0.0 next-intl-swc-plugin-extractor: specifier: workspace:^ version: link:../swc-plugin-extractor po-parser: specifier: ^2.1.1 version: 2.1.1 + devDependencies: + '@types/node': + specifier: ^20.14.5 + version: 20.19.29 + eslint: + specifier: 9.11.1 + version: 9.11.1(jiti@2.6.1) + eslint-config-molindo: + specifier: ^8.0.0 + version: 8.0.0(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(@typescript-eslint/parser@8.53.0(eslint@9.11.1(jiti@2.6.1))(typescript@6.0.2))(eslint@9.11.1(jiti@2.6.1))(jest@30.2.0(@types/node@20.19.29)(esbuild-register@3.6.0(esbuild@0.27.2)))(tailwindcss@4.2.4)(typescript@6.0.2)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.19.29)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2)) + publint: + specifier: ^0.2.8 + version: 0.2.12 + rollup: + specifier: ^4.18.0 + version: 4.55.1 + tools: + specifier: workspace:^ + version: link:../../tools + typescript: + specifier: ^6.0.0 + version: 6.0.2 + vitest: + specifier: ^3.0.8 + version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.19.29)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.32.0)(terser@5.45.0)(yaml@2.8.2) + + packages/next-intl: + dependencies: + '@formatjs/intl-localematcher': + specifier: ^0.8.1 + version: 0.8.1 + icu-minify: + specifier: workspace:^ + version: link:../icu-minify + intl-extractor: + specifier: workspace:^ + version: link:../intl-extractor + negotiator: + specifier: ^1.0.0 + version: 1.0.0 use-intl: specifier: workspace:^ version: link:../use-intl @@ -781,7 +1078,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2) + version: 5.28.5(esbuild@0.27.2) eslint: specifier: 9.11.1 version: 9.11.1(jiti@2.6.1) @@ -793,7 +1090,7 @@ importers: version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.6.1)) next: specifier: ^16.2.2 - version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) path-to-regexp: specifier: ^6.2.2 version: 6.3.0 @@ -1068,6 +1365,10 @@ packages: resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.6': resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} @@ -1080,6 +1381,10 @@ packages: resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -1161,10 +1466,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1216,6 +1517,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-proposal-decorators@7.29.0': + resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} + engines: {node: '>=6.9.0'} + 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-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -1250,11 +1563,29 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.28.6': + resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} + engines: {node: '>=6.9.0'} + 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'} @@ -1367,6 +1698,12 @@ packages: 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'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.28.6': resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} engines: {node: '>=6.9.0'} @@ -1379,6 +1716,12 @@ packages: peerDependencies: '@babel/core': ^7.12.0 + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.28.6': resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} @@ -1439,6 +1782,12 @@ packages: 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'} @@ -1511,6 +1860,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + 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'} @@ -1541,6 +1896,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + 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'} @@ -1708,6 +2069,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.28.5': resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} engines: {node: '>=6.9.0'} @@ -1730,14 +2097,18 @@ packages: resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} '@babel/types@7.28.6': resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1845,6 +2216,10 @@ packages: resolution: {integrity: sha512-NKBGBSIKUG584qrS1tyxVpX/AKJKQw5HgjYEnPLC0QsTw79JrGn+qUr8CXFb955Iy7GUdiiUv1rJ6JBGvaKb6w==} engines: {node: '>=18'} + '@egjs/hammerjs@2.0.17': + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -2231,56 +2606,224 @@ packages: '@exodus/crypto': optional: true - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + '@expo-google-fonts/material-symbols@0.4.37': + resolution: {integrity: sha512-ll8twI7PcfxmjG2hMDS+QNEZ3qYmMERG0YVSJxgYHPlx3VqSNGCasMDAOgPzCE+RhKAVNqlrgTUcIFc8XrHqZQ==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@expo/cli@55.0.30': + resolution: {integrity: sha512-luWcCgompncWtCi1HqQfY32MVOuD0kUeARpr1Le1LeKVtZykjOwnz7YWXZo5zjISiD7L/gQnBNGVrRjvREsJqg==} + hasBin: true + peerDependencies: + expo: '*' + expo-router: '*' + react-native: '*' + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + '@expo/code-signing-certificates@0.0.6': + resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + '@expo/config-plugins@55.0.9': + resolution: {integrity: sha512-jLfpxru8dTo7eU0cqeTWuQav7byyjb37eF/mbXl1/3eTBHBvFU1VGxpeKxanUdTQAAjqzH8KGgWb0fWcce+z1w==} - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@expo/config-types@55.0.5': + resolution: {integrity: sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==} - '@floating-ui/react-dom@2.1.6': - resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@expo/config@55.0.17': + resolution: {integrity: sha512-Y3VaRg7Jllg3MhlUOTQqHm6/dttsqcjYlnS9enhAllZvPUpTHnRA4YPETtUZlxkdMJy6y3UZe986pd/KfJ6OTg==} - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + '@expo/devcert@1.2.1': + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} + + '@expo/devtools@55.0.3': + resolution: {integrity: sha512-KoIDgo0NoXeWLsIcOdZqtAG/1LlsM+JL0DA3bo0vCYaOYTBLXi/ZvRBqa20Ub8D2vKLNa+FgRQW0gRg04Ps1Pg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '*' + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@expo/dom-webview@55.0.6': + resolution: {integrity: sha512-ZNm8tiNEZysxrr36J0x4mOCGyJDcaIvL/3tMxBz0VJIJDcV19xjuJAhJQxHovu+jKx6s9tRyEAINa1mdrzV39g==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@expo/env@2.1.2': + resolution: {integrity: sha512-RJtGFfj/ygO/6zcVbV3cckHf4THcEkv5IZft1GjCB3dfT6axvzvIwXE9EiQqQYmGHcQ+ZrvC8xZcIhiHba0pYg==} + engines: {node: '>=20.12.0'} - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@expo/fingerprint@0.16.7': + resolution: {integrity: sha512-BH8sicYOqZ1iBMwCVEGIz6uTTfylosjc49FoMmCYIzKOiYdiVehsfoYBwyfxwWIiya1VMhm1gv0cgOP8fxHpDw==} + hasBin: true - '@formatjs/ecma402-abstract@3.1.0': - resolution: {integrity: sha512-CjP1sUzM7XiQW6YluDreN+dMvcKZysO/J4ikvuDjDyd6nSOoSqAK9gvD1s75ZFaJVXtYOsz+y3CUXPZ1sKxcxw==} + '@expo/image-utils@0.8.14': + resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==} - '@formatjs/fast-memoize@3.1.0': - resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} + '@expo/json-file@10.0.14': + resolution: {integrity: sha512-yWwBFywFv+SxkJp/pIzzA416JVYflNUh7pqQzgaA6nXDqRyK7KfrqVzk8PdUfDnqbBcaZZxpzNssfQZzp5KHrA==} - '@formatjs/icu-messageformat-parser@3.4.0': - resolution: {integrity: sha512-2bSQc59NFiEuN5VW0dUh7Txn5Qbeib5kZtzxFDXXqxUljvwhA3Qsrv2AwuVCRMISjbgOYwA2Rp5HW6tbdTnv9g==} + '@expo/local-build-cache-provider@55.0.13': + resolution: {integrity: sha512-Vg5BE10UL+0yg3BVtIeiSoeHU31Qe1m3UxhBPS478ACY1zzKuxZE30x2sym/B2OIWypjmPzXDRt8J9TOGFuFNw==} - '@formatjs/icu-skeleton-parser@2.1.0': - resolution: {integrity: sha512-wNer4imHDFBVAJnMb2OGoSyM4wL/uuLnuo5mrenliqkDaNjRbG4jzlJcwTTDEBhai8iCjnzUsE7xwNJC29SfWw==} + '@expo/log-box@55.0.12': + resolution: {integrity: sha512-f9ARS8J60cq3LLNdIqmUjYwyerBzVS5Ecp7KjIf3GOIPjW0571rkcwLz4/U18l/1DeSkSzIkYsNl2TC9oTdWaQ==} + peerDependencies: + '@expo/dom-webview': ^55.0.6 + expo: '*' + react: '*' + react-native: '*' + + '@expo/metro-config@55.0.21': + resolution: {integrity: sha512-pJ8G0uCxqA9KK+XCzXZF7ZI37rduD2l7Cun2e3rVAgB2yeOZagUD+VBvooU9QPiWx9e/7EbimH5/JP81JyhQlg==} + peerDependencies: + expo: '*' + peerDependenciesMeta: + expo: + optional: true + + '@expo/metro-runtime@55.0.11': + resolution: {integrity: sha512-4KKi/jGrIEXi2YGu0hYTVr0CEeRJy5SXbCrz9+KDZkuD3ROwKNpM1DBawni5rhPVovFnR323HBck9GaxhnfrRw==} + peerDependencies: + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + + '@expo/metro@55.1.1': + resolution: {integrity: sha512-/wfXo5hTuAVpVLG/4hzlmD9NBGJkzkmBEMm/4VICajYRbj7y8OmqqPWbbymzHiBiHB6tI9BnsyXpQM6zVZEECg==} + + '@expo/osascript@2.4.3': + resolution: {integrity: sha512-wbuj3EebM7W9hN/Wp4xTzKd6rQ2zKJzAxkFxkOOwyysLp0HOAgQ4/5RINyoS241pZUX2rUHq7mAJ7pcCQ8U0Ow==} + engines: {node: '>=12'} + + '@expo/package-manager@1.10.5': + resolution: {integrity: sha512-nCP9Mebfl3jvOr0/P6VAuyah6PAtun+aihIL2zAtuE8uSe94JWkVZ7051i0MUVO+y3gFpBqnr8IIH5ch+VJjHA==} + + '@expo/plist@0.5.3': + resolution: {integrity: sha512-jz5oPcPDd3fygwVxwSwmO6wodTwm0Qa14NUyPy0ka7H8sFmCtNZUI2+DzVe/EXjOhq1FbEjrwl89gdlWYOnVjQ==} + + '@expo/prebuild-config@55.0.18': + resolution: {integrity: sha512-2oKXyy5pyM87DJqXW5Z+Sakle6rApFFtpPhWOiNsOdoh6rOAD+EqVgyrs2OEEic8CE0tTt27w3SRfSZe/PZrxg==} + peerDependencies: + expo: '*' + + '@expo/require-utils@55.0.5': + resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==} + peerDependencies: + typescript: ^5.0.0 || ^5.0.0-0 + peerDependenciesMeta: + typescript: + optional: true + + '@expo/router-server@55.0.16': + resolution: {integrity: sha512-LvAdrm039nQBG+95+ff5Rc4CsBuoc/giDhjQrgxB9lKJqC/ZTq1xbwfEZFNq6yokX6fOCs/vlxdhmSkOjMIrvg==} + peerDependencies: + '@expo/metro-runtime': ^55.0.11 + expo: '*' + expo-constants: ^55.0.16 + expo-font: ^55.0.7 + expo-router: '*' + expo-server: ^55.0.9 + react: '*' + react-dom: '*' + react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 + peerDependenciesMeta: + '@expo/metro-runtime': + optional: true + expo-router: + optional: true + react-dom: + optional: true + react-server-dom-webpack: + optional: true + + '@expo/schema-utils@55.0.4': + resolution: {integrity: sha512-65IdeeE8dAZR3n3J5Eq7LYiQ8BFGeEYCWPBCzycvafL7PkskbCyIclTQarRwf/HXFoRvezKCjaLwy/8v9Prk6g==} + + '@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: '*' + react-native: '*' + + '@expo/ws-tunnel@1.0.6': + resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} + + '@expo/xcpretty@4.4.4': + resolution: {integrity: sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==} + hasBin: true + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@formatjs/ecma402-abstract@3.1.0': + resolution: {integrity: sha512-CjP1sUzM7XiQW6YluDreN+dMvcKZysO/J4ikvuDjDyd6nSOoSqAK9gvD1s75ZFaJVXtYOsz+y3CUXPZ1sKxcxw==} + + '@formatjs/fast-memoize@3.1.0': + resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} + + '@formatjs/icu-messageformat-parser@3.4.0': + resolution: {integrity: sha512-2bSQc59NFiEuN5VW0dUh7Txn5Qbeib5kZtzxFDXXqxUljvwhA3Qsrv2AwuVCRMISjbgOYwA2Rp5HW6tbdTnv9g==} + + '@formatjs/icu-skeleton-parser@2.1.0': + resolution: {integrity: sha512-wNer4imHDFBVAJnMb2OGoSyM4wL/uuLnuo5mrenliqkDaNjRbG4jzlJcwTTDEBhai8iCjnzUsE7xwNJC29SfWw==} '@formatjs/intl-localematcher@0.5.10': resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} @@ -2643,6 +3186,10 @@ packages: '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + '@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'} @@ -2677,6 +3224,10 @@ packages: node-notifier: optional: true + '@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} @@ -3579,6 +4130,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-direction@1.1.1': resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: @@ -3732,6 +4296,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: @@ -3822,6 +4399,119 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-native/assets-registry@0.83.6': + resolution: {integrity: sha512-iljb4ue1yWJ3EhySz7EjV6CzSVrI2uNtR8BI2jzP5+QS5E4Cl3fdIJRmVwDEx1pu8uE97PGEusGRHnoaZ9Q3jg==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-plugin-codegen@0.83.6': + resolution: {integrity: sha512-qfRXsHGeucT5c6mK+8Q7v4Ly3zmygfVmFlEtkiq7q07W1OTreld6nib4rJ/DBEeNiKBoBTuHjWliYGNuDjLFQA==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-preset@0.83.6': + resolution: {integrity: sha512-4/fXFDUvGOObETZq4+SUFkafld6OGgQWut5cQiqVghlhCB5z/p2lVhPgEUr/aTxTzeS3AmN+ztC+GpYPQ7tsTw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.83.6': + resolution: {integrity: sha512-doB/Pq6Cf6IjF3wlQXTIiZOnsX9X8mEEk+CdGfyuCwZjWrf7IB8KaZEXXckJmfUcIwvJ9u/a72ZoTTCIoxAc9A==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.83.6': + resolution: {integrity: sha512-Mko6mywoHYJmpBnjwAC95vQWaUUh//71knFadH0BrhHDq2m7i/IrpLwcQsPAy8855ucXflBs5zQyGTpNbPBAaw==} + 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.83.6': + resolution: {integrity: sha512-TyWXEpAjVundrc87fPWg91piOUg75+X9iutcfDe7cO3NrAEYCsl7Z09rKHuiAGkxfG9/rFD13dPsYIixUFkSFA==} + engines: {node: '>= 20.19.4'} + + '@react-native/debugger-shell@0.83.6': + resolution: {integrity: sha512-684TJMBCU0l0ZjJWzrnK0HH+ERaM9KLyxyArE1k7BrP+gVl4X9GO0Pi94RoInOxvW/nyV65sOU6Ip1F3ygS0cg==} + engines: {node: '>= 20.19.4'} + + '@react-native/dev-middleware@0.83.6': + resolution: {integrity: sha512-22xoddLTelpcVnF385SNH2hdP7X2av5pu7yRl/WnM5jBznbcl0+M9Ce94cj+WVeomsoUF/vlfuB0Ooy+RMlRiA==} + engines: {node: '>= 20.19.4'} + + '@react-native/gradle-plugin@0.83.6': + resolution: {integrity: sha512-5prXv7WWR1RgZ/kWGZP+mi7/y/IE2ymfOHIZO5Pv14tMOmRAcQSgSYogcRmOiWw5mJs2K0UFeMiQD49ZO9oCug==} + engines: {node: '>= 20.19.4'} + + '@react-native/js-polyfills@0.83.6': + resolution: {integrity: sha512-VSev0LV2i5X0ibduHBSLqKj0YU2F+waCgjl2uvaGHMGCSV1ZRKNFX/vJFqvLwjvdzLbkAZoFT1Rg7k7jDv44UA==} + engines: {node: '>= 20.19.4'} + + '@react-native/normalize-colors@0.74.89': + resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} + + '@react-native/normalize-colors@0.83.6': + resolution: {integrity: sha512-bTM24b5v4qN3h52oflnv+OujFORn/kVi06WaWhnQQw14/ycilPqIsqsa+DpIBqdBrXxvLa9fXtCRrQtGATZCEw==} + + '@react-native/virtualized-lists@0.83.6': + resolution: {integrity: sha512-gNSFXeb4P7qHtauLvl+zESroULIyX6Ltpvau3dhwy/QmfanBv0KUcrIU/7aVXxtWcXgp+54oWJyu2LIrsZ9+LQ==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-navigation/bottom-tabs@7.16.1': + resolution: {integrity: sha512-wjFATJmbq0K8B96Ax0JcK2+Eu7syfYvQ5qUd/tgcv8JuCYLwKKqojJMAl31qdjpKqFG09pQ6TSdEDHOek60CAA==} + peerDependencies: + '@react-navigation/native': ^7.2.4 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/core@7.17.4': + resolution: {integrity: sha512-Rv9E2oNNQEkPGpmu9q+vJwGJRSQR6LBg5L+Yo1QHjtwGbHUbjkIKOdYymDZoZYgNzX2OD4rAIlfuzbDKa3cCeA==} + peerDependencies: + react: '>= 18.2.0' + + '@react-navigation/elements@2.9.18': + resolution: {integrity: sha512-mKEvDr6CkCVYZSb8W9WubNseihL+1c8M7ktZJCTCbMk8rQgdQfkdRNwpSUQKspdGpUHCb9cyzvaiuzl1NtjVgw==} + peerDependencies: + '@react-native-masked-view/masked-view': '>= 0.2.0' + '@react-navigation/native': ^7.2.4 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + peerDependenciesMeta: + '@react-native-masked-view/masked-view': + optional: true + + '@react-navigation/native-stack@7.15.1': + resolution: {integrity: sha512-kNrJggwoB/onC0MpZIuZ6qaqeAziFchz+W9txBzhd6qbWmB1OkPVUnu6fWgc6BQc7MeMf59djVmqgX+6kJU1Ug==} + peerDependencies: + '@react-navigation/native': ^7.2.4 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/native@7.2.4': + resolution: {integrity: sha512-eWC2D3JjhYLId2fVTZhhCiUpWIaPhO9XyEb7Wq8ElmOHyIODlbOzgZ0rKia02OIsDKr9BzZl2sK1dL70yMxDaw==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + + '@react-navigation/routers@7.5.5': + resolution: {integrity: sha512-9/hhMte12Kgu+pMnLfA4EWJ0OQmIEAMVMX06FPH2yGkEQSQ3JhhCN/GkcRikzQhtEi97VYYQA15umptBUShcOQ==} + '@react-stately/flags@3.1.2': resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} @@ -4663,6 +5353,9 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -4935,6 +5628,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -5223,6 +5917,14 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@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'} + '@xmldom/xmldom@0.9.8': resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} engines: {node: '>=14.6'} @@ -5250,6 +5952,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -5281,10 +5987,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -5317,6 +6019,9 @@ packages: resolution: {integrity: sha512-n/NdPglzmkcNYZfIT3Fo8pnDR/lKiK1kZ1Yaa315UoLyHymADhWw15+bzN5gBxrCA8KyeNu0JJD6mLtTov43lQ==} engines: {node: '>= 14.0.0'} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -5343,10 +6048,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -5441,6 +6142,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -5543,11 +6247,41 @@ packages: 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.32.0: + resolution: {integrity: sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==} + + babel-plugin-syntax-hermes-parser@0.32.1: + resolution: {integrity: sha512-HgErPZTghW76Rkq9uqn5ESeiD97FbqpZ1V170T1RG2RDp+7pJVQV2pQJs7y5YzN0/gcT6GM5ci9apRnIwuyPdQ==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + 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@55.0.21: + resolution: {integrity: sha512-anXoUZBcxydLdVs2L+r3bWKGUvZv2FtgOl8xRJ12i/YfKICBpwTGZWSTiEYTqBByZ6GkA3mE9+3TW97X2ocFTQ==} + peerDependencies: + '@babel/runtime': ^7.20.0 + expo: '*' + expo-widgets: ^55.0.17 + react-refresh: '>=0.14.0 <1.0.0' + peerDependenciesMeta: + '@babel/runtime': + optional: true + expo: + optional: true + expo-widgets: + 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} @@ -5566,6 +6300,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5596,6 +6334,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'} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -5623,12 +6365,27 @@ 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==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5769,6 +6526,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'} @@ -5826,10 +6587,21 @@ 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'} @@ -5855,11 +6627,19 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-table3@0.6.5: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} @@ -5949,6 +6729,10 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -6004,6 +6788,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'} + console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} @@ -6067,9 +6855,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - core-js-compat@3.47.0: resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} @@ -6112,6 +6897,9 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 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'} @@ -6120,6 +6908,9 @@ packages: resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} engines: {node: '>= 0.10'} + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-loader@6.11.0: resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} engines: {node: '>= 12.13.0'} @@ -6403,6 +7194,10 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -6524,6 +7319,9 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} + dnssd-advertise@1.1.4: + resolution: {integrity: sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -6622,6 +7420,10 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -7051,50 +7853,216 @@ packages: resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + expo-asset@55.0.17: + resolution: {integrity: sha512-pK9HHJuFqjE8kDUcbMFsZj3Cz8WdXpvZHZmYl7ouFQp59P83BvHln6VnqPDGlO+/4929G0Lm8ZUzbONuNRhi9w==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + expo-constants@55.0.16: + resolution: {integrity: sha512-Z15/No94UHoogD+pulxjudGAeOHTEIWZgb/vnX48Wx5D+apWTeCbnKxQZZtGQlosvduYL5kaic2/W8U+NHfBQQ==} + peerDependencies: + expo: '*' + react-native: '*' - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + expo-device@55.0.17: + resolution: {integrity: sha512-ZcMrSeD0zWooosm5Bet5qluxUrhw+NPgcMmN6ySVF7cm4K8Bvh4KPogJePbI1qfhFAiJWcWeV9e/2uewb9ktfw==} + peerDependencies: + expo: '*' - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + expo-file-system@55.0.20: + resolution: {integrity: sha512-sBCHhNlCT3EiqCcE6xSbyvOLUAlKx7+p0qjo+c+UPyC/gMrXUdva99g25uptM+fEMwy2co25MUQQ0U0guQLOQA==} + peerDependencies: + expo: '*' + react-native: '*' - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + expo-font@55.0.7: + resolution: {integrity: sha512-oH39Xb+3i6Y69b7YRP+P+5WLx7621t+ep/RAgLwJJYpTjs7CnSohUG+873rEtqsTAuQGi63ms7x9ZeHj1E9LYw==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + expo-glass-effect@55.0.11: + resolution: {integrity: sha512-wqq7GUOqSkfoFJzreZvBG0jzjsq5c582m3glhWSjcmIuByxXXWp6j6GY6hyFuYKzpOXhbuvusVxGCQi0yWnp3g==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' - fast-json-parse@1.0.3: - resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + expo-image@55.0.10: + resolution: {integrity: sha512-We+vq/Z8jy8zmGxcOP8vrhiWkkwyXFdSks8cSlPi0bpu6D0Ei6l9Nj2xHWCD+yoENh92aCEe1+QRujAwXbogGA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + expo-keep-awake@55.0.8: + resolution: {integrity: sha512-PfIpMfM+STOBwkR5XOE+yVtER86c44MD+W8QD8JxuO0sT9pF7Y1SJYakWlpvX8xsGA+bjKLxftm9403s9kQhKA==} + peerDependencies: + expo: '*' + react: '*' - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + expo-linking@55.0.15: + resolution: {integrity: sha512-/RQh2vkNqV8Bim9Owm/evVqn2fqTvCDYHkpYPoSKbLAdydSGdHC2xZNw7Odl4wu1i1/3L4Xz//LKd3NsPWYWBQ==} + peerDependencies: + react: '*' + react-native: '*' - fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + expo-modules-autolinking@55.0.22: + resolution: {integrity: sha512-13x32V0HMHJDjND4K/gU2lQIZNxYn5S5rFzujqHmnXvOO6WGrVVELpk/0p5FmBfeuQ7GGFsATbhazQk+FeukUw==} + hasBin: true - fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + expo-modules-core@55.0.25: + resolution: {integrity: sha512-yXpfg7aHLbuqoXocK34Vua6Aey5SCyqLygAsXAMbul9P8vfBjLpaOPiTJ5cLVF7Drfq8ownqVJO6qpGEtZ6GOw==} + peerDependencies: + react: '*' + react-native: '*' + react-native-worklets: ^0.7.4 || ^0.8.0 + peerDependenciesMeta: + react-native-worklets: + optional: true - fast-uri@3.0.6: + expo-router@55.0.14: + resolution: {integrity: sha512-rOn/wosp2hAPM+O2o41hnarbP5Zqv9UkHWa31KoSoiOme1tpmZd2yc93XtRAtzP0P5E5xzqq7a2rbEAarpP5XA==} + peerDependencies: + '@expo/log-box': 55.0.12 + '@expo/metro-runtime': ^55.0.11 + '@react-navigation/drawer': ^7.9.4 + '@testing-library/react-native': '>= 13.2.0' + expo: '*' + expo-constants: ^55.0.16 + expo-linking: ^55.0.15 + react: '*' + react-dom: '*' + react-native: '*' + react-native-gesture-handler: '*' + react-native-reanimated: '*' + react-native-safe-area-context: '>= 5.4.0' + react-native-screens: '*' + react-native-web: '*' + react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 + peerDependenciesMeta: + '@react-navigation/drawer': + optional: true + '@testing-library/react-native': + optional: true + react-dom: + optional: true + react-native-gesture-handler: + optional: true + react-native-reanimated: + optional: true + react-native-web: + optional: true + react-server-dom-webpack: + optional: true + + expo-server@55.0.9: + resolution: {integrity: sha512-N5Ipn1NwqaJzEm+G97o0Jbe4g/th3R/16N1DabnYryXKCiZwDkK13/w3VfGkQN9LOOaBP+JIRxGf4M8lQKPzyA==} + engines: {node: '>=20.16.0'} + + expo-splash-screen@55.0.21: + resolution: {integrity: sha512-hFGEap69ggCckbHIdDXMe5rqfBR9TwcnY5gBhyaACUxU64w827T6prOQcIvLmAdv00kp3Gqt7hgE+mNn37EF+A==} + peerDependencies: + expo: '*' + + expo-status-bar@55.0.6: + resolution: {integrity: sha512-ijOUptfdiqYt7rObZ6jrPQ8sE5YN/8MxKCIJx0b7TY4nGkSJxhPIxeoW4GXcXCA8mTQ9PiOHH/ThLZgRVZvUlQ==} + peerDependencies: + react: '*' + react-native: '*' + + expo-symbols@55.0.8: + resolution: {integrity: sha512-Dg6BTu+fCWukdlh+3XYIr6NbqJWmK4aAQ6i6BInKnWU0ALuzVUJcMDq8Lk9bHok2hOh3OhzJqlCqEoBXPInIVQ==} + peerDependencies: + expo: '*' + expo-font: '*' + react: '*' + react-native: '*' + + expo-system-ui@55.0.18: + resolution: {integrity: sha512-Fbc0HJgqMpABeA/gI7NJFnSXwUeLrEMjjXq8Nl+4gTXyacIK2iOOrzCkvq41rKBBde0CR6kVnB1DXj0j9ZYnjg==} + peerDependencies: + expo: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-web-browser@55.0.16: + resolution: {integrity: sha512-eeGs3439ewO/Q56Pzg3qbAVZSE0oH/R7XW9VCXI59k0m78ZIYbBtPT4PMFL/+sBgRkXm546Lq/DFcJQPTOfXJg==} + peerDependencies: + expo: '*' + react-native: '*' + + expo@55.0.24: + resolution: {integrity: sha512-nU95y+GIfD1dm9CSjsitDdltSU83dDqemxD1UUBxJPH8zKf7B5AdGVNyE6/jLWyCM/p/EmHfCeiqdrWCy9ljZA==} + hasBin: true + peerDependencies: + '@expo/dom-webview': '*' + '@expo/metro-runtime': '*' + react: '*' + 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.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-parse@1.0.3: + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastq@1.19.1: @@ -7107,9 +8075,20 @@ packages: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + 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-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} @@ -7122,6 +8101,9 @@ packages: picomatch: optional: true + fetch-nodeshim@0.4.10: + resolution: {integrity: sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==} + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -7137,10 +8119,18 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + filter-obj@2.0.2: resolution: {integrity: sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==} engines: {node: '>=8'} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@1.3.2: resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} @@ -7183,6 +8173,9 @@ packages: flexsearch@0.7.43: resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -7192,6 +8185,9 @@ packages: debug: optional: true + fontfaceobserver@2.3.0: + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -7318,6 +8314,10 @@ packages: get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + getenv@2.0.0: + resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} + engines: {node: '>=6'} + git-up@8.1.1: resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} @@ -7421,6 +8421,10 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + 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'} @@ -7507,24 +8511,48 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-compiler@0.14.1: + resolution: {integrity: sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA==} + hermes-estree@0.20.1: resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + + hermes-estree@0.32.1: + resolution: {integrity: sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==} + + hermes-estree@0.35.0: + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + hermes-parser@0.20.1: resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + + hermes-parser@0.32.1: + resolution: {integrity: sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==} + + hermes-parser@0.35.0: + resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -7648,6 +8676,9 @@ packages: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} + 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'} @@ -7727,6 +8758,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'} @@ -7741,6 +8775,9 @@ packages: intl-messageformat@11.1.0: resolution: {integrity: sha512-5QJbBIRJqqBX0cD1z+r4e3B5HGmyLYzTFAW5WmSlGuwc3kHSOR0x9fEE/Z9wL2+Px9P1kwqj+wE6QzCoyooBSA==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -8293,6 +9330,9 @@ packages: node-notifier: optional: true + jimp-compact@0.16.1: + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -8318,6 +9358,9 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + jsdoc-type-pratt-parser@4.8.0: resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} @@ -8420,6 +9463,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + lan-network@0.2.1: + resolution: {integrity: sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==} + hasBin: true + langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} @@ -8456,6 +9503,9 @@ packages: resolution: {integrity: sha512-NVPTth/71cfbdYHqypcO9Lt5WFGTzFEcx81lWd7GDJIgZ95ERdYHGUfCtFejHCyqodKsQkNEx2JCkMpreDty/A==} engines: {node: ^20.17.0 || >=22.9.0} + 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'} @@ -8587,6 +9637,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -8603,10 +9657,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} - engines: {node: 20 || >=22} - lru-cache@11.2.4: resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} @@ -8665,6 +9715,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'} @@ -8753,6 +9806,12 @@ packages: memfs@4.52.0: resolution: {integrity: sha512-dG5ZY1wUCPWhtl4M2mlc7Wx4OrMGtiI79axnScxwDoPR/25biQYrYm21OpKyZcnKv8pvWaX95SRtZgecZ84gFg==} + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -8774,6 +9833,64 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + metro-babel-transformer@0.83.7: + resolution: {integrity: sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==} + 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.7: + resolution: {integrity: sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==} + 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.7: + resolution: {integrity: sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==} + 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.7: + resolution: {integrity: sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==} + engines: {node: '>=20.19.4'} + + metro-resolver@0.83.7: + resolution: {integrity: sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==} + 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.7: + resolution: {integrity: sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==} + engines: {node: '>=20.19.4'} + + 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.7: + resolution: {integrity: sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==} + engines: {node: '>=20.19.4'} + + metro-transform-worker@0.83.7: + resolution: {integrity: sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==} + engines: {node: '>=20.19.4'} + + metro@0.83.7: + resolution: {integrity: sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==} + engines: {node: '>=20.19.4'} + hasBin: true + mhchemparser@4.2.1: resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} @@ -8959,6 +10076,10 @@ packages: engines: {node: '>=4'} 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'} @@ -8981,6 +10102,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -9030,6 +10155,11 @@ packages: mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -9051,6 +10181,9 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + multitars@1.0.0: + resolution: {integrity: sha512-H/J4fMLedtudftaYMOg7ajzLYgT3/rwbWVJbqr/iUgB8DQztn38ys5HOqI1CzSxx8QhXXwOOnnBvd4v3jG5+Mg==} + mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9211,6 +10344,19 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + node-gyp@12.1.0: resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==} engines: {node: ^20.17.0 || >=22.9.0} @@ -9268,6 +10414,10 @@ packages: resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} engines: {node: ^20.17.0 || >=22.9.0} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@13.0.2: resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} engines: {node: ^20.17.0 || >=22.9.0} @@ -9308,9 +10458,16 @@ 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.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + 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'} @@ -9360,6 +10517,10 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + 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'} @@ -9371,6 +10532,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + 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'} @@ -9386,6 +10551,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + 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'} @@ -9398,6 +10567,10 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + ora@3.4.0: + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} + os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} @@ -9525,6 +10698,10 @@ packages: parse-path@7.1.0: resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} + parse-png@2.1.0: + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} + parse-url@9.2.0: resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} engines: {node: '>=14.13.0'} @@ -9664,10 +10841,18 @@ packages: engines: {node: '>=18'} hasBin: true + plist@3.1.1: + resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} + engines: {node: '>=10.4.0'} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + pnp-webpack-plugin@1.7.0: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} @@ -9777,6 +10962,10 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -9809,6 +10998,10 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} + 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} + proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9828,6 +11021,10 @@ packages: resolution: {integrity: sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ==} engines: {node: ^20.17.0 || >=22.9.0} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -9838,6 +11035,12 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + 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'} @@ -9893,6 +11096,10 @@ packages: resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + querystring-es3@0.2.1: resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} engines: {node: '>=0.4.x'} @@ -9920,6 +11127,9 @@ packages: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -9939,11 +11149,25 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + react-dom@19.2.3: resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: react: ^19.2.3 + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-freeze@1.0.4: + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=17.0.0' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -9953,12 +11177,76 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.6: + resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} + react-medium-image-zoom@5.2.14: resolution: {integrity: sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-native-gesture-handler@2.30.1: + resolution: {integrity: sha512-xIUBDo5ktmJs++0fZlavQNvDEE4PsihWhSeJsJtoz4Q6p0MiTM9TgrTgfEgzRR36qGPytFoeq+ShLrVwGdpUdA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-is-edge-to-edge@1.2.1: + resolution: {integrity: sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-is-edge-to-edge@1.3.1: + resolution: {integrity: sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-reanimated@4.2.1: + resolution: {integrity: sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==} + peerDependencies: + react: '*' + react-native: '*' + react-native-worklets: '>=0.7.0' + + react-native-safe-area-context@5.6.2: + resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-screens@4.23.0: + resolution: {integrity: sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-web@0.21.2: + resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + react-native-worklets@0.7.4: + resolution: {integrity: sha512-NYOdM1MwBb3n+AtMqy1tFy3Mn8DliQtd8sbzAVRf9Gc+uvQ0zRfxN7dS8ZzoyX7t6cyQL5THuGhlnX+iFlQTag==} + peerDependencies: + '@babel/core': '*' + react: '*' + react-native: '*' + + react-native@0.83.6: + resolution: {integrity: sha512-H513+8VzviNFXOdPnStRzX9S3/jiJGg++QZ1zd+ROyAvBEKqFqKUPHH0d82y3QyRPct5qKjdOa7J6vNehCvXYA==} + engines: {node: '>= 20.19.4'} + hasBin: true + peerDependencies: + '@types/react': ^19.1.1 + react: ^19.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -10024,6 +11312,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} @@ -10107,6 +11399,9 @@ packages: 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==} @@ -10242,6 +11537,9 @@ packages: resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} engines: {node: '>=12'} + 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'} @@ -10260,6 +11558,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -10364,6 +11666,10 @@ packages: webpack: optional: true + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -10414,6 +11720,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -10423,6 +11734,10 @@ packages: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} + 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==} @@ -10434,6 +11749,9 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -10461,10 +11779,17 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sf-symbols-typescript@2.2.0: + resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} + engines: {node: '>=10'} + sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -10518,6 +11843,9 @@ packages: resolution: {integrity: sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==} engines: {node: ^20.17.0 || >=22.9.0} + simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} @@ -10545,6 +11873,10 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -10585,6 +11917,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -10623,6 +11959,10 @@ packages: resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} hasBin: true + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -10643,6 +11983,10 @@ packages: stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -10678,6 +12022,10 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-buffers@2.2.0: + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + stream-http@3.2.0: resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} @@ -10685,6 +12033,10 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -10745,10 +12097,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-ansi@7.1.2: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} @@ -10792,6 +12140,9 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + structured-headers@0.4.1: + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + style-loader@3.3.4: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -10843,6 +12194,9 @@ packages: babel-plugin-macros: optional: true + styleq@0.1.3: + resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -10851,6 +12205,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + 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'} @@ -10859,6 +12217,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.2.0: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} @@ -10914,6 +12276,10 @@ packages: engines: {node: '>=18'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + terser-webpack-plugin@5.3.14: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} @@ -10951,11 +12317,6 @@ packages: engines: {node: '>=10'} hasBin: true - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} - engines: {node: '>=10'} - hasBin: true - terser@5.45.0: resolution: {integrity: sha512-hQ9c+JZEnMug8eqzuU48sCeq95f00lLDAaJ5gWhRkFXsfy3+SUkZXiF/Z66ZO6EomSmgqXnkhVrWXKaQ8K41Ug==} engines: {node: '>=10'} @@ -10981,6 +12342,9 @@ packages: peerDependencies: tslib: ^2 + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -11051,6 +12415,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toqr@0.1.1: + resolution: {integrity: sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -11063,6 +12430,9 @@ packages: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -11204,6 +12574,10 @@ packages: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -11258,6 +12632,14 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@0.7.41: + resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} + hasBin: true + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} @@ -11405,6 +12787,11 @@ packages: '@types/react': optional: true + use-latest-callback@0.2.6: + resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} + peerDependencies: + react: '>=16.8' + use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -11451,7 +12838,12 @@ packages: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true - uuid@8.3.2: + 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==} 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 @@ -11475,6 +12867,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -11594,6 +12992,9 @@ packages: jsdom: optional: true + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -11632,6 +13033,9 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + watchpack@2.4.4: resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} @@ -11649,6 +13053,9 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -11736,6 +13143,9 @@ packages: engines: {node: '>=12'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -11744,6 +13154,9 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url-minimum@0.1.2: + resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==} + whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} @@ -11752,6 +13165,9 @@ packages: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -11878,6 +13294,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + 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'} @@ -11886,6 +13306,18 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.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==} @@ -12167,6 +13599,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.6': {} '@babel/core@7.28.6': @@ -12197,6 +13635,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.21.9 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.28.6 @@ -12312,8 +13758,6 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} @@ -12333,7 +13777,7 @@ snapshots: '@babel/parser@7.21.9': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': dependencies: @@ -12370,6 +13814,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12402,11 +13860,26 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12516,6 +13989,14 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12532,6 +14013,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@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.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12598,6 +14091,12 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12680,6 +14179,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12714,6 +14218,14 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -12973,6 +14485,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + '@babel/preset-typescript@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -13008,16 +14531,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': + '@babel/traverse@7.29.0': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.21.9 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} '@braidai/lang@1.1.2': {} @@ -13107,6 +14642,10 @@ snapshots: dependencies: '@edge-runtime/primitives': 6.0.0 + '@egjs/hammerjs@2.0.17': + dependencies: + '@types/hammerjs': 2.0.46 + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -13358,85 +14897,660 @@ snapshots: '@exodus/bytes@1.8.0': optional: true - '@floating-ui/core@1.6.2': - dependencies: - '@floating-ui/utils': 0.2.8 + '@expo-google-fonts/material-symbols@0.4.37': {} + + '@expo/cli@55.0.30(tk4xwbok6eexo2trkmfdoi7sti)': + dependencies: + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 55.0.17(typescript@5.9.3) + '@expo/config-plugins': 55.0.9 + '@expo/devcert': 1.2.1 + '@expo/env': 2.1.2 + '@expo/image-utils': 0.8.14(typescript@5.9.3) + '@expo/json-file': 10.0.14 + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/metro': 55.1.1 + '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + '@expo/osascript': 2.4.3 + '@expo/package-manager': 1.10.5 + '@expo/plist': 0.5.3 + '@expo/prebuild-config': 55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + '@expo/require-utils': 55.0.5(typescript@5.9.3) + '@expo/router-server': 55.0.16(w3w2xvpwpnzsukpzhxpigl5koq) + '@expo/schema-utils': 55.0.4 + '@expo/spawn-async': 1.7.2 + '@expo/ws-tunnel': 1.0.6 + '@expo/xcpretty': 4.4.4 + '@react-native/dev-middleware': 0.83.6 + 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.1 + connect: 3.7.0 + debug: 4.4.3 + dnssd-advertise: 1.1.4 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-server: 55.0.9 + fetch-nodeshim: 0.4.10 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.2.1 + multitars: 1.0.0 + node-forge: 1.4.0 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 4.0.3 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + resolve-from: 5.0.0 + semver: 7.7.3 + send: 0.19.2 + slugify: 1.6.9 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + terminal-link: 2.1.1 + toqr: 0.1.1 + wrap-ansi: 7.0.0 + ws: 8.19.0 + zod: 3.25.76 + optionalDependencies: + expo-router: 55.0.14(bls4af4uxyiaulbxq3gobnrtf4) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + transitivePeerDependencies: + - '@expo/dom-webview' + - '@expo/metro-runtime' + - bufferutil + - expo-constants + - expo-font + - react + - react-dom + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate - '@floating-ui/core@1.7.3': - dependencies: - '@floating-ui/utils': 0.2.10 + '@expo/cli@55.0.30(utmbucutznkwsh5ecrbgfcjis4)': + dependencies: + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 55.0.17(typescript@6.0.2) + '@expo/config-plugins': 55.0.9 + '@expo/devcert': 1.2.1 + '@expo/env': 2.1.2 + '@expo/image-utils': 0.8.14(typescript@6.0.2) + '@expo/json-file': 10.0.14 + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/metro': 55.1.1 + '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(typescript@6.0.2) + '@expo/osascript': 2.4.3 + '@expo/package-manager': 1.10.5 + '@expo/plist': 0.5.3 + '@expo/prebuild-config': 55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(typescript@6.0.2) + '@expo/require-utils': 55.0.5(typescript@6.0.2) + '@expo/router-server': 55.0.16(qblbds4q2ldarkyu64jd4iigke) + '@expo/schema-utils': 55.0.4 + '@expo/spawn-async': 1.7.2 + '@expo/ws-tunnel': 1.0.6 + '@expo/xcpretty': 4.4.4 + '@react-native/dev-middleware': 0.83.6 + 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.1 + connect: 3.7.0 + debug: 4.4.3 + dnssd-advertise: 1.1.4 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-server: 55.0.9 + fetch-nodeshim: 0.4.10 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.2.1 + multitars: 1.0.0 + node-forge: 1.4.0 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 4.0.3 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + resolve-from: 5.0.0 + semver: 7.7.3 + send: 0.19.2 + slugify: 1.6.9 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + terminal-link: 2.1.1 + toqr: 0.1.1 + wrap-ansi: 7.0.0 + ws: 8.19.0 + zod: 3.25.76 + optionalDependencies: + expo-router: 55.0.14(dlaaohsqynlm2lpw4mem6bur2u) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + transitivePeerDependencies: + - '@expo/dom-webview' + - '@expo/metro-runtime' + - bufferutil + - expo-constants + - expo-font + - react + - react-dom + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate - '@floating-ui/dom@1.6.5': + '@expo/code-signing-certificates@0.0.6': dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.8 + node-forge: 1.4.0 - '@floating-ui/dom@1.7.4': + '@expo/config-plugins@55.0.9': dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.10 + '@expo/config-types': 55.0.5 + '@expo/json-file': 10.0.14 + '@expo/plist': 0.5.3 + '@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 + slugify: 1.6.9 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@expo/config-types@55.0.5': {} - '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@expo/config@55.0.17(typescript@5.9.3)': dependencies: - '@floating-ui/dom': 1.7.4 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@expo/config-plugins': 55.0.9 + '@expo/config-types': 55.0.5 + '@expo/json-file': 10.0.14 + '@expo/require-utils': 55.0.5(typescript@5.9.3) + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + resolve-workspace-root: 2.0.1 + semver: 7.7.3 + slugify: 1.6.9 + transitivePeerDependencies: + - supports-color + - typescript - '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@expo/config@55.0.17(typescript@6.0.2)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.9 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.10': {} - - '@floating-ui/utils@0.2.8': {} - - '@floating-ui/utils@0.2.9': {} + '@expo/config-plugins': 55.0.9 + '@expo/config-types': 55.0.5 + '@expo/json-file': 10.0.14 + '@expo/require-utils': 55.0.5(typescript@6.0.2) + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + resolve-workspace-root: 2.0.1 + semver: 7.7.3 + slugify: 1.6.9 + transitivePeerDependencies: + - supports-color + - typescript - '@formatjs/ecma402-abstract@3.1.0': + '@expo/devcert@1.2.1': dependencies: - '@formatjs/fast-memoize': 3.1.0 - '@formatjs/intl-localematcher': 0.8.0 - decimal.js: 10.6.0 - tslib: 2.8.1 + '@expo/sudo-prompt': 9.3.2 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color - '@formatjs/fast-memoize@3.1.0': + '@expo/devtools@55.0.3(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - tslib: 2.8.1 + chalk: 4.1.2 + optionalDependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) - '@formatjs/icu-messageformat-parser@3.4.0': + '@expo/devtools@55.0.3(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - '@formatjs/ecma402-abstract': 3.1.0 - '@formatjs/icu-skeleton-parser': 2.1.0 - tslib: 2.8.1 + chalk: 4.1.2 + optionalDependencies: + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) - '@formatjs/icu-skeleton-parser@2.1.0': + '@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - '@formatjs/ecma402-abstract': 3.1.0 - tslib: 2.8.1 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) - '@formatjs/intl-localematcher@0.5.10': + '@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - tslib: 2.8.1 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) - '@formatjs/intl-localematcher@0.8.0': + '@expo/env@2.1.2': dependencies: - '@formatjs/fast-memoize': 3.1.0 - tslib: 2.8.1 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + transitivePeerDependencies: + - supports-color - '@formatjs/intl-localematcher@0.8.1': + '@expo/fingerprint@0.16.7': dependencies: - '@formatjs/fast-memoize': 3.1.0 - tslib: 2.8.1 + '@expo/env': 2.1.2 + '@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.5 + resolve-from: 5.0.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + '@expo/image-utils@0.8.14(typescript@5.9.3)': + dependencies: + '@expo/require-utils': 55.0.5(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/image-utils@0.8.14(typescript@6.0.2)': + dependencies: + '@expo/require-utils': 55.0.5(typescript@6.0.2) + '@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.14': + dependencies: + '@babel/code-frame': 7.28.6 + json5: 2.2.3 + + '@expo/local-build-cache-provider@55.0.13(typescript@5.9.3)': + dependencies: + '@expo/config': 55.0.17(typescript@5.9.3) + chalk: 4.1.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/local-build-cache-provider@55.0.13(typescript@6.0.2)': + dependencies: + '@expo/config': 55.0.17(typescript@6.0.2) + chalk: 4.1.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/log-box@55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': + dependencies: + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + anser: 1.4.10 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + stacktrace-parser: 0.1.11 + + '@expo/log-box@55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': + dependencies: + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + anser: 1.4.10 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + stacktrace-parser: 0.1.11 + + '@expo/metro-config@55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@expo/config': 55.0.17(typescript@5.9.3) + '@expo/env': 2.1.2 + '@expo/json-file': 10.0.14 + '@expo/metro': 55.1.1 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.32.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: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@expo/metro-config@55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(typescript@6.0.2)': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@expo/config': 55.0.17(typescript@6.0.2) + '@expo/env': 2.1.2 + '@expo/json-file': 10.0.14 + '@expo/metro': 55.1.1 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.32.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: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@expo/metro-runtime@55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': + dependencies: + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + anser: 1.4.10 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + pretty-format: 29.7.0 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + optionalDependencies: + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@expo/dom-webview' + + '@expo/metro-runtime@55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.3(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': + dependencies: + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + anser: 1.4.10 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + pretty-format: 29.7.0 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - '@expo/dom-webview' + optional: true + + '@expo/metro@55.1.1': + dependencies: + metro: 0.83.7 + 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-minify-terser: 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 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/osascript@2.4.3': + dependencies: + '@expo/spawn-async': 1.7.2 + + '@expo/package-manager@1.10.5': + dependencies: + '@expo/json-file': 10.0.14 + '@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.5.3': + dependencies: + '@xmldom/xmldom': 0.8.13 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + '@expo/prebuild-config@55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@expo/config': 55.0.17(typescript@5.9.3) + '@expo/config-plugins': 55.0.9 + '@expo/config-types': 55.0.5 + '@expo/image-utils': 0.8.14(typescript@5.9.3) + '@expo/json-file': 10.0.14 + '@react-native/normalize-colors': 0.83.6 + debug: 4.4.3 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + resolve-from: 5.0.0 + semver: 7.7.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/prebuild-config@55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(typescript@6.0.2)': + dependencies: + '@expo/config': 55.0.17(typescript@6.0.2) + '@expo/config-plugins': 55.0.9 + '@expo/config-types': 55.0.5 + '@expo/image-utils': 0.8.14(typescript@6.0.2) + '@expo/json-file': 10.0.14 + '@react-native/normalize-colors': 0.83.6 + debug: 4.4.3 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + resolve-from: 5.0.0 + semver: 7.7.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/require-utils@55.0.5(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@expo/require-utils@55.0.5(typescript@6.0.2)': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + optionalDependencies: + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@expo/router-server@55.0.16(qblbds4q2ldarkyu64jd4iigke)': + dependencies: + debug: 4.4.3 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-server: 55.0.9 + react: 19.2.3 + optionalDependencies: + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.3(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-router: 55.0.14(dlaaohsqynlm2lpw4mem6bur2u) + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - supports-color + + '@expo/router-server@55.0.16(w3w2xvpwpnzsukpzhxpigl5koq)': + dependencies: + debug: 4.4.3 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-server: 55.0.9 + react: 19.2.0 + optionalDependencies: + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-router: 55.0.14(bls4af4uxyiaulbxq3gobnrtf4) + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - supports-color + + '@expo/schema-utils@55.0.4': {} + + '@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@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': + dependencies: + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + '@expo/vector-icons@15.1.1(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': + dependencies: + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + + '@expo/ws-tunnel@1.0.6': {} + + '@expo/xcpretty@4.4.4': + dependencies: + '@babel/code-frame': 7.28.6 + chalk: 4.1.2 + js-yaml: 4.1.1 + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} + + '@floating-ui/utils@0.2.8': {} + + '@floating-ui/utils@0.2.9': {} + + '@formatjs/ecma402-abstract@3.1.0': + dependencies: + '@formatjs/fast-memoize': 3.1.0 + '@formatjs/intl-localematcher': 0.8.0 + decimal.js: 10.6.0 + tslib: 2.8.1 + + '@formatjs/fast-memoize@3.1.0': + dependencies: + tslib: 2.8.1 + + '@formatjs/icu-messageformat-parser@3.4.0': + dependencies: + '@formatjs/ecma402-abstract': 3.1.0 + '@formatjs/icu-skeleton-parser': 2.1.0 + tslib: 2.8.1 + + '@formatjs/icu-skeleton-parser@2.1.0': + dependencies: + '@formatjs/ecma402-abstract': 3.1.0 + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.8.0': + dependencies: + '@formatjs/fast-memoize': 3.1.0 + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.8.1': + dependencies: + '@formatjs/fast-memoize': 3.1.0 + tslib: 2.8.1 '@headlessui/react@2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -13713,6 +15827,8 @@ snapshots: '@isaacs/string-locale-compare@1.1.0': {} + '@isaacs/ttlcache@1.4.1': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -13814,6 +15930,10 @@ snapshots: - ts-node optional: true + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@jest/diff-sequences@30.0.1': optional: true @@ -14599,7 +16719,7 @@ snapshots: '@npmcli/agent@4.0.0': dependencies: - agent-base: 7.1.3 + agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 11.2.4 @@ -14653,7 +16773,7 @@ snapshots: dependencies: '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.2.2 + lru-cache: 11.2.4 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 promise-retry: 2.0.1 @@ -14986,6 +17106,18 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) @@ -14998,9 +17130,21 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.0)': dependencies: - react: 19.2.3 + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.0)': + dependencies: + react: 19.2.0 optionalDependencies: '@types/react': 19.2.14 @@ -15010,12 +17154,76 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + optional: true + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -15044,12 +17252,29 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: '@types/react': 19.2.14 + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) @@ -15061,6 +17286,13 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.3)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) @@ -15112,6 +17344,16 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -15122,134 +17364,507 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/rect@1.1.1': {} + + '@react-aria/focus@3.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/interactions@3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-aria/utils': 3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.18 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.10(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.18 + react: 18.3.1 + + '@react-aria/utils@3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.11.0(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-native/assets-registry@0.83.6': {} + + '@react-native/babel-plugin-codegen@0.83.6(@babel/core@7.28.6)': + dependencies: + '@babel/traverse': 7.28.6 + '@react-native/codegen': 0.83.6(@babel/core@7.28.6) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/babel-preset@0.83.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.83.6(@babel/core@7.28.6) + babel-plugin-syntax-hermes-parser: 0.32.0 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + + '@react-native/codegen@0.83.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.21.9 + glob: 7.2.3 + hermes-parser: 0.32.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.83.6': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@react-native/dev-middleware': 0.83.6 + 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 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@react-native/debugger-frontend@0.83.6': {} + + '@react-native/debugger-shell@0.83.6': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + cross-spawn: 7.0.6 + fb-dotslash: 0.5.8 - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@react-native/dev-middleware@0.83.6': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.83.6 + '@react-native/debugger-shell': 0.83.6 + 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.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.3)': + '@react-native/gradle-plugin@0.83.6': {} + + '@react-native/js-polyfills@0.83.6': {} + + '@react-native/normalize-colors@0.74.89': {} + + '@react-native/normalize-colors@0.83.6': {} + + '@react-native/virtualized-lists@0.83.6(@types/react@19.2.14)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@react-native/virtualized-lists@0.83.6(@types/react@19.2.14)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/bottom-tabs@7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + color: 4.2.3 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + sf-symbols-typescript: 2.2.0 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/bottom-tabs@7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + color: 4.2.3 react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + sf-symbols-typescript: 2.2.0 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + optional: true - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/core@7.17.4(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + '@react-navigation/routers': 7.5.5 + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.2.0 + react-is: 19.2.6 + use-latest-callback: 0.2.6(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.0) - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/core@7.17.4(react@19.2.3)': dependencies: + '@react-navigation/routers': 7.5.5 + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + query-string: 7.1.3 react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + react-is: 19.2.6 + use-latest-callback: 0.2.6(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + optional: true - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/elements@2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/rect': 1.1.1 - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + color: 4.2.3 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + use-latest-callback: 0.2.6(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.0) - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@react-navigation/elements@2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + color: 4.2.3 react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + use-latest-callback: 0.2.6(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + optional: true - '@radix-ui/rect@1.1.1': {} + '@react-navigation/native-stack@7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': + dependencies: + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + color: 4.2.3 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + sf-symbols-typescript: 2.2.0 + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' - '@react-aria/focus@3.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-navigation/native-stack@7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - '@react-aria/interactions': 3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-types/shared': 3.32.1(react@18.3.1) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + color: 4.2.3 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + sf-symbols-typescript: 2.2.0 + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + optional: true - '@react-aria/interactions@3.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': dependencies: - '@react-aria/ssr': 3.9.10(react@18.3.1) - '@react-aria/utils': 3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@18.3.1) - '@swc/helpers': 0.5.18 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@react-navigation/core': 7.17.4(react@19.2.0) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + use-latest-callback: 0.2.6(react@19.2.0) - '@react-aria/ssr@3.9.10(react@18.3.1)': + '@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': dependencies: - '@swc/helpers': 0.5.18 - react: 18.3.1 + '@react-navigation/core': 7.17.4(react@19.2.3) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + use-latest-callback: 0.2.6(react@19.2.3) + optional: true - '@react-aria/utils@3.32.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-navigation/routers@7.5.5': dependencies: - '@react-aria/ssr': 3.9.10(react@18.3.1) - '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.11.0(react@18.3.1) - '@react-types/shared': 3.32.1(react@18.3.1) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + nanoid: 3.3.11 '@react-stately/flags@3.1.2': dependencies: @@ -15632,7 +18247,7 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.8.0) - '@storybook/nextjs@8.6.15(@types/webpack@5.28.5(esbuild@0.25.1))(esbuild@0.25.1)(next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sockjs-client@1.6.1)(storybook@8.6.15(prettier@3.8.0))(type-fest@4.41.0)(typescript@6.0.2)(webpack-dev-server@5.2.3(webpack@5.104.1(esbuild@0.25.1)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.1))': + '@storybook/nextjs@8.6.15(@types/webpack@5.28.5(esbuild@0.25.1))(esbuild@0.25.1)(next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sockjs-client@1.6.1)(storybook@8.6.15(prettier@3.8.0))(type-fest@4.41.0)(typescript@6.0.2)(webpack-dev-server@5.2.3(webpack@5.104.1(esbuild@0.25.1)))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(esbuild@0.25.1))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) @@ -15658,7 +18273,7 @@ snapshots: find-up: 5.0.0 image-size: 1.2.1 loader-utils: 3.3.1 - next: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) node-polyfill-webpack-plugin: 2.0.1(webpack@5.104.1(esbuild@0.25.1)) pnp-webpack-plugin: 1.7.0(typescript@6.0.2) postcss: 8.5.6 @@ -15937,7 +18552,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -16221,6 +18836,8 @@ snapshots: dependencies: '@types/node': 20.19.29 + '@types/hammerjs@2.0.46': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -16368,28 +18985,28 @@ snapshots: '@types/unist@3.0.3': {} - '@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2)': + '@types/webpack@5.28.5(esbuild@0.25.1)': dependencies: '@types/node': 20.19.29 tapable: 2.2.3 - webpack: 5.102.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2) + webpack: 5.102.0(esbuild@0.25.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli + optional: true - '@types/webpack@5.28.5(esbuild@0.25.1)': + '@types/webpack@5.28.5(esbuild@0.27.2)': dependencies: '@types/node': 20.19.29 tapable: 2.2.3 - webpack: 5.102.0(esbuild@0.25.1) + webpack: 5.102.0(esbuild@0.27.2) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - optional: true '@types/ws@8.18.1': dependencies: @@ -17209,6 +19826,10 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@xmldom/xmldom@0.8.13': {} + + '@xmldom/xmldom@0.9.10': {} + '@xmldom/xmldom@0.9.8': {} '@xtuc/ieee754@1.2.0': {} @@ -17227,7 +19848,11 @@ snapshots: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - optional: true + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 acorn-globals@7.0.1: dependencies: @@ -17259,8 +19884,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.3: {} - agent-base@7.1.4: {} ajv-formats@2.1.1(ajv@8.17.1): @@ -17307,6 +19930,8 @@ snapshots: '@algolia/requester-fetch': 5.46.3 '@algolia/requester-node-http': 5.46.3 + anser@1.4.10: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -17323,8 +19948,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-regex@6.2.2: {} ansi-styles@3.2.1: @@ -17444,6 +20067,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asap@2.0.6: {} + asn1.js@4.10.1: dependencies: bn.js: 4.12.1 @@ -17552,7 +20177,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -17593,6 +20218,26 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.6 + + babel-plugin-react-native-web@0.21.2: {} + + babel-plugin-syntax-hermes-parser@0.32.0: + dependencies: + hermes-parser: 0.32.0 + + babel-plugin-syntax-hermes-parser@0.32.1: + dependencies: + hermes-parser: 0.32.1 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.6): + dependencies: + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - '@babel/core' + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.6): dependencies: '@babel/core': 7.28.6 @@ -17612,6 +20257,72 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.6) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + babel-preset-expo@55.0.21(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-refresh@0.14.2): + dependencies: + '@babel/generator': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.28.6) + '@babel/preset-react': 7.28.5(@babel/core@7.28.6) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + '@react-native/babel-preset': 0.83.6(@babel/core@7.28.6) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.32.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) + debug: 4.4.3 + react-refresh: 0.14.2 + resolve-from: 5.0.0 + optionalDependencies: + '@babel/runtime': 7.28.6 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + babel-preset-expo@55.0.21(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-refresh@0.14.2): + dependencies: + '@babel/generator': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.28.6) + '@babel/preset-react': 7.28.5(@babel/core@7.28.6) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + '@react-native/babel-preset': 0.83.6(@babel/core@7.28.6) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.32.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) + debug: 4.4.3 + react-refresh: 0.14.2 + resolve-from: 5.0.0 + optionalDependencies: + '@babel/runtime': 7.28.6 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + transitivePeerDependencies: + - '@babel/core' + - supports-color + babel-preset-jest@29.6.3(@babel/core@7.28.6): dependencies: '@babel/core': 7.28.6 @@ -17629,6 +20340,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.10.13: {} @@ -17654,6 +20367,8 @@ snapshots: require-from-string: 2.0.2 optional: true + big-integer@1.6.52: {} + big.js@5.2.2: {} bin-links@6.0.0: @@ -17696,6 +20411,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 @@ -17705,6 +20432,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -17796,8 +20527,7 @@ snapshots: bytes-iec@3.1.1: {} - bytes@3.1.2: - optional: true + bytes@3.1.2: {} bytestreamjs@2.0.1: optional: true @@ -17809,7 +20539,7 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.0 - lru-cache: 11.2.2 + lru-cache: 11.2.4 minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 @@ -17865,6 +20595,12 @@ snapshots: chai@6.2.2: optional: true + 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 @@ -17928,8 +20664,30 @@ snapshots: chownr@3.0.0: {} + chrome-launcher@0.15.2: + dependencies: + '@types/node': 20.19.29 + 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': 20.19.29 + 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: {} ci-info@4.3.1: {} @@ -17952,6 +20710,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -17961,6 +20723,8 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 + cli-spinners@2.9.2: {} + cli-table3@0.6.5: dependencies: string-width: 4.2.3 @@ -17998,7 +20762,7 @@ snapshots: cliui@9.0.1: dependencies: string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 9.0.2 clone@1.0.4: {} @@ -18050,6 +20814,8 @@ snapshots: commander@10.0.1: {} + commander@12.1.0: {} + commander@13.1.0: {} commander@2.20.3: {} @@ -18074,7 +20840,6 @@ snapshots: compressible@2.0.18: dependencies: mime-db: 1.54.0 - optional: true compression@1.8.1: dependencies: @@ -18087,7 +20852,6 @@ snapshots: vary: 1.1.2 transitivePeerDependencies: - supports-color - optional: true compute-scroll-into-view@3.1.0: {} @@ -18100,6 +20864,15 @@ snapshots: connect-history-api-fallback@2.0.0: optional: true + 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 + console-browserify@1.2.0: {} constants-browserify@1.0.0: {} @@ -18166,10 +20939,6 @@ snapshots: cookie@0.7.2: optional: true - core-js-compat@3.41.0: - dependencies: - browserslist: 4.28.1 - core-js-compat@3.47.0: dependencies: browserslist: 4.28.1 @@ -18240,6 +21009,12 @@ snapshots: - supports-color - ts-node + 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 @@ -18261,6 +21036,10 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 + css-in-js-utils@3.1.0: + dependencies: + hyphenate-style-name: 1.1.0 + css-loader@6.11.0(webpack@5.104.1(esbuild@0.25.1)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) @@ -18537,7 +21316,6 @@ snapshots: debug@2.6.9: dependencies: ms: 2.0.0 - optional: true debug@3.2.7: dependencies: @@ -18563,6 +21341,8 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + dedent@0.7.0: {} dedent@1.7.1: {} @@ -18635,8 +21415,7 @@ snapshots: depd@1.1.2: optional: true - depd@2.0.0: - optional: true + depd@2.0.0: {} dequal@2.0.3: {} @@ -18645,8 +21424,7 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - destroy@1.2.0: - optional: true + destroy@1.2.0: {} detect-indent@7.0.2: {} @@ -18680,6 +21458,8 @@ snapshots: '@leichtgewicht/ip-codec': 2.0.5 optional: true + dnssd-advertise@1.1.4: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -18746,8 +21526,7 @@ snapshots: eastasianwidth@0.2.0: optional: true - ee-first@1.1.1: - optional: true + ee-first@1.1.1: {} electron-to-chromium@1.5.267: {} @@ -18777,8 +21556,9 @@ snapshots: emojis-list@3.0.0: {} - encodeurl@2.0.0: - optional: true + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} encoding@0.1.13: dependencies: @@ -19028,8 +21808,7 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: - optional: true + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -19662,11 +22441,11 @@ snapshots: eslint-plugin-unicorn@56.0.0(eslint@9.11.1(jiti@1.21.7)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@eslint-community/eslint-utils': 4.9.1(eslint@9.11.1(jiti@1.21.7)) ci-info: 4.3.1 clean-regexp: 1.0.0 - core-js-compat: 3.41.0 + core-js-compat: 3.47.0 eslint: 9.11.1(jiti@1.21.7) esquery: 1.6.0 globals: 15.15.0 @@ -19682,11 +22461,11 @@ snapshots: eslint-plugin-unicorn@56.0.0(eslint@9.11.1(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@eslint-community/eslint-utils': 4.9.1(eslint@9.11.1(jiti@2.6.1)) ci-info: 4.3.1 clean-regexp: 1.0.0 - core-js-compat: 3.41.0 + core-js-compat: 3.47.0 eslint: 9.11.1(jiti@2.6.1) esquery: 1.6.0 globals: 15.15.0 @@ -19702,11 +22481,11 @@ snapshots: eslint-plugin-unicorn@56.0.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) ci-info: 4.3.1 clean-regexp: 1.0.0 - core-js-compat: 3.41.0 + core-js-compat: 3.47.0 eslint: 9.39.2(jiti@2.6.1) esquery: 1.6.0 globals: 15.15.0 @@ -19927,7 +22706,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 estree-util-value-to-estree@3.5.0: dependencies: @@ -19946,8 +22725,7 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: - optional: true + etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -20030,6 +22808,404 @@ snapshots: jest-util: 30.2.0 optional: true + expo-asset@55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + dependencies: + '@expo/image-utils': 0.8.14(typescript@5.9.3) + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + transitivePeerDependencies: + - supports-color + - typescript + + expo-asset@55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2): + dependencies: + '@expo/image-utils': 0.8.14(typescript@6.0.2) + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + transitivePeerDependencies: + - supports-color + - typescript + + expo-constants@55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)): + dependencies: + '@expo/env': 2.1.2 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + transitivePeerDependencies: + - supports-color + + expo-constants@55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)): + dependencies: + '@expo/env': 2.1.2 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + transitivePeerDependencies: + - supports-color + + expo-device@55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + ua-parser-js: 0.7.41 + + expo-file-system@55.0.20(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + expo-file-system@55.0.20(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + + expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + fontfaceobserver: 2.3.0 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + fontfaceobserver: 2.3.0 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + + expo-glass-effect@55.0.11(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + expo-glass-effect@55.0.11(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optional: true + + expo-image@55.0.10(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + sf-symbols-typescript: 2.2.0 + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + + expo-image@55.0.10(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + sf-symbols-typescript: 2.2.0 + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + optional: true + + expo-keep-awake@55.0.8(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react@19.2.0): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react: 19.2.0 + + expo-keep-awake@55.0.8(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react@19.2.3): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + react: 19.2.3 + + expo-linking@55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + invariant: 2.2.4 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + transitivePeerDependencies: + - expo + - supports-color + + expo-linking@55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + transitivePeerDependencies: + - expo + - supports-color + optional: true + + expo-modules-autolinking@55.0.22(typescript@5.9.3): + dependencies: + '@expo/require-utils': 55.0.5(typescript@5.9.3) + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + commander: 7.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + expo-modules-autolinking@55.0.22(typescript@6.0.2): + dependencies: + '@expo/require-utils': 55.0.5(typescript@6.0.2) + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + commander: 7.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + expo-modules-core@55.0.25(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + invariant: 2.2.4 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + optionalDependencies: + react-native-worklets: 0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + + expo-modules-core@55.0.25(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optionalDependencies: + react-native-worklets: 0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + + expo-router@55.0.14(bls4af4uxyiaulbxq3gobnrtf4): + dependencies: + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/schema-utils': 55.0.4 + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-navigation/bottom-tabs': 7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@react-navigation/native-stack': 7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + client-only: 0.0.1 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-glass-effect: 55.0.11(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-image: 55.0.10(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-linking: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-server: 55.0.9 + expo-symbols: 55.0.8(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.2.0 + react-fast-compare: 3.2.2 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + semver: 7.6.3 + server-only: 0.0.1 + sf-symbols-typescript: 2.2.0 + shallowequal: 1.1.0 + use-latest-callback: 0.2.6(react@19.2.0) + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + optionalDependencies: + react-dom: 19.2.0(react@19.2.0) + react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-reanimated: 4.2.1(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + - '@types/react' + - '@types/react-dom' + - expo-font + - supports-color + + expo-router@55.0.14(dlaaohsqynlm2lpw4mem6bur2u): + dependencies: + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.3(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/schema-utils': 55.0.4 + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-navigation/bottom-tabs': 7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@react-navigation/native-stack': 7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + client-only: 0.0.1 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + expo-glass-effect: 55.0.11(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-image: 55.0.10(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-linking: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-server: 55.0.9 + expo-symbols: 55.0.8(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.2.3 + react-fast-compare: 3.2.2 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + semver: 7.6.3 + server-only: 0.0.1 + sf-symbols-typescript: 2.2.0 + shallowequal: 1.1.0 + use-latest-callback: 0.2.6(react@19.2.3) + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-reanimated: 4.2.1(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + - '@types/react' + - '@types/react-dom' + - expo-font + - supports-color + optional: true + + expo-server@55.0.9: {} + + expo-splash-screen@55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3): + dependencies: + '@expo/prebuild-config': 55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + expo-status-bar@55.0.6(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + + expo-symbols@55.0.8(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + '@expo-google-fonts/material-symbols': 0.4.37 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + sf-symbols-typescript: 2.2.0 + + expo-symbols@55.0.8(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + '@expo-google-fonts/material-symbols': 0.4.37 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + sf-symbols-typescript: 2.2.0 + optional: true + + expo-system-ui@55.0.18(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)): + dependencies: + '@react-native/normalize-colors': 0.83.6 + debug: 4.4.3 + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + transitivePeerDependencies: + - supports-color + + expo-web-browser@55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)): + dependencies: + expo: 55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.28.6 + '@expo/cli': 55.0.30(tk4xwbok6eexo2trkmfdoi7sti) + '@expo/config': 55.0.17(typescript@5.9.3) + '@expo/config-plugins': 55.0.9 + '@expo/devtools': 55.0.3(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/fingerprint': 0.16.7 + '@expo/local-build-cache-provider': 55.0.13(typescript@5.9.3) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/metro': 55.1.1 + '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + '@expo/vector-icons': 15.1.1(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 55.0.21(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-refresh@0.14.2) + expo-asset: 55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-file-system: 55.0.20(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0)) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + expo-keep-awake: 55.0.8(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(react@19.2.0) + expo-modules-autolinking: 55.0.22(typescript@5.9.3) + expo-modules-core: 55.0.25(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + pretty-format: 29.7.0 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-refresh: 0.14.2 + whatwg-url-minimum: 0.1.2 + optionalDependencies: + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - expo-widgets + - react-dom + - react-native-worklets + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate + + expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2): + dependencies: + '@babel/runtime': 7.28.6 + '@expo/cli': 55.0.30(utmbucutznkwsh5ecrbgfcjis4) + '@expo/config': 55.0.17(typescript@6.0.2) + '@expo/config-plugins': 55.0.9 + '@expo/devtools': 55.0.3(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/fingerprint': 0.16.7 + '@expo/local-build-cache-provider': 55.0.13(typescript@6.0.2) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/metro': 55.1.1 + '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(typescript@6.0.2) + '@expo/vector-icons': 15.1.1(expo-font@55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 55.0.21(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-refresh@0.14.2) + expo-asset: 55.0.17(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + expo-file-system: 55.0.20(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3)) + expo-font: 55.0.7(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + expo-keep-awake: 55.0.8(expo@55.0.24(@babel/core@7.28.6)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)(typescript@6.0.2))(react@19.2.3) + expo-modules-autolinking: 55.0.22(typescript@6.0.2) + expo-modules-core: 55.0.25(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + pretty-format: 29.7.0 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-refresh: 0.14.2 + whatwg-url-minimum: 0.1.2 + optionalDependencies: + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.3(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - expo-widgets + - react-dom + - react-native-worklets + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate + exponential-backoff@3.1.2: {} express@4.22.1: @@ -20122,10 +23298,26 @@ snapshots: websocket-driver: 0.7.4 optional: true + fb-dotslash@0.5.8: {} + 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-package-json@2.0.0: dependencies: walk-up-path: 4.0.0 @@ -20134,6 +23326,8 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-nodeshim@0.4.10: {} + fflate@0.8.2: {} figures@6.1.0: @@ -20148,8 +23342,22 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + filter-obj@2.0.2: {} + 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.2: dependencies: debug: 2.6.9 @@ -20208,9 +23416,13 @@ snapshots: flexsearch@0.7.43: {} + flow-enums-runtime@0.0.6: {} + follow-redirects@1.15.11: optional: true + fontfaceobserver@2.3.0: {} + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -20257,8 +23469,7 @@ snapshots: fraction.js@5.3.4: {} - fresh@0.5.2: - optional: true + fresh@0.5.2: {} fs-extra@10.1.0: dependencies: @@ -20348,6 +23559,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + getenv@2.0.0: {} + git-up@8.1.1: dependencies: is-ssh: 1.4.1 @@ -20459,6 +23672,8 @@ snapshots: has-bigints@1.0.2: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -20644,10 +23859,18 @@ snapshots: he@1.2.0: {} + hermes-compiler@0.14.1: {} + hermes-estree@0.20.1: {} hermes-estree@0.25.1: {} + hermes-estree@0.32.0: {} + + hermes-estree@0.32.1: {} + + hermes-estree@0.35.0: {} + hermes-parser@0.20.1: dependencies: hermes-estree: 0.20.1 @@ -20656,6 +23879,18 @@ snapshots: dependencies: hermes-estree: 0.25.1 + hermes-parser@0.32.0: + dependencies: + hermes-estree: 0.32.0 + + hermes-parser@0.32.1: + dependencies: + hermes-estree: 0.32.1 + + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + highlight.js@10.7.3: {} hmac-drbg@1.0.1: @@ -20664,6 +23899,10 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hosted-git-info@2.8.9: {} hosted-git-info@7.0.2: @@ -20676,7 +23915,7 @@ snapshots: hosted-git-info@9.0.2: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.4 hpack.js@2.1.6: dependencies: @@ -20750,7 +23989,6 @@ snapshots: setprototypeof: 1.2.0 statuses: 2.0.2 toidentifier: 1.0.1 - optional: true http-parser-js@0.5.10: optional: true @@ -20819,6 +24057,8 @@ snapshots: hyperdyperid@1.2.0: optional: true + hyphenate-style-name@1.1.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -20882,6 +24122,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 @@ -20899,6 +24143,10 @@ snapshots: '@formatjs/icu-messageformat-parser': 3.4.0 tslib: 2.8.1 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@9.0.5: dependencies: jsbn: 1.1.0 @@ -21558,7 +24806,7 @@ snapshots: jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -21772,10 +25020,10 @@ snapshots: jest-snapshot@30.2.0: dependencies: '@babel/core': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.1 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.2.0 @@ -21919,6 +25167,8 @@ snapshots: - ts-node optional: true + jimp-compact@0.16.1: {} + jiti@1.21.7: {} jiti@2.6.1: {} @@ -21938,6 +25188,8 @@ snapshots: jsbn@1.1.0: {} + jsc-safe-url@0.2.4: {} + jsdoc-type-pratt-parser@4.8.0: {} jsdom@20.0.3: @@ -22061,6 +25313,8 @@ snapshots: kleur@3.0.3: {} + lan-network@0.2.1: {} + langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -22112,6 +25366,13 @@ snapshots: transitivePeerDependencies: - supports-color + 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 @@ -22208,6 +25469,10 @@ snapshots: lodash@4.17.21: {} + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -22222,8 +25487,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} - lru-cache@11.2.4: {} lru-cache@5.1.1: @@ -22291,6 +25554,8 @@ snapshots: marked@9.1.6: {} + marky@1.3.0: {} + math-intrinsics@1.1.0: {} mathjax-full@3.2.2: @@ -22552,6 +25817,10 @@ snapshots: tslib: 2.8.1 optional: true + memoize-one@5.2.1: {} + + memoize-one@6.0.0: {} + meow@13.2.0: {} merge-descriptors@1.0.3: @@ -22587,6 +25856,180 @@ snapshots: methods@1.1.2: optional: true + metro-babel-transformer@0.83.7: + dependencies: + '@babel/core': 7.28.6 + 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.7: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.83.7: + dependencies: + exponential-backoff: 3.1.2 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.7 + transitivePeerDependencies: + - supports-color + + 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.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + 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.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.7: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.45.0 + + metro-resolver@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.83.7: + dependencies: + '@babel/runtime': 7.28.6 + flow-enums-runtime: 0.0.6 + + 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.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.7: + dependencies: + '@babel/core': 7.28.6 + '@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.7: + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.29.1 + '@babel/parser': 7.21.9 + '@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.7: + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.28.6 + '@babel/generator': 7.29.1 + '@babel/parser': 7.21.9 + '@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.2 + 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 + mhchemparser@4.2.1: {} micromark-core-commonmark@2.0.1: @@ -22963,8 +26406,7 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.54.0: - optional: true + mime-db@1.54.0: {} mime-types@2.1.35: dependencies: @@ -22973,10 +26415,10 @@ snapshots: mime-types@3.0.2: dependencies: mime-db: 1.54.0 - optional: true - mime@1.6.0: - optional: true + mime@1.6.0: {} + + mimic-fn@1.2.0: {} mimic-fn@2.1.0: {} @@ -22992,6 +26434,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -23042,6 +26488,8 @@ snapshots: mj-context-menu@0.6.1: {} + mkdirp@1.0.4: {} + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -23053,8 +26501,7 @@ snapshots: mrmime@2.0.1: {} - ms@2.0.0: - optional: true + ms@2.0.0: {} ms@2.1.3: {} @@ -23064,6 +26511,8 @@ snapshots: thunky: 1.1.0 optional: true + multitars@1.0.0: {} + mute-stream@2.0.0: {} mz@2.7.0: @@ -23089,11 +26538,9 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: - optional: true + negotiator@0.6.3: {} - negotiator@0.6.4: - optional: true + negotiator@0.6.4: {} negotiator@1.0.0: {} @@ -23183,7 +26630,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.2.2(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 @@ -23204,6 +26651,7 @@ snapshots: '@next/swc-win32-x64-msvc': 16.2.2 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.57.0 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -23293,6 +26741,14 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-forge@1.4.0: {} + node-gyp@12.1.0: dependencies: env-paths: 2.2.1 @@ -23382,6 +26838,13 @@ snapshots: npm-normalize-package-bin@5.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-package-arg@13.0.2: dependencies: hosted-git-info: 9.0.2 @@ -23440,8 +26903,14 @@ snapshots: dependencies: boolbase: 1.0.0 + nullthrows@1.1.1: {} + nwsapi@2.2.23: {} + ob1@0.83.7: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -23498,18 +26967,24 @@ snapshots: obug@2.1.1: optional: true + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - optional: true - on-headers@1.1.0: - optional: true + on-headers@1.1.0: {} once@1.4.0: dependencies: wrappy: 1.0.2 + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -23532,6 +27007,11 @@ snapshots: wsl-utils: 0.1.0 optional: true + 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 @@ -23549,6 +27029,15 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + ora@3.4.0: + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.9.2 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + os-browserify@0.3.0: {} own-keys@1.0.1: @@ -23719,6 +27208,10 @@ snapshots: dependencies: protocols: 2.0.2 + parse-png@2.1.0: + dependencies: + pngjs: 3.4.0 + parse-url@9.2.0: dependencies: '@types/parse-path': 7.1.0 @@ -23741,8 +27234,7 @@ snapshots: entities: 6.0.1 optional: true - parseurl@1.3.3: - optional: true + parseurl@1.3.3: {} pascal-case@3.1.2: dependencies: @@ -23847,8 +27339,16 @@ 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 + pluralize@8.0.0: {} + pngjs@3.4.0: {} + pnp-webpack-plugin@1.7.0(typescript@6.0.2): dependencies: ts-pnp: 1.2.0(typescript@6.0.2) @@ -23947,6 +27447,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.4.49: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -23985,6 +27491,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + proc-log@4.2.0: {} + proc-log@5.0.0: {} proc-log@6.1.0: {} @@ -23995,6 +27503,8 @@ snapshots: proggy@4.0.0: {} + progress@2.0.3: {} + promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.2: {} @@ -24004,6 +27514,14 @@ snapshots: err-code: 2.0.3 retry: 0.12.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 @@ -24067,6 +27585,13 @@ snapshots: dependencies: side-channel: 1.1.0 + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + querystring-es3@0.2.1: {} querystringify@2.2.0: {} @@ -24086,68 +27611,350 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - range-parser@1.2.1: {} + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + optional: true + + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-docgen-typescript@2.4.0(typescript@6.0.2): + dependencies: + typescript: 6.0.2 + + react-docgen@7.1.1: + dependencies: + '@babel/core': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.11 + strip-indent: 4.1.1 + transitivePeerDependencies: + - supports-color + + react-dom@17.0.2(react@17.0.2): + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + + react-fast-compare@3.2.2: {} + + react-freeze@1.0.4(react@19.2.0): + dependencies: + react: 19.2.0 + + react-freeze@1.0.4(react@19.2.3): + dependencies: + react: 19.2.3 + optional: true + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-is@19.2.6: {} + + react-medium-image-zoom@5.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(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.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optional: true + + react-native-is-edge-to-edge@1.2.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + react-native-is-edge-to-edge@1.2.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optional: true + + react-native-is-edge-to-edge@1.3.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + react-native-is-edge-to-edge@1.3.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optional: true + + react-native-reanimated@4.2.1(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + react-native-worklets: 0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + semver: 7.7.3 + + react-native-reanimated@4.2.1(react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + react-native-is-edge-to-edge: 1.2.1(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + react-native-worklets: 0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + semver: 7.7.3 + optional: true + + react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + + react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + optional: true + + react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-freeze: 1.0.4(react@19.2.0) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + warn-once: 0.1.1 - raw-body@2.5.3: + react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + react: 19.2.3 + react-freeze: 1.0.4(react@19.2.3) + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + warn-once: 0.1.1 optional: true - react-docgen-typescript@2.4.0(typescript@6.0.2): + react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - typescript: 6.0.2 + '@babel/runtime': 7.28.6 + '@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.0 + react-dom: 19.2.0(react@19.2.0) + styleq: 0.1.3 + transitivePeerDependencies: + - encoding - react-docgen@7.1.1: + 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.28.6 + '@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 + optional: true + + react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): dependencies: '@babel/core': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.11 - strip-indent: 4.1.1 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + convert-source-map: 2.0.0 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0) + semver: 7.7.3 transitivePeerDependencies: - supports-color - react-dom@17.0.2(react@17.0.2): + react-native-worklets@0.7.4(@babel/core@7.28.6)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 17.0.2 - scheduler: 0.20.2 + '@babel/core': 7.28.6 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.6) + convert-source-map: 2.0.0 + react: 19.2.3 + react-native: 0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3) + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + optional: true - react-dom@18.3.1(react@18.3.1): + react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.83.6 + '@react-native/codegen': 0.83.6(@babel/core@7.28.6) + '@react-native/community-cli-plugin': 0.83.6 + '@react-native/gradle-plugin': 0.83.6 + '@react-native/js-polyfills': 0.83.6 + '@react-native/normalize-colors': 0.83.6 + '@react-native/virtualized-lists': 0.83.6(@types/react@19.2.14)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.28.6) + babel-plugin-syntax-hermes-parser: 0.32.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + hermes-compiler: 0.14.1 + 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.0 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 7.5.10 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate - react-dom@19.2.3(react@19.2.3): + react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(react@19.2.3): dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.83.6 + '@react-native/codegen': 0.83.6(@babel/core@7.28.6) + '@react-native/community-cli-plugin': 0.83.6 + '@react-native/gradle-plugin': 0.83.6 + '@react-native/js-polyfills': 0.83.6 + '@react-native/normalize-colors': 0.83.6 + '@react-native/virtualized-lists': 0.83.6(@types/react@19.2.14)(react-native@0.83.6(@babel/core@7.28.6)(@types/react@19.2.14)(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.28.6) + babel-plugin-syntax-hermes-parser: 0.32.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + hermes-compiler: 0.14.1 + 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.27.0 - - react-is@16.13.1: {} - - react-is@17.0.2: {} - - react-is@18.3.1: {} - - react-medium-image-zoom@5.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 7.5.10 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate react-refresh@0.14.2: {} react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.0): + dependencies: + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.3): dependencies: react: 19.2.3 @@ -24156,6 +27963,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.0): + dependencies: + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.14 + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.3): dependencies: react: 19.2.3 @@ -24181,6 +27999,14 @@ snapshots: react: 18.3.1 optional: true + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.0): + dependencies: + get-nonce: 1.0.1 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.3): dependencies: get-nonce: 1.0.1 @@ -24206,6 +28032,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.2.0: {} + react@19.2.3: {} read-cache@1.0.0: @@ -24334,6 +28162,8 @@ snapshots: regenerate@1.4.2: {} + regenerator-runtime@0.13.11: {} + regenerator-runtime@0.14.1: {} regex-parser@2.3.1: {} @@ -24550,6 +28380,8 @@ snapshots: postcss: 8.5.6 source-map: 0.6.1 + resolve-workspace-root@2.0.1: {} + resolve.exports@2.0.3: {} resolve@1.22.10: @@ -24570,6 +28402,11 @@ snapshots: 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 + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -24701,6 +28538,8 @@ snapshots: optionalDependencies: webpack: 5.104.1(esbuild@0.25.1) + sax@1.6.0: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -24760,6 +28599,8 @@ snapshots: semver@6.3.1: {} + semver@7.6.3: {} + semver@7.7.3: {} send@0.19.2: @@ -24779,7 +28620,8 @@ snapshots: statuses: 2.0.2 transitivePeerDependencies: - supports-color - optional: true + + serialize-error@2.1.0: {} serialize-javascript@6.0.2: dependencies: @@ -24806,7 +28648,8 @@ snapshots: send: 0.19.2 transitivePeerDependencies: - supports-color - optional: true + + server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -24840,14 +28683,17 @@ snapshots: setprototypeof@1.1.0: optional: true - setprototypeof@1.2.0: - optional: true + setprototypeof@1.2.0: {} + + sf-symbols-typescript@2.2.0: {} sha.js@2.4.11: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + shallowequal@1.1.0: {} + sharp@0.33.5: dependencies: color: 4.2.3 @@ -24912,8 +28758,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: - optional: true + shell-quote@1.8.3: {} shiki@1.29.2: dependencies: @@ -24971,6 +28816,12 @@ snapshots: transitivePeerDependencies: - supports-color + simple-plist@1.3.1: + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.1 + simple-swizzle@0.2.4: dependencies: is-arrayish: 0.3.4 @@ -25001,6 +28852,8 @@ snapshots: slash@5.1.0: {} + slugify@1.6.9: {} + smart-buffer@4.2.0: {} smob@1.4.1: {} @@ -25025,7 +28878,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.3 + agent-base: 7.1.4 debug: 4.4.3 socks: 2.8.4 transitivePeerDependencies: @@ -25056,6 +28909,8 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} source-map@0.7.4: {} @@ -25107,6 +28962,8 @@ snapshots: commander: 13.1.0 wicked-good-xpath: 1.3.0 + split-on-first@1.1.0: {} + sprintf-js@1.0.3: {} sprintf-js@1.1.3: {} @@ -25123,11 +28980,13 @@ snapshots: stackframe@1.3.4: {} - statuses@1.5.0: - optional: true + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 - statuses@2.0.2: - optional: true + statuses@1.5.0: {} + + statuses@2.0.2: {} std-env@3.10.0: {} @@ -25158,6 +29017,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + stream-buffers@2.2.0: {} + stream-http@3.2.0: dependencies: builtin-status-codes: 3.0.0 @@ -25167,6 +29028,8 @@ snapshots: streamsearch@1.1.0: {} + strict-uri-encode@2.0.0: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -25195,7 +29058,7 @@ snapshots: dependencies: emoji-regex: 10.4.0 get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string.prototype.includes@2.0.1: dependencies: @@ -25267,14 +29130,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-ansi@7.1.2: dependencies: ansi-regex: 6.2.2 - optional: true strip-bom-string@1.0.0: {} @@ -25300,6 +29158,8 @@ snapshots: dependencies: js-tokens: 9.0.1 + structured-headers@0.4.1: {} + style-loader@3.3.4(webpack@5.104.1(esbuild@0.25.1)): dependencies: webpack: 5.104.1(esbuild@0.25.1) @@ -25330,6 +29190,8 @@ snapshots: optionalDependencies: '@babel/core': 7.28.6 + styleq@0.1.3: {} + stylis@4.3.6: {} sucrase@3.35.1: @@ -25342,6 +29204,10 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -25350,6 +29216,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.2.0: dependencies: has-flag: 4.0.0 @@ -25420,29 +29291,33 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - terser-webpack-plugin@5.3.14(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2)(webpack@5.102.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2)): + terminal-link@2.1.1: + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + + terser-webpack-plugin@5.3.14(esbuild@0.25.1)(webpack@5.102.0(esbuild@0.25.1)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.102.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2) + terser: 5.45.0 + webpack: 5.102.0(esbuild@0.25.1) optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) - esbuild: 0.27.2 + esbuild: 0.25.1 + optional: true - terser-webpack-plugin@5.3.14(esbuild@0.25.1)(webpack@5.102.0(esbuild@0.25.1)): + terser-webpack-plugin@5.3.14(esbuild@0.27.2)(webpack@5.102.0(esbuild@0.27.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.102.0(esbuild@0.25.1) + terser: 5.45.0 + webpack: 5.102.0(esbuild@0.27.2) optionalDependencies: - esbuild: 0.25.1 - optional: true + esbuild: 0.27.2 terser-webpack-plugin@5.3.16(esbuild@0.25.1)(webpack@5.104.1(esbuild@0.25.1)): dependencies: @@ -25462,13 +29337,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - terser@5.39.0: - dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - terser@5.45.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -25497,6 +29365,8 @@ snapshots: tslib: 2.8.1 optional: true + throat@5.0.0: {} + thunky@1.1.0: optional: true @@ -25549,8 +29419,9 @@ snapshots: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: - optional: true + toidentifier@1.0.1: {} + + toqr@0.1.1: {} totalist@3.0.1: {} @@ -25566,6 +29437,8 @@ snapshots: tldts: 7.0.19 optional: true + tr46@0.0.3: {} + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -25697,6 +29570,8 @@ snapshots: type-fest@0.6.0: {} + type-fest@0.7.1: {} + type-fest@0.8.1: {} type-fest@2.19.0: {} @@ -25792,6 +29667,10 @@ snapshots: typescript@6.0.2: {} + ua-parser-js@0.7.41: {} + + ua-parser-js@1.0.41: {} + ufo@1.6.3: {} uglify-js@3.19.3: @@ -25919,8 +29798,7 @@ snapshots: universalify@2.0.1: {} - unpipe@1.0.0: - optional: true + unpipe@1.0.0: {} unrs-resolver@1.11.1: dependencies: @@ -25967,6 +29845,13 @@ snapshots: punycode: 1.4.1 qs: 6.14.1 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.0): + dependencies: + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.3): dependencies: react: 19.2.3 @@ -25974,6 +29859,23 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-latest-callback@0.2.6(react@19.2.0): + dependencies: + react: 19.2.0 + + use-latest-callback@0.2.6(react@19.2.3): + dependencies: + react: 19.2.3 + optional: true + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.3): dependencies: detect-node-es: 1.1.0 @@ -25994,6 +29896,15 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.6.0(react@19.2.0): + dependencies: + react: 19.2.0 + + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 + optional: true + util-deprecate@1.0.2: {} util@0.12.5: @@ -26006,13 +29917,14 @@ snapshots: utila@0.4.0: {} - utils-merge@1.0.1: - optional: true + utils-merge@1.0.1: {} uuid@11.1.0: {} uuid@13.0.0: {} + uuid@7.0.3: {} + uuid@8.3.2: optional: true @@ -26031,7 +29943,25 @@ snapshots: validate-npm-package-name@7.0.0: {} - vary@1.1.2: + vary@1.1.2: {} + + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' optional: true vfile-location@5.0.3: @@ -26306,6 +30236,8 @@ snapshots: - yaml optional: true + vlq@1.0.1: {} + vm-browserify@1.1.2: {} vscode-jsonrpc@8.2.0: {} @@ -26340,6 +30272,8 @@ snapshots: dependencies: makeerror: 1.0.12 + warn-once@0.1.1: {} + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 @@ -26361,6 +30295,8 @@ snapshots: web-namespaces@2.0.1: {} + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} webidl-conversions@8.0.1: @@ -26456,7 +30392,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.102.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2): + webpack@5.102.0(esbuild@0.25.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -26480,15 +30416,16 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2)(webpack@5.102.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.2)) + terser-webpack-plugin: 5.3.14(esbuild@0.25.1)(webpack@5.102.0(esbuild@0.25.1)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js + optional: true - webpack@5.102.0(esbuild@0.25.1): + webpack@5.102.0(esbuild@0.27.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -26512,14 +30449,13 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(esbuild@0.25.1)(webpack@5.102.0(esbuild@0.25.1)) + terser-webpack-plugin: 5.3.14(esbuild@0.27.2)(webpack@5.102.0(esbuild@0.27.2)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - optional: true webpack@5.104.1(esbuild@0.25.1): dependencies: @@ -26567,11 +30503,15 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-fetch@3.6.20: {} + whatwg-mimetype@3.0.0: {} whatwg-mimetype@4.0.0: optional: true + whatwg-url-minimum@0.1.2: {} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 @@ -26583,6 +30523,11 @@ snapshots: webidl-conversions: 8.0.1 optional: true + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -26685,7 +30630,7 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -26740,11 +30685,25 @@ snapshots: is-wsl: 3.1.0 optional: true + 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: optional: true + xml2js@0.6.0: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xmlbuilder@15.1.1: {} + xmlchars@2.2.0: {} xtend@4.0.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 75b9196a5..470c9c9b7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,8 @@ packages: - 'packages/*' - 'examples/*' + - 'examples/example-expo-monorepo/apps/*' + - 'examples/example-expo-monorepo/packages/*' - 'e2e/*' - 'docs' - 'tools' From edfbebe6d6795d49af88741ab2419ec8d53aea90 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Fri, 22 May 2026 08:08:17 +0200 Subject: [PATCH 2/4] done --- .../src/plugin/createExpoIntlPlugin.tsx | 18 +++++++++++++++--- .../extractor/initExtractionCompiler.tsx | 11 +++++++++-- packages/expo-intl/src/plugin/transformer.tsx | 3 +++ packages/expo-intl/src/plugin/types.tsx | 9 +++++++++ .../intl-extractor/src/ExtractionCompiler.tsx | 1 + .../intl-extractor/src/extractMessages.tsx | 3 ++- .../src/extractor/MessageExtractor.tsx | 11 ++++++++++- .../src/normalizeExtractorConfig.tsx | 3 ++- packages/intl-extractor/src/types.tsx | 12 ++++++++++++ .../src/plugin/createNextIntlPlugin.tsx | 3 ++- .../src/plugin/extractor/extractionLoader.tsx | 3 +++ .../extractor/initExtractionCompiler.tsx | 5 ++++- packages/next-intl/src/plugin/types.tsx | 8 ++++++++ packages/swc-plugin-extractor/package.json | 2 +- 14 files changed, 81 insertions(+), 11 deletions(-) diff --git a/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx index 6d45a66ef..07d5dc58d 100644 --- a/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx +++ b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx @@ -63,6 +63,9 @@ export default function createExpoIntlPlugin( return function withExpoIntl(metroConfig: MetroConfig): MetroConfig { const projectRoot = process.cwd(); const isDevelopment = process.env['NODE_ENV'] !== 'production'; + const referenceRoot = pluginConfig.experimental?.referenceRoot + ? path.resolve(pluginConfig.experimental.referenceRoot) + : undefined; let extractorConfig: ExtractorConfig | undefined; const experimental = pluginConfig.experimental; @@ -70,17 +73,23 @@ export default function createExpoIntlPlugin( extractorConfig = normalizeExtractorConfig({ extract: experimental.extract, messages: experimental.messages, - srcPath: experimental.srcPath + srcPath: experimental.srcPath, + referenceRoot }); } - initExtractionCompiler(extractorConfig, {projectRoot, isDevelopment}); + initExtractionCompiler(extractorConfig, { + projectRoot, + referenceRoot, + isDevelopment + }); return applyMetroConfig({ metroConfig, pluginConfig, extractorConfig, projectRoot, + referenceRoot, isDevelopment }); }; @@ -91,9 +100,11 @@ function applyMetroConfig(args: { pluginConfig: PluginConfig; extractorConfig: ExtractorConfig | undefined; projectRoot: string; + referenceRoot: string | undefined; isDevelopment: boolean; }): MetroConfig { - const {metroConfig, pluginConfig, projectRoot, isDevelopment} = args; + const {metroConfig, pluginConfig, projectRoot, referenceRoot, isDevelopment} = + args; const messages = pluginConfig.experimental?.messages; if (!messages) { warn( @@ -130,6 +141,7 @@ function applyMetroConfig(args: { messagesPaths, extension, projectRoot, + ...(referenceRoot != null && {referenceRoot}), isDevelopment }; diff --git a/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx index 96fb00c21..ce96cb915 100644 --- a/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx +++ b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx @@ -21,7 +21,11 @@ const runOnce = once('_EXPO_INTL_EXTRACT'); */ export default function initExtractionCompiler( extractorConfig: ExtractorConfig | undefined, - options: {readonly projectRoot: string; readonly isDevelopment: boolean} + options: { + readonly projectRoot: string; + readonly referenceRoot?: string; + readonly isDevelopment: boolean; + } ): void { if (!extractorConfig || !hasLocalesToExtract(extractorConfig)) { return; @@ -30,7 +34,10 @@ export default function initExtractionCompiler( runOnce(() => { compiler = new ExtractionCompiler(extractorConfig, { isDevelopment: options.isDevelopment, - projectRoot: options.projectRoot + projectRoot: options.projectRoot, + ...(options.referenceRoot != null && { + referenceRoot: options.referenceRoot + }) }); // Fire-and-forget: don't block Metro config evaluation. diff --git a/packages/expo-intl/src/plugin/transformer.tsx b/packages/expo-intl/src/plugin/transformer.tsx index b78a9aa4c..93e7041f8 100644 --- a/packages/expo-intl/src/plugin/transformer.tsx +++ b/packages/expo-intl/src/plugin/transformer.tsx @@ -113,6 +113,9 @@ export async function transform( cachedExtractor ??= new MessageExtractor({ isDevelopment: options.isDevelopment, projectRoot: options.projectRoot, + ...(options.referenceRoot != null && { + referenceRoot: options.referenceRoot + }), sourceMap: input.options.sourceMap === true }); diff --git a/packages/expo-intl/src/plugin/types.tsx b/packages/expo-intl/src/plugin/types.tsx index aa2d3fa6b..dcae90a23 100644 --- a/packages/expo-intl/src/plugin/types.tsx +++ b/packages/expo-intl/src/plugin/types.tsx @@ -27,6 +27,14 @@ export interface PluginConfig { * Enables the usage of [`useExtracted`](https://next-intl.dev/docs/usage/extraction). */ extract?: ExtractorConfigInput['extract']; + + /** + * Absolute base path used when computing relative paths in catalog + * references (e.g. `#:` lines in PO). Defaults to the project root + * (Expo project directory). Set this to a monorepo root to keep + * references stable across multiple apps that share a single catalog. + */ + referenceRoot?: string; }; } @@ -66,5 +74,6 @@ export interface SerializedTransformerOptions { readonly messagesPaths: ReadonlyArray; readonly extension: string; readonly projectRoot: string; + readonly referenceRoot?: string; readonly isDevelopment: boolean; } diff --git a/packages/intl-extractor/src/ExtractionCompiler.tsx b/packages/intl-extractor/src/ExtractionCompiler.tsx index d90898258..70ba7e401 100644 --- a/packages/intl-extractor/src/ExtractionCompiler.tsx +++ b/packages/intl-extractor/src/ExtractionCompiler.tsx @@ -11,6 +11,7 @@ export default class ExtractionCompiler implements Disposable { extractor?: MessageExtractor; isDevelopment?: boolean; projectRoot?: string; + referenceRoot?: string; saveDebounceMs?: number; sourceMap?: boolean; } = {} diff --git a/packages/intl-extractor/src/extractMessages.tsx b/packages/intl-extractor/src/extractMessages.tsx index 5fb68d072..b58359f40 100644 --- a/packages/intl-extractor/src/extractMessages.tsx +++ b/packages/intl-extractor/src/extractMessages.tsx @@ -15,7 +15,8 @@ export default async function extractMessages(params: ExtractorConfigInput) { const compiler = new ExtractionCompiler(config, { extractor: new MessageExtractor({ isDevelopment: false, - projectRoot: getDefaultProjectRoot() + projectRoot: getDefaultProjectRoot(), + ...(config.referenceRoot != null && {referenceRoot: config.referenceRoot}) }) }); await compiler.extractAll(); diff --git a/packages/intl-extractor/src/extractor/MessageExtractor.tsx b/packages/intl-extractor/src/extractor/MessageExtractor.tsx index 0170bc1c0..8ab1a862a 100644 --- a/packages/intl-extractor/src/extractor/MessageExtractor.tsx +++ b/packages/intl-extractor/src/extractor/MessageExtractor.tsx @@ -10,6 +10,13 @@ const require = createRequire(import.meta.url); export default class MessageExtractor { private isDevelopment: boolean; private projectRoot: string; + /** + * Base path used to compute relative paths in catalog references + * (e.g. `#:` lines in PO). Defaults to `projectRoot`. Set this to a + * monorepo root to keep references stable across multiple apps that + * share a single catalog. + */ + private referenceRoot: string; private sourceMap: boolean; private compileCache = new LRUCache<{ messages: Array; @@ -20,10 +27,12 @@ export default class MessageExtractor { public constructor(opts: { isDevelopment?: boolean; projectRoot?: string; + referenceRoot?: string; sourceMap?: boolean; }) { this.isDevelopment = opts.isDevelopment ?? false; this.projectRoot = opts.projectRoot ?? getDefaultProjectRoot(); + this.referenceRoot = opts.referenceRoot ?? this.projectRoot; this.sourceMap = opts.sourceMap ?? false; } @@ -47,7 +56,7 @@ export default class MessageExtractor { } const filePath = normalizePathToPosix( - path.relative(this.projectRoot, absoluteFilePath) + path.relative(this.referenceRoot, absoluteFilePath) ); const result = await transform(source, { jsc: { diff --git a/packages/intl-extractor/src/normalizeExtractorConfig.tsx b/packages/intl-extractor/src/normalizeExtractorConfig.tsx index c02e545e5..24a3f0d27 100644 --- a/packages/intl-extractor/src/normalizeExtractorConfig.tsx +++ b/packages/intl-extractor/src/normalizeExtractorConfig.tsx @@ -89,6 +89,7 @@ export default function normalizeExtractorConfig( messages: { format: input.messages.format, path: messagesPath - } + }, + ...(input.referenceRoot != null && {referenceRoot: input.referenceRoot}) }; } diff --git a/packages/intl-extractor/src/types.tsx b/packages/intl-extractor/src/types.tsx index 99ffed1f0..35634b3f2 100644 --- a/packages/intl-extractor/src/types.tsx +++ b/packages/intl-extractor/src/types.tsx @@ -44,6 +44,13 @@ export type ExtractorConfigInput = { * Relative path(s) to your source code files. */ srcPath?: string | Array; + /** + * Absolute base path used when computing relative paths in catalog + * references (e.g. `#:` lines in PO). Defaults to the project root. + * Set this to a monorepo root to keep references stable across + * multiple apps that share a single catalog. + */ + referenceRoot?: string; messages: { /** The format of your messages files. */ format: MessagesFormat; @@ -81,6 +88,11 @@ export type ExtractorConfig = { format: MessagesFormat; path: Array; }; + /** + * Absolute base path used when computing relative paths in catalog + * references. When unset, the project root is used. + */ + referenceRoot?: string; }; export type CatalogLoaderConfig = { diff --git a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx index 61397f8d4..c4f0f5025 100644 --- a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx +++ b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx @@ -39,7 +39,8 @@ function initPlugin( extractorConfig = normalizeExtractorConfig({ extract, messages: experimental.messages, - srcPath: experimental.srcPath + srcPath: experimental.srcPath, + referenceRoot: experimental.referenceRoot }); } diff --git a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx index 28de3245d..9cb4b207c 100644 --- a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx +++ b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx @@ -13,6 +13,8 @@ export default function extractionLoader( ) { const callback = this.async(); const projectRoot = this.rootContext; + const options = this.getOptions(); + const referenceRoot = options.referenceRoot; // Avoid rollup's `replace` plugin to compile this away const isDevelopment = process.env['NODE_ENV'.trim()] === 'development'; @@ -21,6 +23,7 @@ export default function extractionLoader( extractor = new MessageExtractor({ isDevelopment, projectRoot, + ...(referenceRoot != null && {referenceRoot}), sourceMap: this.sourceMap }); } diff --git a/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx b/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx index 8bf0541a1..068d25d96 100644 --- a/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx +++ b/packages/next-intl/src/plugin/extractor/initExtractionCompiler.tsx @@ -36,7 +36,10 @@ export default function initExtractionCompiler( runOnce(() => { compiler = new ExtractionCompiler(extractorConfig, { isDevelopment, - projectRoot: process.cwd() + projectRoot: process.cwd(), + ...(extractorConfig.referenceRoot != null && { + referenceRoot: extractorConfig.referenceRoot + }) }); // Fire-and-forget: Start extraction, don't block config return. diff --git a/packages/next-intl/src/plugin/types.tsx b/packages/next-intl/src/plugin/types.tsx index ecb2a7878..508709a4e 100644 --- a/packages/next-intl/src/plugin/types.tsx +++ b/packages/next-intl/src/plugin/types.tsx @@ -24,6 +24,14 @@ export type PluginConfig = { * Enables the usage of [`useExtracted`](/docs/usage/extraction). */ extract?: ExtractorConfigInput['extract']; + + /** + * Absolute base path used when computing relative paths in catalog + * references (e.g. `#:` lines in PO). Defaults to the project root + * (Next.js project directory). Set this to a monorepo root to keep + * references stable across multiple apps that share a single catalog. + */ + referenceRoot?: string; }; }; diff --git a/packages/swc-plugin-extractor/package.json b/packages/swc-plugin-extractor/package.json index 335e8aa2d..d3bbebce9 100644 --- a/packages/swc-plugin-extractor/package.json +++ b/packages/swc-plugin-extractor/package.json @@ -16,7 +16,7 @@ "scripts": { "prepublishOnly": "turbo build", "test": "cargo test --release", - "build": "cargo build --release --target wasm32-wasip1 --target-dir target" + "build": "test -f target/wasm32-wasip1/release/swc_plugin_extractor.wasm || cargo build --release --target wasm32-wasip1 --target-dir target" }, "main": "target/wasm32-wasip1/release/swc_plugin_extractor.wasm", "files": [ From 473c976767013bd097529af78f2450d02b47bdd3 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Fri, 22 May 2026 08:34:14 +0200 Subject: [PATCH 3/4] add: translations --- examples/example-expo-monorepo/messages/de.po | 10 +- examples/example-expo-monorepo/package.json | 3 +- .../scripts/apply-translations.mjs | 476 ++++++++++++++++++ 3 files changed, 483 insertions(+), 6 deletions(-) create mode 100755 examples/example-expo-monorepo/scripts/apply-translations.mjs diff --git a/examples/example-expo-monorepo/messages/de.po b/examples/example-expo-monorepo/messages/de.po index 06f2665ff..ae9593030 100644 --- a/examples/example-expo-monorepo/messages/de.po +++ b/examples/example-expo-monorepo/messages/de.po @@ -9,24 +9,24 @@ msgstr "" #: ../../packages/ui/src/greeting.tsx msgctxt "shared-ui.greeting" msgid "Vl1vzv" -msgstr "" +msgstr "Hej på dig " #: ../../packages/ui/src/greeting.tsx msgctxt "shared-ui.greeting" msgid "Wzy5/1" -msgstr "" +msgstr "Hallo {name}, du hast {count} ungelesene Nachrichten." #: ../../packages/ui/src/locale-switcher.tsx msgctxt "shared-ui.locale-switcher" msgid "y1Z3or" -msgstr "" +msgstr "Sprache" #: ../mobile/src/app/index.tsx msgctxt "home" msgid "QOAwWZ" -msgstr "" +msgstr "Mobile App — gemeinsame UI-Demo" #: src/app/page.tsx msgctxt "home" msgid "7yl+zD" -msgstr "" +msgstr "Web-App — gemeinsame UI-Demo" diff --git a/examples/example-expo-monorepo/package.json b/examples/example-expo-monorepo/package.json index 752ab83e1..d317cb937 100644 --- a/examples/example-expo-monorepo/package.json +++ b/examples/example-expo-monorepo/package.json @@ -4,7 +4,8 @@ "private": true, "description": "Monorepo example: one shared UI package consumed by an Expo (`expo-intl`) app and a Next.js (`next-intl`) app, all extracted by a single SWC pipeline.", "scripts": { - "extract": "node ./scripts/extract.mjs" + "extract": "node ./scripts/extract.mjs", + "translate": "node ./scripts/apply-translations.mjs" }, "devDependencies": { "intl-extractor": "workspace:^" diff --git a/examples/example-expo-monorepo/scripts/apply-translations.mjs b/examples/example-expo-monorepo/scripts/apply-translations.mjs new file mode 100755 index 000000000..47dd9006c --- /dev/null +++ b/examples/example-expo-monorepo/scripts/apply-translations.mjs @@ -0,0 +1,476 @@ +#!/usr/bin/env node +/** + * Fill empty msgstr entries across every locale .po by asking an LLM via + * OpenRouter to translate them. + * + * Pipeline (per locale): + * 1. Parse en.po and .po; collect entries with empty msgstr. + * 2. Chunk entries and translate in parallel via OpenRouter chat completions. + * 3. Write filled msgstr entries back into .po immediately as each + * chunk completes (per-locale write mutex serialises writes). + * + * Usage: + * OPENROUTER_API_KEY=… node ./scripts/apply-translations.mjs + * OPENROUTER_API_KEY=… node ./scripts/apply-translations.mjs --locale de + * + * Env vars: + * OPENROUTER_API_KEY (required) — get one at https://openrouter.ai/keys + * OPENROUTER_MODEL (optional) — override the default model + */ + +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import {fileURLToPath} from 'node:url'; + +// Must stay in sync with the `locales` array in scripts/extract.mjs. +const TARGET_LOCALES = ['de']; + +const LANGUAGE_NAMES = { + de: 'German' +}; + +const CHUNK_SIZE = 50; +const MAX_PARALLEL = 16; +const DEFAULT_MODEL = 'anthropic/claude-haiku-4.5'; +const OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const ROOT = path.resolve(__dirname, '..'); +const I18N_DIR = path.join(ROOT, 'messages'); + +function parseLocaleArg() { + const args = process.argv.slice(2); + const idx = args.indexOf('--locale'); + if (idx === -1) return undefined; + const value = args[idx + 1]; + if (!value || !TARGET_LOCALES.includes(value)) { + console.error( + `Invalid --locale. Expected one of: ${TARGET_LOCALES.join(', ')}` + ); + process.exit(1); + } + return value; +} + +function unescapePo(s) { + return s + .replace(/\\n/g, '\n') + .replace(/\\r/g, '\r') + .replace(/\\t/g, '\t') + .replace(/\\"/g, '"') + .replace(/\\\\/g, '\\'); +} + +function escapePo(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/\\t/g, '\\t'); +} + +function parsePo(filePath) { + const text = fs.readFileSync(filePath, 'utf-8'); + const entries = []; + const lines = text.split('\n'); + let currentMsgid; + let currentMsgstr; + let mode; + + const flush = () => { + if ( + currentMsgid !== undefined && + currentMsgstr !== undefined && + currentMsgid !== '' + ) { + entries.push({msgid: currentMsgid, msgstr: currentMsgstr}); + } + currentMsgid = undefined; + currentMsgstr = undefined; + mode = undefined; + }; + + for (const raw of lines) { + const line = raw.replace(/\r$/, ''); + if (line.startsWith('#') || line === '') { + if (line === '') flush(); + continue; + } + const msgidMatch = line.match(/^msgid\s+"(.*)"$/); + if (msgidMatch) { + flush(); + currentMsgid = unescapePo(msgidMatch[1] ?? ''); + mode = 'msgid'; + continue; + } + const msgstrMatch = line.match(/^msgstr\s+"(.*)"$/); + if (msgstrMatch) { + currentMsgstr = unescapePo(msgstrMatch[1] ?? ''); + mode = 'msgstr'; + continue; + } + const contMatch = line.match(/^"(.*)"$/); + if (contMatch) { + const piece = unescapePo(contMatch[1] ?? ''); + if (mode === 'msgid') currentMsgid = (currentMsgid ?? '') + piece; + else if (mode === 'msgstr') + currentMsgstr = (currentMsgstr ?? '') + piece; + } + } + flush(); + return entries; +} + +function findEmptyEntries(locale) { + const enPath = path.join(I18N_DIR, 'en.po'); + const localePath = path.join(I18N_DIR, `${locale}.po`); + if (!fs.existsSync(localePath)) return []; + const enByMsgid = new Map(); + for (const e of parsePo(enPath)) enByMsgid.set(e.msgid, e.msgstr); + const out = []; + for (const e of parsePo(localePath)) { + if (e.msgstr !== '') continue; + const english = enByMsgid.get(e.msgid); + if (english === undefined || english === '') continue; + out.push({msgid: e.msgid, english}); + } + return out; +} + +function buildPrompt(locale, chunk) { + const jsonl = chunk.map((e) => JSON.stringify(e)).join('\n'); + const language = LANGUAGE_NAMES[locale]; + return [ + `You are translating UI strings from English to ${language}.`, + '', + 'Guidelines:', + `- Use natural, idiomatic ${language}.`, + '- Preserve placeholders like {name}, {count}, %s, %d, exactly.', + '- Preserve leading/trailing whitespace and punctuation.', + '- Return ONLY a JSON object mapping each msgid to its translation. No commentary.', + '', + 'Entries (one JSON object per line, fields: msgid, english):', + jsonl + ].join('\n'); +} + +function stripCodeFences(s) { + const trimmed = s.trim(); + const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/); + return fenced ? (fenced[1]?.trim() ?? trimmed) : trimmed; +} + +/** + * Normalize a model response into a flat msgid → translation map. Handles + * common variants: bare flat map, wrapper key with object value, wrapper key + * with stringified-JSON value. + */ +function normalizeTranslationMap(raw) { + if (raw === null || typeof raw !== 'object') return {}; + const obj = raw; + const entries = Object.entries(obj); + + if (entries.every(([, v]) => typeof v === 'string')) { + if (entries.length === 1) { + const onlyValue = entries[0]?.[1]; + if (typeof onlyValue === 'string') { + const trimmed = stripCodeFences(onlyValue); + if (trimmed.startsWith('{') && trimmed.endsWith('}')) { + try { + const inner = JSON.parse(trimmed); + return normalizeTranslationMap(inner); + } catch { + // Fall through and treat the single key as a real entry. + } + } + } + } + return obj; + } + + if (entries.length === 1 && typeof entries[0]?.[1] === 'object') { + return normalizeTranslationMap(entries[0][1]); + } + + const out = {}; + for (const [k, v] of entries) { + if (typeof v === 'string') out[k] = v; + } + return out; +} + +const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY; +const OPENROUTER_MODEL = process.env.OPENROUTER_MODEL ?? DEFAULT_MODEL; +if (!OPENROUTER_API_KEY) { + console.error( + 'OPENROUTER_API_KEY env var is required. Get a key at https://openrouter.ai/keys' + ); + process.exit(1); +} + +async function runOpenRouter(prompt) { + const body = { + model: OPENROUTER_MODEL, + messages: [ + { + role: 'system', + content: + 'You are a professional UI translator. Respond with a single JSON object mapping each msgid to its translated string. Do not include commentary, explanations, or code fences.' + }, + {role: 'user', content: prompt} + ], + response_format: {type: 'json_object'}, + temperature: 0 + }; + + const response = await fetch(OPENROUTER_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${OPENROUTER_API_KEY}`, + 'HTTP-Referer': 'https://next-intl.dev', + 'X-Title': 'next-intl example i18n' + }, + body: JSON.stringify(body) + }); + + const text = await response.text(); + if (!response.ok) { + throw new Error( + `OpenRouter HTTP ${response.status}: ${text.slice(0, 500)}` + ); + } + + let envelope; + try { + envelope = JSON.parse(text); + } catch (err) { + throw new Error( + `OpenRouter returned non-JSON: ${text.slice(0, 500)} | parse error: ${err instanceof Error ? err.message : String(err)}` + ); + } + + if (envelope.error) { + throw new Error( + `OpenRouter API error${envelope.error.code ? ` (${envelope.error.code})` : ''}: ${envelope.error.message ?? ''}` + ); + } + + const content = envelope.choices?.[0]?.message?.content; + if (typeof content !== 'string' || content.trim() === '') { + throw new Error( + `OpenRouter response missing content: ${text.slice(0, 500)}` + ); + } + + const cleaned = stripCodeFences(content); + let parsed; + try { + parsed = JSON.parse(cleaned); + } catch (err) { + throw new Error( + `Failed to parse model JSON: ${err instanceof Error ? err.message : String(err)} | raw: ${cleaned.slice(0, 500)}` + ); + } + + return { + translations: normalizeTranslationMap(parsed), + rawResponse: text + }; +} + +function applyTranslations(locale, translations) { + const poPath = path.join(I18N_DIR, `${locale}.po`); + const lines = fs.readFileSync(poPath, 'utf-8').split('\n'); + const out = []; + let filled = 0; + let i = 0; + while (i < lines.length) { + const line = lines[i] ?? ''; + const msgidMatch = line.match(/^msgid\s+"(.*)"$/); + if (!msgidMatch) { + out.push(line); + i++; + continue; + } + const msgid = unescapePo(msgidMatch[1] ?? ''); + out.push(line); + i++; + const next = lines[i] ?? ''; + const msgstrMatch = next.match(/^msgstr\s+"(.*)"$/); + if (!msgstrMatch || msgid === '') { + out.push(next); + i++; + continue; + } + const currentMsgstr = unescapePo(msgstrMatch[1] ?? ''); + if (currentMsgstr !== '') { + out.push(next); + i++; + continue; + } + const translation = translations[msgid]; + if (translation === undefined) { + out.push(next); + i++; + continue; + } + out.push(`msgstr "${escapePo(translation)}"`); + filled++; + i++; + } + if (filled > 0) fs.writeFileSync(poPath, out.join('\n'), 'utf-8'); + return filled; +} + +async function runJobsWithConcurrency(items, worker, limit) { + const results = []; + let cursor = 0; + async function pull() { + while (cursor < items.length) { + const idx = cursor++; + const job = items[idx]; + if (!job) return; + const value = await worker(job); + results.push(value); + } + } + const runners = []; + for (let n = 0; n < Math.min(limit, items.length); n++) { + runners.push(pull()); + } + await Promise.all(runners); + return results; +} + +function log(msg) { + console.log(msg); +} + +// Per-locale write mutex: chunks for the same locale serialize their PO writes +// so concurrent read-modify-write cycles cannot clobber each other. +const localeWriteLocks = new Map(); + +function withLocaleLock(locale, work) { + const previous = localeWriteLocks.get(locale) ?? Promise.resolve(); + const next = previous.then(() => work()); + localeWriteLocks.set( + locale, + next.then( + () => undefined, + () => undefined + ) + ); + return next; +} + +async function main() { + const only = parseLocaleArg(); + const locales = only ? [only] : TARGET_LOCALES; + + const jobs = []; + const emptyByLocale = new Map(); + + for (const locale of locales) { + const empty = findEmptyEntries(locale); + emptyByLocale.set(locale, empty.length); + if (empty.length === 0) { + log(`[${locale}] nothing to translate`); + continue; + } + const totalChunks = Math.ceil(empty.length / CHUNK_SIZE); + for (let i = 0; i < empty.length; i += CHUNK_SIZE) { + jobs.push({ + locale, + chunkIndex: i / CHUNK_SIZE, + totalChunks, + entries: empty.slice(i, i + CHUNK_SIZE) + }); + } + log( + `[${locale}] queued ${totalChunks} chunk(s) for ${empty.length} entries` + ); + } + + if (jobs.length === 0) { + log('Nothing to do.'); + return; + } + + log( + `\n▶ Running ${jobs.length} chunk(s) via OpenRouter (model=${OPENROUTER_MODEL}, parallel=${MAX_PARALLEL})` + ); + + const filledByLocale = new Map(); + for (const locale of locales) filledByLocale.set(locale, 0); + + const DEBUG_DIR = '/tmp/apply-translations-debug'; + fs.mkdirSync(DEBUG_DIR, {recursive: true}); + + let completed = 0; + await runJobsWithConcurrency( + jobs, + async (job) => { + const prompt = buildPrompt(job.locale, job.entries); + try { + const {translations, rawResponse} = await runOpenRouter(prompt); + const requestedIds = new Set(job.entries.map((e) => e.msgid)); + const returnedKeys = Object.keys(translations); + const matchedKeys = returnedKeys.filter((k) => requestedIds.has(k)); + const filled = await withLocaleLock(job.locale, () => + applyTranslations(job.locale, translations) + ); + filledByLocale.set( + job.locale, + (filledByLocale.get(job.locale) ?? 0) + filled + ); + completed++; + log( + ` ✓ [${job.locale}] chunk ${job.chunkIndex + 1}/${job.totalChunks} → model returned ${returnedKeys.length} keys (${matchedKeys.length} matched), wrote ${filled} entries (${completed}/${jobs.length} total)` + ); + if (filled === 0 && job.entries.length > 0) { + const debugPath = `${DEBUG_DIR}/${job.locale}-chunk${job.chunkIndex + 1}.json`; + fs.writeFileSync( + debugPath, + JSON.stringify( + { + requestedMsgids: Array.from(requestedIds).slice(0, 5), + returnedKeysSample: returnedKeys.slice(0, 5), + returnedValuesSample: returnedKeys + .slice(0, 3) + .map((k) => ({key: k, value: translations[k]})), + rawResponsePreview: rawResponse.slice(0, 2000) + }, + null, + 2 + ), + 'utf-8' + ); + log(` ↳ wrote debug snapshot: ${debugPath}`); + } + } catch (err) { + completed++; + log( + ` ✗ [${job.locale}] chunk ${job.chunkIndex + 1}/${job.totalChunks} FAILED: ${err instanceof Error ? err.message : String(err)}` + ); + } + }, + MAX_PARALLEL + ); + + log('\n▶ Per-locale totals:'); + for (const locale of locales) { + const total = emptyByLocale.get(locale) ?? 0; + if (total === 0) continue; + log(` [${locale}] filled ${filledByLocale.get(locale) ?? 0}/${total}`); + } + + log('\n✓ Done.'); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); From 45b3a64619b30407bb1d1fe5485f122532cd4120 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Fri, 22 May 2026 08:59:38 +0200 Subject: [PATCH 4/4] fixes --- examples/example-expo-monorepo/README.md | 2 +- .../packages/ui/src/greeting.tsx | 1 - .../scripts/apply-translations.mjs | 476 ------------------ .../example-expo-monorepo/scripts/extract.mjs | 21 - packages/expo-intl/package.json | 3 + .../src/plugin/createExpoIntlPlugin.tsx | 11 +- .../extractor/initExtractionCompiler.tsx | 10 +- packages/expo-intl/src/plugin/transformer.tsx | 13 +- packages/intl-extractor/src/utils.tsx | 2 +- packages/intl-extractor/tsconfig.json | 4 +- 10 files changed, 35 insertions(+), 508 deletions(-) delete mode 100755 examples/example-expo-monorepo/scripts/apply-translations.mjs delete mode 100644 examples/example-expo-monorepo/scripts/extract.mjs diff --git a/examples/example-expo-monorepo/README.md b/examples/example-expo-monorepo/README.md index 98865a51f..280724c2f 100644 --- a/examples/example-expo-monorepo/README.md +++ b/examples/example-expo-monorepo/README.md @@ -9,7 +9,7 @@ Two apps + one shared UI package + one shared message catalog: The shared package imports `_useExtracted as useExtracted` from `use-intl/react`. The SWC plugin recognizes that import source, so calls inside `packages/ui` get the same compile-time rewrite as calls inside the apps themselves. -``` +```text examples/example-expo-monorepo/ ├── messages/{en,de}.po # everything lives here ├── scripts/extract.mjs # workspace-wide extraction diff --git a/examples/example-expo-monorepo/packages/ui/src/greeting.tsx b/examples/example-expo-monorepo/packages/ui/src/greeting.tsx index a270084b1..0e3494216 100644 --- a/examples/example-expo-monorepo/packages/ui/src/greeting.tsx +++ b/examples/example-expo-monorepo/packages/ui/src/greeting.tsx @@ -30,7 +30,6 @@ export function Greeting({ name, unreadCount = 0, Text, Strong }: GreetingProps) // and import it in your entry before the IntlProvider is rendered. return ( - {t("Hej på dig ")} {t.rich('Hello {name}, you have {count} unread messages.', { name, count: unreadCount, diff --git a/examples/example-expo-monorepo/scripts/apply-translations.mjs b/examples/example-expo-monorepo/scripts/apply-translations.mjs deleted file mode 100755 index 47dd9006c..000000000 --- a/examples/example-expo-monorepo/scripts/apply-translations.mjs +++ /dev/null @@ -1,476 +0,0 @@ -#!/usr/bin/env node -/** - * Fill empty msgstr entries across every locale .po by asking an LLM via - * OpenRouter to translate them. - * - * Pipeline (per locale): - * 1. Parse en.po and .po; collect entries with empty msgstr. - * 2. Chunk entries and translate in parallel via OpenRouter chat completions. - * 3. Write filled msgstr entries back into .po immediately as each - * chunk completes (per-locale write mutex serialises writes). - * - * Usage: - * OPENROUTER_API_KEY=… node ./scripts/apply-translations.mjs - * OPENROUTER_API_KEY=… node ./scripts/apply-translations.mjs --locale de - * - * Env vars: - * OPENROUTER_API_KEY (required) — get one at https://openrouter.ai/keys - * OPENROUTER_MODEL (optional) — override the default model - */ - -import * as fs from 'node:fs'; -import * as path from 'node:path'; -import {fileURLToPath} from 'node:url'; - -// Must stay in sync with the `locales` array in scripts/extract.mjs. -const TARGET_LOCALES = ['de']; - -const LANGUAGE_NAMES = { - de: 'German' -}; - -const CHUNK_SIZE = 50; -const MAX_PARALLEL = 16; -const DEFAULT_MODEL = 'anthropic/claude-haiku-4.5'; -const OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const ROOT = path.resolve(__dirname, '..'); -const I18N_DIR = path.join(ROOT, 'messages'); - -function parseLocaleArg() { - const args = process.argv.slice(2); - const idx = args.indexOf('--locale'); - if (idx === -1) return undefined; - const value = args[idx + 1]; - if (!value || !TARGET_LOCALES.includes(value)) { - console.error( - `Invalid --locale. Expected one of: ${TARGET_LOCALES.join(', ')}` - ); - process.exit(1); - } - return value; -} - -function unescapePo(s) { - return s - .replace(/\\n/g, '\n') - .replace(/\\r/g, '\r') - .replace(/\\t/g, '\t') - .replace(/\\"/g, '"') - .replace(/\\\\/g, '\\'); -} - -function escapePo(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/\\t/g, '\\t'); -} - -function parsePo(filePath) { - const text = fs.readFileSync(filePath, 'utf-8'); - const entries = []; - const lines = text.split('\n'); - let currentMsgid; - let currentMsgstr; - let mode; - - const flush = () => { - if ( - currentMsgid !== undefined && - currentMsgstr !== undefined && - currentMsgid !== '' - ) { - entries.push({msgid: currentMsgid, msgstr: currentMsgstr}); - } - currentMsgid = undefined; - currentMsgstr = undefined; - mode = undefined; - }; - - for (const raw of lines) { - const line = raw.replace(/\r$/, ''); - if (line.startsWith('#') || line === '') { - if (line === '') flush(); - continue; - } - const msgidMatch = line.match(/^msgid\s+"(.*)"$/); - if (msgidMatch) { - flush(); - currentMsgid = unescapePo(msgidMatch[1] ?? ''); - mode = 'msgid'; - continue; - } - const msgstrMatch = line.match(/^msgstr\s+"(.*)"$/); - if (msgstrMatch) { - currentMsgstr = unescapePo(msgstrMatch[1] ?? ''); - mode = 'msgstr'; - continue; - } - const contMatch = line.match(/^"(.*)"$/); - if (contMatch) { - const piece = unescapePo(contMatch[1] ?? ''); - if (mode === 'msgid') currentMsgid = (currentMsgid ?? '') + piece; - else if (mode === 'msgstr') - currentMsgstr = (currentMsgstr ?? '') + piece; - } - } - flush(); - return entries; -} - -function findEmptyEntries(locale) { - const enPath = path.join(I18N_DIR, 'en.po'); - const localePath = path.join(I18N_DIR, `${locale}.po`); - if (!fs.existsSync(localePath)) return []; - const enByMsgid = new Map(); - for (const e of parsePo(enPath)) enByMsgid.set(e.msgid, e.msgstr); - const out = []; - for (const e of parsePo(localePath)) { - if (e.msgstr !== '') continue; - const english = enByMsgid.get(e.msgid); - if (english === undefined || english === '') continue; - out.push({msgid: e.msgid, english}); - } - return out; -} - -function buildPrompt(locale, chunk) { - const jsonl = chunk.map((e) => JSON.stringify(e)).join('\n'); - const language = LANGUAGE_NAMES[locale]; - return [ - `You are translating UI strings from English to ${language}.`, - '', - 'Guidelines:', - `- Use natural, idiomatic ${language}.`, - '- Preserve placeholders like {name}, {count}, %s, %d, exactly.', - '- Preserve leading/trailing whitespace and punctuation.', - '- Return ONLY a JSON object mapping each msgid to its translation. No commentary.', - '', - 'Entries (one JSON object per line, fields: msgid, english):', - jsonl - ].join('\n'); -} - -function stripCodeFences(s) { - const trimmed = s.trim(); - const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/); - return fenced ? (fenced[1]?.trim() ?? trimmed) : trimmed; -} - -/** - * Normalize a model response into a flat msgid → translation map. Handles - * common variants: bare flat map, wrapper key with object value, wrapper key - * with stringified-JSON value. - */ -function normalizeTranslationMap(raw) { - if (raw === null || typeof raw !== 'object') return {}; - const obj = raw; - const entries = Object.entries(obj); - - if (entries.every(([, v]) => typeof v === 'string')) { - if (entries.length === 1) { - const onlyValue = entries[0]?.[1]; - if (typeof onlyValue === 'string') { - const trimmed = stripCodeFences(onlyValue); - if (trimmed.startsWith('{') && trimmed.endsWith('}')) { - try { - const inner = JSON.parse(trimmed); - return normalizeTranslationMap(inner); - } catch { - // Fall through and treat the single key as a real entry. - } - } - } - } - return obj; - } - - if (entries.length === 1 && typeof entries[0]?.[1] === 'object') { - return normalizeTranslationMap(entries[0][1]); - } - - const out = {}; - for (const [k, v] of entries) { - if (typeof v === 'string') out[k] = v; - } - return out; -} - -const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY; -const OPENROUTER_MODEL = process.env.OPENROUTER_MODEL ?? DEFAULT_MODEL; -if (!OPENROUTER_API_KEY) { - console.error( - 'OPENROUTER_API_KEY env var is required. Get a key at https://openrouter.ai/keys' - ); - process.exit(1); -} - -async function runOpenRouter(prompt) { - const body = { - model: OPENROUTER_MODEL, - messages: [ - { - role: 'system', - content: - 'You are a professional UI translator. Respond with a single JSON object mapping each msgid to its translated string. Do not include commentary, explanations, or code fences.' - }, - {role: 'user', content: prompt} - ], - response_format: {type: 'json_object'}, - temperature: 0 - }; - - const response = await fetch(OPENROUTER_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${OPENROUTER_API_KEY}`, - 'HTTP-Referer': 'https://next-intl.dev', - 'X-Title': 'next-intl example i18n' - }, - body: JSON.stringify(body) - }); - - const text = await response.text(); - if (!response.ok) { - throw new Error( - `OpenRouter HTTP ${response.status}: ${text.slice(0, 500)}` - ); - } - - let envelope; - try { - envelope = JSON.parse(text); - } catch (err) { - throw new Error( - `OpenRouter returned non-JSON: ${text.slice(0, 500)} | parse error: ${err instanceof Error ? err.message : String(err)}` - ); - } - - if (envelope.error) { - throw new Error( - `OpenRouter API error${envelope.error.code ? ` (${envelope.error.code})` : ''}: ${envelope.error.message ?? ''}` - ); - } - - const content = envelope.choices?.[0]?.message?.content; - if (typeof content !== 'string' || content.trim() === '') { - throw new Error( - `OpenRouter response missing content: ${text.slice(0, 500)}` - ); - } - - const cleaned = stripCodeFences(content); - let parsed; - try { - parsed = JSON.parse(cleaned); - } catch (err) { - throw new Error( - `Failed to parse model JSON: ${err instanceof Error ? err.message : String(err)} | raw: ${cleaned.slice(0, 500)}` - ); - } - - return { - translations: normalizeTranslationMap(parsed), - rawResponse: text - }; -} - -function applyTranslations(locale, translations) { - const poPath = path.join(I18N_DIR, `${locale}.po`); - const lines = fs.readFileSync(poPath, 'utf-8').split('\n'); - const out = []; - let filled = 0; - let i = 0; - while (i < lines.length) { - const line = lines[i] ?? ''; - const msgidMatch = line.match(/^msgid\s+"(.*)"$/); - if (!msgidMatch) { - out.push(line); - i++; - continue; - } - const msgid = unescapePo(msgidMatch[1] ?? ''); - out.push(line); - i++; - const next = lines[i] ?? ''; - const msgstrMatch = next.match(/^msgstr\s+"(.*)"$/); - if (!msgstrMatch || msgid === '') { - out.push(next); - i++; - continue; - } - const currentMsgstr = unescapePo(msgstrMatch[1] ?? ''); - if (currentMsgstr !== '') { - out.push(next); - i++; - continue; - } - const translation = translations[msgid]; - if (translation === undefined) { - out.push(next); - i++; - continue; - } - out.push(`msgstr "${escapePo(translation)}"`); - filled++; - i++; - } - if (filled > 0) fs.writeFileSync(poPath, out.join('\n'), 'utf-8'); - return filled; -} - -async function runJobsWithConcurrency(items, worker, limit) { - const results = []; - let cursor = 0; - async function pull() { - while (cursor < items.length) { - const idx = cursor++; - const job = items[idx]; - if (!job) return; - const value = await worker(job); - results.push(value); - } - } - const runners = []; - for (let n = 0; n < Math.min(limit, items.length); n++) { - runners.push(pull()); - } - await Promise.all(runners); - return results; -} - -function log(msg) { - console.log(msg); -} - -// Per-locale write mutex: chunks for the same locale serialize their PO writes -// so concurrent read-modify-write cycles cannot clobber each other. -const localeWriteLocks = new Map(); - -function withLocaleLock(locale, work) { - const previous = localeWriteLocks.get(locale) ?? Promise.resolve(); - const next = previous.then(() => work()); - localeWriteLocks.set( - locale, - next.then( - () => undefined, - () => undefined - ) - ); - return next; -} - -async function main() { - const only = parseLocaleArg(); - const locales = only ? [only] : TARGET_LOCALES; - - const jobs = []; - const emptyByLocale = new Map(); - - for (const locale of locales) { - const empty = findEmptyEntries(locale); - emptyByLocale.set(locale, empty.length); - if (empty.length === 0) { - log(`[${locale}] nothing to translate`); - continue; - } - const totalChunks = Math.ceil(empty.length / CHUNK_SIZE); - for (let i = 0; i < empty.length; i += CHUNK_SIZE) { - jobs.push({ - locale, - chunkIndex: i / CHUNK_SIZE, - totalChunks, - entries: empty.slice(i, i + CHUNK_SIZE) - }); - } - log( - `[${locale}] queued ${totalChunks} chunk(s) for ${empty.length} entries` - ); - } - - if (jobs.length === 0) { - log('Nothing to do.'); - return; - } - - log( - `\n▶ Running ${jobs.length} chunk(s) via OpenRouter (model=${OPENROUTER_MODEL}, parallel=${MAX_PARALLEL})` - ); - - const filledByLocale = new Map(); - for (const locale of locales) filledByLocale.set(locale, 0); - - const DEBUG_DIR = '/tmp/apply-translations-debug'; - fs.mkdirSync(DEBUG_DIR, {recursive: true}); - - let completed = 0; - await runJobsWithConcurrency( - jobs, - async (job) => { - const prompt = buildPrompt(job.locale, job.entries); - try { - const {translations, rawResponse} = await runOpenRouter(prompt); - const requestedIds = new Set(job.entries.map((e) => e.msgid)); - const returnedKeys = Object.keys(translations); - const matchedKeys = returnedKeys.filter((k) => requestedIds.has(k)); - const filled = await withLocaleLock(job.locale, () => - applyTranslations(job.locale, translations) - ); - filledByLocale.set( - job.locale, - (filledByLocale.get(job.locale) ?? 0) + filled - ); - completed++; - log( - ` ✓ [${job.locale}] chunk ${job.chunkIndex + 1}/${job.totalChunks} → model returned ${returnedKeys.length} keys (${matchedKeys.length} matched), wrote ${filled} entries (${completed}/${jobs.length} total)` - ); - if (filled === 0 && job.entries.length > 0) { - const debugPath = `${DEBUG_DIR}/${job.locale}-chunk${job.chunkIndex + 1}.json`; - fs.writeFileSync( - debugPath, - JSON.stringify( - { - requestedMsgids: Array.from(requestedIds).slice(0, 5), - returnedKeysSample: returnedKeys.slice(0, 5), - returnedValuesSample: returnedKeys - .slice(0, 3) - .map((k) => ({key: k, value: translations[k]})), - rawResponsePreview: rawResponse.slice(0, 2000) - }, - null, - 2 - ), - 'utf-8' - ); - log(` ↳ wrote debug snapshot: ${debugPath}`); - } - } catch (err) { - completed++; - log( - ` ✗ [${job.locale}] chunk ${job.chunkIndex + 1}/${job.totalChunks} FAILED: ${err instanceof Error ? err.message : String(err)}` - ); - } - }, - MAX_PARALLEL - ); - - log('\n▶ Per-locale totals:'); - for (const locale of locales) { - const total = emptyByLocale.get(locale) ?? 0; - if (total === 0) continue; - log(` [${locale}] filled ${filledByLocale.get(locale) ?? 0}/${total}`); - } - - log('\n✓ Done.'); -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/examples/example-expo-monorepo/scripts/extract.mjs b/examples/example-expo-monorepo/scripts/extract.mjs deleted file mode 100644 index 35340dfe2..000000000 --- a/examples/example-expo-monorepo/scripts/extract.mjs +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -// Workspace-level extraction. Scans both apps and the shared `packages/ui` -// and writes a single catalog at `examples/example-expo-monorepo/messages/`. -// -// Equivalent to running either app's `pnpm extract` (each app scans the same -// union of sources). This script just gives you a single entry point that -// doesn't depend on which app you happen to have installed. -import {unstable_extractMessages} from 'intl-extractor'; - -await unstable_extractMessages({ - extract: {path: './messages'}, - srcPath: ['apps/mobile/src', 'apps/web/src', 'packages/ui/src'], - messages: { - path: './messages', - format: 'po', - locales: ['en', 'de'], - sourceLocale: 'en' - } -}); - -console.log('Extracted messages into messages/{en,de}.po'); diff --git a/packages/expo-intl/package.json b/packages/expo-intl/package.json index bce688d9c..50e157624 100644 --- a/packages/expo-intl/package.json +++ b/packages/expo-intl/package.json @@ -5,6 +5,9 @@ "author": "Hugo Persson", "description": "Internationalization (i18n) for Expo / React Native, with build-time message extraction via Metro.", "license": "MIT", + "engines": { + "node": ">=20.10.0" + }, "homepage": "https://next-intl.dev", "repository": { "type": "git", diff --git a/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx index 07d5dc58d..6d15bbfa2 100644 --- a/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx +++ b/packages/expo-intl/src/plugin/createExpoIntlPlugin.tsx @@ -182,9 +182,10 @@ function applyMetroConfig(args: { // 4) When `precompile: true`, swap `use-intl/format-message` for the // `format-only` runtime that understands precompiled ICU ASTs. if (messages.precompile) { - const previousResolveRequest = metroConfig.resolver?.resolveRequest as - | MetroResolveRequest - | undefined; + const candidate: unknown = metroConfig.resolver?.resolveRequest; + const previousResolveRequest = isMetroResolveRequest(candidate) + ? candidate + : undefined; next.resolver.resolveRequest = createFormatMessageRedirect({ previousResolveRequest }); @@ -233,6 +234,10 @@ type MetroResolveRequest = ( platform: string | null ) => MetroResolutionResult; +function isMetroResolveRequest(value: unknown): value is MetroResolveRequest { + return typeof value === 'function'; +} + function createFormatMessageRedirect({ previousResolveRequest }: { diff --git a/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx index ce96cb915..2748630bf 100644 --- a/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx +++ b/packages/expo-intl/src/plugin/extractor/initExtractionCompiler.tsx @@ -40,8 +40,14 @@ export default function initExtractionCompiler( }) }); - // Fire-and-forget: don't block Metro config evaluation. - compiler.extractAll(); + // Fire-and-forget: don't block Metro config evaluation, but surface + // failures so they don't become silent unhandled rejections. + Promise.resolve(compiler.extractAll()).catch((error: unknown) => { + console.error( + `[expo-intl] extractAll() failed (projectRoot: ${options.projectRoot}):`, + error + ); + }); function cleanup(): void { if (compiler) { diff --git a/packages/expo-intl/src/plugin/transformer.tsx b/packages/expo-intl/src/plugin/transformer.tsx index 93e7041f8..50434de28 100644 --- a/packages/expo-intl/src/plugin/transformer.tsx +++ b/packages/expo-intl/src/plugin/transformer.tsx @@ -57,6 +57,15 @@ function getOptions(): SerializedTransformerOptions | null { } } +function normalizeDottedExtension(extension: unknown): `.${string}` { + if (typeof extension !== 'string' || extension.length === 0) { + throw new Error( + `[expo-intl] customFormat.extension must be a non-empty string (got ${String(extension)}).` + ); + } + return (extension.startsWith('.') ? extension : `.${extension}`) as `.${string}`; +} + function isCatalogPath( filename: string, options: SerializedTransformerOptions @@ -83,7 +92,9 @@ export async function transform( ? { format: { codec: options.customFormat.codec, - extension: options.customFormat.extension as `.${string}` + extension: normalizeDottedExtension( + options.customFormat.extension + ) }, precompile: options.precompile } diff --git a/packages/intl-extractor/src/utils.tsx b/packages/intl-extractor/src/utils.tsx index 2e1d983ed..754288888 100644 --- a/packages/intl-extractor/src/utils.tsx +++ b/packages/intl-extractor/src/utils.tsx @@ -42,7 +42,7 @@ export function hasLocalesToExtract( return locales === 'infer' || locales.length > 0; } -// Essentialls lodash/set, but we avoid this dependency +// Essentially lodash/set, but we avoid this dependency export function setNestedProperty( obj: Record, keyPath: string, diff --git a/packages/intl-extractor/tsconfig.json b/packages/intl-extractor/tsconfig.json index e19f71ed7..0ce5e3c0b 100644 --- a/packages/intl-extractor/tsconfig.json +++ b/packages/intl-extractor/tsconfig.json @@ -2,9 +2,9 @@ "extends": "eslint-config-molindo/tsconfig.json", "include": ["src"], "compilerOptions": { - "lib": ["esnext"], + "lib": ["esnext", "ES2022", "ESNext.Disposable"], "types": ["node"], - "target": "ES2020", + "target": "ES2022", "declaration": true, "rootDir": ".", "module": "NodeNext",