diff --git a/.changeset/config.json b/.changeset/config.json index f6bc924a..3f250ef7 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -14,7 +14,9 @@ "@callstack/brownfield-example-android-app", "@callstack/brownfield-example-ios-app", "@callstack/brownfield-example-rn-app", - "@callstack/brownfield-example-expo-app", + "@callstack/brownfield-example-expo-app-54", + "@callstack/brownfield-example-expo-app-55", + "@callstack/react-native-brownfield-tester-integrated", "@callstack/brownfield-gradle-plugin-react" ], "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { diff --git a/.changeset/wet-ears-cough.md b/.changeset/wet-ears-cough.md new file mode 100644 index 00000000..9b5bda36 --- /dev/null +++ b/.changeset/wet-ears-cough.md @@ -0,0 +1,5 @@ +--- +'@callstack/react-native-brownfield': minor +--- + +feat: support Expo 55 diff --git a/.github/actions/androidapp-road-test/action.yml b/.github/actions/androidapp-road-test/action.yml index 8cd2da4b..82e89764 100644 --- a/.github/actions/androidapp-road-test/action.yml +++ b/.github/actions/androidapp-road-test/action.yml @@ -3,7 +3,7 @@ description: Package the given RN app as AAR, publish to Maven Local, and build inputs: flavor: - description: 'AndroidApp flavor to build (expo or vanilla)' + description: 'AndroidApp flavor to build (expo or vanilla)' required: true rn-project-path: @@ -42,14 +42,14 @@ runs: # == RN app == - name: Prebuild Expo app - if: ${{ inputs.flavor == 'expo' }} + if: ${{ startsWith(inputs.flavor, 'expo') }} run: | cd ${{ inputs.rn-project-path }} yarn run expo prebuild --platform android shell: bash - name: Patch ExpoApp Android build.gradle for CI - if: ${{ inputs.flavor == 'expo' }} + if: ${{ startsWith(inputs.flavor, 'expo') }} run: | cd ${{ inputs.rn-project-path }} yarn run brownfield:prepare:android:ci diff --git a/.github/actions/appleapp-road-test/action.yml b/.github/actions/appleapp-road-test/action.yml index b4bf7b4c..0c81240e 100644 --- a/.github/actions/appleapp-road-test/action.yml +++ b/.github/actions/appleapp-road-test/action.yml @@ -83,7 +83,7 @@ runs: - name: Build Brownfield iOS native app (${{ inputs.variant }}) run: | - yarn run build:example:ios-consumer:${{ inputs.variant }} + yarn run build:example:ios-consumer:${{ startsWith(inputs.variant, 'expo') && 'expo' || inputs.variant }} shell: bash # ============== diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e1b323d..8483154f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,19 +51,24 @@ jobs: yarn workspace @callstack/react-native-brownfield brownfield --version android-androidapp-expo: - name: Android road test (RNApp & AndroidApp - Expo) + name: Android road test (RNApp & AndroidApp - Expo ${{ matrix.version }}) runs-on: ubuntu-latest needs: build-lint + strategy: + matrix: + include: + - version: '54' + - version: '55' steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Run RNApp -> AndroidApp road test (Expo) + - name: Run RNApp -> AndroidApp road test (Expo ${{ matrix.version }}) uses: ./.github/actions/androidapp-road-test with: - flavor: expo - rn-project-path: apps/ExpoApp + flavor: expo${{ matrix.version }} + rn-project-path: apps/ExpoApp${{ matrix.version }} rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapp/brownfieldlib android-androidapp-vanilla: diff --git a/.yarnrc.yml b/.yarnrc.yml index da847f36..a4a2e259 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -2,8 +2,8 @@ compressionLevel: mixed enableGlobalCache: false -nodeLinker: node-modules - nmHoistingLimits: workspaces +nodeLinker: node-modules + yarnPath: .yarn/releases/yarn-4.12.0.cjs diff --git a/apps/AndroidApp/app/build.gradle.kts b/apps/AndroidApp/app/build.gradle.kts index 2b6cd3a6..03398065 100644 --- a/apps/AndroidApp/app/build.gradle.kts +++ b/apps/AndroidApp/app/build.gradle.kts @@ -30,7 +30,10 @@ android { flavorDimensions += "app" productFlavors { - create("expo") { + create("expo54") { + dimension = "app" + } + create("expo55") { dimension = "app" } create("vanilla") { @@ -71,7 +74,8 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) implementation(libs.androidx.appcompat) - add("expoImplementation", libs.brownfieldlib.expo) + add("expo55Implementation", libs.brownfieldlib.expo55) + add("expo54Implementation", libs.brownfieldlib.expo54) add("vanillaImplementation", libs.brownfieldlib.vanilla) implementation(libs.androidx.fragment.compose) diff --git a/apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt similarity index 73% rename from apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt rename to apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt index da2e6d93..ef91af22 100644 --- a/apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt +++ b/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt @@ -2,5 +2,5 @@ package com.callstack.brownfield.android.example object ReactNativeConstants { const val MAIN_MODULE_NAME = "main" - const val APP_NAME = "Android (Expo)" + const val APP_NAME = "Android (Expo 54)" } diff --git a/apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt similarity index 76% rename from apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt rename to apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt index f47c28c0..4fb0f2c0 100644 --- a/apps/AndroidApp/app/src/expo/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt +++ b/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -1,3 +1,3 @@ package com.callstack.brownfield.android.example -typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp.ReactNativeHostManager +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp54.ReactNativeHostManager diff --git a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt new file mode 100644 index 00000000..ee7e89bf --- /dev/null +++ b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt @@ -0,0 +1,6 @@ +package com.callstack.brownfield.android.example + +object ReactNativeConstants { + const val MAIN_MODULE_NAME = "main" + const val APP_NAME = "Android (Expo 55)" +} diff --git a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt new file mode 100644 index 00000000..be934b7a --- /dev/null +++ b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -0,0 +1,3 @@ +package com.callstack.brownfield.android.example + +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp55.ReactNativeHostManager diff --git a/apps/AndroidApp/gradle/libs.versions.toml b/apps/AndroidApp/gradle/libs.versions.toml index 4895fec2..3cd1b127 100644 --- a/apps/AndroidApp/gradle/libs.versions.toml +++ b/apps/AndroidApp/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] agp = "8.13.2" brownfieldlib = "0.0.1-SNAPSHOT" -kotlin = "2.0.21" +kotlin = "2.2.21" coreKtx = "1.17.0" junit = "4.13.2" junitVersion = "1.3.0" @@ -15,7 +15,8 @@ material = "1.13.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -brownfieldlib-expo = { module = "com.callstack.rnbrownfield.demo.expoapp:brownfieldlib", version.ref = "brownfieldlib" } +brownfieldlib-expo55 = { module = "com.callstack.rnbrownfield.demo.expoapp55:brownfieldlib", version.ref = "brownfieldlib" } +brownfieldlib-expo54 = { module = "com.callstack.rnbrownfield.demo.expoapp54:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-vanilla = { module = "com.rnapp:brownfieldlib", version.ref = "brownfieldlib" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } diff --git a/apps/AndroidApp/package.json b/apps/AndroidApp/package.json index fab1000e..ec42f314 100644 --- a/apps/AndroidApp/package.json +++ b/apps/AndroidApp/package.json @@ -3,7 +3,9 @@ "version": "0.0.1", "private": true, "scripts": { - "build:example:android-consumer:expo": "./gradlew assembleExpoRelease", + "build:example:android-consumer:expo": "./gradlew assembleExpo55Release", + "build:example:android-consumer:expo55": "./gradlew assembleExpo55Release", + "build:example:android-consumer:expo54": "./gradlew assembleExpo54Release", "build:example:android-consumer:vanilla": "./gradlew assembleVanillaRelease" } } diff --git a/apps/AppleApp/package.json b/apps/AppleApp/package.json index a6d3aab9..04dac4e8 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -4,9 +4,11 @@ "private": true, "type": "module", "scripts": { - "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build", - "build:example:ios-consumer:expo": "node prepareXCFrameworks.js --appName ExpoApp && yarn internal::build::common -scheme \"Brownfield Apple App Expo\" -configuration \"Release Expo\"", - "build:example:ios-consumer:vanilla": "node prepareXCFrameworks.js --appName RNApp && yarn internal::build::common -scheme \"Brownfield Apple App Vanilla\" -configuration \"Release Vanilla\"" + "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo55", + "build:example:ios-consumer:expo54": "node prepareXCFrameworks.js --appName ExpoApp54 && yarn internal::build::common -scheme \"Brownfield Apple App Expo\" -configuration Release", + "build:example:ios-consumer:expo55": "node prepareXCFrameworks.js --appName ExpoApp55 && yarn internal::build::common -scheme \"Brownfield Apple App Expo\" -configuration Release", + "build:example:ios-consumer:vanilla": "node prepareXCFrameworks.js --appName RNApp && yarn internal::build::common -scheme \"Brownfield Apple App Vanilla\" -configuration \"Release Vanilla\"", + "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build" }, "devDependencies": { "@rock-js/tools": "^0.12.8" diff --git a/apps/ExpoApp/.gitignore b/apps/ExpoApp54/.gitignore similarity index 100% rename from apps/ExpoApp/.gitignore rename to apps/ExpoApp54/.gitignore diff --git a/apps/ExpoApp/BrownfieldStore.brownie.ts b/apps/ExpoApp54/BrownfieldStore.brownie.ts similarity index 100% rename from apps/ExpoApp/BrownfieldStore.brownie.ts rename to apps/ExpoApp54/BrownfieldStore.brownie.ts diff --git a/apps/ExpoApp/README.md b/apps/ExpoApp54/README.md similarity index 100% rename from apps/ExpoApp/README.md rename to apps/ExpoApp54/README.md diff --git a/apps/ExpoApp/RNApp.tsx b/apps/ExpoApp54/RNApp.tsx similarity index 100% rename from apps/ExpoApp/RNApp.tsx rename to apps/ExpoApp54/RNApp.tsx diff --git a/apps/ExpoApp/app.json b/apps/ExpoApp54/app.json similarity index 91% rename from apps/ExpoApp/app.json rename to apps/ExpoApp54/app.json index 293c5cda..169d9305 100644 --- a/apps/ExpoApp/app.json +++ b/apps/ExpoApp54/app.json @@ -1,7 +1,7 @@ { "expo": { - "name": "ExpoApp", - "slug": "ExpoApp", + "name": "ExpoApp54", + "slug": "ExpoApp54", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", @@ -10,7 +10,7 @@ "newArchEnabled": true, "ios": { "supportsTablet": true, - "bundleIdentifier": "com.callstack.rnbrownfield.demo.expoapp" + "bundleIdentifier": "com.callstack.rnbrownfield.demo.expoapp54" }, "android": { "adaptiveIcon": { @@ -21,7 +21,7 @@ }, "edgeToEdgeEnabled": true, "predictiveBackGestureEnabled": false, - "package": "com.callstack.rnbrownfield.demo.expoapp" + "package": "com.callstack.rnbrownfield.demo.expoapp54" }, "web": { "output": "static", diff --git a/apps/ExpoApp/app/(tabs)/_layout.tsx b/apps/ExpoApp54/app/(tabs)/_layout.tsx similarity index 100% rename from apps/ExpoApp/app/(tabs)/_layout.tsx rename to apps/ExpoApp54/app/(tabs)/_layout.tsx diff --git a/apps/ExpoApp/app/(tabs)/explore.tsx b/apps/ExpoApp54/app/(tabs)/explore.tsx similarity index 100% rename from apps/ExpoApp/app/(tabs)/explore.tsx rename to apps/ExpoApp54/app/(tabs)/explore.tsx diff --git a/apps/ExpoApp/app/(tabs)/index.tsx b/apps/ExpoApp54/app/(tabs)/index.tsx similarity index 98% rename from apps/ExpoApp/app/(tabs)/index.tsx rename to apps/ExpoApp54/app/(tabs)/index.tsx index ba27c8fd..78b79634 100644 --- a/apps/ExpoApp/app/(tabs)/index.tsx +++ b/apps/ExpoApp54/app/(tabs)/index.tsx @@ -20,7 +20,7 @@ export default function HomeScreen() { } > - Welcome! + Welcome to Expo 54! diff --git a/apps/ExpoApp/app/(tabs)/postMessage.tsx b/apps/ExpoApp54/app/(tabs)/postMessage.tsx similarity index 100% rename from apps/ExpoApp/app/(tabs)/postMessage.tsx rename to apps/ExpoApp54/app/(tabs)/postMessage.tsx diff --git a/apps/ExpoApp/app/_layout.tsx b/apps/ExpoApp54/app/_layout.tsx similarity index 100% rename from apps/ExpoApp/app/_layout.tsx rename to apps/ExpoApp54/app/_layout.tsx diff --git a/apps/ExpoApp/app/modal.tsx b/apps/ExpoApp54/app/modal.tsx similarity index 100% rename from apps/ExpoApp/app/modal.tsx rename to apps/ExpoApp54/app/modal.tsx diff --git a/apps/ExpoApp/assets/images/android-icon-background.png b/apps/ExpoApp54/assets/images/android-icon-background.png similarity index 100% rename from apps/ExpoApp/assets/images/android-icon-background.png rename to apps/ExpoApp54/assets/images/android-icon-background.png diff --git a/apps/ExpoApp/assets/images/android-icon-foreground.png b/apps/ExpoApp54/assets/images/android-icon-foreground.png similarity index 100% rename from apps/ExpoApp/assets/images/android-icon-foreground.png rename to apps/ExpoApp54/assets/images/android-icon-foreground.png diff --git a/apps/ExpoApp/assets/images/android-icon-monochrome.png b/apps/ExpoApp54/assets/images/android-icon-monochrome.png similarity index 100% rename from apps/ExpoApp/assets/images/android-icon-monochrome.png rename to apps/ExpoApp54/assets/images/android-icon-monochrome.png diff --git a/apps/ExpoApp/assets/images/favicon.png b/apps/ExpoApp54/assets/images/favicon.png similarity index 100% rename from apps/ExpoApp/assets/images/favicon.png rename to apps/ExpoApp54/assets/images/favicon.png diff --git a/apps/ExpoApp/assets/images/icon.png b/apps/ExpoApp54/assets/images/icon.png similarity index 100% rename from apps/ExpoApp/assets/images/icon.png rename to apps/ExpoApp54/assets/images/icon.png diff --git a/apps/ExpoApp/assets/images/partial-react-logo.png b/apps/ExpoApp54/assets/images/partial-react-logo.png similarity index 100% rename from apps/ExpoApp/assets/images/partial-react-logo.png rename to apps/ExpoApp54/assets/images/partial-react-logo.png diff --git a/apps/ExpoApp/assets/images/react-logo.png b/apps/ExpoApp54/assets/images/react-logo.png similarity index 100% rename from apps/ExpoApp/assets/images/react-logo.png rename to apps/ExpoApp54/assets/images/react-logo.png diff --git a/apps/ExpoApp/assets/images/react-logo@2x.png b/apps/ExpoApp54/assets/images/react-logo@2x.png similarity index 100% rename from apps/ExpoApp/assets/images/react-logo@2x.png rename to apps/ExpoApp54/assets/images/react-logo@2x.png diff --git a/apps/ExpoApp/assets/images/react-logo@3x.png b/apps/ExpoApp54/assets/images/react-logo@3x.png similarity index 100% rename from apps/ExpoApp/assets/images/react-logo@3x.png rename to apps/ExpoApp54/assets/images/react-logo@3x.png diff --git a/apps/ExpoApp/assets/images/splash-icon.png b/apps/ExpoApp54/assets/images/splash-icon.png similarity index 100% rename from apps/ExpoApp/assets/images/splash-icon.png rename to apps/ExpoApp54/assets/images/splash-icon.png diff --git a/apps/ExpoApp/components/counter/index.ios.tsx b/apps/ExpoApp54/components/counter/index.ios.tsx similarity index 100% rename from apps/ExpoApp/components/counter/index.ios.tsx rename to apps/ExpoApp54/components/counter/index.ios.tsx diff --git a/apps/ExpoApp/components/counter/index.tsx b/apps/ExpoApp54/components/counter/index.tsx similarity index 100% rename from apps/ExpoApp/components/counter/index.tsx rename to apps/ExpoApp54/components/counter/index.tsx diff --git a/apps/ExpoApp/components/external-link.tsx b/apps/ExpoApp54/components/external-link.tsx similarity index 100% rename from apps/ExpoApp/components/external-link.tsx rename to apps/ExpoApp54/components/external-link.tsx diff --git a/apps/ExpoApp/components/haptic-tab.tsx b/apps/ExpoApp54/components/haptic-tab.tsx similarity index 100% rename from apps/ExpoApp/components/haptic-tab.tsx rename to apps/ExpoApp54/components/haptic-tab.tsx diff --git a/apps/ExpoApp/components/hello-wave.tsx b/apps/ExpoApp54/components/hello-wave.tsx similarity index 100% rename from apps/ExpoApp/components/hello-wave.tsx rename to apps/ExpoApp54/components/hello-wave.tsx diff --git a/apps/ExpoApp/components/parallax-scroll-view.tsx b/apps/ExpoApp54/components/parallax-scroll-view.tsx similarity index 100% rename from apps/ExpoApp/components/parallax-scroll-view.tsx rename to apps/ExpoApp54/components/parallax-scroll-view.tsx diff --git a/apps/ExpoApp/components/postMessage/Message.ts b/apps/ExpoApp54/components/postMessage/Message.ts similarity index 100% rename from apps/ExpoApp/components/postMessage/Message.ts rename to apps/ExpoApp54/components/postMessage/Message.ts diff --git a/apps/ExpoApp/components/postMessage/MessageBubble.tsx b/apps/ExpoApp54/components/postMessage/MessageBubble.tsx similarity index 100% rename from apps/ExpoApp/components/postMessage/MessageBubble.tsx rename to apps/ExpoApp54/components/postMessage/MessageBubble.tsx diff --git a/apps/ExpoApp/components/themed-text.tsx b/apps/ExpoApp54/components/themed-text.tsx similarity index 100% rename from apps/ExpoApp/components/themed-text.tsx rename to apps/ExpoApp54/components/themed-text.tsx diff --git a/apps/ExpoApp/components/themed-view.tsx b/apps/ExpoApp54/components/themed-view.tsx similarity index 100% rename from apps/ExpoApp/components/themed-view.tsx rename to apps/ExpoApp54/components/themed-view.tsx diff --git a/apps/ExpoApp/components/ui/collapsible.tsx b/apps/ExpoApp54/components/ui/collapsible.tsx similarity index 100% rename from apps/ExpoApp/components/ui/collapsible.tsx rename to apps/ExpoApp54/components/ui/collapsible.tsx diff --git a/apps/ExpoApp/components/ui/icon-symbol.ios.tsx b/apps/ExpoApp54/components/ui/icon-symbol.ios.tsx similarity index 100% rename from apps/ExpoApp/components/ui/icon-symbol.ios.tsx rename to apps/ExpoApp54/components/ui/icon-symbol.ios.tsx diff --git a/apps/ExpoApp/components/ui/icon-symbol.tsx b/apps/ExpoApp54/components/ui/icon-symbol.tsx similarity index 100% rename from apps/ExpoApp/components/ui/icon-symbol.tsx rename to apps/ExpoApp54/components/ui/icon-symbol.tsx diff --git a/apps/ExpoApp/constants/theme.ts b/apps/ExpoApp54/constants/theme.ts similarity index 100% rename from apps/ExpoApp/constants/theme.ts rename to apps/ExpoApp54/constants/theme.ts diff --git a/apps/ExpoApp/entry.tsx b/apps/ExpoApp54/entry.tsx similarity index 100% rename from apps/ExpoApp/entry.tsx rename to apps/ExpoApp54/entry.tsx diff --git a/apps/ExpoApp/eslint.config.mjs b/apps/ExpoApp54/eslint.config.mjs similarity index 100% rename from apps/ExpoApp/eslint.config.mjs rename to apps/ExpoApp54/eslint.config.mjs diff --git a/apps/ExpoApp/hooks/use-color-scheme.ts b/apps/ExpoApp54/hooks/use-color-scheme.ts similarity index 100% rename from apps/ExpoApp/hooks/use-color-scheme.ts rename to apps/ExpoApp54/hooks/use-color-scheme.ts diff --git a/apps/ExpoApp/hooks/use-color-scheme.web.ts b/apps/ExpoApp54/hooks/use-color-scheme.web.ts similarity index 100% rename from apps/ExpoApp/hooks/use-color-scheme.web.ts rename to apps/ExpoApp54/hooks/use-color-scheme.web.ts diff --git a/apps/ExpoApp/hooks/use-theme-color.ts b/apps/ExpoApp54/hooks/use-theme-color.ts similarity index 100% rename from apps/ExpoApp/hooks/use-theme-color.ts rename to apps/ExpoApp54/hooks/use-theme-color.ts diff --git a/apps/ExpoApp/package.json b/apps/ExpoApp54/package.json similarity index 87% rename from apps/ExpoApp/package.json rename to apps/ExpoApp54/package.json index 9244f052..f576ce6e 100644 --- a/apps/ExpoApp/package.json +++ b/apps/ExpoApp54/package.json @@ -1,5 +1,5 @@ { - "name": "@callstack/brownfield-example-expo-app", + "name": "@callstack/brownfield-example-expo-app-54", "main": "./entry.tsx", "version": "1.0.0", "private": true, @@ -10,7 +10,7 @@ "web": "expo start --web", "lint": "expo lint", "prebuild": "expo prebuild", - "brownfield:prepare:android:ci": "node --experimental-strip-types --no-warnings ./scripts/prepare-android-build-gradle-for-ci.ts", + "brownfield:prepare:android:ci": "cd .. && node --experimental-strip-types --no-warnings ./scripts/prepare-android-build-gradle-for-ci.ts ExpoApp54", "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release", "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib", "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release" diff --git a/apps/ExpoApp/tsconfig.json b/apps/ExpoApp54/tsconfig.json similarity index 100% rename from apps/ExpoApp/tsconfig.json rename to apps/ExpoApp54/tsconfig.json diff --git a/apps/ExpoApp55/.gitignore b/apps/ExpoApp55/.gitignore new file mode 100644 index 00000000..f8c6c2e8 --- /dev/null +++ b/apps/ExpoApp55/.gitignore @@ -0,0 +1,43 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +app-example + +# generated native folders +/ios +/android diff --git a/apps/ExpoApp55/BrownfieldStore.brownie.ts b/apps/ExpoApp55/BrownfieldStore.brownie.ts new file mode 100644 index 00000000..94e22c72 --- /dev/null +++ b/apps/ExpoApp55/BrownfieldStore.brownie.ts @@ -0,0 +1,21 @@ +import type { BrownieStore } from '@callstack/brownie'; + +export interface BrownfieldStore extends BrownieStore { + counter: number; + user: { + name: string; + }; +} + +export interface SettingsStore extends BrownieStore { + theme: 'light' | 'dark'; + notificationsEnabled: boolean; + privacyMode: boolean; +} + +declare module '@callstack/brownie' { + interface BrownieStores { + BrownfieldStore: BrownfieldStore; + SettingsStore: SettingsStore; + } +} diff --git a/apps/ExpoApp55/README.md b/apps/ExpoApp55/README.md new file mode 100644 index 00000000..48dd63ff --- /dev/null +++ b/apps/ExpoApp55/README.md @@ -0,0 +1,50 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/apps/ExpoApp55/RNApp.tsx b/apps/ExpoApp55/RNApp.tsx new file mode 100644 index 00000000..a87add22 --- /dev/null +++ b/apps/ExpoApp55/RNApp.tsx @@ -0,0 +1,38 @@ +import { SafeAreaView } from 'react-native-safe-area-context'; +import { StyleSheet, Text, View } from 'react-native'; +import Counter from './components/counter'; + +export default function RNApp() { + return ( + + Expo React Native Brownfield + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#eeeeee', + paddingTop: 20, + }, + title: { + fontSize: 20, + fontWeight: 'bold', + textAlign: 'center', + }, + content: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + text: { + fontSize: 18, + textAlign: 'center', + marginBottom: 5, + }, +}); diff --git a/apps/ExpoApp55/app.json b/apps/ExpoApp55/app.json new file mode 100644 index 00000000..85cef2c1 --- /dev/null +++ b/apps/ExpoApp55/app.json @@ -0,0 +1,47 @@ +{ + "expo": { + "name": "ExpoApp55", + "slug": "ExpoApp55", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "expoapp55", + "userInterfaceStyle": "automatic", + "ios": { + "icon": "./assets/expo.icon", + "bundleIdentifier": "com.callstack.rnbrownfield.demo.expoapp55" + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#E6F4FE", + "foregroundImage": "./assets/images/android-icon-foreground.png", + "backgroundImage": "./assets/images/android-icon-background.png", + "monochromeImage": "./assets/images/android-icon-monochrome.png" + }, + "predictiveBackGestureEnabled": false, + "package": "com.callstack.rnbrownfield.demo.expoapp55" + }, + "web": { + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + "expo-router", + [ + "expo-splash-screen", + { + "backgroundColor": "#208AEF", + "android": { + "image": "./assets/images/splash-icon.png", + "imageWidth": 76 + } + } + ], + "@callstack/react-native-brownfield" + ], + "experiments": { + "typedRoutes": true, + "reactCompiler": true + } + } +} diff --git a/apps/ExpoApp55/assets/expo.icon/Assets/expo-symbol 2.svg b/apps/ExpoApp55/assets/expo.icon/Assets/expo-symbol 2.svg new file mode 100644 index 00000000..51d36767 --- /dev/null +++ b/apps/ExpoApp55/assets/expo.icon/Assets/expo-symbol 2.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/ExpoApp55/assets/expo.icon/Assets/grid.png b/apps/ExpoApp55/assets/expo.icon/Assets/grid.png new file mode 100644 index 00000000..eefea242 Binary files /dev/null and b/apps/ExpoApp55/assets/expo.icon/Assets/grid.png differ diff --git a/apps/ExpoApp55/assets/expo.icon/icon.json b/apps/ExpoApp55/assets/expo.icon/icon.json new file mode 100644 index 00000000..7a2c33cd --- /dev/null +++ b/apps/ExpoApp55/assets/expo.icon/icon.json @@ -0,0 +1,40 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "image-name" : "expo-symbol 2.svg", + "name" : "expo-symbol 2", + "position" : { + "scale" : 1, + "translation-in-points" : [ + 1.1008400065293245e-05, + -16.046875 + ] + } + }, + { + "image-name" : "grid.png", + "name" : "grid" + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/apps/ExpoApp55/assets/images/android-icon-background.png b/apps/ExpoApp55/assets/images/android-icon-background.png new file mode 100644 index 00000000..5ffefc5b Binary files /dev/null and b/apps/ExpoApp55/assets/images/android-icon-background.png differ diff --git a/apps/ExpoApp55/assets/images/android-icon-foreground.png b/apps/ExpoApp55/assets/images/android-icon-foreground.png new file mode 100644 index 00000000..3a9e5016 Binary files /dev/null and b/apps/ExpoApp55/assets/images/android-icon-foreground.png differ diff --git a/apps/ExpoApp55/assets/images/android-icon-monochrome.png b/apps/ExpoApp55/assets/images/android-icon-monochrome.png new file mode 100644 index 00000000..77484ebd Binary files /dev/null and b/apps/ExpoApp55/assets/images/android-icon-monochrome.png differ diff --git a/apps/ExpoApp55/assets/images/expo-badge-white.png b/apps/ExpoApp55/assets/images/expo-badge-white.png new file mode 100644 index 00000000..28630679 Binary files /dev/null and b/apps/ExpoApp55/assets/images/expo-badge-white.png differ diff --git a/apps/ExpoApp55/assets/images/expo-badge.png b/apps/ExpoApp55/assets/images/expo-badge.png new file mode 100644 index 00000000..5d5c5bb5 Binary files /dev/null and b/apps/ExpoApp55/assets/images/expo-badge.png differ diff --git a/apps/ExpoApp55/assets/images/expo-logo.png b/apps/ExpoApp55/assets/images/expo-logo.png new file mode 100644 index 00000000..6b1642a0 Binary files /dev/null and b/apps/ExpoApp55/assets/images/expo-logo.png differ diff --git a/apps/ExpoApp55/assets/images/favicon.png b/apps/ExpoApp55/assets/images/favicon.png new file mode 100644 index 00000000..408bd746 Binary files /dev/null and b/apps/ExpoApp55/assets/images/favicon.png differ diff --git a/apps/ExpoApp55/assets/images/icon.png b/apps/ExpoApp55/assets/images/icon.png new file mode 100644 index 00000000..67c777a4 Binary files /dev/null and b/apps/ExpoApp55/assets/images/icon.png differ diff --git a/apps/ExpoApp55/assets/images/logo-glow.png b/apps/ExpoApp55/assets/images/logo-glow.png new file mode 100644 index 00000000..edc99be1 Binary files /dev/null and b/apps/ExpoApp55/assets/images/logo-glow.png differ diff --git a/apps/ExpoApp55/assets/images/react-logo.png b/apps/ExpoApp55/assets/images/react-logo.png new file mode 100644 index 00000000..9d72a9ff Binary files /dev/null and b/apps/ExpoApp55/assets/images/react-logo.png differ diff --git a/apps/ExpoApp55/assets/images/react-logo@2x.png b/apps/ExpoApp55/assets/images/react-logo@2x.png new file mode 100644 index 00000000..2229b130 Binary files /dev/null and b/apps/ExpoApp55/assets/images/react-logo@2x.png differ diff --git a/apps/ExpoApp55/assets/images/react-logo@3x.png b/apps/ExpoApp55/assets/images/react-logo@3x.png new file mode 100644 index 00000000..a99b2032 Binary files /dev/null and b/apps/ExpoApp55/assets/images/react-logo@3x.png differ diff --git a/apps/ExpoApp55/assets/images/splash-icon.png b/apps/ExpoApp55/assets/images/splash-icon.png new file mode 100644 index 00000000..6b1642a0 Binary files /dev/null and b/apps/ExpoApp55/assets/images/splash-icon.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/explore.png b/apps/ExpoApp55/assets/images/tabIcons/explore.png new file mode 100644 index 00000000..73d82583 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/explore.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/explore@2x.png b/apps/ExpoApp55/assets/images/tabIcons/explore@2x.png new file mode 100644 index 00000000..21b9bd26 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/explore@2x.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/explore@3x.png b/apps/ExpoApp55/assets/images/tabIcons/explore@3x.png new file mode 100644 index 00000000..422202d5 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/explore@3x.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/home.png b/apps/ExpoApp55/assets/images/tabIcons/home.png new file mode 100644 index 00000000..ad5699c4 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/home.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/home@2x.png b/apps/ExpoApp55/assets/images/tabIcons/home@2x.png new file mode 100644 index 00000000..22a1f2c7 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/home@2x.png differ diff --git a/apps/ExpoApp55/assets/images/tabIcons/home@3x.png b/apps/ExpoApp55/assets/images/tabIcons/home@3x.png new file mode 100644 index 00000000..f5d1f9a4 Binary files /dev/null and b/apps/ExpoApp55/assets/images/tabIcons/home@3x.png differ diff --git a/apps/ExpoApp55/assets/images/tutorial-web.png b/apps/ExpoApp55/assets/images/tutorial-web.png new file mode 100644 index 00000000..e4a8c58f Binary files /dev/null and b/apps/ExpoApp55/assets/images/tutorial-web.png differ diff --git a/apps/ExpoApp55/entry.tsx b/apps/ExpoApp55/entry.tsx new file mode 100644 index 00000000..86abd0e1 --- /dev/null +++ b/apps/ExpoApp55/entry.tsx @@ -0,0 +1,12 @@ +import { ExpoRoot } from 'expo-router'; +import { AppRegistry } from 'react-native'; +import RNApp from './RNApp'; + +function App() { + const ctx = require.context('./app'); + return ; +} + +AppRegistry.registerComponent('RNApp', () => RNApp); +// Keep compatibility with Expo's default app key. +AppRegistry.registerComponent('main', () => App); diff --git a/apps/ExpoApp55/eslint.config.js b/apps/ExpoApp55/eslint.config.js new file mode 100644 index 00000000..5025da68 --- /dev/null +++ b/apps/ExpoApp55/eslint.config.js @@ -0,0 +1,10 @@ +// https://docs.expo.dev/guides/using-eslint/ +const { defineConfig } = require('eslint/config'); +const expoConfig = require('eslint-config-expo/flat'); + +module.exports = defineConfig([ + expoConfig, + { + ignores: ['dist/*'], + }, +]); diff --git a/apps/ExpoApp55/package.json b/apps/ExpoApp55/package.json new file mode 100644 index 00000000..f3331677 --- /dev/null +++ b/apps/ExpoApp55/package.json @@ -0,0 +1,54 @@ +{ + "name": "@callstack/brownfield-example-expo-app-55", + "main": "expo-router/entry", + "version": "1.0.0", + "scripts": { + "start": "expo start", + "android": "expo run:android", + "ios": "expo run:ios", + "web": "expo start --web", + "lint": "expo lint", + "prebuild": "expo prebuild", + "brownfield:prepare:android:ci": "cd .. && node --experimental-strip-types --no-warnings ./scripts/prepare-android-build-gradle-for-ci.ts ExpoApp54", + "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release", + "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib", + "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release" + }, + "dependencies": { + "@callstack/brownie": "workspace:^", + "@callstack/react-native-brownfield": "workspace:^", + "@expo/vector-icons": "^15.0.2", + "@react-navigation/bottom-tabs": "^7.7.3", + "@react-navigation/elements": "^2.8.1", + "@react-navigation/native": "^7.1.28", + "expo": "~55.0.0-preview.12", + "expo-constants": "~55.0.6", + "expo-device": "~55.0.8", + "expo-font": "~55.0.4", + "expo-glass-effect": "~55.0.6", + "expo-image": "~55.0.4", + "expo-linking": "~55.0.6", + "expo-router": "~55.0.0-preview.9", + "expo-splash-screen": "~55.0.8", + "expo-status-bar": "~55.0.3", + "expo-symbols": "~55.0.4", + "expo-system-ui": "~55.0.8", + "expo-web-browser": "~55.0.8", + "react": "19.2.0", + "react-dom": "19.2.0", + "react-native": "0.83.2", + "react-native-gesture-handler": "~2.30.0", + "react-native-reanimated": "~4.2.1", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.7.2" + }, + "devDependencies": { + "@types/react": "~19.2.2", + "eslint": "^9.25.0", + "eslint-config-expo": "~55.0.0", + "typescript": "~5.9.2" + }, + "private": true +} diff --git a/apps/ExpoApp55/src/app/_layout.tsx b/apps/ExpoApp55/src/app/_layout.tsx new file mode 100644 index 00000000..00afd3cc --- /dev/null +++ b/apps/ExpoApp55/src/app/_layout.tsx @@ -0,0 +1,20 @@ +import { + DarkTheme, + DefaultTheme, + ThemeProvider, +} from '@react-navigation/native'; +import React from 'react'; +import { useColorScheme } from 'react-native'; + +import { AnimatedSplashOverlay } from '@/components/animated-icon'; +import AppTabs from '@/components/app-tabs'; + +export default function TabLayout() { + const colorScheme = useColorScheme(); + return ( + + + + + ); +} diff --git a/apps/ExpoApp55/src/app/explore.tsx b/apps/ExpoApp55/src/app/explore.tsx new file mode 100644 index 00000000..f08c5d37 --- /dev/null +++ b/apps/ExpoApp55/src/app/explore.tsx @@ -0,0 +1,181 @@ +import { Image } from 'expo-image'; +import { SymbolView } from 'expo-symbols'; +import React from 'react'; +import { Platform, Pressable, ScrollView, StyleSheet } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { ExternalLink } from '@/components/external-link'; +import { ThemedText } from '@/components/themed-text'; +import { ThemedView } from '@/components/themed-view'; +import { Collapsible } from '@/components/ui/collapsible'; +import { WebBadge } from '@/components/web-badge'; +import { BottomTabInset, MaxContentWidth, Spacing } from '@/constants/theme'; +import { useTheme } from '@/hooks/use-theme'; + +export default function TabTwoScreen() { + const safeAreaInsets = useSafeAreaInsets(); + const insets = { + ...safeAreaInsets, + bottom: safeAreaInsets.bottom + BottomTabInset + Spacing.three, + }; + const theme = useTheme(); + + const contentPlatformStyle = Platform.select({ + android: { + paddingTop: insets.top, + paddingLeft: insets.left, + paddingRight: insets.right, + paddingBottom: insets.bottom, + }, + web: { + paddingTop: Spacing.six, + paddingBottom: Spacing.four, + }, + }); + + return ( + + + + Explore + + This starter app includes example{'\n'}code to help you get started. + + + + pressed && styles.pressed}> + + Expo documentation + + + + + + + + + + This app has two screens: src/app/index.tsx and{' '} + src/app/explore.tsx + + + The layout file in src/app/_layout.tsx sets up + the tab navigator. + + + Learn more + + + + + + + You can open this project on Android, iOS, and the web. To open the web version, + press w in the terminal running this + project. + + + + + + + + For static images, you can use the @2x and{' '} + @3x suffixes to provide files for different + screen densities. + + + + Learn more + + + + + + This template has light and dark mode support. The{' '} + useColorScheme() hook lets you inspect what the + user's current color scheme is, and so you can adjust UI colors accordingly. + + + Learn more + + + + + + This template includes an example of an animated component. The{' '} + src/components/ui/collapsible.tsx component uses + the powerful react-native-reanimated library to + animate opening this hint. + + + + {Platform.OS === 'web' && } + + + ); +} + +const styles = StyleSheet.create({ + scrollView: { + flex: 1, + }, + contentContainer: { + flexDirection: 'row', + justifyContent: 'center', + }, + container: { + maxWidth: MaxContentWidth, + flexGrow: 1, + }, + titleContainer: { + gap: Spacing.three, + alignItems: 'center', + paddingHorizontal: Spacing.four, + paddingVertical: Spacing.six, + }, + centerText: { + textAlign: 'center', + }, + pressed: { + opacity: 0.7, + }, + linkButton: { + flexDirection: 'row', + paddingHorizontal: Spacing.four, + paddingVertical: Spacing.two, + borderRadius: Spacing.five, + justifyContent: 'center', + gap: Spacing.one, + alignItems: 'center', + }, + sectionsWrapper: { + gap: Spacing.five, + paddingHorizontal: Spacing.four, + paddingTop: Spacing.three, + }, + collapsibleContent: { + alignItems: 'center', + }, + imageTutorial: { + width: '100%', + aspectRatio: 296 / 171, + borderRadius: Spacing.three, + marginTop: Spacing.two, + }, + imageReact: { + width: 100, + height: 100, + alignSelf: 'center', + }, +}); diff --git a/apps/ExpoApp55/src/app/index.tsx b/apps/ExpoApp55/src/app/index.tsx new file mode 100644 index 00000000..8cc33f12 --- /dev/null +++ b/apps/ExpoApp55/src/app/index.tsx @@ -0,0 +1,98 @@ +import * as Device from 'expo-device'; +import { Platform, StyleSheet } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import { AnimatedIcon } from '@/components/animated-icon'; +import { HintRow } from '@/components/hint-row'; +import { ThemedText } from '@/components/themed-text'; +import { ThemedView } from '@/components/themed-view'; +import { WebBadge } from '@/components/web-badge'; +import { BottomTabInset, MaxContentWidth, Spacing } from '@/constants/theme'; + +function getDevMenuHint() { + if (Platform.OS === 'web') { + return use browser devtools; + } + if (Device.isDevice) { + return ( + + shake device or press m in terminal + + ); + } + const shortcut = Platform.OS === 'android' ? 'cmd+m (or ctrl+m)' : 'cmd+d'; + return ( + + press {shortcut} + + ); +} + +export default function HomeScreen() { + return ( + + + + + + Welcome to Expo 55 + + + + + get started + + + + src/app/index.tsx} + /> + + npm run reset-project} + /> + + + {Platform.OS === 'web' && } + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + flexDirection: 'row', + paddingTop: Spacing.three, + }, + safeArea: { + flex: 1, + paddingHorizontal: Spacing.four, + alignItems: 'center', + gap: Spacing.three, + paddingBottom: BottomTabInset + Spacing.three, + maxWidth: MaxContentWidth, + }, + heroSection: { + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: Spacing.four, + gap: Spacing.four, + }, + title: { + textAlign: 'center', + }, + code: { + textTransform: 'uppercase', + }, + stepContainer: { + gap: Spacing.three, + alignSelf: 'stretch', + paddingHorizontal: Spacing.three, + paddingVertical: Spacing.four, + borderRadius: Spacing.four, + }, +}); diff --git a/apps/ExpoApp55/src/app/postMessage.tsx b/apps/ExpoApp55/src/app/postMessage.tsx new file mode 100644 index 00000000..4910c934 --- /dev/null +++ b/apps/ExpoApp55/src/app/postMessage.tsx @@ -0,0 +1,105 @@ +import { StyleSheet, FlatList, TouchableOpacity } from 'react-native'; + +import { useCallback, useEffect, useRef, useState } from 'react'; +import ReactNativeBrownfield from '@callstack/react-native-brownfield'; +import type { MessageEvent } from '@callstack/react-native-brownfield'; + +import { ThemedView } from '@/components/themed-view'; +import { ThemedText } from '@/components/themed-text'; +import type { Message } from '@/components/postMessage/Message'; +import { MessageBubble } from '@/components/postMessage/MessageBubble'; + +export default function HomeScreen() { + const [messages, setMessages] = useState([]); + const flatListRef = useRef>(null); + + const messageCounterRef = useRef(0); + + useEffect(() => { + const sub = ReactNativeBrownfield.onMessage((event: MessageEvent) => { + const data = event.data as { text?: string }; + setMessages((prev) => [ + ...prev, + { + id: String(++messageCounterRef.current), + text: data?.text ?? JSON.stringify(event.data), + from: 'native', + timestamp: Date.now(), + }, + ]); + }); + return () => sub.remove(); + }, []); + + const sendMessage = useCallback(() => { + const msg = { + text: `Hello from Expo! (#${++messageCounterRef.current})`, + timestamp: Date.now(), + }; + ReactNativeBrownfield.postMessage(msg); + setMessages((prev) => [ + ...prev, + { + id: String(messageCounterRef.current), + text: msg.text, + from: 'rn', + timestamp: msg.timestamp, + }, + ]); + }, []); + + return ( + + + + Send message to Native + + + + `message-${item.id}`} + renderItem={({ item }) => } + style={styles.messageList} + contentContainerStyle={styles.messageListContent} + inverted={true} // ensure newest messages are at the top + onContentSizeChange={() => { + flatListRef.current?.scrollToEnd({ animated: true }); + }} + ref={flatListRef} + /> + + ); +} + +const styles = StyleSheet.create({ + messageSection: { + flex: 1, + width: '100%', + padding: 12, + paddingHorizontal: 20, + }, + sendButton: { + paddingVertical: 12, + paddingHorizontal: 20, + borderRadius: 10, + alignItems: 'center', + marginBottom: 10, + backgroundColor: '#4F8EF7', + }, + sendButtonText: { + fontWeight: '700', + fontSize: 15, + color: '#fff', + }, + messageList: { + flex: 1, + }, + messageListContent: { + paddingBottom: 8, + }, +}); diff --git a/apps/ExpoApp55/src/components/animated-icon.module.css b/apps/ExpoApp55/src/components/animated-icon.module.css new file mode 100644 index 00000000..f8156fec --- /dev/null +++ b/apps/ExpoApp55/src/components/animated-icon.module.css @@ -0,0 +1,6 @@ +.expoLogoBackground { + background-image: linear-gradient(180deg, #3c9ffe, #0274df); + border-radius: 40px; + width: 128px; + height: 128px; +} diff --git a/apps/ExpoApp55/src/components/animated-icon.tsx b/apps/ExpoApp55/src/components/animated-icon.tsx new file mode 100644 index 00000000..91a480fc --- /dev/null +++ b/apps/ExpoApp55/src/components/animated-icon.tsx @@ -0,0 +1,132 @@ +import { Image } from 'expo-image'; +import { useState } from 'react'; +import { Dimensions, StyleSheet, View } from 'react-native'; +import Animated, { Easing, Keyframe } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; + +const INITIAL_SCALE_FACTOR = Dimensions.get('screen').height / 90; +const DURATION = 600; + +export function AnimatedSplashOverlay() { + const [visible, setVisible] = useState(true); + + if (!visible) return null; + + const splashKeyframe = new Keyframe({ + 0: { + transform: [{ scale: INITIAL_SCALE_FACTOR }], + opacity: 1, + }, + 20: { + opacity: 1, + }, + 70: { + opacity: 0, + easing: Easing.elastic(0.7), + }, + 100: { + opacity: 0, + transform: [{ scale: 1 }], + easing: Easing.elastic(0.7), + }, + }); + + return ( + { + 'worklet'; + if (finished) { + scheduleOnRN(setVisible, false); + } + })} + style={styles.backgroundSolidColor} + /> + ); +} + +const keyframe = new Keyframe({ + 0: { + transform: [{ scale: INITIAL_SCALE_FACTOR }], + }, + 100: { + transform: [{ scale: 1 }], + easing: Easing.elastic(0.7), + }, +}); + +const logoKeyframe = new Keyframe({ + 0: { + transform: [{ scale: 1.3 }], + opacity: 0, + }, + 40: { + transform: [{ scale: 1.3 }], + opacity: 0, + easing: Easing.elastic(0.7), + }, + 100: { + opacity: 1, + transform: [{ scale: 1 }], + easing: Easing.elastic(0.7), + }, +}); + +const glowKeyframe = new Keyframe({ + 0: { + transform: [{ rotateZ: '0deg' }], + }, + 100: { + transform: [{ rotateZ: '7200deg' }], + }, +}); + +export function AnimatedIcon() { + return ( + + + + + + + + + + + ); +} + +const styles = StyleSheet.create({ + imageContainer: { + justifyContent: 'center', + alignItems: 'center', + }, + glow: { + width: 201, + height: 201, + position: 'absolute', + }, + iconContainer: { + justifyContent: 'center', + alignItems: 'center', + width: 128, + height: 128, + zIndex: 100, + }, + image: { + position: 'absolute', + width: 76, + height: 71, + }, + background: { + borderRadius: 40, + experimental_backgroundImage: `linear-gradient(180deg, #3C9FFE, #0274DF)`, + width: 128, + height: 128, + position: 'absolute', + }, + backgroundSolidColor: { + ...StyleSheet.absoluteFillObject, + backgroundColor: '#208AEF', + zIndex: 1000, + }, +}); diff --git a/apps/ExpoApp55/src/components/animated-icon.web.tsx b/apps/ExpoApp55/src/components/animated-icon.web.tsx new file mode 100644 index 00000000..dfbb1fd7 --- /dev/null +++ b/apps/ExpoApp55/src/components/animated-icon.web.tsx @@ -0,0 +1,108 @@ +import { Image } from 'expo-image'; +import { StyleSheet, View } from 'react-native'; +import Animated, { Keyframe, Easing } from 'react-native-reanimated'; + +import classes from './animated-icon.module.css'; +const DURATION = 300; + +export function AnimatedSplashOverlay() { + return null; +} + +const keyframe = new Keyframe({ + 0: { + transform: [{ scale: 0 }], + }, + 60: { + transform: [{ scale: 1.2 }], + easing: Easing.elastic(1.2), + }, + 100: { + transform: [{ scale: 1 }], + easing: Easing.elastic(1.2), + }, +}); + +const logoKeyframe = new Keyframe({ + 0: { + opacity: 0, + }, + 60: { + transform: [{ scale: 1.2 }], + opacity: 0, + easing: Easing.elastic(1.2), + }, + 100: { + transform: [{ scale: 1 }], + opacity: 1, + easing: Easing.elastic(1.2), + }, +}); + +const glowKeyframe = new Keyframe({ + 0: { + transform: [{ rotateZ: '-180deg' }, { scale: 0.8 }], + opacity: 0, + }, + [DURATION / 1000]: { + transform: [{ rotateZ: '0deg' }, { scale: 1 }], + opacity: 1, + easing: Easing.elastic(0.7), + }, + 100: { + transform: [{ rotateZ: '7200deg' }], + }, +}); + +export function AnimatedIcon() { + return ( + + + + + + +
+ + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: 'center', + width: '100%', + zIndex: 1000, + position: 'absolute', + top: 128 / 2 + 138, + }, + imageContainer: { + justifyContent: 'center', + alignItems: 'center', + }, + glow: { + width: 201, + height: 201, + position: 'absolute', + }, + iconContainer: { + justifyContent: 'center', + alignItems: 'center', + width: 128, + height: 128, + }, + image: { + position: 'absolute', + width: 76, + height: 71, + }, + background: { + width: 128, + height: 128, + position: 'absolute', + }, +}); diff --git a/apps/ExpoApp55/src/components/app-tabs.tsx b/apps/ExpoApp55/src/components/app-tabs.tsx new file mode 100644 index 00000000..3313a64c --- /dev/null +++ b/apps/ExpoApp55/src/components/app-tabs.tsx @@ -0,0 +1,37 @@ +import { NativeTabs } from 'expo-router/unstable-native-tabs'; +import React from 'react'; +import { useColorScheme } from 'react-native'; + +import { Colors } from '@/constants/theme'; + +export default function AppTabs() { + const scheme = useColorScheme(); + const colors = Colors[scheme === 'unspecified' ? 'light' : scheme]; + + return ( + + + Home + + + + + Explore + + + + + postMessage API + + + + ); +} diff --git a/apps/ExpoApp55/src/components/app-tabs.web.tsx b/apps/ExpoApp55/src/components/app-tabs.web.tsx new file mode 100644 index 00000000..f74288a6 --- /dev/null +++ b/apps/ExpoApp55/src/components/app-tabs.web.tsx @@ -0,0 +1,116 @@ +import { + Tabs, + TabList, + TabTrigger, + TabSlot, + TabTriggerSlotProps, + TabListProps, +} from 'expo-router/ui'; +import { SymbolView } from 'expo-symbols'; +import React from 'react'; +import { Pressable, useColorScheme, View, StyleSheet } from 'react-native'; + +import { ExternalLink } from './external-link'; +import { ThemedText } from './themed-text'; +import { ThemedView } from './themed-view'; + +import { Colors, MaxContentWidth, Spacing } from '@/constants/theme'; + +export default function AppTabs() { + return ( + + + + + + Home + + + Explore + + + + + ); +} + +export function TabButton({ children, isFocused, ...props }: TabTriggerSlotProps) { + return ( + pressed && styles.pressed}> + + + {children} + + + + ); +} + +export function CustomTabList(props: TabListProps) { + const scheme = useColorScheme(); + const colors = Colors[scheme === 'unspecified' ? 'light' : scheme]; + + return ( + + + + Expo Starter + + + {props.children} + + + + Doc + + + + + + ); +} + +const styles = StyleSheet.create({ + tabListContainer: { + position: 'absolute', + width: '100%', + padding: Spacing.three, + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'row', + }, + innerContainer: { + paddingVertical: Spacing.two, + paddingHorizontal: Spacing.five, + borderRadius: Spacing.five, + flexDirection: 'row', + alignItems: 'center', + flexGrow: 1, + gap: Spacing.two, + maxWidth: MaxContentWidth, + }, + brandText: { + marginRight: 'auto', + }, + pressed: { + opacity: 0.7, + }, + tabButtonView: { + paddingVertical: Spacing.one, + paddingHorizontal: Spacing.three, + borderRadius: Spacing.three, + }, + externalPressable: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + gap: Spacing.one, + marginLeft: Spacing.three, + }, +}); diff --git a/apps/ExpoApp55/src/components/external-link.tsx b/apps/ExpoApp55/src/components/external-link.tsx new file mode 100644 index 00000000..883e515a --- /dev/null +++ b/apps/ExpoApp55/src/components/external-link.tsx @@ -0,0 +1,25 @@ +import { Href, Link } from 'expo-router'; +import { openBrowserAsync, WebBrowserPresentationStyle } from 'expo-web-browser'; +import { type ComponentProps } from 'react'; + +type Props = Omit, 'href'> & { href: Href & string }; + +export function ExternalLink({ href, ...rest }: Props) { + return ( + { + if (process.env.EXPO_OS !== 'web') { + // Prevent the default behavior of linking to the default browser on native. + event.preventDefault(); + // Open the link in an in-app browser. + await openBrowserAsync(href, { + presentationStyle: WebBrowserPresentationStyle.AUTOMATIC, + }); + } + }} + /> + ); +} diff --git a/apps/ExpoApp55/src/components/hint-row.tsx b/apps/ExpoApp55/src/components/hint-row.tsx new file mode 100644 index 00000000..a66062b6 --- /dev/null +++ b/apps/ExpoApp55/src/components/hint-row.tsx @@ -0,0 +1,35 @@ +import React, { type ReactNode } from 'react'; +import { View, StyleSheet } from 'react-native'; + +import { ThemedText } from './themed-text'; +import { ThemedView } from './themed-view'; + +import { Spacing } from '@/constants/theme'; + +type HintRowProps = { + title?: string; + hint?: ReactNode; +}; + +export function HintRow({ title = 'Try editing', hint = 'app/index.tsx' }: HintRowProps) { + return ( + + {title} + + {hint} + + + ); +} + +const styles = StyleSheet.create({ + stepRow: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + codeSnippet: { + borderRadius: Spacing.two, + paddingVertical: Spacing.half, + paddingHorizontal: Spacing.two, + }, +}); diff --git a/apps/ExpoApp55/src/components/postMessage/Message.ts b/apps/ExpoApp55/src/components/postMessage/Message.ts new file mode 100644 index 00000000..35e5f1d1 --- /dev/null +++ b/apps/ExpoApp55/src/components/postMessage/Message.ts @@ -0,0 +1,6 @@ +export interface Message { + id: string; + text: string; + from: 'native' | 'rn'; + timestamp: number; +} diff --git a/apps/ExpoApp55/src/components/postMessage/MessageBubble.tsx b/apps/ExpoApp55/src/components/postMessage/MessageBubble.tsx new file mode 100644 index 00000000..b9b86102 --- /dev/null +++ b/apps/ExpoApp55/src/components/postMessage/MessageBubble.tsx @@ -0,0 +1,74 @@ +import { Animated, StyleSheet } from 'react-native'; +import { Message } from './Message'; +import { useEffect, useRef } from 'react'; +import { ThemedText } from '@/components/themed-text'; + +export function MessageBubble({ item }: { item: Message }) { + const opacity = useRef(new Animated.Value(0)).current; + const translateY = useRef(new Animated.Value(20)).current; + + useEffect(() => { + Animated.parallel([ + Animated.timing(opacity, { + toValue: 1, + duration: 300, + useNativeDriver: true, + }), + Animated.spring(translateY, { + toValue: 0, + tension: 80, + friction: 10, + useNativeDriver: true, + }), + ]).start(); + }, [opacity, translateY]); + + const isFromNative = item.from === 'native'; + + return ( + + + {isFromNative ? 'From Native' : 'From RN'} + + {item.text} + + ); +} + +const styles = StyleSheet.create({ + bubble: { + padding: 10, + borderRadius: 10, + borderWidth: 1, + marginBottom: 6, + }, + bubbleNative: { + alignSelf: 'flex-start', + backgroundColor: 'rgba(79, 142, 247, 0.1)', + maxWidth: '80%', + }, + bubbleRN: { + alignSelf: 'flex-end', + backgroundColor: 'rgba(218, 165, 32, 0.1)', + maxWidth: '80%', + }, + bubbleLabel: { + fontSize: 10, + fontWeight: '600', + marginBottom: 2, + textTransform: 'uppercase', + }, + bubbleText: { + fontSize: 14, + }, +}); diff --git a/apps/ExpoApp55/src/components/themed-text.tsx b/apps/ExpoApp55/src/components/themed-text.tsx new file mode 100644 index 00000000..799c8b13 --- /dev/null +++ b/apps/ExpoApp55/src/components/themed-text.tsx @@ -0,0 +1,73 @@ +import { Platform, StyleSheet, Text, type TextProps } from 'react-native'; + +import { Fonts, ThemeColor } from '@/constants/theme'; +import { useTheme } from '@/hooks/use-theme'; + +export type ThemedTextProps = TextProps & { + type?: 'default' | 'title' | 'small' | 'smallBold' | 'subtitle' | 'link' | 'linkPrimary' | 'code'; + themeColor?: ThemeColor; +}; + +export function ThemedText({ style, type = 'default', themeColor, ...rest }: ThemedTextProps) { + const theme = useTheme(); + + return ( + + ); +} + +const styles = StyleSheet.create({ + small: { + fontSize: 14, + lineHeight: 20, + fontWeight: 500, + }, + smallBold: { + fontSize: 14, + lineHeight: 20, + fontWeight: 700, + }, + default: { + fontSize: 16, + lineHeight: 24, + fontWeight: 500, + }, + title: { + fontSize: 48, + fontWeight: 600, + lineHeight: 52, + }, + subtitle: { + fontSize: 32, + lineHeight: 44, + fontWeight: 600, + }, + link: { + lineHeight: 30, + fontSize: 14, + }, + linkPrimary: { + lineHeight: 30, + fontSize: 14, + color: '#3c87f7', + }, + code: { + fontFamily: Fonts.mono, + fontWeight: Platform.select({ android: 700 }) ?? 500, + fontSize: 12, + }, +}); diff --git a/apps/ExpoApp55/src/components/themed-view.tsx b/apps/ExpoApp55/src/components/themed-view.tsx new file mode 100644 index 00000000..c710df9b --- /dev/null +++ b/apps/ExpoApp55/src/components/themed-view.tsx @@ -0,0 +1,16 @@ +import { View, type ViewProps } from 'react-native'; + +import { ThemeColor } from '@/constants/theme'; +import { useTheme } from '@/hooks/use-theme'; + +export type ThemedViewProps = ViewProps & { + lightColor?: string; + darkColor?: string; + type?: ThemeColor; +}; + +export function ThemedView({ style, lightColor, darkColor, type, ...otherProps }: ThemedViewProps) { + const theme = useTheme(); + + return ; +} diff --git a/apps/ExpoApp55/src/components/ui/collapsible.tsx b/apps/ExpoApp55/src/components/ui/collapsible.tsx new file mode 100644 index 00000000..d0d745b4 --- /dev/null +++ b/apps/ExpoApp55/src/components/ui/collapsible.tsx @@ -0,0 +1,65 @@ +import { SymbolView } from 'expo-symbols'; +import { PropsWithChildren, useState } from 'react'; +import { Pressable, StyleSheet } from 'react-native'; +import Animated, { FadeIn } from 'react-native-reanimated'; + +import { ThemedText } from '@/components/themed-text'; +import { ThemedView } from '@/components/themed-view'; +import { Spacing } from '@/constants/theme'; +import { useTheme } from '@/hooks/use-theme'; + +export function Collapsible({ children, title }: PropsWithChildren & { title: string }) { + const [isOpen, setIsOpen] = useState(false); + const theme = useTheme(); + + return ( + + [styles.heading, pressed && styles.pressedHeading]} + onPress={() => setIsOpen((value) => !value)}> + + + + + {title} + + {isOpen && ( + + + {children} + + + )} + + ); +} + +const styles = StyleSheet.create({ + heading: { + flexDirection: 'row', + alignItems: 'center', + gap: Spacing.two, + }, + pressedHeading: { + opacity: 0.7, + }, + button: { + width: Spacing.four, + height: Spacing.four, + borderRadius: 12, + justifyContent: 'center', + alignItems: 'center', + }, + content: { + marginTop: Spacing.three, + borderRadius: Spacing.three, + marginLeft: Spacing.four, + padding: Spacing.four, + }, +}); diff --git a/apps/ExpoApp55/src/components/web-badge.tsx b/apps/ExpoApp55/src/components/web-badge.tsx new file mode 100644 index 00000000..23933d29 --- /dev/null +++ b/apps/ExpoApp55/src/components/web-badge.tsx @@ -0,0 +1,44 @@ +import { version } from 'expo/package.json'; +import { Image } from 'expo-image'; +import React from 'react'; +import { useColorScheme, StyleSheet } from 'react-native'; + +import { ThemedText } from './themed-text'; +import { ThemedView } from './themed-view'; + +import { Spacing } from '@/constants/theme'; + +export function WebBadge() { + const scheme = useColorScheme(); + + return ( + + + v{version} + + + + ); +} + +const styles = StyleSheet.create({ + container: { + padding: Spacing.five, + alignItems: 'center', + gap: Spacing.two, + }, + versionText: { + textAlign: 'center', + }, + badgeImage: { + width: 123, + aspectRatio: 123 / 24, + }, +}); diff --git a/apps/ExpoApp55/src/constants/theme.ts b/apps/ExpoApp55/src/constants/theme.ts new file mode 100644 index 00000000..c10ed272 --- /dev/null +++ b/apps/ExpoApp55/src/constants/theme.ts @@ -0,0 +1,65 @@ +/** + * Below are the colors that are used in the app. The colors are defined in the light and dark mode. + * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [Tamagui](https://tamagui.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc. + */ + +import '@/global.css'; + +import { Platform } from 'react-native'; + +export const Colors = { + light: { + text: '#000000', + background: '#ffffff', + backgroundElement: '#F0F0F3', + backgroundSelected: '#E0E1E6', + textSecondary: '#60646C', + }, + dark: { + text: '#ffffff', + background: '#000000', + backgroundElement: '#212225', + backgroundSelected: '#2E3135', + textSecondary: '#B0B4BA', + }, +} as const; + +export type ThemeColor = keyof typeof Colors.light & keyof typeof Colors.dark; + +export const Fonts = Platform.select({ + ios: { + /** iOS `UIFontDescriptorSystemDesignDefault` */ + sans: 'system-ui', + /** iOS `UIFontDescriptorSystemDesignSerif` */ + serif: 'ui-serif', + /** iOS `UIFontDescriptorSystemDesignRounded` */ + rounded: 'ui-rounded', + /** iOS `UIFontDescriptorSystemDesignMonospaced` */ + mono: 'ui-monospace', + }, + default: { + sans: 'normal', + serif: 'serif', + rounded: 'normal', + mono: 'monospace', + }, + web: { + sans: 'var(--font-display)', + serif: 'var(--font-serif)', + rounded: 'var(--font-rounded)', + mono: 'var(--font-mono)', + }, +}); + +export const Spacing = { + half: 2, + one: 4, + two: 8, + three: 16, + four: 24, + five: 32, + six: 64, +} as const; + +export const BottomTabInset = Platform.select({ ios: 50, android: 80 }) ?? 0; +export const MaxContentWidth = 800; diff --git a/apps/ExpoApp55/src/global.css b/apps/ExpoApp55/src/global.css new file mode 100644 index 00000000..c8fe5031 --- /dev/null +++ b/apps/ExpoApp55/src/global.css @@ -0,0 +1,9 @@ +:root { + --font-display: + Spline Sans, Inter, ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, + Segoe UI Symbol, Noto Color Emoji; + --font-mono: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; + --font-rounded: 'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif; + --font-serif: Georgia, 'Times New Roman', serif; +} diff --git a/apps/ExpoApp55/src/hooks/use-color-scheme.ts b/apps/ExpoApp55/src/hooks/use-color-scheme.ts new file mode 100644 index 00000000..17e3c63e --- /dev/null +++ b/apps/ExpoApp55/src/hooks/use-color-scheme.ts @@ -0,0 +1 @@ +export { useColorScheme } from 'react-native'; diff --git a/apps/ExpoApp55/src/hooks/use-color-scheme.web.ts b/apps/ExpoApp55/src/hooks/use-color-scheme.web.ts new file mode 100644 index 00000000..7eb1c1b7 --- /dev/null +++ b/apps/ExpoApp55/src/hooks/use-color-scheme.web.ts @@ -0,0 +1,21 @@ +import { useEffect, useState } from 'react'; +import { useColorScheme as useRNColorScheme } from 'react-native'; + +/** + * To support static rendering, this value needs to be re-calculated on the client side for web + */ +export function useColorScheme() { + const [hasHydrated, setHasHydrated] = useState(false); + + useEffect(() => { + setHasHydrated(true); + }, []); + + const colorScheme = useRNColorScheme(); + + if (hasHydrated) { + return colorScheme; + } + + return 'light'; +} diff --git a/apps/ExpoApp55/src/hooks/use-theme.ts b/apps/ExpoApp55/src/hooks/use-theme.ts new file mode 100644 index 00000000..677e0151 --- /dev/null +++ b/apps/ExpoApp55/src/hooks/use-theme.ts @@ -0,0 +1,14 @@ +/** + * Learn more about light and dark modes: + * https://docs.expo.dev/guides/color-schemes/ + */ + +import { Colors } from '@/constants/theme'; +import { useColorScheme } from '@/hooks/use-color-scheme'; + +export function useTheme() { + const scheme = useColorScheme(); + const theme = scheme === 'unspecified' ? 'light' : scheme; + + return Colors[theme]; +} diff --git a/apps/ExpoApp55/tsconfig.json b/apps/ExpoApp55/tsconfig.json new file mode 100644 index 00000000..2e9a6695 --- /dev/null +++ b/apps/ExpoApp55/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./src/*" + ], + "@/assets/*": [ + "./assets/*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.ts", + "expo-env.d.ts" + ] +} diff --git a/apps/README.md b/apps/README.md index aac6b34c..e641e007 100644 --- a/apps/README.md +++ b/apps/README.md @@ -3,10 +3,15 @@ This directory contains demo projects showcasing the usage of the `react-native-brownfield` library. - `RNApp` - the React Native application that is packaged to AAR and XCFramework archives and integrated into native projects -- `ExpoApp` - the Expo application that is packaged analogously to the above using React Native Brownfield Expo config plugin +- `ExpoApp54` - the Expo application that is packaged analogously to the above using React Native Brownfield Expo config plugin; this app uses Expo SDK v54, which is an important test case since pre-55 versions require additional configuration steps +- `ExpoApp` - another Expo application similar to `ExpoApp55`, but using Expo SDK v55 - `AndroidApp` - the native Android application that integrates the RNApp AAR package (a "consumer" of the RNApp library); it comes in two flavors: - `expo` - which uses the artifact produced from `ExpoApp` - `vanilla` - which uses the artifact produced from `RNApp` - `AppleApp` - the native iOS application that integrates the RNApp XCFramework package (a "consumer" of the RNApp library); it comes in two configurations: - `expo` - which uses the artifact produced from `ExpoApp` - `vanilla` - which uses the artifact produced from `RNApp` + +## Additional notes + +There are 2 demo apps for Expo: `ExpoApp` (Expo 55 SDK) and `ExpoApp54` (Expo 54 SDK). This is to test our setup works with bost pre- and post-55 Expo SDK versions. It is important since the pre-55 Expo versions require additional handling, which is not applied by our Expo config plugin for Expo >= 55. diff --git a/apps/ExpoApp/scripts/prepare-android-build-gradle-for-ci.ts b/apps/scripts/prepare-android-build-gradle-for-ci.ts similarity index 94% rename from apps/ExpoApp/scripts/prepare-android-build-gradle-for-ci.ts rename to apps/scripts/prepare-android-build-gradle-for-ci.ts index 62f2fffd..6c4c59a1 100644 --- a/apps/ExpoApp/scripts/prepare-android-build-gradle-for-ci.ts +++ b/apps/scripts/prepare-android-build-gradle-for-ci.ts @@ -2,6 +2,11 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +const projectDirName = process.argv[2]; +if (!projectDirName) { + throw new Error('Project directory name is required'); +} + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const SNAPSHOT_VERSION = '1.0.1-SNAPSHOT'; diff --git a/docs/docs/docs/getting-started/android.mdx b/docs/docs/docs/getting-started/android.mdx index 72d56f6a..2df4d243 100644 --- a/docs/docs/docs/getting-started/android.mdx +++ b/docs/docs/docs/getting-started/android.mdx @@ -65,12 +65,18 @@ Add to `reactnativeapp/build.gradle.kts`: ```kotlin dependencies { - // Match your version of React Native + // Match your version of React Native. For example, for React Native 0.83.x: api("com.facebook.react:react-android:0.83.0") - // For React Native 0.83+: - api("com.facebook.hermes:hermes-android:0.14.0") - // For React Native 0.82 or older: - // api("com.facebook.react:hermes-android:0.82.0") + + // Hermes artifact - choose based on your React Native version + // For React Native 0.84+: + api("com.facebook.hermes:hermes-android:0.15.1") + // For React Native 0.83.2 - 0.83.x: + // api("com.facebook.hermes:hermes-android:0.14.1") + // For React Native 0.83.0 and 0.83.1: + // api("com.facebook.hermes:hermes-android:0.14.0") + // For React Native 0.82.x and below: + // api("com.facebook.react:hermes-android:") } ``` diff --git a/docs/docs/docs/getting-started/examples.mdx b/docs/docs/docs/getting-started/examples.mdx index b50ed6ef..3bb763bb 100644 --- a/docs/docs/docs/getting-started/examples.mdx +++ b/docs/docs/docs/getting-started/examples.mdx @@ -5,10 +5,15 @@ You can find example projects demonstrating the usage of React Native Brownfield It contains the following apps: - `RNApp` - a React Native app that is packaged using React Native Brownfield to an artifact consumed in native apps, in which you can refer to an exemplar usage of the library for packaging a React Native app to a consumable artifact -- `ExpoApp` - an Expo app that is packaged analogously to the above using React Native Brownfield Expo config plugin +- `ExpoApp54` - the Expo application that is packaged analogously to the above using React Native Brownfield Expo config plugin; this app uses Expo SDK v54, which is an important test case since pre-55 versions require additional configuration steps +- `ExpoApp` - another Expo application similar to `ExpoApp55`, but using Expo SDK v55 - `AndroidApp` - an Android app consuming the packaged artifact from `RNApp` or `ExpoApp`, in which you can refer to an exemplar usage of the library for integrating React Native Brownfield into a native Android app; this app comes in two flavors: - `expo` - which uses the artifact produced from `ExpoApp` - `vanilla` - which uses the artifact produced from `RNApp` - `AppleApp` - an iOS app consuming the packaged artifact from `RNApp`, in which you can refer to an exemplar usage of the library for integrating React Native Brownfield into a native iOS app; this app comes in two configurations: - `expo` - which uses the artifact produced from `ExpoApp` - `vanilla` - which uses the artifact produced from `RNApp` + +## Additional notes + +There are 2 demo apps for Expo: `ExpoApp` (Expo 55 SDK) and `ExpoApp54` (Expo 54 SDK). This is to test our setup works with bost pre- and post-55 Expo SDK versions. It is important since the pre-55 Expo versions require additional handling, which is not applied by our Expo config plugin for Expo >= 55. diff --git a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/expo/ExpoPublishingHelper.kt b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/expo/ExpoPublishingHelper.kt index 0cf7b099..1b3cbd2f 100644 --- a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/expo/ExpoPublishingHelper.kt +++ b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/expo/ExpoPublishingHelper.kt @@ -338,7 +338,7 @@ open class ExpoPublishingHelper(val brownfieldAppProject: Project) { } Logging.log( - "Discovered ${dependencies.size} transitive dependencies for Expo project" + + "Discovered ${dependencies.size} transitive dependencies for Expo project " + "'${expoGPProjection.name}' from $depsDiscoverySource", ) diff --git a/packages/react-native-brownfield/package.json b/packages/react-native-brownfield/package.json index 6bbe22a5..9b90d9b3 100644 --- a/packages/react-native-brownfield/package.json +++ b/packages/react-native-brownfield/package.json @@ -50,7 +50,8 @@ "dev": "nodemon --ext '*' --watch src --exec \"bob build\"", "build:brownfield": "yarn run build", "prepack": "cp ../../README.md ./README.md", - "postpack": "rm ./README.md" + "postpack": "rm ./README.md", + "test": "vitest run" }, "keywords": [ "react-native-brownfield", @@ -95,6 +96,7 @@ "@react-native/babel-preset": "0.82.1", "@types/jest": "^30.0.0", "@types/react": "^19.1.1", + "@vitest/coverage-v8": "^4.0.17", "eslint": "^9.28.0", "globals": "^16.2.0", "import": "^0.0.6", @@ -102,7 +104,8 @@ "react": "19.1.1", "react-native": "0.82.1", "react-native-builder-bob": "^0.40.17", - "typescript": "5.9.3" + "typescript": "5.9.3", + "vitest": "^4.0.17" }, "codegenConfig": { "name": "ReactNativeBrownfield", diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/index.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/index.ts index c22143e3..570dc0fa 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/android/index.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/index.ts @@ -3,4 +3,7 @@ export { withAndroidModuleFiles, createAndroidModule, } from './withAndroidModuleFiles'; -export { modifyRootBuildGradle, modifySettingsGradle } from './gradleHelpers'; +export { + modifyRootBuildGradle, + modifySettingsGradle, +} from './utils/gradleHelpers'; diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/utils/__tests__/hermes.test.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/__tests__/hermes.test.ts new file mode 100644 index 00000000..7099a7e9 --- /dev/null +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/__tests__/hermes.test.ts @@ -0,0 +1,140 @@ +import { vi } from 'vitest'; + +import { getHermesArtifact } from '../hermes'; +import { Logger } from '../../../logging'; + +// Mock Logger.logWarning to prevent console output during tests +vi.mock('../../logging', () => ({ + Logger: { + logWarning: vi.fn(), + }, +})); + +describe('getHermesArtifact', () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should return correct artifact for RN 0.84.0', () => { + const artifact = getHermesArtifact('0.84.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.15.1', + }); + }); + + it('should return correct artifact for RN 0.85.0', () => { + const artifact = getHermesArtifact('0.85.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.15.1', + }); + }); + + it('should return correct artifact for RN 0.83.0', () => { + const artifact = getHermesArtifact('0.83.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.0', + }); + }); + + it('should return correct artifact for RN 0.83.1', () => { + const artifact = getHermesArtifact('0.83.1'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.0', + }); + }); + + it('should return correct artifact for RN 0.83.2', () => { + const artifact = getHermesArtifact('0.83.2'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.1', + }); + }); + + it('should return correct artifact for RN 0.83.4', () => { + const artifact = getHermesArtifact('0.83.4'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.1', + }); + }); + + it('should return correct artifact for (inexistent) RN 0.83.1000000 and log a warning', () => { + const artifact = getHermesArtifact('0.83.1000000'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.1', + }); + expect(Logger.logWarning).toHaveBeenCalledTimes(1); + expect(Logger.logWarning).toHaveBeenCalledWith( + expect.stringContaining( + `This React Native patch version '0.83.1000000' (in 0.83.1000000) has not been tested with the Brownfield plugin yet - please consider reporting this on GitHub: https://github.com/callstack/react-native-brownfield/. Using the latest version of Hermes that Brownfield has been tested with` + ) + ); + }); + + it('should return correct artifact for RN 0.82.0', () => { + const artifact = getHermesArtifact('0.82.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.react', + artifactId: 'hermes-android', + version: '0.82.0', + }); + }); + + it('should return correct artifact for RN 0.73.0', () => { + const artifact = getHermesArtifact('0.73.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.react', + artifactId: 'hermes-android', + version: '0.73.0', + }); + }); + + it('should handle pre-release versions for patch', () => { + const artifact = getHermesArtifact('0.83.2-rc.0'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.1', + }); + }); + + it('should handle build metadata for patch', () => { + const artifact = getHermesArtifact('0.83.2+build.1'); + expect(artifact).toEqual({ + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.14.1', + }); + }); + + it('should throw error for invalid RN version string (too few parts)', () => { + expect(() => getHermesArtifact('0.84')).toThrow( + "Failed to parse React Native version from '0.84' - resolved components are: 0.84.NaN" + ); + }); + + it('should throw error for invalid RN version string (non-numeric parts)', () => { + expect(() => getHermesArtifact('0.84.x')).toThrow( + "Failed to parse React Native version from '0.84.x' - resolved components are: 0.84.NaN" + ); + }); + + it('should throw error for unsupported major version', () => { + expect(() => getHermesArtifact('1.0.0')).toThrow( + "Unsupported React Native major version '1' in '1.0.0'" + ); + }); +}); diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/constants.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/constants.ts similarity index 100% rename from packages/react-native-brownfield/src/expo-config-plugin/android/constants.ts rename to packages/react-native-brownfield/src/expo-config-plugin/android/utils/constants.ts diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/gradleHelpers.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/gradleHelpers.ts similarity index 98% rename from packages/react-native-brownfield/src/expo-config-plugin/android/gradleHelpers.ts rename to packages/react-native-brownfield/src/expo-config-plugin/android/utils/gradleHelpers.ts index 342aaea1..e6a2f05b 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/android/gradleHelpers.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/gradleHelpers.ts @@ -1,5 +1,5 @@ import { brownfieldGradlePluginDependency } from './constants'; -import { Logger } from '../logging'; +import { Logger } from '../../logging'; /** * Modifies the root build.gradle to add the Brownfield Gradle plugin dependency diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/utils/hermes.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/hermes.ts new file mode 100644 index 00000000..a08d85e8 --- /dev/null +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/utils/hermes.ts @@ -0,0 +1,83 @@ +import { Logger } from '../../logging'; + +export function getHermesArtifact(rnVersion: string) { + let [rnMajorVersionString, rnMinorVersionString, rnPatchVersionString] = + rnVersion.split('.') as [string?, string?, string?]; + + const rnMajorVersion = Number(rnMajorVersionString); + const rnMinorVersion = Number(rnMinorVersionString); + + if ( + rnPatchVersionString?.includes('-') || + rnPatchVersionString?.includes('+') + ) { + rnPatchVersionString = rnPatchVersionString.split('-')[0].split('+')[0]; + } + + const rnPatchVersion = Number(rnPatchVersionString); + + if ( + Number.isNaN(rnMajorVersion) || + Number.isNaN(rnMinorVersion) || + Number.isNaN(rnPatchVersion) + ) { + throw new Error( + `Failed to parse React Native version from '${rnVersion}' - resolved components are: ${rnMajorVersion}.${rnMinorVersion}.${rnPatchVersion}` + ); + } + + if (rnMajorVersion !== 0) { + throw new Error( + `Unsupported React Native major version '${rnMajorVersion}' in '${rnVersion}'` + ); + } + + // below: 0.84.x + if (rnMinorVersion >= 84) { + return { + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version: '0.15.1', + }; + } + + // below: 0.83.x + if (rnMinorVersion === 83) { + let version: string; + + switch (rnPatchVersion) { + // below: 0.83.0, 0.83.1 + case 0: + case 1: + version = '0.14.0'; + break; + + // below: 0.83.2, 0.83.3, 0.83.4 + case 2: + case 3: + case 4: + version = '0.14.1'; + break; + + default: + version = '0.14.1'; + Logger.logWarning( + `This React Native patch version '${rnVersion}' (in ${rnMajorVersion}.${rnMinorVersion}.${rnPatchVersion}) has not been tested with the Brownfield plugin yet - please consider reporting this on GitHub: https://github.com/callstack/react-native-brownfield/. Using the latest version of Hermes that Brownfield has been tested with (0.14.1).` + ); + break; + } + + return { + groupId: 'com.facebook.hermes', + artifactId: 'hermes-android', + version, + }; + } + + // below: 0.82.x and below + return { + groupId: 'com.facebook.react', + artifactId: 'hermes-android', + version: rnVersion, + }; +} diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts index 5dad5b1b..95873e2c 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts @@ -9,6 +9,8 @@ import type { } from '../types'; import { Logger } from '../logging'; import { renderTemplate } from '../template/engine'; +import { getExpoInfo } from '../expoUtils'; +import { getHermesArtifact } from './utils/hermes'; /** * Creates the Android library module directory structure and files @@ -17,7 +19,13 @@ export function createAndroidModule({ androidDir, config, rnVersion, + isExpoPre55, }: { + /** + * Whether the Expo project is pre-55 + */ + isExpoPre55: boolean; + /** * The root Android directory path */ @@ -38,6 +46,11 @@ export function createAndroidModule({ Logger.logDebug(`Creating Android module in: ${androidDir}`); + const hermesArtifact = getHermesArtifact(rnVersion); + Logger.logDebug( + `Resolved Hermes artifact: ${hermesArtifact.groupId}:${hermesArtifact.artifactId}:${hermesArtifact.version}` + ); + // generate module files const files: RenderedTemplateFile[] = [ { @@ -50,6 +63,7 @@ export function createAndroidModule({ '{{ARTIFACT_ID}}': android.artifactId, '{{ARTIFACT_VERSION}}': android.version, '{{RN_VERSION}}': rnVersion, + '{{HERMES_ARTIFACT}}': `${hermesArtifact.groupId}:${hermesArtifact.artifactId}:${hermesArtifact.version}`, }), }, { @@ -62,9 +76,15 @@ export function createAndroidModule({ }, { relativePath: `src/main/java/${config.android.packageName.replace(/\./g, '/')}/ReactNativeHostManager.kt`, - content: renderTemplate('android', 'ReactNativeHostManager.kt', { - '{{PACKAGE_NAME}}': android.packageName, - }), + content: renderTemplate( + 'android', + isExpoPre55 + ? 'ReactNativeHostManager.pre55.kt' + : 'ReactNativeHostManager.post55.kt', + { + '{{PACKAGE_NAME}}': android.packageName, + } + ), }, { relativePath: 'consumer-rules.pro', @@ -127,10 +147,13 @@ export const withAndroidModuleFiles: ConfigPlugin< ); } + const { isExpoPre55 } = getExpoInfo(config); + createAndroidModule({ androidDir, config: props, rnVersion, + isExpoPre55, }); return dangerousConfig; diff --git a/packages/react-native-brownfield/src/expo-config-plugin/android/withBrownfieldAndroid.ts b/packages/react-native-brownfield/src/expo-config-plugin/android/withBrownfieldAndroid.ts index 6b0b83c8..678afd19 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/android/withBrownfieldAndroid.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/android/withBrownfieldAndroid.ts @@ -4,7 +4,10 @@ import { type ConfigPlugin, } from '@expo/config-plugins'; -import { modifyRootBuildGradle, modifySettingsGradle } from './gradleHelpers'; +import { + modifyRootBuildGradle, + modifySettingsGradle, +} from './utils/gradleHelpers'; import { withAndroidModuleFiles } from './withAndroidModuleFiles'; import type { ResolvedBrownfieldPluginConfigWithAndroid } from '../types'; diff --git a/packages/react-native-brownfield/src/expo-config-plugin/expoUtils.ts b/packages/react-native-brownfield/src/expo-config-plugin/expoUtils.ts new file mode 100644 index 00000000..b4c8f3a3 --- /dev/null +++ b/packages/react-native-brownfield/src/expo-config-plugin/expoUtils.ts @@ -0,0 +1,12 @@ +import type { ExpoConfig } from '@expo/config-types'; + +export function getExpoInfo(config: ExpoConfig) { + const expoMajor = config.sdkVersion + ? parseInt(config.sdkVersion.split('.')[0], 10) + : -1; + const isExpoPre55 = expoMajor < 55; + return { + expoMajor, + isExpoPre55, + }; +} diff --git a/packages/react-native-brownfield/src/expo-config-plugin/ios/withBrownfieldIos.ts b/packages/react-native-brownfield/src/expo-config-plugin/ios/withBrownfieldIos.ts index 894af550..58da907a 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/ios/withBrownfieldIos.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/ios/withBrownfieldIos.ts @@ -14,6 +14,7 @@ import { modifyPodfile } from './podfileHelpers'; import { withIosFrameworkFiles } from './withIosFrameworkFiles'; import type { ResolvedBrownfieldPluginConfigWithIos } from '../types'; import { Logger } from '../logging'; +import { getExpoInfo } from '../expoUtils'; /** * iOS Config Plugin for integration with @callstack/react-native-brownfield. @@ -28,10 +29,8 @@ import { Logger } from '../logging'; export const withBrownfieldIos: ConfigPlugin< ResolvedBrownfieldPluginConfigWithIos > = (config, props) => { - const expoMajor = config.sdkVersion - ? parseInt(config.sdkVersion.split('.')[0], 10) - : -1; - const isExpoPre55 = expoMajor < 55; + const { isExpoPre55 } = getExpoInfo(config); + // Step 1: modify the Xcode project to add framework target & config = withXcodeProject(config, (xcodeConfig) => { const { modResults: project, modRequest } = xcodeConfig; diff --git a/packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.post55.kt b/packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.post55.kt new file mode 100644 index 00000000..f7db6bef --- /dev/null +++ b/packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.post55.kt @@ -0,0 +1,32 @@ +package {{PACKAGE_NAME}} + +import android.app.Application +import android.content.res.Configuration +import com.callstack.reactnativebrownfield.OnJSBundleLoaded +import com.callstack.reactnativebrownfield.ReactNativeBrownfield +import com.facebook.react.PackageList +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import expo.modules.ApplicationLifecycleDispatcher +import expo.modules.ExpoReactHostFactory + +object ReactNativeHostManager { + fun initialize(application: Application, onJSBundleLoaded: OnJSBundleLoaded? = null) { + loadReactNative(application) + + ApplicationLifecycleDispatcher.onApplicationCreate(application) + + val reactHost: ReactHost by lazy { + ExpoReactHostFactory.getDefaultReactHost( + context = application.applicationContext, + packageList = PackageList(application).packages, + ) + } + + ReactNativeBrownfield.initialize(application, reactHost, onJSBundleLoaded) + } + + fun onConfigurationChanged(application: Application, newConfig: Configuration) { + ApplicationLifecycleDispatcher.onConfigurationChanged(application, newConfig) + } +} diff --git a/packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.kt b/packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.pre55.kt similarity index 100% rename from packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.kt rename to packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.pre55.kt diff --git a/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts b/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts index 746d1ccf..18643252 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts +++ b/packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts @@ -83,7 +83,7 @@ android { dependencies { api("com.facebook.react:react-android:{{RN_VERSION}}") - api("com.facebook.react:hermes-android:{{RN_VERSION}}") + api("{{HERMES_ARTIFACT}}") api("io.coil-kt.coil3:coil-compose:3.2.0") api("io.coil-kt.coil3:coil-network-okhttp:3.2.0") diff --git a/packages/react-native-brownfield/vitest.config.ts b/packages/react-native-brownfield/vitest.config.ts new file mode 100644 index 00000000..3e1d87fa --- /dev/null +++ b/packages/react-native-brownfield/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + watch: false, + globals: true, + environment: 'node', + include: ['src/**/*.{test,spec}.{js,ts}'], + clearMocks: true, + }, +}); diff --git a/yarn.lock b/yarn.lock index 1a86a49d..9fb57ded 100644 --- a/yarn.lock +++ b/yarn.lock @@ -64,6 +64,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/199e15ff89007dd30675655eec52481cb245c9fdf4f81e4dc1f866603b0217b57aff25f5ffa0a95bbc8e31eb861695330cd7869ad52cc211aa63016320ef72c5 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.5": version: 7.28.5 resolution: "@babel/compat-data@npm:7.28.5" @@ -164,6 +175,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" + dependencies: + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/61fe4ddd6e817aa312a14963ccdbb5c9a8c57e8b97b98d19a8a99ccab2215fda1a5f52bc8dd8d2e3c064497ddeb3ab8ceb55c76fa0f58f8169c34679d2256fe0 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" @@ -482,6 +506,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" + dependencies: + "@babel/types": "npm:^7.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/b1576dca41074997a33ee740d87b330ae2e647f4b7da9e8d2abd3772b18385d303b0cee962b9b88425e0f30d58358dbb8d63792c1a2d005c823d335f6a029747 + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": version: 7.28.5 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" @@ -850,6 +885,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -862,7 +908,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": +"@babel/plugin-transform-arrow-functions@npm:7.27.1, @babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: @@ -958,27 +1004,27 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" +"@babel/plugin-transform-class-properties@npm:7.27.1, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.28.6" - "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc + checksum: 10/475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" +"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 + checksum: 10/200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc languageName: node linkType: hard @@ -1006,35 +1052,35 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/plugin-transform-classes@npm:7.28.6" +"@babel/plugin-transform-classes@npm:7.28.4, @babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-globals": "npm:^7.28.0" - "@babel/helper-plugin-utils": "npm:^7.28.6" - "@babel/helper-replace-supers": "npm:^7.28.6" - "@babel/traverse": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9c3278a314d1c4bcda792bb22aced20e30c735557daf9bcc56397c0f3eb54761b21c770219e4581036a10dabda3e597321ed093bc245d5f4d561e19ceff66a6d + checksum: 10/1f8423d0ba287ba4ae3aac89299e704a666ef2fc5950cd581e056c068486917a460efd5731fdd0d0fb0a8a08852e13b31c1add089028e89a8991a7fdfaff5c43 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/plugin-transform-classes@npm:7.28.4" +"@babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-compilation-targets": "npm:^7.28.6" "@babel/helper-globals": "npm:^7.28.0" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.4" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1f8423d0ba287ba4ae3aac89299e704a666ef2fc5950cd581e056c068486917a460efd5731fdd0d0fb0a8a08852e13b31c1add089028e89a8991a7fdfaff5c43 + checksum: 10/9c3278a314d1c4bcda792bb22aced20e30c735557daf9bcc56397c0f3eb54761b21c770219e4581036a10dabda3e597321ed093bc245d5f4d561e19ceff66a6d languageName: node linkType: hard @@ -1389,25 +1435,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" +"@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/88106952ca4f4fea8f97222a25f9595c6859d458d76905845dfa54f54e7d345e3dc338932e8c84a9c57a6c88b2f6d9ebff47130ce508a49c2b6e6a9f03858750 + checksum: 10/15333f4888ffedc449a2a21a0b1ca7983e089f43faa00cfb71d2466e20221a5fd979cdb1a3f57bc20fc62c67bd3ff3dde054133fb6324a58be8f64d20aefacd2 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/15333f4888ffedc449a2a21a0b1ca7983e089f43faa00cfb71d2466e20221a5fd979cdb1a3f57bc20fc62c67bd3ff3dde054133fb6324a58be8f64d20aefacd2 + checksum: 10/88106952ca4f4fea8f97222a25f9595c6859d458d76905845dfa54f54e7d345e3dc338932e8c84a9c57a6c88b2f6d9ebff47130ce508a49c2b6e6a9f03858750 languageName: node linkType: hard @@ -1497,6 +1543,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/34b0f96400c259a2722740d17a001fe45f78d8ff052c40e29db2e79173be72c1cfe8d9681067e3f5da3989e4a557402df5c982c024c18257587a41e022f95640 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" @@ -1737,7 +1795,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": +"@babel/plugin-transform-shorthand-properties@npm:7.27.1, @babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: @@ -1794,7 +1852,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.27.1": +"@babel/plugin-transform-template-literals@npm:7.27.1, @babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: @@ -1831,6 +1889,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/plugin-transform-typescript@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a0bccc531fa8710a45b0b593140273741e0e4a0721b1ef6ef9dfefae0bbe61528440d65aab7936929551fd76793272257d74f60cf66891352f793294930a4b67 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" @@ -1866,7 +1939,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": +"@babel/plugin-transform-unicode-regex@npm:7.27.1, @babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: @@ -2091,6 +2164,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/preset-typescript@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/9d8e75326b3c93fa016ba7aada652800fc77bc05fcc181888700a049935e8cf1284b549de18a5d62ef3591d02f097ea6de1111f7d71a991aaf36ba74657bd145 + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.16.7, @babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.24.7, @babel/preset-typescript@npm:^7.27.1, @babel/preset-typescript@npm:^7.28.5": version: 7.28.5 resolution: "@babel/preset-typescript@npm:7.28.5" @@ -2106,7 +2194,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.20.0": +"@babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0": version: 7.28.6 resolution: "@babel/runtime@npm:7.28.6" checksum: 10/fbcd439cb74d4a681958eb064c509829e3f46d8a4bfaaf441baa81bb6733d1e680bccc676c813883d7741bcaada1d0d04b15aa320ef280b5734e2192b50decf9 @@ -2172,6 +2260,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" + debug: "npm:^4.3.1" + checksum: 10/3a0d0438f1ba9fed4fbe1706ea598a865f9af655a16ca9517ab57bda526e224569ca1b980b473fb68feea5e08deafbbf2cf9febb941f92f2d2533310c3fc4abc + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.28.5 resolution: "@babel/types@npm:7.28.5" @@ -2192,6 +2295,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10/bfc2b211210f3894dcd7e6a33b2d1c32c93495dc1e36b547376aa33441abe551ab4bc1640d4154ee2acd8e46d3bbc925c7224caae02fcaf0e6a771e97fccc661 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2251,9 +2364,9 @@ __metadata: languageName: unknown linkType: soft -"@callstack/brownfield-example-expo-app@workspace:apps/ExpoApp": +"@callstack/brownfield-example-expo-app-54@workspace:apps/ExpoApp54": version: 0.0.0-use.local - resolution: "@callstack/brownfield-example-expo-app@workspace:apps/ExpoApp" + resolution: "@callstack/brownfield-example-expo-app-54@workspace:apps/ExpoApp54" dependencies: "@callstack/brownie": "workspace:^" "@callstack/react-native-brownfield": "workspace:^" @@ -2284,6 +2397,45 @@ __metadata: languageName: unknown linkType: soft +"@callstack/brownfield-example-expo-app-55@workspace:apps/ExpoApp55": + version: 0.0.0-use.local + resolution: "@callstack/brownfield-example-expo-app-55@workspace:apps/ExpoApp55" + dependencies: + "@callstack/brownie": "workspace:^" + "@callstack/react-native-brownfield": "workspace:^" + "@expo/vector-icons": "npm:^15.0.2" + "@react-navigation/bottom-tabs": "npm:^7.7.3" + "@react-navigation/elements": "npm:^2.8.1" + "@react-navigation/native": "npm:^7.1.28" + "@types/react": "npm:~19.2.2" + eslint: "npm:^9.25.0" + eslint-config-expo: "npm:~55.0.0" + expo: "npm:~55.0.0-preview.12" + expo-constants: "npm:~55.0.6" + expo-device: "npm:~55.0.8" + expo-font: "npm:~55.0.4" + expo-glass-effect: "npm:~55.0.6" + expo-image: "npm:~55.0.4" + expo-linking: "npm:~55.0.6" + expo-router: "npm:~55.0.0-preview.9" + expo-splash-screen: "npm:~55.0.8" + expo-status-bar: "npm:~55.0.3" + expo-symbols: "npm:~55.0.4" + expo-system-ui: "npm:~55.0.8" + expo-web-browser: "npm:~55.0.8" + react: "npm:19.2.0" + react-dom: "npm:19.2.0" + react-native: "npm:0.83.2" + react-native-gesture-handler: "npm:~2.30.0" + react-native-reanimated: "npm:~4.2.1" + react-native-safe-area-context: "npm:~5.6.2" + react-native-screens: "npm:~4.23.0" + react-native-web: "npm:~0.21.0" + react-native-worklets: "npm:0.7.2" + typescript: "npm:~5.9.2" + languageName: unknown + linkType: soft + "@callstack/brownfield-example-ios-app@workspace:apps/AppleApp": version: 0.0.0-use.local resolution: "@callstack/brownfield-example-ios-app@workspace:apps/AppleApp" @@ -2398,6 +2550,7 @@ __metadata: "@react-native/babel-preset": "npm:0.82.1" "@types/jest": "npm:^30.0.0" "@types/react": "npm:^19.1.1" + "@vitest/coverage-v8": "npm:^4.0.17" eslint: "npm:^9.28.0" globals: "npm:^16.2.0" import: "npm:^0.0.6" @@ -2406,6 +2559,7 @@ __metadata: react-native: "npm:0.82.1" react-native-builder-bob: "npm:^0.40.17" typescript: "npm:5.9.3" + vitest: "npm:^4.0.17" peerDependencies: "@expo/config-plugins": ^54.0.4 bin: @@ -2916,6 +3070,15 @@ __metadata: languageName: node linkType: hard +"@egjs/hammerjs@npm:^2.0.17": + version: 2.0.17 + resolution: "@egjs/hammerjs@npm:2.0.17" + dependencies: + "@types/hammerjs": "npm:^2.0.36" + checksum: 10/f695129d45edfcfd6c5f2d1d36186da36ffade013991972ce23721a6b7ad7f214ce282abc4023e3f6b63062620852a63e897b523f247804afc7acd188fee9d9d + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0": version: 1.8.1 resolution: "@emnapi/core@npm:1.8.1" @@ -3261,6 +3424,13 @@ __metadata: languageName: node linkType: hard +"@expo-google-fonts/material-symbols@npm:^0.4.1": + version: 0.4.25 + resolution: "@expo-google-fonts/material-symbols@npm:0.4.25" + checksum: 10/6eb639c70ad9ac001f8bdbce70e8191fa654b87cace2801395bda80447df95711e0f3a9a40e6744b3321c800dded2f100a0a07dbb5d5a94515c5ead0f926764b + languageName: node + linkType: hard + "@expo/cli@npm:54.0.23": version: 54.0.23 resolution: "@expo/cli@npm:54.0.23" @@ -3343,6 +3513,83 @@ __metadata: languageName: node linkType: hard +"@expo/cli@npm:55.0.10": + version: 55.0.10 + resolution: "@expo/cli@npm:55.0.10" + dependencies: + "@expo/code-signing-certificates": "npm:^0.0.6" + "@expo/config": "npm:~55.0.7" + "@expo/config-plugins": "npm:~55.0.5" + "@expo/devcert": "npm:^1.2.1" + "@expo/env": "npm:~2.1.1" + "@expo/image-utils": "npm:^0.8.12" + "@expo/json-file": "npm:^10.0.12" + "@expo/log-box": "npm:55.0.7" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:~55.0.7" + "@expo/osascript": "npm:^2.4.2" + "@expo/package-manager": "npm:^1.10.3" + "@expo/plist": "npm:^0.5.2" + "@expo/prebuild-config": "npm:^55.0.6" + "@expo/require-utils": "npm:^55.0.1" + "@expo/router-server": "npm:^55.0.7" + "@expo/schema-utils": "npm:^55.0.2" + "@expo/spawn-async": "npm:^1.7.2" + "@expo/ws-tunnel": "npm:^1.0.1" + "@expo/xcpretty": "npm:^4.4.0" + "@react-native/dev-middleware": "npm:0.83.2" + accepts: "npm:^1.3.8" + arg: "npm:^5.0.2" + better-opn: "npm:~3.0.2" + bplist-creator: "npm:0.1.0" + bplist-parser: "npm:^0.3.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.3.0" + compression: "npm:^1.7.4" + connect: "npm:^3.7.0" + debug: "npm:^4.3.4" + dnssd-advertise: "npm:^1.1.3" + expo-server: "npm:^55.0.4" + fetch-nodeshim: "npm:^0.4.6" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + lan-network: "npm:^0.2.0" + minimatch: "npm:^9.0.0" + multitars: "npm:^0.2.3" + node-forge: "npm:^1.3.3" + npm-package-arg: "npm:^11.0.0" + ora: "npm:^3.4.0" + picomatch: "npm:^3.0.1" + pretty-format: "npm:^29.7.0" + progress: "npm:^2.0.3" + prompts: "npm:^2.3.2" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.6.0" + send: "npm:^0.19.0" + slugify: "npm:^1.3.4" + source-map-support: "npm:~0.5.21" + stacktrace-parser: "npm:^0.1.10" + structured-headers: "npm:^0.4.1" + terminal-link: "npm:^2.1.1" + toqr: "npm:^0.1.1" + wrap-ansi: "npm:^7.0.0" + ws: "npm:^8.12.1" + zod: "npm:^3.25.76" + peerDependencies: + expo: "*" + expo-router: "*" + react-native: "*" + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true + bin: + expo-internal: build/bin/cli + checksum: 10/7eb2c8f7c2a7c36c0a320b9316816a02ba7990c0ee31d84686e67ce0c4d3314ca4d1410658b57ddb8a04d950e7a24623db52f4c074078977bcb26d1bfc6cd9fc + languageName: node + linkType: hard + "@expo/code-signing-certificates@npm:^0.0.6": version: 0.0.6 resolution: "@expo/code-signing-certificates@npm:0.0.6" @@ -3374,6 +3621,27 @@ __metadata: languageName: node linkType: hard +"@expo/config-plugins@npm:~55.0.5": + version: 55.0.5 + resolution: "@expo/config-plugins@npm:55.0.5" + dependencies: + "@expo/config-types": "npm:^55.0.4" + "@expo/json-file": "npm:~10.0.12" + "@expo/plist": "npm:^0.5.2" + "@expo/sdk-runtime-versions": "npm:^1.0.0" + chalk: "npm:^4.1.2" + debug: "npm:^4.3.5" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.5.4" + slugify: "npm:^1.6.6" + xcode: "npm:^3.0.1" + xml2js: "npm:0.6.0" + checksum: 10/6194c7c6ae91236bdbbd57929d71f0bde2dac603ca70233a943175445eb86b28c747366e4bed418bd1012084a6e16e7c41946fef69a9dec78cf48e040bda93ca + languageName: node + linkType: hard + "@expo/config-types@npm:^54.0.10": version: 54.0.10 resolution: "@expo/config-types@npm:54.0.10" @@ -3381,6 +3649,13 @@ __metadata: languageName: node linkType: hard +"@expo/config-types@npm:^55.0.4": + version: 55.0.4 + resolution: "@expo/config-types@npm:55.0.4" + checksum: 10/0f08e6c453f1e1952da89c4ed33594ead5f01e9e99d49f62ed60d9e1273579566305287a24bff7f83e4371a2a9431dada5ffffffd6c25ab11fed996fe93d903c + languageName: node + linkType: hard + "@expo/config@npm:^12.0.13, @expo/config@npm:~12.0.13": version: 12.0.13 resolution: "@expo/config@npm:12.0.13" @@ -3402,6 +3677,25 @@ __metadata: languageName: node linkType: hard +"@expo/config@npm:~55.0.7": + version: 55.0.7 + resolution: "@expo/config@npm:55.0.7" + dependencies: + "@expo/config-plugins": "npm:~55.0.5" + "@expo/config-types": "npm:^55.0.4" + "@expo/json-file": "npm:^10.0.12" + "@expo/require-utils": "npm:^55.0.1" + deepmerge: "npm:^4.3.1" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + resolve-from: "npm:^5.0.0" + resolve-workspace-root: "npm:^2.0.0" + semver: "npm:^7.6.0" + slugify: "npm:^1.3.4" + checksum: 10/9fed59c27a5e2ee49f69c8ac181581cbd74f0e2e3c15d64f6ba57f62a67adee8d775035aefcf4dc9e78806068bbdcbe8e14ce5d8185eabe69294b3536a55726b + languageName: node + linkType: hard + "@expo/devcert@npm:^1.2.1": version: 1.2.1 resolution: "@expo/devcert@npm:1.2.1" @@ -3429,22 +3723,61 @@ __metadata: languageName: node linkType: hard -"@expo/env@npm:~2.0.8": - version: 2.0.8 - resolution: "@expo/env@npm:2.0.8" - dependencies: - chalk: "npm:^4.0.0" - debug: "npm:^4.3.4" - dotenv: "npm:~16.4.5" - dotenv-expand: "npm:~11.0.6" - getenv: "npm:^2.0.0" - checksum: 10/d440e0c7d8f4d438a9f82794435c315b63fc18a9b251ee7238f150255634d2786874cd85ff78589eb0488125d41d57a9b055fb1a25c4e06a08a0330d809e78cd - languageName: node - linkType: hard - -"@expo/fingerprint@npm:0.15.4": - version: 0.15.4 - resolution: "@expo/fingerprint@npm:0.15.4" +"@expo/devtools@npm:55.0.2": + version: 55.0.2 + resolution: "@expo/devtools@npm:55.0.2" + dependencies: + chalk: "npm:^4.1.2" + peerDependencies: + react: "*" + react-native: "*" + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + checksum: 10/0a43121fb5a7993dfe0c112e287e292358c099c4f02dbd1f80e67fe8bb7cff21be77cf389fefcc84f86e2955066e4b0e70e447cf48ca8772de47c6eef114ecdd + languageName: node + linkType: hard + +"@expo/dom-webview@npm:^55.0.3": + version: 55.0.3 + resolution: "@expo/dom-webview@npm:55.0.3" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/e93ec71dc764b57fb109ed97794b8b033a88ab9656bee875853f838777590ff85bc7614f1af95e9ea528a3424e18fa27be80fe252565f0dff980e8766a56d7f9 + languageName: node + linkType: hard + +"@expo/env@npm:^2.0.11, @expo/env@npm:~2.1.1": + version: 2.1.1 + resolution: "@expo/env@npm:2.1.1" + dependencies: + chalk: "npm:^4.0.0" + debug: "npm:^4.3.4" + getenv: "npm:^2.0.0" + checksum: 10/19be4c7131b1d718a456018dfe3133b6c021b71b8689b11b208d03aae947c0f0848ce21996adf9010c1b87d765b46b14484f1d1f30f73db466b9500024bfac53 + languageName: node + linkType: hard + +"@expo/env@npm:~2.0.8": + version: 2.0.8 + resolution: "@expo/env@npm:2.0.8" + dependencies: + chalk: "npm:^4.0.0" + debug: "npm:^4.3.4" + dotenv: "npm:~16.4.5" + dotenv-expand: "npm:~11.0.6" + getenv: "npm:^2.0.0" + checksum: 10/d440e0c7d8f4d438a9f82794435c315b63fc18a9b251ee7238f150255634d2786874cd85ff78589eb0488125d41d57a9b055fb1a25c4e06a08a0330d809e78cd + languageName: node + linkType: hard + +"@expo/fingerprint@npm:0.15.4": + version: 0.15.4 + resolution: "@expo/fingerprint@npm:0.15.4" dependencies: "@expo/spawn-async": "npm:^1.7.2" arg: "npm:^5.0.2" @@ -3463,6 +3796,42 @@ __metadata: languageName: node linkType: hard +"@expo/fingerprint@npm:0.16.4": + version: 0.16.4 + resolution: "@expo/fingerprint@npm:0.16.4" + dependencies: + "@expo/env": "npm:^2.0.11" + "@expo/spawn-async": "npm:^1.7.2" + arg: "npm:^5.0.2" + chalk: "npm:^4.1.2" + debug: "npm:^4.3.4" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + ignore: "npm:^5.3.1" + minimatch: "npm:^9.0.0" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.6.0" + bin: + fingerprint: bin/cli.js + checksum: 10/c1f71030d9ef019e705de67279aaab281c2e5499860a0ea49b675b25e70ec9f9ba6133269811bc4cf860ad211b3baf594102ae1ed8eba6047f489345d662d1ca + languageName: node + linkType: hard + +"@expo/image-utils@npm:^0.8.12": + version: 0.8.12 + resolution: "@expo/image-utils@npm:0.8.12" + dependencies: + "@expo/spawn-async": "npm:^1.7.2" + chalk: "npm:^4.0.0" + getenv: "npm:^2.0.0" + jimp-compact: "npm:0.16.1" + parse-png: "npm:^2.1.0" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.6.0" + checksum: 10/fb474558bb4009f39c640fb028a57cfae721e52dae0085bb2505390c6968d30cdc82eb195c15de82f30879c710104c08e60120de8f49613183437701f19dd363 + languageName: node + linkType: hard + "@expo/image-utils@npm:^0.8.8": version: 0.8.8 resolution: "@expo/image-utils@npm:0.8.8" @@ -3481,7 +3850,7 @@ __metadata: languageName: node linkType: hard -"@expo/json-file@npm:^10.0.12": +"@expo/json-file@npm:^10.0.12, @expo/json-file@npm:~10.0.12": version: 10.0.12 resolution: "@expo/json-file@npm:10.0.12" dependencies: @@ -3501,6 +3870,32 @@ __metadata: languageName: node linkType: hard +"@expo/local-build-cache-provider@npm:55.0.5": + version: 55.0.5 + resolution: "@expo/local-build-cache-provider@npm:55.0.5" + dependencies: + "@expo/config": "npm:~55.0.7" + chalk: "npm:^4.1.2" + checksum: 10/aaee5951bfa05be64a4ab73ddccc69a3f04f46898e6f316baa8dd550754e27001644c5e2afe56804541b08ba7c44ed7677ab2e30cf2d1a33b42d6afe1045059e + languageName: node + linkType: hard + +"@expo/log-box@npm:55.0.7": + version: 55.0.7 + resolution: "@expo/log-box@npm:55.0.7" + dependencies: + "@expo/dom-webview": "npm:^55.0.3" + anser: "npm:^1.4.9" + stacktrace-parser: "npm:^0.1.10" + peerDependencies: + "@expo/dom-webview": ^55.0.3 + expo: "*" + react: "*" + react-native: "*" + checksum: 10/812ea909c527d21a284d6ce273351836b8848618611d6cece0e2a284a7314f9cd7d8ba0deed96125790cdbdd993bdcb68c45d1612604ea4e300021e13f80302b + languageName: node + linkType: hard + "@expo/metro-config@npm:54.0.14, @expo/metro-config@npm:~54.0.14": version: 54.0.14 resolution: "@expo/metro-config@npm:54.0.14" @@ -3535,6 +3930,59 @@ __metadata: languageName: node linkType: hard +"@expo/metro-config@npm:55.0.7, @expo/metro-config@npm:~55.0.7": + version: 55.0.7 + resolution: "@expo/metro-config@npm:55.0.7" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + "@babel/core": "npm:^7.20.0" + "@babel/generator": "npm:^7.20.5" + "@expo/config": "npm:~55.0.7" + "@expo/env": "npm:~2.1.1" + "@expo/json-file": "npm:~10.0.12" + "@expo/metro": "npm:~54.2.0" + "@expo/spawn-async": "npm:^1.7.2" + browserslist: "npm:^4.25.0" + chalk: "npm:^4.1.0" + debug: "npm:^4.3.2" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + hermes-parser: "npm:^0.29.1" + jsc-safe-url: "npm:^0.2.4" + lightningcss: "npm:^1.30.1" + minimatch: "npm:^9.0.0" + postcss: "npm:~8.4.32" + resolve-from: "npm:^5.0.0" + peerDependencies: + expo: "*" + peerDependenciesMeta: + expo: + optional: true + checksum: 10/6fda8cdce5f8f2105c7289af257b36227f47328240aaeceb5138199e7c61c00c83b328fdf761ed0a3693d0629fa211969117786c36338c5f5b5411ab59f74c81 + languageName: node + linkType: hard + +"@expo/metro-runtime@npm:^55.0.6": + version: 55.0.6 + resolution: "@expo/metro-runtime@npm:55.0.6" + dependencies: + "@expo/log-box": "npm:55.0.7" + anser: "npm:^1.4.9" + pretty-format: "npm:^29.7.0" + stacktrace-parser: "npm:^0.1.10" + whatwg-fetch: "npm:^3.0.0" + peerDependencies: + expo: "*" + react: "*" + react-dom: "*" + react-native: "*" + peerDependenciesMeta: + react-dom: + optional: true + checksum: 10/cae7fc019f65be573709bc86ef8eaad297bc1c8cd5ed8ed7a4ddb2342faf5a6021217a82344583d60079ceea694ab2613bd15afdcc5cf3390c0528198fe3aaa9 + languageName: node + linkType: hard + "@expo/metro-runtime@npm:^6.1.2": version: 6.1.2 resolution: "@expo/metro-runtime@npm:6.1.2" @@ -3587,7 +4035,16 @@ __metadata: languageName: node linkType: hard -"@expo/package-manager@npm:^1.9.10": +"@expo/osascript@npm:^2.4.2": + version: 2.4.2 + resolution: "@expo/osascript@npm:2.4.2" + dependencies: + "@expo/spawn-async": "npm:^1.7.2" + checksum: 10/5609b926bd68120b6a01edea0c7b14d4fa9fcd454bbcb49b89988f7acdb540f3b9c1c133acbbd3f9cd6a6937ce2a950c9cdde2a98ec8769d8a8b1481666a67d9 + languageName: node + linkType: hard + +"@expo/package-manager@npm:^1.10.3, @expo/package-manager@npm:^1.9.10": version: 1.10.3 resolution: "@expo/package-manager@npm:1.10.3" dependencies: @@ -3612,6 +4069,17 @@ __metadata: languageName: node linkType: hard +"@expo/plist@npm:^0.5.2": + version: 0.5.2 + resolution: "@expo/plist@npm:0.5.2" + dependencies: + "@xmldom/xmldom": "npm:^0.8.8" + base64-js: "npm:^1.5.1" + xmlbuilder: "npm:^15.1.1" + checksum: 10/ab9350226a2f651c030f9704a0c66474b616b9772e7c6209d2d8271a6e5cc5d713b3b755c2c790a3b96d6f29af35b5ef18353611dc9e6f58d1827b207036ec81 + languageName: node + linkType: hard + "@expo/prebuild-config@npm:^54.0.8": version: 54.0.8 resolution: "@expo/prebuild-config@npm:54.0.8" @@ -3632,6 +4100,68 @@ __metadata: languageName: node linkType: hard +"@expo/prebuild-config@npm:^55.0.6": + version: 55.0.6 + resolution: "@expo/prebuild-config@npm:55.0.6" + dependencies: + "@expo/config": "npm:~55.0.7" + "@expo/config-plugins": "npm:~55.0.5" + "@expo/config-types": "npm:^55.0.4" + "@expo/image-utils": "npm:^0.8.12" + "@expo/json-file": "npm:^10.0.12" + "@react-native/normalize-colors": "npm:0.83.2" + debug: "npm:^4.3.1" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.6.0" + xml2js: "npm:0.6.0" + peerDependencies: + expo: "*" + checksum: 10/e158bc8b595146b4956bce10564c285b483faa714f8d03a20eb4d699cc381e9289c9e02549e091b779f1cbec7a2d01b18f864782ce3e16ec9486d12642d6ab25 + languageName: node + linkType: hard + +"@expo/require-utils@npm:^55.0.1": + version: 55.0.1 + resolution: "@expo/require-utils@npm:55.0.1" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + peerDependencies: + typescript: ^5.0.0 || ^5.0.0-0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/1da315c31a95fe3cb78a27c89b128f09c0934874c8d6ad0bf9bff76772bfe53a82a2f54aa3fe41d45b8bb66c84d39176dbf1f7f6193a35582de74f0b776df2ca + languageName: node + linkType: hard + +"@expo/router-server@npm:^55.0.7": + version: 55.0.7 + resolution: "@expo/router-server@npm:55.0.7" + dependencies: + debug: "npm:^4.3.4" + peerDependencies: + "@expo/metro-runtime": ^55.0.6 + expo: "*" + expo-constants: ^55.0.6 + expo-font: ^55.0.4 + expo-router: "*" + expo-server: ^55.0.4 + 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 + checksum: 10/d8fa58fe94bece678e1d79ab3f85954f814902d0d96c70def3d693533450dc3735fd1879eeed669c504610a81faa32d775fb663d839e35838619834d12f3f2c4 + languageName: node + linkType: hard + "@expo/schema-utils@npm:^0.1.8": version: 0.1.8 resolution: "@expo/schema-utils@npm:0.1.8" @@ -3639,6 +4169,13 @@ __metadata: languageName: node linkType: hard +"@expo/schema-utils@npm:^55.0.2": + version: 55.0.2 + resolution: "@expo/schema-utils@npm:55.0.2" + checksum: 10/a5ded5555112f0490af0a9794d876f8c0433a14c46f9f315c581920782d9e8c6e830f401e03e174a5ca245f90d8b07143f3e98f762cd2644d307413792f58dd7 + languageName: node + linkType: hard + "@expo/sdk-runtime-versions@npm:^1.0.0": version: 1.0.0 resolution: "@expo/sdk-runtime-versions@npm:1.0.0" @@ -3662,6 +4199,17 @@ __metadata: languageName: node linkType: hard +"@expo/vector-icons@npm:^15.0.2": + version: 15.1.1 + resolution: "@expo/vector-icons@npm:15.1.1" + peerDependencies: + expo-font: ">=14.0.4" + react: "*" + react-native: "*" + checksum: 10/204fafd5141c81bd55dd33f6c00cdc48ec1d37b6460be6fa3f851ccb235e1fad1097f22d034470daa49a5b839d058bbcadda1efd349c670c2fdce2ae65fb9bba + languageName: node + linkType: hard + "@expo/vector-icons@npm:^15.0.3": version: 15.0.3 resolution: "@expo/vector-icons@npm:15.0.3" @@ -3694,6 +4242,19 @@ __metadata: languageName: node linkType: hard +"@expo/xcpretty@npm:^4.4.0": + version: 4.4.1 + resolution: "@expo/xcpretty@npm:4.4.1" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + chalk: "npm:^4.1.0" + js-yaml: "npm:^4.1.0" + bin: + excpretty: build/cli.js + checksum: 10/56d4c7d54f2b2d4a04d24f77c8e6926c0760c2983c5ac54018a35b754e261d3f31b7cd509342ff161dfbe852c03d5d62096927130069e6020db29c33ca3fa580 + languageName: node + linkType: hard + "@glideapps/ts-necessities@npm:2.2.3": version: 2.2.3 resolution: "@glideapps/ts-necessities@npm:2.2.3" @@ -4791,6 +5352,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-slot@npm:^1.2.0": + version: 1.2.4 + resolution: "@radix-ui/react-slot@npm:1.2.4" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b37e37455b92789758980359d73ab5a5f5d1c12af480c775519bd15c556b891642d472accf05b30d520751489ca74cdb8fd7866064abc7942f0437371be28e51 + languageName: node + linkType: hard + "@radix-ui/react-tabs@npm:^1.1.12": version: 1.1.13 resolution: "@radix-ui/react-tabs@npm:1.1.13" @@ -5146,6 +5722,13 @@ __metadata: languageName: node linkType: hard +"@react-native/assets-registry@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/assets-registry@npm:0.83.2" + checksum: 10/62a4bfd803209795079878ed57ea9275c50added84b3ad514ffae43b0036f7e3319b0241c47f29f454d52b4739c42bf5e0171205697c2b8b45366b37bfca7e1d + languageName: node + linkType: hard + "@react-native/babel-plugin-codegen@npm:0.81.5": version: 0.81.5 resolution: "@react-native/babel-plugin-codegen@npm:0.81.5" @@ -5166,6 +5749,16 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-plugin-codegen@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/babel-plugin-codegen@npm:0.83.2" + dependencies: + "@babel/traverse": "npm:^7.25.3" + "@react-native/codegen": "npm:0.83.2" + checksum: 10/fa28a674da9d4c515ccde850858bd27b1b508825f02bd415f4e48f8e2f0becf41a6d2f96e8578e0670d50dc1b36d2fe7403194c0f52d31bf87728982a13399d1 + languageName: node + linkType: hard + "@react-native/babel-preset@npm:0.81.5": version: 0.81.5 resolution: "@react-native/babel-preset@npm:0.81.5" @@ -5276,6 +5869,61 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-preset@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/babel-preset@npm:0.83.2" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-classes": "npm:^7.25.4" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" + "@babel/plugin-transform-literals": "npm:^7.25.2" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@babel/plugin-transform-typescript": "npm:^7.25.2" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@babel/template": "npm:^7.25.0" + "@react-native/babel-plugin-codegen": "npm:0.83.2" + babel-plugin-syntax-hermes-parser: "npm:0.32.0" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + react-refresh: "npm:^0.14.0" + peerDependencies: + "@babel/core": "*" + checksum: 10/e35d3bd86caaf49abc2703d43319aa68195f8f9c48b42f8dc70ead5127b41178bda5d6a39c64f39c12a3b1eeafc1ddd4746e2d108fec1619adcc0d664702e7d5 + languageName: node + linkType: hard + "@react-native/codegen@npm:0.81.5": version: 0.81.5 resolution: "@react-native/codegen@npm:0.81.5" @@ -5310,6 +5958,23 @@ __metadata: languageName: node linkType: hard +"@react-native/codegen@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/codegen@npm:0.83.2" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/parser": "npm:^7.25.3" + glob: "npm:^7.1.1" + hermes-parser: "npm:0.32.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/core": "*" + checksum: 10/757095d1b7b20574012751bd647242bb2e5b67b14afb6c5a2b80e51bb36e474aaf34c6c6600cc09b23745bc38469dab99ec56c53f7a8737ca1ec4b9aa52fbdde + languageName: node + linkType: hard + "@react-native/community-cli-plugin@npm:0.81.5": version: 0.81.5 resolution: "@react-native/community-cli-plugin@npm:0.81.5" @@ -5356,6 +6021,29 @@ __metadata: languageName: node linkType: hard +"@react-native/community-cli-plugin@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/community-cli-plugin@npm:0.83.2" + dependencies: + "@react-native/dev-middleware": "npm:0.83.2" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" + metro: "npm:^0.83.3" + metro-config: "npm:^0.83.3" + metro-core: "npm:^0.83.3" + semver: "npm:^7.1.3" + peerDependencies: + "@react-native-community/cli": "*" + "@react-native/metro-config": "*" + peerDependenciesMeta: + "@react-native-community/cli": + optional: true + "@react-native/metro-config": + optional: true + checksum: 10/2683c34c2c8c56fa9d765baf97701893ff57816f606d115938be0684ac7829782721d927d7957e7075d8399d7cbfa71af205f79fae3bc7e633b5c54ed1de8dbb + languageName: node + linkType: hard + "@react-native/debugger-frontend@npm:0.81.5": version: 0.81.5 resolution: "@react-native/debugger-frontend@npm:0.81.5" @@ -5370,13 +6058,30 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/debugger-shell@npm:0.82.1" +"@react-native/debugger-frontend@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/debugger-frontend@npm:0.83.2" + checksum: 10/17e9452c73fc464daa13655d8a9e5868298e47b6b3e67ca41d624f176c6c493ae37c4a56a4b1106edf0a85902127501e8e29d1bf70dcf5205bba7a81a304f359 + languageName: node + linkType: hard + +"@react-native/debugger-shell@npm:0.82.1": + version: 0.82.1 + resolution: "@react-native/debugger-shell@npm:0.82.1" + dependencies: + cross-spawn: "npm:^7.0.6" + fb-dotslash: "npm:0.5.8" + checksum: 10/4b84507dda0676e1a81b0016a25b4f0c54bb1008955e08c32cc7f40b8eec8d72f4a3941b957724db0c2e2bca3759498dec2e620d4b33e2b6488453b8a7b5cb59 + languageName: node + linkType: hard + +"@react-native/debugger-shell@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/debugger-shell@npm:0.83.2" dependencies: cross-spawn: "npm:^7.0.6" fb-dotslash: "npm:0.5.8" - checksum: 10/4b84507dda0676e1a81b0016a25b4f0c54bb1008955e08c32cc7f40b8eec8d72f4a3941b957724db0c2e2bca3759498dec2e620d4b33e2b6488453b8a7b5cb59 + checksum: 10/214590025f5dd7781dc906c2945dd21f595bc5534c807e2af29133175dcb05d9be979a95857ff186bcc97cc307a99d26a6b993798c643cee7d5203bb56c64b47 languageName: node linkType: hard @@ -5419,6 +6124,26 @@ __metadata: languageName: node linkType: hard +"@react-native/dev-middleware@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/dev-middleware@npm:0.83.2" + dependencies: + "@isaacs/ttlcache": "npm:^1.4.1" + "@react-native/debugger-frontend": "npm:0.83.2" + "@react-native/debugger-shell": "npm:0.83.2" + chrome-launcher: "npm:^0.15.2" + chromium-edge-launcher: "npm:^0.2.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + open: "npm:^7.0.3" + serve-static: "npm:^1.16.2" + ws: "npm:^7.5.10" + checksum: 10/cb5f90aa8c64c20efeaa36a9cc66ea8e7180a8d5b6c1068d52f42e269d4786049829a9b620f5090542c48f0dbb4100527bb61fbe0db8b39050cfc0f76a94388e + languageName: node + linkType: hard + "@react-native/eslint-config@npm:0.82.1": version: 0.82.1 resolution: "@react-native/eslint-config@npm:0.82.1" @@ -5463,6 +6188,13 @@ __metadata: languageName: node linkType: hard +"@react-native/gradle-plugin@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/gradle-plugin@npm:0.83.2" + checksum: 10/09517663800636f2352ce95c183e51c5c69037baf93bf6cf3cad947fe062510b77aca38dc8e85164fad54c73db8a8e83968652f76ee1d9965e2e417da45522c0 + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.81.5": version: 0.81.5 resolution: "@react-native/js-polyfills@npm:0.81.5" @@ -5477,6 +6209,13 @@ __metadata: languageName: node linkType: hard +"@react-native/js-polyfills@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/js-polyfills@npm:0.83.2" + checksum: 10/da869dba00ff02561e1dd017d617ac1b48286a465e419ce750bec0963cead0b51bd100507e977cd6c9ba6bb983b5e76eb0fecc7842fed69db23e6a968557c18e + languageName: node + linkType: hard + "@react-native/metro-babel-transformer@npm:0.82.1": version: 0.82.1 resolution: "@react-native/metro-babel-transformer@npm:0.82.1" @@ -5517,6 +6256,20 @@ __metadata: languageName: node linkType: hard +"@react-native/normalize-colors@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/normalize-colors@npm:0.83.2" + checksum: 10/57e09d151ac697b55207fd9ef47de79598682610c13d6d6c40be2de40abd1c0bc2b52e8acadead779ab19538e8a56e17f205a3c13ab7fa51b368e342c9f94d08 + languageName: node + linkType: hard + +"@react-native/normalize-colors@npm:^0.74.1": + version: 0.74.89 + resolution: "@react-native/normalize-colors@npm:0.74.89" + checksum: 10/2e2e2f950cc4c2896af6094cb045f1d6e8d73101960b9cadb67b944b1254a9204b8f78a075dafd22cff39bc154a0cbe48b57f262b5d319ecb823c84519352545 + languageName: node + linkType: hard + "@react-native/typescript-config@npm:0.82.1": version: 0.82.1 resolution: "@react-native/typescript-config@npm:0.82.1" @@ -5558,6 +6311,40 @@ __metadata: languageName: node linkType: hard +"@react-native/virtualized-lists@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/virtualized-lists@npm:0.83.2" + dependencies: + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + peerDependencies: + "@types/react": ^19.2.0 + react: "*" + react-native: "*" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ba4d794330f869f51565abb1717af929a817bcfdfabb6684b3307e4289706345db174062ed79ca6b340f5a7b2952e02e62a821cfb86bc24f41bbf2ee931a882c + languageName: node + linkType: hard + +"@react-navigation/bottom-tabs@npm:^7.10.1": + version: 7.15.5 + resolution: "@react-navigation/bottom-tabs@npm:7.15.5" + dependencies: + "@react-navigation/elements": "npm:^2.9.10" + color: "npm:^4.2.3" + sf-symbols-typescript: "npm:^2.1.0" + peerDependencies: + "@react-navigation/native": ^7.1.33 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 10/d4cde316c33ba29fae900bcbb8a2e663eade3e72348f332954e9462db3fb433867d86ee493d025cc0ae30910bce5b598844f1097b43b78a4d65dd5d703b00fd5 + languageName: node + linkType: hard + "@react-navigation/bottom-tabs@npm:^7.4.0": version: 7.9.1 resolution: "@react-navigation/bottom-tabs@npm:7.9.1" @@ -5575,6 +6362,23 @@ __metadata: languageName: node linkType: hard +"@react-navigation/bottom-tabs@npm:^7.7.3": + version: 7.14.0 + resolution: "@react-navigation/bottom-tabs@npm:7.14.0" + dependencies: + "@react-navigation/elements": "npm:^2.9.5" + color: "npm:^4.2.3" + sf-symbols-typescript: "npm:^2.1.0" + peerDependencies: + "@react-navigation/native": ^7.1.28 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 10/0a81b2bc9b58234898bfecc5fb70a578729bfd4d1205284c598e3a3f59beedb151b4c35381ac7be139d28ffaa18d53cf2eacf7cec30c7a3f9f4738527eb5e6f1 + languageName: node + linkType: hard + "@react-navigation/core@npm:^7.13.7": version: 7.13.7 resolution: "@react-navigation/core@npm:7.13.7" @@ -5593,6 +6397,64 @@ __metadata: languageName: node linkType: hard +"@react-navigation/core@npm:^7.14.0": + version: 7.14.0 + resolution: "@react-navigation/core@npm:7.14.0" + dependencies: + "@react-navigation/routers": "npm:^7.5.3" + escape-string-regexp: "npm:^4.0.0" + fast-deep-equal: "npm:^3.1.3" + nanoid: "npm:^3.3.11" + query-string: "npm:^7.1.3" + react-is: "npm:^19.1.0" + use-latest-callback: "npm:^0.2.4" + use-sync-external-store: "npm:^1.5.0" + peerDependencies: + react: ">= 18.2.0" + checksum: 10/fa43ad12304f0dfa60688c73f59ac374c1900d1bad1823ab2b1454ab7e6376d0038ec2a597f67fa09fabe4381bfd210fb048518d61ad4fc44d6d608a0ceb6a1a + languageName: node + linkType: hard + +"@react-navigation/elements@npm:^2.8.1, @react-navigation/elements@npm:^2.9.5": + version: 2.9.5 + resolution: "@react-navigation/elements@npm:2.9.5" + dependencies: + color: "npm:^4.2.3" + use-latest-callback: "npm:^0.2.4" + use-sync-external-store: "npm:^1.5.0" + peerDependencies: + "@react-native-masked-view/masked-view": ">= 0.2.0" + "@react-navigation/native": ^7.1.28 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + peerDependenciesMeta: + "@react-native-masked-view/masked-view": + optional: true + checksum: 10/b71c367082527dda303dfaa319af930ccbb1622f2cbe018382c8070c91944b59891fcabe048a76590d52ee07eac7ca9acb33e03fdacd8092aff1d58a165b0762 + languageName: node + linkType: hard + +"@react-navigation/elements@npm:^2.9.10": + version: 2.9.10 + resolution: "@react-navigation/elements@npm:2.9.10" + dependencies: + color: "npm:^4.2.3" + use-latest-callback: "npm:^0.2.4" + use-sync-external-store: "npm:^1.5.0" + peerDependencies: + "@react-native-masked-view/masked-view": ">= 0.2.0" + "@react-navigation/native": ^7.1.33 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + peerDependenciesMeta: + "@react-native-masked-view/masked-view": + optional: true + checksum: 10/ef6b7280d8902411431de1038ed6f19caac5fda9b7e2dff28037d0699cf8fd75eaff07169fc114ff8ec9c1099e1617d75b96dd1b616f3d982c67c86f41a8bc43 + languageName: node + linkType: hard + "@react-navigation/elements@npm:^2.9.3": version: 2.9.3 resolution: "@react-navigation/elements@npm:2.9.3" @@ -5633,6 +6495,24 @@ __metadata: languageName: node linkType: hard +"@react-navigation/native-stack@npm:^7.10.1": + version: 7.14.4 + resolution: "@react-navigation/native-stack@npm:7.14.4" + dependencies: + "@react-navigation/elements": "npm:^2.9.10" + color: "npm:^4.2.3" + sf-symbols-typescript: "npm:^2.1.0" + warn-once: "npm:^0.1.1" + peerDependencies: + "@react-navigation/native": ^7.1.33 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 10/4290d4416502ea2035d28442181caa564fc3d461cd4c7c2b847a51f71876c8a7fa7557dc01b218a549bb0f5efe344cd8463b30463d86193471be9d36f3c22aa6 + languageName: node + linkType: hard + "@react-navigation/native-stack@npm:^7.2.1": version: 7.9.0 resolution: "@react-navigation/native-stack@npm:7.9.0" @@ -5685,6 +6565,22 @@ __metadata: languageName: node linkType: hard +"@react-navigation/native@npm:^7.1.28": + version: 7.1.28 + resolution: "@react-navigation/native@npm:7.1.28" + dependencies: + "@react-navigation/core": "npm:^7.14.0" + escape-string-regexp: "npm:^4.0.0" + fast-deep-equal: "npm:^3.1.3" + nanoid: "npm:^3.3.11" + use-latest-callback: "npm:^0.2.4" + peerDependencies: + react: ">= 18.2.0" + react-native: "*" + checksum: 10/64f2d3136ad4034315b2aaf81d0ffd3d73425787aebf3ef7934dfb50931d50cbc3322378fdc240df5d795f5c1ab361038c3200cc24c266c8a089706ca1f4edb7 + languageName: node + linkType: hard + "@react-navigation/native@npm:^7.1.8": version: 7.1.27 resolution: "@react-navigation/native@npm:7.1.27" @@ -6657,6 +7553,13 @@ __metadata: languageName: node linkType: hard +"@types/hammerjs@npm:^2.0.36": + version: 2.0.46 + resolution: "@types/hammerjs@npm:2.0.46" + checksum: 10/1b6502d668f45ca49fb488c01f7938d3aa75e989d70c64801c8feded7d659ca1a118f745c1b604d220efe344c93231767d5cc68c05e00e069c14539b6143cfd9 + languageName: node + linkType: hard + "@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" @@ -7420,6 +8323,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10/ea1343992b40b2bfb3a3113fa9c3c2f918ba0f9197ae565c48d3f84d44b174f6b1d5cd9989decd7655963eb03a272abc36968cc439c2907f999bd5ef8653d5a7 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -7786,7 +8699,7 @@ __metadata: languageName: node linkType: hard -"asap@npm:~2.0.6": +"asap@npm:~2.0.3, asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" checksum: 10/b244c0458c571945e4b3be0b14eb001bea5596f9868cc50cc711dc03d58a7e953517d3f0dad81ccde3ff37d1f074701fa76a6f07d41aaa992d7204a37b915dda @@ -8103,6 +9016,49 @@ __metadata: languageName: node linkType: hard +"babel-preset-expo@npm:~55.0.6": + version: 55.0.6 + resolution: "babel-preset-expo@npm:55.0.6" + dependencies: + "@babel/generator": "npm:^7.20.5" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/plugin-proposal-decorators": "npm:^7.12.9" + "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-transform-class-static-block": "npm:^7.27.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/preset-react": "npm:^7.22.15" + "@babel/preset-typescript": "npm:^7.23.0" + "@react-native/babel-preset": "npm:0.83.2" + babel-plugin-react-compiler: "npm:^1.0.0" + babel-plugin-react-native-web: "npm:~0.21.0" + babel-plugin-syntax-hermes-parser: "npm:^0.29.1" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + debug: "npm:^4.3.4" + resolve-from: "npm:^5.0.0" + peerDependencies: + "@babel/runtime": ^7.20.0 + expo: "*" + expo-widgets: ^55.0.0-alpha.8 + react-refresh: ">=0.14.0 <1.0.0" + peerDependenciesMeta: + "@babel/runtime": + optional: true + expo: + optional: true + expo-widgets: + optional: true + checksum: 10/c97b547a54511058c13ebe8de15ada56d57bd599483c6c30b1e42ea4e6b095a42946d224878ba8c4c65a4a134df7906db7ad8941e00c60b8b86e856eedd5be7f + languageName: node + linkType: hard + "babel-preset-jest@npm:30.2.0": version: 30.2.0 resolution: "babel-preset-jest@npm:30.2.0" @@ -8940,7 +9896,7 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^2.0.0": +"convert-source-map@npm:2.0.0, convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 @@ -9016,6 +9972,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^3.1.5": + version: 3.2.0 + resolution: "cross-fetch@npm:3.2.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10/e4ab1d390a5b6ca8bb0605f028af2ffc1127d2e407b954654949f506d04873c4863ece264662c074865d7874060e35f938cec74fe7b5736d46d545e2685f6aec + languageName: node + linkType: hard + "cross-fetch@npm:^4.0.0": version: 4.1.0 resolution: "cross-fetch@npm:4.1.0" @@ -9043,6 +10008,15 @@ __metadata: languageName: node linkType: hard +"css-in-js-utils@npm:^3.1.0": + version: 3.1.0 + resolution: "css-in-js-utils@npm:3.1.0" + dependencies: + hyphenate-style-name: "npm:^1.0.3" + checksum: 10/bd2f569f1870389004cfacfd7b798c0f40933d34af1f040c391a08322d097790b9a9524affb2ba4d26122e9cb8f4256afb59edb6077dbe607506944a9c673c67 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" @@ -9325,6 +10299,13 @@ __metadata: languageName: node linkType: hard +"dnssd-advertise@npm:^1.1.3": + version: 1.1.3 + resolution: "dnssd-advertise@npm:1.1.3" + checksum: 10/76cb498953c7e455d85b2092a977eba7c347ba7b14892d812b2a089587c97e72d87d47967c5c77e64cdbe6706a8153b848e9df790c91b15cc829e2415e1afa6e + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -9908,6 +10889,24 @@ __metadata: languageName: node linkType: hard +"eslint-config-expo@npm:~55.0.0": + version: 55.0.0 + resolution: "eslint-config-expo@npm:55.0.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:^8.18.2" + "@typescript-eslint/parser": "npm:^8.18.2" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-expo: "npm:^1.0.0" + eslint-plugin-import: "npm:^2.30.0" + eslint-plugin-react: "npm:^7.37.3" + eslint-plugin-react-hooks: "npm:^5.1.0" + globals: "npm:^16.0.0" + peerDependencies: + eslint: ">=8.10" + checksum: 10/84a1ed8de53f6eec32357193c37785559b1c30f65267f42ba5b58aed2e96c50924a878f417ef469dac96a570455751bde0b017272a56b1b4ff7fd1a57dc6c2e0 + languageName: node + linkType: hard + "eslint-config-prettier@npm:^10.1.8": version: 10.1.8 resolution: "eslint-config-prettier@npm:10.1.8" @@ -10537,6 +11536,20 @@ __metadata: languageName: node linkType: hard +"expo-asset@npm:~55.0.6": + version: 55.0.6 + resolution: "expo-asset@npm:55.0.6" + dependencies: + "@expo/image-utils": "npm:^0.8.12" + expo-constants: "npm:~55.0.6" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/e8d592c32bbb7a15e5bb91ae91e62aaeb4379da1609d1ada5f26cae3d5c18a342d4f8b18d56e4ccf09935c371afffc527fb88e2c67231bcf23af6b2c818c669c + languageName: node + linkType: hard + "expo-constants@npm:~18.0.12, expo-constants@npm:~18.0.13": version: 18.0.13 resolution: "expo-constants@npm:18.0.13" @@ -10550,6 +11563,30 @@ __metadata: languageName: node linkType: hard +"expo-constants@npm:~55.0.6": + version: 55.0.6 + resolution: "expo-constants@npm:55.0.6" + dependencies: + "@expo/config": "npm:~55.0.7" + "@expo/env": "npm:~2.1.1" + peerDependencies: + expo: "*" + react-native: "*" + checksum: 10/c890715e84fdc85904d76ec365624c18a7dcf50b75d6ef84e4b832149ec381b64885ab6335c58ab587b920e50d8675f899504e7f1c7c6480f349cd1d2aa7818e + languageName: node + linkType: hard + +"expo-device@npm:~55.0.8": + version: 55.0.8 + resolution: "expo-device@npm:55.0.8" + dependencies: + ua-parser-js: "npm:^0.7.33" + peerDependencies: + expo: "*" + checksum: 10/651f3e1988383383529c2dd3a153b8c1836eb024262f5ad66eb24ba1254f46901baed4c2846a88794b4b178f54460843fb67115873f402a81fd6a250ac2b836b + languageName: node + linkType: hard + "expo-file-system@npm:~19.0.21": version: 19.0.21 resolution: "expo-file-system@npm:19.0.21" @@ -10560,6 +11597,16 @@ __metadata: languageName: node linkType: hard +"expo-file-system@npm:~55.0.8": + version: 55.0.10 + resolution: "expo-file-system@npm:55.0.10" + peerDependencies: + expo: "*" + react-native: "*" + checksum: 10/cf6cca908aed92fd226135f7c4609e8751ed69f512717076711db5b7697447b52a9b639204b5fd76ebc420a34e816deae647b939c273d00963a1e0654a8b3854 + languageName: node + linkType: hard + "expo-font@npm:~14.0.11": version: 14.0.11 resolution: "expo-font@npm:14.0.11" @@ -10569,7 +11616,42 @@ __metadata: expo: "*" react: "*" react-native: "*" - checksum: 10/80acffecdbd49a2ba1d7ecd8727f355bf47c39873d92f5959ff3bf7fd1de3e6ac10ebe2a77b8238287c3f2b7d033df40b562505fec370f82d9444400e19d7518 + checksum: 10/80acffecdbd49a2ba1d7ecd8727f355bf47c39873d92f5959ff3bf7fd1de3e6ac10ebe2a77b8238287c3f2b7d033df40b562505fec370f82d9444400e19d7518 + languageName: node + linkType: hard + +"expo-font@npm:~55.0.4": + version: 55.0.4 + resolution: "expo-font@npm:55.0.4" + dependencies: + fontfaceobserver: "npm:^2.1.0" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/d590354e45c5a4a7a801ab04e4eec6b2a0bf42a2dde7e618f13cdf799d6ce86ccbfabb124de6b1f9ec0a077e74532429169d737948a1bdb0496b762fbf503c31 + languageName: node + linkType: hard + +"expo-glass-effect@npm:^55.0.7": + version: 55.0.7 + resolution: "expo-glass-effect@npm:55.0.7" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/10d787d05c69c5fdcd525dafc407376937e491c8abdc583b388ba09cab71109ceeaa687ec873220405e5fade0340dcd34437155a8ebcae18615a1f67381abad4 + languageName: node + linkType: hard + +"expo-glass-effect@npm:~55.0.6": + version: 55.0.6 + resolution: "expo-glass-effect@npm:55.0.6" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/b6f9fa52146c47c735feb9b597d8324ac2d0dcc90a81ba6a4f3ac6636cb75bfe0ac9e02bc0e743b8f37d91c2c9369eda1c16cdaf0c3e3ff84395bceb139e3ed7 languageName: node linkType: hard @@ -10582,6 +11664,23 @@ __metadata: languageName: node linkType: hard +"expo-image@npm:^55.0.6": + version: 55.0.6 + resolution: "expo-image@npm:55.0.6" + dependencies: + sf-symbols-typescript: "npm:^2.2.0" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + react-native-web: "*" + peerDependenciesMeta: + react-native-web: + optional: true + checksum: 10/69da92574bf4971e7be7350a3b874fa70ee8795c038f1fea54fe2f96d3a1345329cc36117fc362f11f9d8f77bbecf4161abe221cfa6cd0c70e8759160e7d1d6f + languageName: node + linkType: hard + "expo-image@npm:~3.0.11": version: 3.0.11 resolution: "expo-image@npm:3.0.11" @@ -10597,6 +11696,23 @@ __metadata: languageName: node linkType: hard +"expo-image@npm:~55.0.4": + version: 55.0.4 + resolution: "expo-image@npm:55.0.4" + dependencies: + sf-symbols-typescript: "npm:^2.2.0" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + react-native-web: "*" + peerDependenciesMeta: + react-native-web: + optional: true + checksum: 10/f41bbd5068a7b8e996198764d161f059322d62f1d1bd45d5d1ac5a3d36a5d16d897d8e556bd66eab0ab55c7331acddeb08740f201394bf996860b4952e605a6f + languageName: node + linkType: hard + "expo-keep-awake@npm:~15.0.8": version: 15.0.8 resolution: "expo-keep-awake@npm:15.0.8" @@ -10607,6 +11723,29 @@ __metadata: languageName: node linkType: hard +"expo-keep-awake@npm:~55.0.4": + version: 55.0.4 + resolution: "expo-keep-awake@npm:55.0.4" + peerDependencies: + expo: "*" + react: "*" + checksum: 10/02c47078b3600be15a59574f4840ba7b9a65c491bd8436e7147d3e02d61993fc14f2ade5897301c18652fb206203001416a1b66242a239ebb9f29519560eae3a + languageName: node + linkType: hard + +"expo-linking@npm:~55.0.6": + version: 55.0.6 + resolution: "expo-linking@npm:55.0.6" + dependencies: + expo-constants: "npm:~55.0.6" + invariant: "npm:^2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/a585771c256eff94bfdcf8a371c55ea8bb821f47d5ed93f82a6ab643bdcbec8e7458bb466215874845e5c5a79dba20a7b5b9a7934068baa89fa294c75a6a2153 + languageName: node + linkType: hard + "expo-linking@npm:~8.0.11": version: 8.0.11 resolution: "expo-linking@npm:8.0.11" @@ -10635,6 +11774,20 @@ __metadata: languageName: node linkType: hard +"expo-modules-autolinking@npm:55.0.7": + version: 55.0.7 + resolution: "expo-modules-autolinking@npm:55.0.7" + dependencies: + "@expo/require-utils": "npm:^55.0.1" + "@expo/spawn-async": "npm:^1.7.2" + chalk: "npm:^4.1.0" + commander: "npm:^7.2.0" + bin: + expo-modules-autolinking: bin/expo-modules-autolinking.js + checksum: 10/cd99467de0e60167b4638475de04891cd5b9cdbfde2491c0721c9306a1a5879a43e713c2471435720e00ab28dd3512a6dba97c9e62d689aaabe674322ac04b5a + languageName: node + linkType: hard + "expo-modules-core@npm:3.0.29": version: 3.0.29 resolution: "expo-modules-core@npm:3.0.29" @@ -10647,6 +11800,84 @@ __metadata: languageName: node linkType: hard +"expo-modules-core@npm:55.0.10": + version: 55.0.10 + resolution: "expo-modules-core@npm:55.0.10" + dependencies: + invariant: "npm:^2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/4b440415ac1e1a2a23514e0c60c8039fcae4ee5fa37fbda09be43f43c9694f18fa97965040139696dc9c6b2339d1baac590006cbce7009eec6643fe165ce2f88 + languageName: node + linkType: hard + +"expo-router@npm:~55.0.0-preview.9": + version: 55.0.4 + resolution: "expo-router@npm:55.0.4" + dependencies: + "@expo/metro-runtime": "npm:^55.0.6" + "@expo/schema-utils": "npm:^55.0.2" + "@radix-ui/react-slot": "npm:^1.2.0" + "@radix-ui/react-tabs": "npm:^1.1.12" + "@react-navigation/bottom-tabs": "npm:^7.10.1" + "@react-navigation/native": "npm:^7.1.28" + "@react-navigation/native-stack": "npm:^7.10.1" + client-only: "npm:^0.0.1" + debug: "npm:^4.3.4" + escape-string-regexp: "npm:^4.0.0" + expo-glass-effect: "npm:^55.0.7" + expo-image: "npm:^55.0.6" + expo-server: "npm:^55.0.6" + expo-symbols: "npm:^55.0.5" + fast-deep-equal: "npm:^3.1.3" + invariant: "npm:^2.2.4" + nanoid: "npm:^3.3.8" + query-string: "npm:^7.1.3" + react-fast-compare: "npm:^3.2.2" + react-native-is-edge-to-edge: "npm:^1.2.1" + semver: "npm:~7.6.3" + server-only: "npm:^0.0.1" + sf-symbols-typescript: "npm:^2.1.0" + shallowequal: "npm:^1.1.0" + use-latest-callback: "npm:^0.2.1" + vaul: "npm:^1.1.2" + peerDependencies: + "@expo/log-box": 55.0.7 + "@expo/metro-runtime": ^55.0.6 + "@react-navigation/drawer": ^7.7.2 + "@testing-library/react-native": ">= 13.2.0" + expo: "*" + expo-constants: ^55.0.7 + expo-linking: ^55.0.7 + 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 + checksum: 10/5a55a1d5d3b06f49386d9b4494a1b7a12d2ec56859cc569836fb6b5ec6195ba42294fc21061981a098225e9cd4b18831d2ab1f9bc489461e38340a78b739b98d + languageName: node + linkType: hard + "expo-router@npm:~6.0.23": version: 6.0.23 resolution: "expo-router@npm:6.0.23" @@ -10716,6 +11947,20 @@ __metadata: languageName: node linkType: hard +"expo-server@npm:^55.0.4": + version: 55.0.4 + resolution: "expo-server@npm:55.0.4" + checksum: 10/3269d29acf41adeaaf38b6a366576fdd4504eef43e880be95543fda3451fd1efa161599e1c401907b42309a8c1db0fdf6b7d9d6b8a89b47802c276d2ca233707 + languageName: node + linkType: hard + +"expo-server@npm:^55.0.6": + version: 55.0.6 + resolution: "expo-server@npm:55.0.6" + checksum: 10/966ce7100313ed7ba2f9298eee14e828f8eac420636d0a1b59f60fd6aecfee205a5eea53883c9fa107b6bda15ab00cf37349c4fabfa7993c3f7b8039978c3318 + languageName: node + linkType: hard + "expo-splash-screen@npm:~31.0.13": version: 31.0.13 resolution: "expo-splash-screen@npm:31.0.13" @@ -10727,6 +11972,17 @@ __metadata: languageName: node linkType: hard +"expo-splash-screen@npm:~55.0.8": + version: 55.0.8 + resolution: "expo-splash-screen@npm:55.0.8" + dependencies: + "@expo/prebuild-config": "npm:^55.0.6" + peerDependencies: + expo: "*" + checksum: 10/b552542443047bb5e1d5dc534defe83dc502d344223302ee7d83700b3cfcdf75769c8e5b1dc85dbe10edb084e32947c54c3df07129f11ee453ad0c473201deee + languageName: node + linkType: hard + "expo-status-bar@npm:~3.0.9": version: 3.0.9 resolution: "expo-status-bar@npm:3.0.9" @@ -10739,6 +11995,33 @@ __metadata: languageName: node linkType: hard +"expo-status-bar@npm:~55.0.3": + version: 55.0.3 + resolution: "expo-status-bar@npm:55.0.3" + dependencies: + react-native-is-edge-to-edge: "npm:^1.2.1" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/e55fa741d675ca0d1a996a2e457df4f9b9d41eae37d06ebba6cd281f87102bb3b8ed558aa5f3a7817292c6697c86f3ae32526164aac06495ab3f566a91b5c165 + languageName: node + linkType: hard + +"expo-symbols@npm:^55.0.5": + version: 55.0.5 + resolution: "expo-symbols@npm:55.0.5" + dependencies: + "@expo-google-fonts/material-symbols": "npm:^0.4.1" + sf-symbols-typescript: "npm:^2.0.0" + peerDependencies: + expo: "*" + expo-font: "*" + react: "*" + react-native: "*" + checksum: 10/992834df221bd792ff251fc622bd5c6ecb3f1c1862a58273c9edef5e9934870c8f53693871a53dff20bc37792cd16e886fc5475e2e98de8955f95bcd825cc61d + languageName: node + linkType: hard + "expo-symbols@npm:~1.0.8": version: 1.0.8 resolution: "expo-symbols@npm:1.0.8" @@ -10751,6 +12034,38 @@ __metadata: languageName: node linkType: hard +"expo-symbols@npm:~55.0.4": + version: 55.0.4 + resolution: "expo-symbols@npm:55.0.4" + dependencies: + "@expo-google-fonts/material-symbols": "npm:^0.4.1" + sf-symbols-typescript: "npm:^2.0.0" + peerDependencies: + expo: "*" + expo-font: "*" + react: "*" + react-native: "*" + checksum: 10/f5350f6124886c4ab2493a2530c2d252998f3098326bfef81e7259336c43382ceab504834dfcd2dcb242dc650df6cf53889cb77b81114918bc8fbd4b537fbc8c + languageName: node + linkType: hard + +"expo-system-ui@npm:~55.0.8": + version: 55.0.8 + resolution: "expo-system-ui@npm:55.0.8" + dependencies: + "@react-native/normalize-colors": "npm:0.83.2" + debug: "npm:^4.3.2" + peerDependencies: + expo: "*" + react-native: "*" + react-native-web: "*" + peerDependenciesMeta: + react-native-web: + optional: true + checksum: 10/646f29e828f4f631aba83b36d86455642397e1a6908c4ebfb71062a90e9b4915154e58fe54b4613bf1268f3bf0027ac2dc9fd66870435ee74681637fcbf41d55 + languageName: node + linkType: hard + "expo-system-ui@npm:~6.0.9": version: 6.0.9 resolution: "expo-system-ui@npm:6.0.9" @@ -10778,6 +12093,16 @@ __metadata: languageName: node linkType: hard +"expo-web-browser@npm:~55.0.8": + version: 55.0.9 + resolution: "expo-web-browser@npm:55.0.9" + peerDependencies: + expo: "*" + react-native: "*" + checksum: 10/0d7edbf9e046fbe98bc74d64c97b94477cde5904338b12356a646f87baafa4bcc59a54fbc88e1f231a08d2819c9149785afe8ecc047ee88ab3aec8f061640b3f + languageName: node + linkType: hard + "expo@npm:~54.0.33": version: 54.0.33 resolution: "expo@npm:54.0.33" @@ -10824,6 +12149,54 @@ __metadata: languageName: node linkType: hard +"expo@npm:~55.0.0-preview.12": + version: 55.0.0-preview.12 + resolution: "expo@npm:55.0.0-preview.12" + dependencies: + "@babel/runtime": "npm:^7.20.0" + "@expo/cli": "npm:55.0.10" + "@expo/config": "npm:~55.0.7" + "@expo/config-plugins": "npm:~55.0.5" + "@expo/devtools": "npm:55.0.2" + "@expo/fingerprint": "npm:0.16.4" + "@expo/local-build-cache-provider": "npm:55.0.5" + "@expo/log-box": "npm:55.0.7" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:55.0.7" + "@expo/vector-icons": "npm:^15.0.2" + "@ungap/structured-clone": "npm:^1.3.0" + babel-preset-expo: "npm:~55.0.6" + expo-asset: "npm:~55.0.6" + expo-constants: "npm:~55.0.6" + expo-file-system: "npm:~55.0.8" + expo-font: "npm:~55.0.4" + expo-keep-awake: "npm:~55.0.4" + expo-modules-autolinking: "npm:55.0.7" + expo-modules-core: "npm:55.0.10" + pretty-format: "npm:^29.7.0" + react-refresh: "npm:^0.14.2" + whatwg-url-minimum: "npm:^0.1.1" + 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 + bin: + expo: bin/cli + expo-modules-autolinking: bin/autolinking + fingerprint: bin/fingerprint + checksum: 10/3c6db567fc1f2a0f4d26004032b6a4dfbd021fc5e09cb2978ab02a56721ac43e005d478a029cd01ee00692aeab5baa1faeb53e7a218b2dc6505781464759dcf2 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.3 resolution: "exponential-backoff@npm:3.1.3" @@ -10940,6 +12313,28 @@ __metadata: languageName: node linkType: hard +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 10/72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 + languageName: node + linkType: hard + +"fbjs@npm:^3.0.4": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + dependencies: + cross-fetch: "npm:^3.1.5" + fbjs-css-vars: "npm:^1.0.0" + loose-envify: "npm:^1.0.0" + object-assign: "npm:^4.1.0" + promise: "npm:^7.1.1" + setimmediate: "npm:^1.0.5" + ua-parser-js: "npm:^1.0.35" + checksum: 10/71252595b00b06fb0475a295c74d81ada1cc499b7e11f2cde51fef04618affa568f5b7f4927f61720c23254b9144be28f8acb2086a5001cf65df8eec87c6ca5c + languageName: node + linkType: hard + "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -10952,6 +12347,13 @@ __metadata: languageName: node linkType: hard +"fetch-nodeshim@npm:^0.4.6": + version: 0.4.8 + resolution: "fetch-nodeshim@npm:0.4.8" + checksum: 10/a478a9af8fb1f1515e8ff1be242d1f8bc96b430cc511c3862f6d76c084b673015b20de709f4e4cfe7ff518eeb958570e6f957a2801367a7991bf32fffe6238b7 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -11783,6 +13185,13 @@ __metadata: languageName: node linkType: hard +"hermes-compiler@npm:0.14.1": + version: 0.14.1 + resolution: "hermes-compiler@npm:0.14.1" + checksum: 10/dbb0f4886532b26262721fa34de5947502b265cea8574f6094915abf59d31c757da6a41730cb6f6d088ec7607d659e8b4036782d227dcf072e9a49152bbef756 + languageName: node + linkType: hard + "hermes-estree@npm:0.28.1": version: 0.28.1 resolution: "hermes-estree@npm:0.28.1" @@ -11804,6 +13213,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.33.3": + version: 0.33.3 + resolution: "hermes-estree@npm:0.33.3" + checksum: 10/dfaac7eb91e282cf04f26c8f557fcadbfb78f630062c7abc1e75b9765918103ebee1359dffbe6c5e42a52c7cee0b14420affda984d534f76ba3d7e8d9ba98215 + languageName: node + linkType: hard + "hermes-parser@npm:0.28.1": version: 0.28.1 resolution: "hermes-parser@npm:0.28.1" @@ -11831,6 +13247,24 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.33.3": + version: 0.33.3 + resolution: "hermes-parser@npm:0.33.3" + dependencies: + hermes-estree: "npm:0.33.3" + checksum: 10/709dac7283a9eab706f3fff5c6f09deee5197a1a38751da66fdf499a307120ba3ef14ce734715430a838145531973a8c0b69874bf5bc615cca10059ee87f5ff3 + languageName: node + linkType: hard + +"hoist-non-react-statics@npm:^3.3.0": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10/1acbe85f33e5a39f90c822ad4d28b24daeb60f71c545279431dc98c312cd28a54f8d64788e477fe21dc502b0e3cf58589ebe5c1ad22af27245370391c2d24ea6 + languageName: node + linkType: hard + "hookable@npm:^6.0.1": version: 6.0.1 resolution: "hookable@npm:6.0.1" @@ -11956,6 +13390,13 @@ __metadata: languageName: node linkType: hard +"hyphenate-style-name@npm:^1.0.3": + version: 1.1.0 + resolution: "hyphenate-style-name@npm:1.1.0" + checksum: 10/b9ed74e29181d96bd58a2d0e62fc4a19879db591dba268275829ff0ae595fcdf11faafaeaa63330a45c3004664d7db1f0fc7cdb372af8ee4615ed8260302c207 + languageName: node + linkType: hard + "iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -12114,6 +13555,15 @@ __metadata: languageName: node linkType: hard +"inline-style-prefixer@npm:^7.0.1": + version: 7.0.1 + resolution: "inline-style-prefixer@npm:7.0.1" + dependencies: + css-in-js-utils: "npm:^3.1.0" + checksum: 10/a430c962693f32a36bcec0124c9798bcf3725bb90468d493108c0242446a9cc92ff1967bdf99b6ce5331e7a9b75e6836bc9ba1b3d4756876b8ef48036acb2509 + languageName: node + linkType: hard + "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -13530,6 +14980,15 @@ __metadata: languageName: node linkType: hard +"lan-network@npm:^0.2.0": + version: 0.2.0 + resolution: "lan-network@npm:0.2.0" + bin: + lan-network: dist/lan-network-cli.js + checksum: 10/221291b52503454b37b0f51670f4b4a2844b727e73a706ce6b5167813ac00d06be333e2a8c6be3dc645222b99cc246d68f59642dd892c80d76bd294802b28f94 + languageName: node + linkType: hard + "launch-editor@npm:^2.9.1": version: 2.12.0 resolution: "launch-editor@npm:2.12.0" @@ -14349,6 +15808,13 @@ __metadata: languageName: node linkType: hard +"memoize-one@npm:^6.0.0": + version: 6.0.0 + resolution: "memoize-one@npm:6.0.0" + checksum: 10/28feaf7e9a870efef1187df110b876ce42deaf86c955f4111d72d23b96e44eed573469316e6ad0d2cc7fa3b1526978215617b126158015f957242c7493babca9 + languageName: node + linkType: hard + "meow@npm:^12.0.1": version: 12.1.1 resolution: "meow@npm:12.1.1" @@ -14382,6 +15848,18 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.83.4": + version: 0.83.4 + resolution: "metro-babel-transformer@npm:0.83.4" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.33.3" + nullthrows: "npm:^1.1.1" + checksum: 10/931bbb895bbf6f9feec6faaac425b7f85365ff9e1c5d2019b3310bc977354b6b804365562071510fbcd9ec079a934ee416cf315d954bb4bb1f31973bfd0e2956 + languageName: node + linkType: hard + "metro-cache-key@npm:0.83.3": version: 0.83.3 resolution: "metro-cache-key@npm:0.83.3" @@ -14391,15 +15869,36 @@ __metadata: languageName: node linkType: hard -"metro-cache@npm:0.83.3": - version: 0.83.3 - resolution: "metro-cache@npm:0.83.3" +"metro-cache-key@npm:0.83.4": + version: 0.83.4 + resolution: "metro-cache-key@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/fb1b3dc077185454dbf981981da98cbf7af9aa16982bac6dac1eec96cf1023cec05985e011ddf15ab47a052f0829070a40450f867964e28bad677d13456a5480 + languageName: node + linkType: hard + +"metro-cache@npm:0.83.3": + version: 0.83.3 + resolution: "metro-cache@npm:0.83.3" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.83.3" + checksum: 10/4bc263ac92f176451710ebd330d156675e40f028be02eb9659a9b024db9897f3ad8510809d699969cb6f06dc0f06d85c38ca7162fb9a70be44510fa03270e089 + languageName: node + linkType: hard + +"metro-cache@npm:0.83.4": + version: 0.83.4 + resolution: "metro-cache@npm:0.83.4" dependencies: exponential-backoff: "npm:^3.1.1" flow-enums-runtime: "npm:^0.0.6" https-proxy-agent: "npm:^7.0.5" - metro-core: "npm:0.83.3" - checksum: 10/4bc263ac92f176451710ebd330d156675e40f028be02eb9659a9b024db9897f3ad8510809d699969cb6f06dc0f06d85c38ca7162fb9a70be44510fa03270e089 + metro-core: "npm:0.83.4" + checksum: 10/0835cfa70dc912e54217eda871aa3610c6731f36d6e8154cdaa148313a3b10b1fdebc1462e51dc94c146a438297f0b3f9627b76ebc19aad79641c669bb564575 languageName: node linkType: hard @@ -14419,6 +15918,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.83.4, metro-config@npm:^0.83.3": + version: 0.83.4 + resolution: "metro-config@npm:0.83.4" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.83.4" + metro-cache: "npm:0.83.4" + metro-core: "npm:0.83.4" + metro-runtime: "npm:0.83.4" + yaml: "npm:^2.6.1" + checksum: 10/2056a0efb7c17ca7fc8bb8c157ff3fef1314ba53c92911aeed12eff362bd3eda3f670d69bdcab1d8fe466a81e750945a4f0cec05e7ab6961edad8f95fdede4c5 + languageName: node + linkType: hard + "metro-core@npm:0.83.3, metro-core@npm:^0.83.1": version: 0.83.3 resolution: "metro-core@npm:0.83.3" @@ -14430,6 +15945,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.83.4, metro-core@npm:^0.83.3": + version: 0.83.4 + resolution: "metro-core@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.83.4" + checksum: 10/de8c156aab7d029547ae72f707c3a4943138044b9ed28fb10461869d4eb5bcb8a099c3c4073f2f50ec34b33aca989ce6056ff876297b5c69a12b8c73effac8bb + languageName: node + linkType: hard + "metro-file-map@npm:0.83.3": version: 0.83.3 resolution: "metro-file-map@npm:0.83.3" @@ -14447,6 +15973,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.83.4": + version: 0.83.4 + resolution: "metro-file-map@npm:0.83.4" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/afb9f03aba8e0b2a97e3594aa88101a3fae360efdd003675dce07322f0d672f0f3256b71cf20dfffd556cc898fbf2d0eeba3555003e36922a988c50b0d62de41 + languageName: node + linkType: hard + "metro-minify-terser@npm:0.83.3": version: 0.83.3 resolution: "metro-minify-terser@npm:0.83.3" @@ -14457,6 +16000,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.83.4": + version: 0.83.4 + resolution: "metro-minify-terser@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/3e3c7da77e1c8b256f2fc4a4db2f0db6227ef094297d6c57d67fa9d89cfe559867fa733b4d0373112a9a7ae9255a435943fb9755e4e4dcaaacbf85e1c690c27d + languageName: node + linkType: hard + "metro-resolver@npm:0.83.3": version: 0.83.3 resolution: "metro-resolver@npm:0.83.3" @@ -14466,6 +16019,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.83.4": + version: 0.83.4 + resolution: "metro-resolver@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/4b51bc061a712cc0f79172cdaeef7eae4c7e1b4a38468df4a7d1a7fc76bc6669b0abc9a98a41ed25102efe04502ec5eb65f9112ed0d6d809f7a05f723f15bebf + languageName: node + linkType: hard + "metro-runtime@npm:0.83.3, metro-runtime@npm:^0.83.1": version: 0.83.3 resolution: "metro-runtime@npm:0.83.3" @@ -14476,6 +16038,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.83.4, metro-runtime@npm:^0.83.3": + version: 0.83.4 + resolution: "metro-runtime@npm:0.83.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/2f518a73bcdfea680499515e7dff5a5e7a69a3c0fdd980014d31acda8705d72456aa9f325ae250c782bceab4c37a139b1e5f417ad57b8a5b36dddb25dc8f5699 + languageName: node + linkType: hard + "metro-source-map@npm:0.83.3, metro-source-map@npm:^0.83.1": version: 0.83.3 resolution: "metro-source-map@npm:0.83.3" @@ -14494,6 +16066,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.83.4, metro-source-map@npm:^0.83.3": + version: 0.83.4 + resolution: "metro-source-map@npm:0.83.4" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.83.4" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.83.4" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/9e634269e8d20e335b4e31a1bdf94dd3537f33722d80994c6356ab7a976dfc44cfc8389637e116b218b30b7823d4b4ddfbd4cbbb363aead146a010c31110d484 + languageName: node + linkType: hard + "metro-symbolicate@npm:0.83.3": version: 0.83.3 resolution: "metro-symbolicate@npm:0.83.3" @@ -14510,6 +16099,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.83.4": + version: 0.83.4 + resolution: "metro-symbolicate@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.83.4" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/671b7046969a6878a6eea0199a753ed52f9159da6726eccf018a2723aae169e877caa63a83897f9206e288bbc40d7306c4331a2287b6412ab5f973434a1f1019 + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-plugins@npm:0.83.3" @@ -14524,6 +16129,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.83.4": + version: 0.83.4 + resolution: "metro-transform-plugins@npm:0.83.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/613a9c30bda3221b6fe113b0136c0047ab68c8e87fc0f38d7d7ee7c570a7f3e2866c923aaf9bf1230ed46918bfd1763898ff82225be1a765e7d2b8b0676594af + languageName: node + linkType: hard + "metro-transform-worker@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-worker@npm:0.83.3" @@ -14545,6 +16164,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.83.4": + version: 0.83.4 + resolution: "metro-transform-worker@npm:0.83.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.83.4" + metro-babel-transformer: "npm:0.83.4" + metro-cache: "npm:0.83.4" + metro-cache-key: "npm:0.83.4" + metro-minify-terser: "npm:0.83.4" + metro-source-map: "npm:0.83.4" + metro-transform-plugins: "npm:0.83.4" + nullthrows: "npm:^1.1.1" + checksum: 10/99269c498d95a68815d28e5d9e14eed25e4ac59014c1891c50bbcd10ee6700b69c796c375cba95669b448d2faa8786ca0a5237dd9c9c865f51b554510f95f775 + languageName: node + linkType: hard + "metro@npm:0.83.3, metro@npm:^0.83.1": version: 0.83.3 resolution: "metro@npm:0.83.3" @@ -14595,6 +16235,56 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.83.4, metro@npm:^0.83.3": + version: 0.83.4 + resolution: "metro@npm:0.83.4" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.33.3" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.83.4" + metro-cache: "npm:0.83.4" + metro-cache-key: "npm:0.83.4" + metro-config: "npm:0.83.4" + metro-core: "npm:0.83.4" + metro-file-map: "npm:0.83.4" + metro-resolver: "npm:0.83.4" + metro-runtime: "npm:0.83.4" + metro-source-map: "npm:0.83.4" + metro-symbolicate: "npm:0.83.4" + metro-transform-plugins: "npm:0.83.4" + metro-transform-worker: "npm:0.83.4" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/9986b40bca503d97c270e3821bd2786d51de1f8f4759d5fec9b8454ea8f46f6d5769324ad2c05df0faef9379831f17e1a1f7f07e81e7821610521e5d47d1c5e1 + languageName: node + linkType: hard + "micromark-core-commonmark@npm:^2.0.0": version: 2.0.3 resolution: "micromark-core-commonmark@npm:2.0.3" @@ -15049,7 +16739,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": version: 1.54.0 resolution: "mime-db@npm:1.54.0" checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 @@ -15065,6 +16755,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10/9db0ad31f5eff10ee8f848130779b7f2d056ddfdb6bda696cb69be68d486d33a3457b4f3f9bdeb60d0736edb471bd5a7c0a384375c011c51c889fd0d5c3b893e + languageName: node + linkType: hard + "mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -15253,6 +16952,13 @@ __metadata: languageName: node linkType: hard +"multitars@npm:^0.2.3": + version: 0.2.4 + resolution: "multitars@npm:0.2.4" + checksum: 10/20a9f234e8789bd9456f2133fd770642708c016428e8953e9f5ea62e1c8fa00b505e6d8ff1d7b9d8e44bf93163da6ec239e1b30bbab065a2100f61e72b8313b5 + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -15475,7 +17181,16 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"ob1@npm:0.83.4": + version: 0.83.4 + resolution: "ob1@npm:0.83.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/418eb2c819c6af464b20525f309eb49c0ac69ae43c4476b147cf1d1db4103c0c77b79bd420f3ba382c608d60c969e7da23228c6bf16bf241a15cf7aaf3becd11 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -16137,6 +17852,13 @@ __metadata: languageName: node linkType: hard +"postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10/e4e4486f33b3163a606a6ed94f9c196ab49a37a7a7163abfcd469e5f113210120d70b8dd5e33d64636f41ad52316a3725655421eb9a1094f1bcab1db2f555c62 + languageName: node + linkType: hard + "postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" @@ -16260,6 +17982,15 @@ __metadata: languageName: node linkType: hard +"promise@npm:^7.1.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: "npm:~2.0.3" + checksum: 10/37dbe58ca7b0716cc881f0618128f1fd6ff9c46cdc529a269fd70004e567126a449a94e9428e2d19b53d06182d11b45d0c399828f103e06b2bb87643319bd2e7 + languageName: node + linkType: hard + "promise@npm:^8.3.0": version: 8.3.0 resolution: "promise@npm:8.3.0" @@ -16468,6 +18199,17 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:19.2.0": + version: 19.2.0 + resolution: "react-dom@npm:19.2.0" + dependencies: + scheduler: "npm:^0.27.0" + peerDependencies: + react: ^19.2.0 + checksum: 10/3dbba071b9b1e7a19eae55f05c100f6b44f88c0aee72397d719ae338248ca66ed5028e6964c1c14870cc3e1abcecc91b22baba6dc2072f819dea81a9fd72f2fd + languageName: node + linkType: hard + "react-dom@npm:^19.2.3": version: 19.2.3 resolution: "react-dom@npm:19.2.3" @@ -16495,7 +18237,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf @@ -16565,7 +18307,21 @@ __metadata: languageName: node linkType: hard -"react-native-is-edge-to-edge@npm:^1.1.6, react-native-is-edge-to-edge@npm:^1.2.1": +"react-native-gesture-handler@npm:~2.30.0": + version: 2.30.0 + resolution: "react-native-gesture-handler@npm:2.30.0" + dependencies: + "@egjs/hammerjs": "npm:^2.0.17" + hoist-non-react-statics: "npm:^3.3.0" + invariant: "npm:^2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/242b1eb29202bc9fc7bf0271c3da102559adc9f2810441465b6d78c1a8ed8f65bdd91335957c841a4716f796be3e7b87d1d55629d6803ea12e1be832d89c946c + languageName: node + linkType: hard + +"react-native-is-edge-to-edge@npm:1.2.1, react-native-is-edge-to-edge@npm:^1.1.6, react-native-is-edge-to-edge@npm:^1.2.1": version: 1.2.1 resolution: "react-native-is-edge-to-edge@npm:1.2.1" peerDependencies: @@ -16600,7 +18356,21 @@ __metadata: languageName: node linkType: hard -"react-native-safe-area-context@npm:^5.6.2, react-native-safe-area-context@npm:~5.6.0": +"react-native-reanimated@npm:~4.2.1": + version: 4.2.2 + resolution: "react-native-reanimated@npm:4.2.2" + dependencies: + react-native-is-edge-to-edge: "npm:1.2.1" + semver: "npm:7.7.3" + peerDependencies: + react: "*" + react-native: "*" + react-native-worklets: ">=0.7.0" + checksum: 10/2ad24cc827aaabb54c18d75a4ab98b92a25dd57c05bfabb886341c0e62d8efc5d5973f415cb1da2ecab9ebe077bec1179b91c681de90e124dbf1160a418ee29d + languageName: node + linkType: hard + +"react-native-safe-area-context@npm:^5.6.2, react-native-safe-area-context@npm:~5.6.0, react-native-safe-area-context@npm:~5.6.2": version: 5.6.2 resolution: "react-native-safe-area-context@npm:5.6.2" peerDependencies: @@ -16637,6 +18407,38 @@ __metadata: languageName: node linkType: hard +"react-native-screens@npm:~4.23.0": + version: 4.23.0 + resolution: "react-native-screens@npm:4.23.0" + dependencies: + react-freeze: "npm:^1.0.0" + warn-once: "npm:^0.1.0" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/cb8cc1c18c8d340f53a34a15e84ad6a3bd0ee43384d712a9e4c2a8257428c129c9bae0900ab86f64a4ebdc27684e6b12be9064a410e8f54c7a649534f12a9d76 + languageName: node + linkType: hard + +"react-native-web@npm:~0.21.0": + version: 0.21.2 + resolution: "react-native-web@npm:0.21.2" + dependencies: + "@babel/runtime": "npm:^7.18.6" + "@react-native/normalize-colors": "npm:^0.74.1" + fbjs: "npm:^3.0.4" + inline-style-prefixer: "npm:^7.0.1" + memoize-one: "npm:^6.0.0" + nullthrows: "npm:^1.1.1" + postcss-value-parser: "npm:^4.2.0" + styleq: "npm:^0.1.3" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/32f785541660c25326d6ef863afb7b07259b884c2faf083b2d9ea44677bf2423a5b805478f83531be7c9b0260d98997def720000c033d178fd55fecfe6336211 + languageName: node + linkType: hard + "react-native-worklets@npm:0.5.1": version: 0.5.1 resolution: "react-native-worklets@npm:0.5.1" @@ -16660,6 +18462,29 @@ __metadata: languageName: node linkType: hard +"react-native-worklets@npm:0.7.2": + version: 0.7.2 + resolution: "react-native-worklets@npm:0.7.2" + dependencies: + "@babel/plugin-transform-arrow-functions": "npm:7.27.1" + "@babel/plugin-transform-class-properties": "npm:7.27.1" + "@babel/plugin-transform-classes": "npm:7.28.4" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:7.27.1" + "@babel/plugin-transform-template-literals": "npm:7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:7.27.1" + "@babel/preset-typescript": "npm:7.27.1" + convert-source-map: "npm:2.0.0" + semver: "npm:7.7.3" + peerDependencies: + "@babel/core": "*" + react: "*" + react-native: "*" + checksum: 10/4bc9b71a3a63f589da6f9bc7d889218f4a0e8d80737fb79e9e78298924774a99db254089428a877b0f1e434acdd00099a86a2424f33bf908283eb1b60adaea0e + languageName: node + linkType: hard + "react-native@npm:0.81.5": version: 0.81.5 resolution: "react-native@npm:0.81.5" @@ -16761,6 +18586,57 @@ __metadata: languageName: node linkType: hard +"react-native@npm:0.83.2": + version: 0.83.2 + resolution: "react-native@npm:0.83.2" + dependencies: + "@jest/create-cache-key-function": "npm:^29.7.0" + "@react-native/assets-registry": "npm:0.83.2" + "@react-native/codegen": "npm:0.83.2" + "@react-native/community-cli-plugin": "npm:0.83.2" + "@react-native/gradle-plugin": "npm:0.83.2" + "@react-native/js-polyfills": "npm:0.83.2" + "@react-native/normalize-colors": "npm:0.83.2" + "@react-native/virtualized-lists": "npm:0.83.2" + abort-controller: "npm:^3.0.0" + anser: "npm:^1.4.9" + ansi-regex: "npm:^5.0.0" + babel-jest: "npm:^29.7.0" + babel-plugin-syntax-hermes-parser: "npm:0.32.0" + base64-js: "npm:^1.5.1" + commander: "npm:^12.0.0" + flow-enums-runtime: "npm:^0.0.6" + glob: "npm:^7.1.1" + hermes-compiler: "npm:0.14.1" + invariant: "npm:^2.2.4" + jest-environment-node: "npm:^29.7.0" + memoize-one: "npm:^5.0.0" + metro-runtime: "npm:^0.83.3" + metro-source-map: "npm:^0.83.3" + nullthrows: "npm:^1.1.1" + pretty-format: "npm:^29.7.0" + promise: "npm:^8.3.0" + react-devtools-core: "npm:^6.1.5" + react-refresh: "npm:^0.14.0" + regenerator-runtime: "npm:^0.13.2" + scheduler: "npm:0.27.0" + semver: "npm:^7.1.3" + stacktrace-parser: "npm:^0.1.10" + whatwg-fetch: "npm:^3.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + peerDependencies: + "@types/react": ^19.1.1 + react: ^19.2.0 + peerDependenciesMeta: + "@types/react": + optional: true + bin: + react-native: cli.js + checksum: 10/415d10079de4b21608b303809c938154fcd55731204827c34334d331acd8edb0162b72ee146ee61202ecdd2a0c6a5d4e9b35dc82e39a22cd8ff870a2f6b4ac1c + languageName: node + linkType: hard + "react-reconciler@npm:0.33.0": version: 0.33.0 resolution: "react-reconciler@npm:0.33.0" @@ -16891,6 +18767,13 @@ __metadata: languageName: node linkType: hard +"react@npm:19.2.0": + version: 19.2.0 + resolution: "react@npm:19.2.0" + checksum: 10/e13bcdb8e994c3cfa922743cb75ca8deb60531bf02f584d2d8dab940a8132ce8a2e6ef16f8ed7f372b4072e7a7eeff589b2812dabbedfa73e6e46201dac8a9d0 + languageName: node + linkType: hard + "react@npm:^19.2.3": version: 19.2.3 resolution: "react@npm:19.2.3" @@ -17586,7 +19469,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.27.0": +"scheduler@npm:0.27.0, scheduler@npm:^0.27.0": version: 0.27.0 resolution: "scheduler@npm:0.27.0" checksum: 10/eab3c3a8373195173e59c147224fc30dabe6dd453f248f5e610e8458512a5a2ee3a06465dc400ebfe6d35c9f5b7f3bb6b2e41c88c86fd177c25a73e7286a1e06 @@ -17630,21 +19513,21 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" +"semver@npm:7.7.3, semver@npm:^7.1.3, semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: 10/1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e + checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 languageName: node linkType: hard -"semver@npm:^7.1.3, semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": - version: 7.7.3 - resolution: "semver@npm:7.7.3" +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: semver: bin/semver.js - checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 + checksum: 10/1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e languageName: node linkType: hard @@ -17755,6 +19638,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10/76e3f5d7f4b581b6100ff819761f04a984fa3f3990e72a6554b57188ded53efce2d3d6c0932c10f810b7c59414f85e2ab3c11521877d1dea1ce0b56dc906f485 + languageName: node + linkType: hard + "setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -17762,7 +19652,7 @@ __metadata: languageName: node linkType: hard -"sf-symbols-typescript@npm:^2.0.0, sf-symbols-typescript@npm:^2.1.0": +"sf-symbols-typescript@npm:^2.0.0, sf-symbols-typescript@npm:^2.1.0, sf-symbols-typescript@npm:^2.2.0": version: 2.2.0 resolution: "sf-symbols-typescript@npm:2.2.0" checksum: 10/8623e148bf86151692d3ccb3149122c091b256162a39f4c4f78472811ffe92e3c77a83841a7381a5dc0bc6505ebb73e7ca8901cb077004872d7ee1cb4e5be9d4 @@ -18387,6 +20277,13 @@ __metadata: languageName: node linkType: hard +"styleq@npm:^0.1.3": + version: 0.1.3 + resolution: "styleq@npm:0.1.3" + checksum: 10/9a75a1b635f8ebf5c0fdc3ffb56f466254f29aa1b2962ab2af776015d3b3bb1732a53edcda0c9ac9b97be96c22459db768feac0d61c1a319cc3954011ca9dcd8 + languageName: node + linkType: hard + "sucrase@npm:~3.35.1": version: 3.35.1 resolution: "sucrase@npm:3.35.1" @@ -18641,6 +20538,13 @@ __metadata: languageName: node linkType: hard +"toqr@npm:^0.1.1": + version: 0.1.1 + resolution: "toqr@npm:0.1.1" + checksum: 10/b75da11ce8bf645f805c43fc8a2ea6dfe5e7d2da9a751404deb72d48def027abccdf4ea3af5dce771852717f5c2c5d2eb7fdee246566eccbdab9b86a98ba9100 + languageName: node + linkType: hard + "touch@npm:^3.1.0": version: 3.1.1 resolution: "touch@npm:3.1.1" @@ -18985,6 +20889,24 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^0.7.33": + version: 0.7.41 + resolution: "ua-parser-js@npm:0.7.41" + bin: + ua-parser-js: script/cli.js + checksum: 10/e41306332d8ace098d51a644a3ba95522ddfc04243727a3c0419efcdf486c8f868c3af8e6a56f6aa86bdc26e6b893abb0b2bde0c9e1a1625a183dfdf839cac82 + languageName: node + linkType: hard + +"ua-parser-js@npm:^1.0.35": + version: 1.0.41 + resolution: "ua-parser-js@npm:1.0.41" + bin: + ua-parser-js: script/cli.js + checksum: 10/86f2b624ff13f5be86a7cc5172427960493c8c0f703fdc8de340d8701951a1478cdf7a76f1f510932bb25a2fce6a3e0ba750b631f026d85acdc6b2a6b0ba6138 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -19638,6 +21560,13 @@ __metadata: languageName: node linkType: hard +"whatwg-url-minimum@npm:^0.1.1": + version: 0.1.1 + resolution: "whatwg-url-minimum@npm:0.1.1" + checksum: 10/96d06b1ad60bd8e0eb134a4741e244ee91030edb59fd0bcc01a808daeb0110d84eee92c8bc462a2675be82ecac33ec560a28429bb4fec3587846b58388351bf7 + languageName: node + linkType: hard + "whatwg-url-without-unicode@npm:8.0.0-3": version: 8.0.0-3 resolution: "whatwg-url-without-unicode@npm:8.0.0-3" @@ -20038,7 +21967,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.23.8": +"zod@npm:^3.23.8, zod@npm:^3.25.76": version: 3.25.76 resolution: "zod@npm:3.25.76" checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995