From 6742b8b277863b206737928caf5189d4107f38a6 Mon Sep 17 00:00:00 2001 From: Gabriel Taveira Date: Mon, 27 Jul 2026 02:35:46 -0300 Subject: [PATCH 01/12] build(deps): adopt the magic tooling packages and pnpm 11 Swaps oxlint 1.64 / oxfmt 0.49 for the pinned 1.75.0 / 0.60.0 the shared configs are built against, adds magic-oxlint-config, magic-oxfmt-config, magic-tsconfig and magic-codemods, and moves packageManager to pnpm 11.17.0. pnpm 11 no longer reads the "pnpm" key in package.json, so overrides, patchedDependencies and supportedArchitectures move to pnpm-workspace.yaml together with the two .npmrc settings. It also fails the install outright on unapproved dependency build scripts, hence the allowBuilds block, and refuses to resolve packages published less than 24h ago, hence minimumReleaseAgeExclude for the magic-* releases. Claude-Session: https://claude.ai/code/session_01Fe92vvdc4R3F4BDBFoLcw1 --- .npmrc | 2 - package.json | 58 +- pnpm-lock.yaml | 2998 +++++++++++++++++++++++++------------------ pnpm-workspace.yaml | 77 ++ 4 files changed, 1844 insertions(+), 1291 deletions(-) delete mode 100644 .npmrc diff --git a/.npmrc b/.npmrc deleted file mode 100644 index f8915f6..0000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -node-linker=hoisted -dedupe-direct-deps=true \ No newline at end of file diff --git a/package.json b/package.json index a464806..de137be 100644 --- a/package.json +++ b/package.json @@ -29,58 +29,14 @@ }, "devDependencies": { "dotenv-cli": "^7.4.4", - "oxfmt": "0.49.0", - "oxlint": "1.64.0", + "magic-codemods": "^1.0.0", + "magic-oxfmt-config": "^1.0.0", + "magic-oxlint-config": "^1.0.0", + "magic-tsconfig": "^1.0.0", + "oxfmt": "0.60.0", + "oxlint": "1.75.0", "turbo": "^2.9.12", "typescript": "^5.4.5" }, - "packageManager": "pnpm@9.6.0", - "pnpm": { - "supportedArchitectures": { - "os": [ - "win32", - "darwin", - "current" - ], - "cpu": [ - "x64", - "arm64" - ] - }, - "patchedDependencies": { - "react-native-draggable-grid@2.2.1": "patches/react-native-draggable-grid@2.2.1.patch", - "styled-components@6.1.11": "patches/styled-components@6.1.11.patch", - "redux-saga@1.3.0": "patches/redux-saga@1.3.0.patch", - "minimatch@3.1.5": "patches/minimatch@3.1.5.patch", - "minimatch@9.0.9": "patches/minimatch@9.0.9.patch" - }, - "overrides": { - "@react-native-async-storage/async-storage": "2.2.0", - "react-native-svg": "15.15.3", - "@xmldom/xmldom": "^0.8.13", - "brace-expansion": "^5.0.8", - "braces": "^3.0.3", - "diff@4": "^4.0.4", - "esbuild": "^0.28.1", - "fast-uri": "^3.1.4", - "fast-xml-parser": "^5.7.0", - "form-data": "^4.0.6", - "image-size@1": "^1.2.1", - "js-yaml@3": "^3.15.0", - "js-yaml@4": "^4.3.0", - "mdast-util-to-hast": "^13.2.1", - "micromatch": "^4.0.8", - "minimatch@3": "^3.1.4", - "minimatch@9": "^9.0.7", - "on-headers": "^1.1.0", - "picomatch@2": "^2.3.2", - "postcss": "^8.5.18", - "sharp": "^0.35.3", - "shell-quote": "^1.9.0", - "svgo@3": "^3.3.4", - "uuid": "^11.1.1", - "ws@7": "^7.5.11", - "ws@8": "^8.21.0" - } - } + "packageManager": "pnpm@11.17.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d98531b..cfa2e04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,21 +33,11 @@ overrides: ws@8: ^8.21.0 patchedDependencies: - minimatch@3.1.5: - hash: anzpumbibnypkm6xefxwimexay - path: patches/minimatch@3.1.5.patch - minimatch@9.0.9: - hash: keuwdskl3w6bv76exewvpi5lxe - path: patches/minimatch@9.0.9.patch - react-native-draggable-grid@2.2.1: - hash: v6ayathkzbndn3dcqvsojpmote - path: patches/react-native-draggable-grid@2.2.1.patch - redux-saga@1.3.0: - hash: fuqywzq4jqd6wsmilvg6dhxzpi - path: patches/redux-saga@1.3.0.patch - styled-components@6.1.11: - hash: 7pi476ptgmafuuvkxpwgjc6kq4 - path: patches/styled-components@6.1.11.patch + minimatch@3.1.5: 476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1 + minimatch@9.0.9: 291dd2efac7e5cd6b31364c2548f9e97e74ae39487476509acbf3218cea1b813 + react-native-draggable-grid@2.2.1: b76c67d70eda667cbfa38d0a069bf76d77375bb01a3b87e60be4ff809a0877a2 + redux-saga@1.3.0: 8c7f7d64fa347d148c073162a8afd0e421c019bb94193fd3f29bccc3024e9a66 + styled-components@6.1.11: f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638 importers: @@ -56,12 +46,24 @@ importers: dotenv-cli: specifier: ^7.4.4 version: 7.4.4 + magic-codemods: + specifier: ^1.0.0 + version: 1.0.0 + magic-oxfmt-config: + specifier: ^1.0.0 + version: 1.0.0(oxfmt@0.60.0) + magic-oxlint-config: + specifier: ^1.0.0 + version: 1.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1))(oxlint@1.75.0) + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 oxfmt: - specifier: 0.49.0 - version: 0.49.0 + specifier: 0.60.0 + version: 0.60.0 oxlint: - specifier: 1.64.0 - version: 1.64.0 + specifier: 1.75.0 + version: 1.75.0 turbo: specifier: ^2.9.12 version: 2.9.14 @@ -76,10 +78,10 @@ importers: version: 55.0.5 '@expo/metro-runtime': specifier: ~55.0.11 - version: 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@gorhom/bottom-sheet': specifier: ^5.2.14 - version: 5.2.14(@types/react-native@0.70.19)(@types/react@19.2.17)(react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 5.2.14(cc43a45343e0aaaaddd4d7aa33837760) '@hookform/resolvers': specifier: ^3.9.0 version: 3.9.0(react-hook-form@7.52.2(react@19.2.0)) @@ -88,28 +90,28 @@ importers: version: link:../../packages/shared '@ptomasroos/react-native-multi-slider': specifier: ^2.2.2 - version: 2.2.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 2.2.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@react-native-anywhere/polyfill-base64': specifier: 0.0.1-alpha.0 version: 0.0.1-alpha.0 '@react-native-async-storage/async-storage': specifier: 2.2.0 - version: 2.2.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 2.2.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) '@react-native-community/netinfo': specifier: 11.5.2 - version: 11.5.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 11.5.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@react-navigation/elements': specifier: ^2.9.18 - version: 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@react-navigation/native': specifier: ^7.2.4 - version: 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@reduxjs/toolkit': specifier: ^2.2.7 version: 2.2.7(react-redux@9.1.2(@types/react@19.2.17)(react@19.2.0)(redux@5.0.1))(react@19.2.0) '@shopify/flash-list': specifier: 2.0.2 - version: 2.0.2(@babel/runtime@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 2.0.2(@babel/runtime@7.29.7)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@styled/typescript-styled-plugin': specifier: ^1.0.1 version: 1.0.1 @@ -133,97 +135,97 @@ importers: version: 3.6.0 expo: specifier: ^55.0.24 - version: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + version: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-application: specifier: ~55.0.16 - version: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.16(expo@55.0.24) expo-asset: specifier: ~55.0.17 - version: 55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + version: 55.0.17(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-blur: specifier: ~55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-build-properties: specifier: ~55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.14(expo@55.0.24) expo-constants: specifier: ~55.0.16 - version: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) expo-crypto: specifier: ~55.0.15 - version: 55.0.15(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.15(expo@55.0.24) expo-device: specifier: ~55.0.18 - version: 55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.18(expo@55.0.24) expo-file-system: specifier: ~55.0.23 - version: 55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) expo-font: specifier: ~55.0.7 - version: 55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-glass-effect: specifier: ~55.0.11 - version: 55.0.11(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.11(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-haptics: specifier: ~55.0.15 - version: 55.0.15(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.15(expo@55.0.24) expo-image: specifier: ~55.0.10 - version: 55.0.10(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.10(expo@55.0.24)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-image-manipulator: specifier: ^55.0.16 - version: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.16(expo@55.0.24) expo-image-picker: specifier: ~55.0.20 - version: 55.0.20(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.20(expo@55.0.24) expo-insights: specifier: ^55.0.17 - version: 55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.17(expo@55.0.24) expo-linear-gradient: specifier: ~55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-linking: specifier: ~55.0.15 - version: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) expo-localization: specifier: ~55.0.16 - version: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0) + version: 55.0.16(expo@55.0.24)(react@19.2.0) expo-location: specifier: ~55.1.10 - version: 55.1.10(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) + version: 55.1.10(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) expo-notifications: specifier: ^55.0.23 - version: 55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + version: 55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-quick-actions: specifier: ^6.0.2 - version: 6.0.2(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) + version: 6.0.2(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) expo-router: specifier: ^55.0.14 - version: 55.0.14(lw7znn4muny63e22tia4nt7rje) + version: 55.0.14(cda63964b4377ec86701fe3437763bb4) expo-secure-store: specifier: ^55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 55.0.14(expo@55.0.24) expo-splash-screen: specifier: ~55.0.21 - version: 55.0.21(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) + version: 55.0.21(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) expo-status-bar: specifier: ~55.0.6 - version: 55.0.6(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.6(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-store-review: specifier: ~55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) expo-system-ui: specifier: ~55.0.18 - version: 55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.18(expo@55.0.24)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) expo-tracking-transparency: specifier: ~55.0.14 - version: 55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) expo-updates: specifier: ~55.0.22 - version: 55.0.22(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 55.0.22(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) expo-web-browser: specifier: ~55.0.16 - version: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) i18next: specifier: ^23.12.2 version: 23.12.2 @@ -238,13 +240,13 @@ importers: version: 4.18.1 lottie-react-native: specifier: 7.3.8 - version: 7.3.8(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 7.3.8(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) posthog-react-native: specifier: ^4.54.4 - version: 4.54.4(5vspvbqys4mpwu3duw7ly5vpve) + version: 4.54.4(dd0719650ac7408b8594bb3923b10638) posthog-react-native-session-replay: specifier: ^1.6.0 - version: 1.6.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 1.6.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) prop-types: specifier: ^15.8.1 version: 15.8.1 @@ -262,52 +264,52 @@ importers: version: 7.52.2(react@19.2.0) react-i18next: specifier: ^15.0.0 - version: 15.0.0(i18next@23.12.2)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 15.0.0(i18next@23.12.2)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native: specifier: 0.83.6 - version: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + version: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) react-native-draggable-grid: specifier: ^2.2.1 - version: 2.2.1(patch_hash=v6ayathkzbndn3dcqvsojpmote)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 2.2.1(patch_hash=b76c67d70eda667cbfa38d0a069bf76d77375bb01a3b87e60be4ff809a0877a2)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-gesture-handler: specifier: ~2.30.1 - version: 2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 2.30.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-get-random-values: specifier: ^1.11.0 - version: 1.11.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + version: 1.11.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) react-native-google-mobile-ads: specifier: ^14.2.1 - version: 14.2.1(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0) + version: 14.2.1(expo@55.0.24)(react@19.2.0) react-native-magic-modal: specifier: ^7.0.2 - version: 7.0.2(jqag6joy54stcznur2ncimavde) + version: 7.0.2(b96d8217212b0fc32ef895954de141dd) react-native-magic-toast: specifier: ^0.3.1 - version: 0.3.1(react-native-magic-modal@7.0.2(jqag6joy54stcznur2ncimavde))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 0.3.1(react-native-magic-modal@7.0.2(b96d8217212b0fc32ef895954de141dd))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-maps: specifier: 1.27.2 - version: 1.27.2(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 1.27.2(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-mime-types: specifier: ^2.5.0 version: 2.5.0 react-native-purchases: specifier: ^8.12.0 - version: 8.12.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 8.12.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-reanimated: specifier: 4.3.1 - version: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-safe-area-context: specifier: 5.6.2 - version: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-screens: specifier: ~4.23.0 - version: 4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 4.23.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-svg: specifier: 15.15.3 - version: 15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + version: 15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-svg-transformer: specifier: ^1.5.0 - version: 1.5.0(react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(typescript@5.4.5) + version: 1.5.0(react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.4.5) react-native-web: specifier: ~0.21.2 version: 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -322,13 +324,13 @@ importers: version: 5.0.1 redux-saga: specifier: ^1.3.0 - version: 1.3.0(patch_hash=fuqywzq4jqd6wsmilvg6dhxzpi) + version: 1.3.0(patch_hash=8c7f7d64fa347d148c073162a8afd0e421c019bb94193fd3f29bccc3024e9a66) reselect: specifier: ^5.1.1 version: 5.1.1 styled-components: specifier: 6.1.11 - version: 6.1.11(patch_hash=7pi476ptgmafuuvkxpwgjc6kq4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 6.1.11(patch_hash=f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) superjson: specifier: ^2.2.6 version: 2.2.6 @@ -344,10 +346,10 @@ importers: devDependencies: '@babel/core': specifier: ^7.29.0 - version: 7.29.7 + version: 7.29.7(supports-color@8.1.1) '@bacons/apple-targets': specifier: ^4.0.7 - version: 4.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + version: 4.0.7(expo@55.0.24)(supports-color@8.1.1) '@pegada/api': specifier: workspace:* version: link:../../packages/api @@ -380,25 +382,25 @@ importers: version: 18.3.0 babel-jest: specifier: ^29.7.0 - version: 29.7.0(@babel/core@7.29.7) + version: 29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-styled-components: specifier: ^2.1.4 - version: 2.1.4(@babel/core@7.29.7)(styled-components@6.1.11(patch_hash=7pi476ptgmafuuvkxpwgjc6kq4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 2.1.4(@babel/core@7.29.7(supports-color@8.1.1))(styled-components@6.1.11(patch_hash=f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(supports-color@8.1.1) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + version: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) apps/nextjs: dependencies: '@mdx-js/loader': specifier: ^3.1.1 - version: 3.1.1 + version: 3.1.1(supports-color@8.1.1) '@mdx-js/react': specifier: ^3.1.1 version: 3.1.1(@types/react@19.2.17)(react@19.2.0) '@next/mdx': specifier: ^15.5.20 - version: 15.5.20(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.0)) + version: 15.5.20(@mdx-js/loader@3.1.1(supports-color@8.1.1))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.0)) '@pegada/api': specifier: workspace:* version: link:../../packages/api @@ -410,7 +412,7 @@ importers: version: link:../../packages/shared '@tailwindcss/typography': specifier: ^0.5.19 - version: 0.5.19(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5))) + version: 0.5.19(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5))) '@types/mdx': specifier: ^2.0.13 version: 2.0.13 @@ -422,7 +424,7 @@ importers: version: 1.38.0 '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(next@15.5.22(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + version: 1.6.1(next@15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) '@vercel/functions': specifier: ^3.7.5 version: 3.7.5(@aws-sdk/credential-provider-web-identity@3.972.42)(ws@8.21.1) @@ -449,13 +451,13 @@ importers: version: 0.424.0(react@19.2.0) next: specifier: 15.5.22 - version: 15.5.22(@babel/core@7.29.7)(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.13.1 - version: 4.13.1(next@15.5.22(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + version: 4.13.1(next@15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.4.5) next-mdx-remote: specifier: ^6.0.0 - version: 6.0.0(@types/react@19.2.17)(react@19.2.0) + version: 6.0.0(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) postcss: specifier: ^8.5.18 version: 8.5.23 @@ -473,10 +475,10 @@ importers: version: 2.4.0 tailwindcss: specifier: 3.4.7 - version: 3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5))) + version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5))) typescript: specifier: '*' version: 5.4.5 @@ -546,7 +548,7 @@ importers: version: 23.12.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + version: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 @@ -567,7 +569,7 @@ importers: version: 2.2.6 ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)))(typescript@5.4.5) + version: 29.4.9(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@29.7.0(supports-color@8.1.1))(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)))(typescript@5.4.5) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5) @@ -592,7 +594,7 @@ importers: version: 7.7.1 next: specifier: 15.5.22 - version: 15.5.22(@babel/core@7.29.7)(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) typescript: specifier: '*' version: 5.4.5 @@ -1446,6 +1448,44 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@expo-google-fonts/material-symbols@0.4.38': resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==} @@ -1665,6 +1705,26 @@ packages: peerDependencies: react-hook-form: ^7.0.0 + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@iabtcf/core@1.5.6': resolution: {integrity: sha512-u2q9thI9vLurYZdGtyJsDYOqoeLc4EgQsYGSc+UVibYII61B/ENJPZS6eFlML1F0hSoTR/goptpo5nGRDkKd2w==} @@ -1703,89 +1763,105 @@ packages: resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.3.2': resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.3.2': resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.3.2': resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.3.2': resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.3.2': resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.3.2': resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.3.2': resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.35.3': resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.35.3': resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.35.3': resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.35.3': resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.35.3': resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.35.3': resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.35.3': resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.35.3': resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.35.3': resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} @@ -1974,24 +2050,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.5.22': resolution: {integrity: sha512-iknK80pWlNDnkdSr13bd8mMuG3Z2oTxODwsZHvuMY7caMk77+rBLdHVWsy8v2EVa3ZojJ/+wJX5fnq8va6Gv8A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.5.22': resolution: {integrity: sha512-penuEdkwU2OOAiS+n4LE8T/VIoCfAI01QcLZTJ2xc3+l4Q22L/DzURocmI2LU1b+8BMQoLAP1Sze3uYAZT05Bg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.5.22': resolution: {integrity: sha512-ZM0BKJm3FZ+guG6WT6PcyOLtp6paZ5tngcJC/uUKvLW4Y0TQnnVi1+UGdo8Q6Yxp5gaS82pmC1rD/oFlhkWB3g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@15.5.22': resolution: {integrity: sha512-rY/YaumrZaS0//94BnHLF5VSRp0GFUO4GvXNuoCBb0cGSci96yO+p1JaNL2aq9YZAYv9cuZRziV02x5IQH/wjg==} @@ -2024,230 +2104,246 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxfmt/binding-android-arm-eabi@0.49.0': - resolution: {integrity: sha512-HbifJ84prIh9+55CTPAU35JdRQrwg47y16cGerCC+iejSKOuHXYo2WDql6l7cQlzrYVtc3f4UWY+dBj2lRmOeA==} + '@oxfmt/binding-android-arm-eabi@0.60.0': + resolution: {integrity: sha512-1q4q4Jc8FlOMVojEisyFAVyl8h1yawNv6phjgmhGVEDeyeOdsSnSr9x0+D4mOnEKvpO5L4mxKZ/DP9X6U3A/Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.49.0': - resolution: {integrity: sha512-Ef7SKJqAaH2d7E6eXZZa2OffIShbhFMxnGK0zd93p4qiyTJr75B0qf7lrPD+qQOwcf04BrjYJ0JUxq8d5+yZwg==} + '@oxfmt/binding-android-arm64@0.60.0': + resolution: {integrity: sha512-tD41I6nCt9k8SQXft0CSjjU9jg6SwG7uMu7PxodSEHXl+GDW0868oy6tTtoJkyUze8YKFgTpz/k5LuPUnFiGLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.49.0': - resolution: {integrity: sha512-8x5DN9CsFfb432sHa9NyqX5XisGUdA53LPEGSdv/VniS+v4uEOR8Orv7A9QSB98Xxgp0t6r31DzQA/wpIobGqQ==} + '@oxfmt/binding-darwin-arm64@0.60.0': + resolution: {integrity: sha512-TTpzPug96Zxdyb46KvTyIUQDdsqbumXh2TKG9C23PCT0kF7JkW56Z/quPuG9rqOFKQIi1gpRNZ7DX18LwxXPnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.49.0': - resolution: {integrity: sha512-e0+DSVzk4ewhMVKNYDaRTmP81jNMBWR1X9al0cVKWS+hDM/dElNqD5zjTOCuLOZc4oOdp2Gx2ldrVL+yYo9TZQ==} + '@oxfmt/binding-darwin-x64@0.60.0': + resolution: {integrity: sha512-CnOoWgQ7L+JL/YQaRJ+NyATciSfcftncm7y3kqyte1cGtFEGnStaCd1TAyrinkfQ7nRBfHrTs1/vTwUJr3WF2Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.49.0': - resolution: {integrity: sha512-W+mjtYtrQvFbXT/uNT+221OBhGRZ8UqNsLxjTWsjZ4GsQnRdvRC/N2NCK86BcamWr7lsTxwpwN3PULnr78sgcQ==} + '@oxfmt/binding-freebsd-x64@0.60.0': + resolution: {integrity: sha512-ychJo7S3hZxdO6eDZ9zM6F2lM9fpJS3EKS5CAUSWyprdLYxTu4gbaUKV/VBPTcMJwQa2Bpo+643y3OJ537pihA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.49.0': - resolution: {integrity: sha512-Rtv6UevV7czDlLqil+NZUe4d8gs8jQo/zScSpumwyf7I+fSdLc+hc8AF3MQC7ymxSMMD9+vfiqQlsIf7wOAzXA==} + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': + resolution: {integrity: sha512-36IH5o55T2Fx7E0feDttt+mifxN6yk9pWv4KfhAIsP0dFnUq27331OwbpOsZdoXF9soOLWm7mQUz5+UUmyec4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.49.0': - resolution: {integrity: sha512-sBi+8C/Q/MdKa5FL8ibAUCdhFBGFH7HFN/Qoyd5xQbZ/0ky3NMPpKfIBpaH0lhK2dXkGLczVQUoZ+xuNSerCdQ==} + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': + resolution: {integrity: sha512-G1Ve7lAa6sFBolVI2LWHfEAqy0YKh4vnioH8uYO9kAEdgM7mR40IksIx9/Zk4+vbYew/sGa4J9Q4tZ3n9gXDHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.49.0': - resolution: {integrity: sha512-JIfWenFhlzx+O8YygyZhoHFzTsdgDhxhbDRnE2iJLnnM5pWKScFvPECO2vOlA7JqJ/9S1g3uzEKuRCkHFwTjvA==} + '@oxfmt/binding-linux-arm64-gnu@0.60.0': + resolution: {integrity: sha512-LTQdRBf6uzj/h7Xk6lKzbGD2hrF/fK4YI9LIN1c0509tPUn8wRa3mCmrFQpEWJPLYGFrLFFMTYW1Ljj6VqW2Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.49.0': - resolution: {integrity: sha512-iNzkMPG18jPkwBOZ4/HEjwqfzAjq4RrUQ0CgId/fC1ENvYD5jLVAaU/gWgpiqP1ys07kxSsSggDd1fp3E7mQHw==} + '@oxfmt/binding-linux-arm64-musl@0.60.0': + resolution: {integrity: sha512-2JMo3XPxMPx3hiqddSZYyaH+fKJm6cz0u8n1naYjP/CdOQOZW34i8lKBUfmbWiuFvd6KoYXLmhAyBuvojsYS7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.49.0': - resolution: {integrity: sha512-BPHA/NN3LvoIXiid+iz3BHt5V0Rzx0tXAqRUovwE1NsbDaLG9e8mtv7evDGRIkVQacqTDBv0XL25THHsxSJosQ==} + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': + resolution: {integrity: sha512-L3C+nBD13lr306tr/PjM3RMll+BVqgFrIgUyoeHuai5oueJrRLgO3j+GO5/Cbhtkf5PSlHYTI1JY7iqBd1qa6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.49.0': - resolution: {integrity: sha512-3Eroshe+s69htC9JIL0+zLGQczLtRKezkMhwqQC21VC5Z/fuLvzLfbAOLgJLUq601H8gDYjy7deYycfOBjCvWg==} + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': + resolution: {integrity: sha512-M4MsmvqlxFiPtSRGyBYQSZxchEf463AOyd+Dh4/9xDpjWBsRtDUTDMFN5EdHinjVK1/eDJQ8MLpcYjpYayaCnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.49.0': - resolution: {integrity: sha512-fnaERGgsxGm0lKAmO72EYR4BA3qBnzBTJBTi6EtUMq1D4R7EexRBMU4voXnx4TXla3SEDl9x4uNp/18SbkPjGg==} + '@oxfmt/binding-linux-riscv64-musl@0.60.0': + resolution: {integrity: sha512-OH+9UskYuxRB+GxqdGkVN8f5UpwhqG8YscNo1wl8+KJ62cd7wZdGga6iGLJIf8kibF1WBwvlfDUx3cez/VXwFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.49.0': - resolution: {integrity: sha512-rBwasMl1Uul1MCCeTGEFKnOTL7VUxHf+634jWStrQAbzpBJgd5Yz5m4F7exVCsoI8PHn57dNjssXagXLCLB5yA==} + '@oxfmt/binding-linux-s390x-gnu@0.60.0': + resolution: {integrity: sha512-y7AAFutt9wFWBFOAn6+BHaV39usZmcr3YYH2385f+NHgPNpIF9HpqKp0jgUxPaUOCyG3oaX5VhJduL1Nw164rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.49.0': - resolution: {integrity: sha512-BoC/F9xHe2y/deuBGA5Aw7bes07OD2gcL2wlpzTrfImR92vPP7S/k3LBTyspQZCNIVNdagkELcqKELwMLGIfAg==} + '@oxfmt/binding-linux-x64-gnu@0.60.0': + resolution: {integrity: sha512-yKZ9+CXAI+1RO5nH/4Z/9M6DAsfOzd5bw/gtWk81KB4mpalMaRRSXfouc5/tHxazDmBek55HNPepNYBgaCew0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.49.0': - resolution: {integrity: sha512-umY6jFADAo/oztFKl8D/S6vSrG6oBpEskcentiRuz42kZVU2kfDXMWCYavxyZR2bwPjqkHpcHZ6EZFiH3Qj9ZA==} + '@oxfmt/binding-linux-x64-musl@0.60.0': + resolution: {integrity: sha512-bCUGaF6hJOYnQzLJdHLZbvGsOd5oSvGAyJhPAKum2uyLYUuXmP8vqg690DWi2hqcnIoYpqSqCrjzE5aiUAgwQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.49.0': - resolution: {integrity: sha512-J85zQMiw2pXiGPK+OusmDvSnJ/dgpgN7VgmB2zOBtgS8F+nsOUfSg9ZEBrwbQscjZ7tkPbm38CG4VF5f53MsiA==} + '@oxfmt/binding-openharmony-arm64@0.60.0': + resolution: {integrity: sha512-GrUeZOvzP30ExxfCuQiyofuUGI+OmvAgFwOO5w5p9mGPlxcyuqI+6Sy9fAKFFfLQrqKYWFgc5sYA2Unj/29nPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.49.0': - resolution: {integrity: sha512-38K67XR++CoFFORDd4sMFwUVAnD6msYBdGTei+qvKGrRPO6S2PbrYPNL/eQQ1RgnnxOegNba0YQwg6uRkNcw6A==} + '@oxfmt/binding-win32-arm64-msvc@0.60.0': + resolution: {integrity: sha512-WD4Q954kUl2TDJV/6q7UnE2rlKk047kXLJsr4bJ2mXRaAqNXcmV3nwKUsGCc3mz/jYDBnXtJEaBErJEybK8iQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.49.0': - resolution: {integrity: sha512-rXVe0HICwQF0dBgbQtBCoYf8x/SidPIdhyQl+iPuJlV7suV+qDv7yUEB3wQ4qC3nOeNxz287SwFXKzyr0kWgEg==} + '@oxfmt/binding-win32-ia32-msvc@0.60.0': + resolution: {integrity: sha512-HqDekjr8JXzVDUP1YthDZ1Y3CBEcuZT4WX3B+1kaxj8CvZA8Y2YhcEsXqoSop3tVsgjACxjnFQFDkBo0r/jq1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.49.0': - resolution: {integrity: sha512-gwWLwSEmBBfIK/Wh7GGd658161o4RKAvHWRaRQbJm571iQXGKfyr7UKsI1vsWvDlNLc30CxJDc8mMmCvJ/kczQ==} + '@oxfmt/binding-win32-x64-msvc@0.60.0': + resolution: {integrity: sha512-tz78yhmGPKboTMHCHSaUqXK8JrmoSejgDcWeqAtg2s07ZGKQ3rH5Jn8NuXPGNG33CDbY2e9NoQWXIVEmKO21Rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.64.0': - resolution: {integrity: sha512-2r6Nq3XXGLHEXKkSj8JtmJ6N4gDw431DPFOg0ZoJHlNjnG6HVMm/ksQ10m0HJ8WBvwgMe1L50UHPaYZutCRPCw==} + '@oxlint/binding-android-arm-eabi@1.75.0': + resolution: {integrity: sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.64.0': - resolution: {integrity: sha512-ePJMpePgg7fBv+L/hVx1xXRU5/5gd5m0obLA6hPEfLXF3GjpR8idIDbY1dhQYhyz1ms2wdTccSboo6KEd2Oxtg==} + '@oxlint/binding-android-arm64@1.75.0': + resolution: {integrity: sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.64.0': - resolution: {integrity: sha512-U4DMLQd10gJLuoSTLSGbfv3bGjTlUNsScm9Dgb8wwBqmCzidf1pE1pXV4doGNxqwH3KtVng1AGTINA0NvkGLvQ==} + '@oxlint/binding-darwin-arm64@1.75.0': + resolution: {integrity: sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.64.0': - resolution: {integrity: sha512-GoRIL48QWm4/TAvjN8pB1nAG+1/uqc9EdnWT9zqHeb6wsmjZtywj8VRe5aGW47Fdb64YtLOsdLqVxOvQuz98Wg==} + '@oxlint/binding-darwin-x64@1.75.0': + resolution: {integrity: sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.64.0': - resolution: {integrity: sha512-5dFkv4tkg7PxJJGS9/OjrJwjhuHczrd3OQOkRE0wHcLM+ncUnULtzEPWjqGOxTXxZnLWcB91bGiIznx89TVXyQ==} + '@oxlint/binding-freebsd-x64@1.75.0': + resolution: {integrity: sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.64.0': - resolution: {integrity: sha512-jsBqMLl/uOL5+Kq/+BtK9FrmiNGUbx8SiyZXv+WlUxA45KuwcLu9BfiSIL3I3DBDgWM3yZizDITnTK9BcqNBQg==} + '@oxlint/binding-linux-arm-gnueabihf@1.75.0': + resolution: {integrity: sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.64.0': - resolution: {integrity: sha512-1lrj8At/Uuc9GhjrVFBQo0NEjfBrTkzpmtHIGAhNnIXqn1CAyGL+qrztUsXb2GIluJrpl9Q7qRLJOb/NqydacQ==} + '@oxlint/binding-linux-arm-musleabihf@1.75.0': + resolution: {integrity: sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.64.0': - resolution: {integrity: sha512-HpSQbubwh03mMhAdy2BYtad/fsY8vDFHDAb6bUwuCYg2VD3xCQgn6ArKcO0oZyLCheacKTv4PrF3Mfu5hgoE2g==} + '@oxlint/binding-linux-arm64-gnu@1.75.0': + resolution: {integrity: sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.64.0': - resolution: {integrity: sha512-00QQ0h0Y7u0G69BgiH3+ky2aaq/QvkDL6DYok8htIuJHxybiux5aQ8jwmg8qIk9wha6UagUP2BAwAzbemcJbpg==} + '@oxlint/binding-linux-arm64-musl@1.75.0': + resolution: {integrity: sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.64.0': - resolution: {integrity: sha512-2GaimTV6EMW+s5HS0An3oGbQme3BgHswvfVdGk3EB57Xe9+/gyT+Qd7lNVzb3rtir52vbIPzXfaYArzs5b5zcw==} + '@oxlint/binding-linux-ppc64-gnu@1.75.0': + resolution: {integrity: sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.64.0': - resolution: {integrity: sha512-H46AtFb9wypjoVwGdlxrm0DsD809NGmtiK9HiyPKTxkSte2YjhC4S+00rOIrwCaxcyPiGid3Y3OMXp5KMAkGZw==} + '@oxlint/binding-linux-riscv64-gnu@1.75.0': + resolution: {integrity: sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.64.0': - resolution: {integrity: sha512-HEgsidjjvvyzdg82icYkuFCf7REDV7B9JFwbIMbVwrKLBY0MrXX+bku3POn/hduZ2yW91IyVDUMq0Bf02KwXQw==} + '@oxlint/binding-linux-riscv64-musl@1.75.0': + resolution: {integrity: sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.64.0': - resolution: {integrity: sha512-Axvm8qryotmKN00P5w4JapaSjvP2LOSbdbBJiX+2SuHd3QzhW7TUc8skqgw+ahQZ5DmzEYeHCqauvW8f32Ns6Q==} + '@oxlint/binding-linux-s390x-gnu@1.75.0': + resolution: {integrity: sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.64.0': - resolution: {integrity: sha512-cR60vSd7+m+KRZ3GQGfDxWwahW5RMXg0qlGvAluZr0fTUYvw0H9N9AXAF/M/PMqgytyqvVNmBAkJG9l7U30Y1g==} + '@oxlint/binding-linux-x64-gnu@1.75.0': + resolution: {integrity: sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.64.0': - resolution: {integrity: sha512-2u/aPZ9pEg7HnvZPDsHxUGNnrpr4qaHi+mCgLgpt+LYRzPrS4Px4wPfkIdRdr2GvKnaYyt+XSlto0Vm5sbStTg==} + '@oxlint/binding-linux-x64-musl@1.75.0': + resolution: {integrity: sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@oxlint/binding-openharmony-arm64@1.64.0': - resolution: {integrity: sha512-kfhkGfCdoXLSxEkrhDlJrvBYajGmq+ma4EMc53dsOWTq+rIBOlI0vTBmpZNnM5oH2LY/K/w1HAK+UQEgjgpVUg==} + '@oxlint/binding-openharmony-arm64@1.75.0': + resolution: {integrity: sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.64.0': - resolution: {integrity: sha512-r/cNKBFieONoVu2bb1KkVouq9W+edDUgHumXJGphCRRj+U0xaD4nanrw8ZOqo0IsutPkEM4vCcGBpak6x5aXMg==} + '@oxlint/binding-win32-arm64-msvc@1.75.0': + resolution: {integrity: sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.64.0': - resolution: {integrity: sha512-tUw0xUUwEFVZbpJoeCblkv8SJA4Xz3CdXCJbAnBsiNLyxDrk2tLcxEAS6M73Q7hHHDg3OtwI8vZVK3t5RJt4Gw==} + '@oxlint/binding-win32-ia32-msvc@1.75.0': + resolution: {integrity: sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.64.0': - resolution: {integrity: sha512-9CBR+LO0JVST87fNTzzNxS5I29jIUO5gxT9i9+M3SDHHALElj9sY1Prf12tad3vIRC6OD7Ehtvvh+sn13vSwHw==} + '@oxlint/binding-win32-x64-msvc@1.75.0': + resolution: {integrity: sha512-DSxnNkBUAYARPwJtR12Ig3deWr8w0H997xP6jy33i+e0SyYJw8FKuz4+cZtpmPEhQmvlPJE3X/2vNxDmLkd/rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2284,36 +2380,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -3033,36 +3135,42 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.15.43': resolution: {integrity: sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-ppc64-gnu@1.15.43': resolution: {integrity: sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] + libc: [glibc] '@swc/core-linux-s390x-gnu@1.15.43': resolution: {integrity: sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==} engines: {node: '>=10'} cpu: [s390x] os: [linux] + libc: [glibc] '@swc/core-linux-x64-gnu@1.15.43': resolution: {integrity: sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.15.43': resolution: {integrity: sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.15.43': resolution: {integrity: sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==} @@ -3169,6 +3277,9 @@ packages: '@trpc/server@11.0.0-rc.477': resolution: {integrity: sha512-K6zmjRv96fWilqm/ETehEK1DWsy5bSyrs2xbsNzCbjguMgamMhOClRHgYzJcwgLp2kasJ7QgD9YbahOhV1/u1w==} + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -3482,6 +3593,9 @@ packages: peerDependencies: ajv: ^8.8.2 + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -3887,6 +4001,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -4096,6 +4213,9 @@ packages: babel-plugin-macros: optional: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -4285,11 +4405,63 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-plugin-react-native-globals@0.1.2: + resolution: {integrity: sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==} + + eslint-plugin-react-native@5.0.0: + resolution: {integrity: sha512-VyWlyCC/7FC/aONibOwLkzmyKg4j9oI8fzrk9WYNs4I8/m436JuOTAFwLvEn1CVvc7La4cPfbCyspP4OYpP52Q==} + peerDependencies: + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-safe-jsx@1.3.0: + resolution: {integrity: sha512-6IvENBEMjHLxp8TOtSHwZ2qmlsZ1XQEyyO9EVDBze37rLvXyPXmqs0wjFNbXFQpF+oTJhEg7hr/x9qMthqezrw==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 || ^10 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -4308,6 +4480,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -4637,6 +4813,9 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.1.4: resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} @@ -4679,6 +4858,10 @@ packages: fetch-nodeshim@0.4.10: resolution: {integrity: sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4699,6 +4882,13 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.3: + resolution: {integrity: sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==} + flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} @@ -4802,6 +4992,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5258,15 +5452,24 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -5296,6 +5499,9 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -5308,6 +5514,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -5346,24 +5556,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -5428,6 +5642,9 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -5491,6 +5708,33 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + magic-codemods@1.0.0: + resolution: {integrity: sha512-X5oxZZrm0wuzbpOOWBROwXo3OOBPLTaiC54NzBDXWlGa+V0hDcJU8oYvE1lqgrdkuSpI08dbNn2IXMjL0ySMYA==} + engines: {node: '>=22'} + hasBin: true + + magic-oxfmt-config@1.0.0: + resolution: {integrity: sha512-scXKgtJSEWSC4nVSQxccPzABbcRn3hBeieF/uB0mF8+Xrk0+6atlNIcP2fRfPT5oTPZ8GAyRdBggQrPqbHnVag==} + engines: {node: '>=22.18.0'} + hasBin: true + peerDependencies: + oxfmt: '>=0.60.0' + peerDependenciesMeta: + oxfmt: + optional: true + + magic-oxlint-config@1.0.0: + resolution: {integrity: sha512-F1P+knzaNTZoW2YFBg1s/5xJyqHGcWA3wkRjy6BVB4fuhBEoY2Hnw0npIga8BSwbEMAqW4IQhMibHnKC+ZJ+MA==} + engines: {node: '>=22.18.0'} + peerDependencies: + oxlint: '>=1.75.0' + peerDependenciesMeta: + oxlint: + optional: true + + magic-tsconfig@1.0.0: + resolution: {integrity: sha512-UpRdb1iP4dy6GocRcoSznUdCEA+2AFK3b24tnciezr5MokxPNtNfZ9ELflSTeRrOkbBr/WTXnpO1wLDVb4xxyA==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -6028,6 +6272,10 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + ora@3.4.0: resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} engines: {node: '>=6'} @@ -6040,25 +6288,31 @@ packages: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} - oxfmt@0.49.0: - resolution: {integrity: sha512-IAHFMdlJSWe+oAr65dx22UvjCtV9DBMisAuLnKpDqMQrctzCkGnj3QRwNHm0d+uwSWPalsDF8ZYLz9rh6nH2IQ==} + oxfmt@0.60.0: + resolution: {integrity: sha512-fViX6i+gJuZWY+jI/fnR6WRbRj70GZ9RlCd30MygJrHTUNc4DxvKHWw8vBjMjffv3PgU5qWDR0AzmojQByqaZA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: svelte: ^5.0.0 + vite-plus: '*' peerDependenciesMeta: svelte: optional: true + vite-plus: + optional: true - oxlint@1.64.0: - resolution: {integrity: sha512-Star3SNpWPeWFPw7kRXIhXUSn6fdiAl25q15CQzH/9WaOtG6e9CWTc25vNZOCr4PE1yEP1GtKJKIKglhj3OmEQ==} + oxlint@1.75.0: + resolution: {integrity: sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.22.1' + oxlint-tsgolint: '>=7.0.2001' + vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: optional: true + vite-plus: + optional: true p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -6106,6 +6360,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} @@ -6284,6 +6541,10 @@ packages: react-native-svg: optional: true + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + pretty-format@26.6.2: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} engines: {node: '>= 10'} @@ -6328,6 +6589,10 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -7100,6 +7365,9 @@ packages: jest-util: optional: true + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -7129,6 +7397,10 @@ packages: resolution: {integrity: sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw==} hasBin: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -7243,6 +7515,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -7380,6 +7655,10 @@ packages: engines: {node: '>= 8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -7823,20 +8102,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7863,32 +8142,32 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: @@ -7896,26 +8175,26 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7925,27 +8204,27 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/helper-wrap-function': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -7956,10 +8235,10 @@ snapshots: '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-wrap-function@7.29.7': + '@babel/helper-wrap-function@7.29.7(supports-color@8.1.1)': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -7973,404 +8252,404 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.29.7)': + '@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.29.7) + '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.29.7)': + '@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.7)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.29.7)': + '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/preset-react@7.24.1(@babel/core@7.29.7)': + '@babel/preset-react@7.24.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.29.7) - '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.29.7) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8382,7 +8661,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -8390,7 +8669,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8399,20 +8678,20 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@bacons/apple-targets@4.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))': + '@bacons/apple-targets@4.0.7(expo@55.0.24)(supports-color@8.1.1)': dependencies: - '@bacons/xcode': 1.0.0-alpha.32 + '@bacons/xcode': 1.0.0-alpha.32(supports-color@8.1.1) '@react-native/normalize-colors': 0.79.7 - debug: 4.4.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + debug: 4.4.3(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) glob: 10.5.0 transitivePeerDependencies: - supports-color - '@bacons/xcode@1.0.0-alpha.32': + '@bacons/xcode@1.0.0-alpha.32(supports-color@8.1.1)': dependencies: '@expo/plist': 0.0.18 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) uuid: 11.1.1 transitivePeerDependencies: - supports-color @@ -8528,31 +8807,77 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1))': + dependencies: + eslint: 9.39.5(jiti@1.21.0)(supports-color@8.1.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.2(supports-color@8.1.1)': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1) + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.6(supports-color@8.1.1)': + dependencies: + ajv: 6.15.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.3.0 + minimatch: 3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1) + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.5': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@expo-google-fonts/material-symbols@0.4.38': {} - '@expo/cli@55.0.30(5gf73afq22s4k5bekgf3ygiaqa)': + '@expo/cli@55.0.30(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-constants@55.0.16)(expo-font@55.0.7)(expo-router@55.0.14)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5)': dependencies: '@expo/code-signing-certificates': 0.0.6 - '@expo/config': 55.0.17(typescript@5.4.5) - '@expo/config-plugins': 55.0.9 - '@expo/devcert': 1.2.1 - '@expo/env': 2.1.2 - '@expo/image-utils': 0.8.14(typescript@5.4.5) + '@expo/config': 55.0.17(supports-color@8.1.1)(typescript@5.4.5) + '@expo/config-plugins': 55.0.9(supports-color@8.1.1) + '@expo/devcert': 1.2.1(supports-color@8.1.1) + '@expo/env': 2.1.2(supports-color@8.1.1) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) '@expo/json-file': 10.0.14 - '@expo/log-box': 55.0.12(up7cgsml7rcrdggwamagoykibu) - '@expo/metro': 55.1.1 - '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@expo/metro': 55.1.1(supports-color@8.1.1) + '@expo/metro-config': 55.0.21(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) '@expo/osascript': 2.4.3 '@expo/package-manager': 1.10.5 '@expo/plist': 0.5.3 - '@expo/prebuild-config': 55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) - '@expo/require-utils': 55.0.5(typescript@5.4.5) - '@expo/router-server': 55.0.16(yqmkzdykmamv7dzoncd7vqj6ii) + '@expo/prebuild-config': 55.0.18(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) + '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@5.4.5) + '@expo/router-server': 55.0.16(@expo/metro-runtime@55.0.11)(expo-constants@55.0.16)(expo-font@55.0.7)(expo-router@55.0.14)(expo-server@55.0.9)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(supports-color@8.1.1) '@expo/schema-utils': 55.0.4 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.4.4 - '@react-native/dev-middleware': 0.83.6 + '@react-native/dev-middleware': 0.83.6(supports-color@8.1.1) accepts: 1.3.8 arg: 5.0.2 better-opn: 3.0.2 @@ -8560,11 +8885,11 @@ snapshots: bplist-parser: 0.3.2 chalk: 4.1.2 ci-info: 3.9.0 - compression: 1.8.1 - connect: 3.7.0 - debug: 4.4.3 + compression: 1.8.1(supports-color@8.1.1) + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) dnssd-advertise: 1.1.4 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-server: 55.0.9 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -8580,7 +8905,7 @@ snapshots: prompts: 2.4.2 resolve-from: 5.0.0 semver: 7.8.5 - send: 0.19.2 + send: 0.19.2(supports-color@8.1.1) slugify: 1.6.6 source-map-support: 0.5.21 stacktrace-parser: 0.1.10 @@ -8591,8 +8916,8 @@ snapshots: ws: 8.21.1 zod: 3.25.76 optionalDependencies: - expo-router: 55.0.14(lw7znn4muny63e22tia4nt7rje) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + expo-router: 55.0.14(cda63964b4377ec86701fe3437763bb4) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -8610,14 +8935,14 @@ snapshots: dependencies: node-forge: 1.4.0 - '@expo/config-plugins@55.0.9': + '@expo/config-plugins@55.0.9(supports-color@8.1.1)': dependencies: '@expo/config-types': 55.0.5 '@expo/json-file': 10.0.14 '@expo/plist': 0.5.3 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 resolve-from: 5.0.0 @@ -8630,12 +8955,12 @@ snapshots: '@expo/config-types@55.0.5': {} - '@expo/config@55.0.17(typescript@5.4.5)': + '@expo/config@55.0.17(supports-color@8.1.1)(typescript@5.4.5)': dependencies: - '@expo/config-plugins': 55.0.9 + '@expo/config-plugins': 55.0.9(supports-color@8.1.1) '@expo/config-types': 55.0.5 '@expo/json-file': 10.0.14 - '@expo/require-utils': 55.0.5(typescript@5.4.5) + '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@5.4.5) deepmerge: 4.3.1 getenv: 2.0.0 glob: 13.0.6 @@ -8646,41 +8971,41 @@ snapshots: - supports-color - typescript - '@expo/devcert@1.2.1': + '@expo/devcert@1.2.1(supports-color@8.1.1)': dependencies: '@expo/sudo-prompt': 9.3.2 - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@expo/devtools@55.0.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@expo/devtools@55.0.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - '@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@expo/dom-webview@55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - '@expo/env@2.1.2': + '@expo/env@2.1.2(supports-color@8.1.1)': dependencies: chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 transitivePeerDependencies: - supports-color - '@expo/fingerprint@0.16.7': + '@expo/fingerprint@0.16.7(supports-color@8.1.1)': dependencies: - '@expo/env': 2.1.2 + '@expo/env': 2.1.2(supports-color@8.1.1) '@expo/spawn-async': 1.7.2 arg: 5.0.2 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 ignore: 5.3.1 @@ -8690,9 +9015,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/image-utils@0.8.14(typescript@5.4.5)': + '@expo/image-utils@0.8.14(supports-color@8.1.1)(typescript@5.4.5)': dependencies: - '@expo/require-utils': 55.0.5(typescript@5.4.5) + '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@5.4.5) '@expo/spawn-async': 1.7.2 chalk: 4.1.2 getenv: 2.0.0 @@ -8708,36 +9033,36 @@ snapshots: '@babel/code-frame': 7.29.7 json5: 2.2.3 - '@expo/local-build-cache-provider@55.0.13(typescript@5.4.5)': + '@expo/local-build-cache-provider@55.0.13(supports-color@8.1.1)(typescript@5.4.5)': dependencies: - '@expo/config': 55.0.17(typescript@5.4.5) + '@expo/config': 55.0.17(supports-color@8.1.1)(typescript@5.4.5) chalk: 4.1.2 transitivePeerDependencies: - supports-color - typescript - '@expo/log-box@55.0.12(up7cgsml7rcrdggwamagoykibu)': + '@expo/log-box@55.0.12(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: - '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) anser: 1.4.10 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) stacktrace-parser: 0.1.10 - '@expo/metro-config@55.0.21(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5)': + '@expo/metro-config@55.0.21(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 - '@expo/config': 55.0.17(typescript@5.4.5) - '@expo/env': 2.1.2 + '@expo/config': 55.0.17(supports-color@8.1.1)(typescript@5.4.5) + '@expo/env': 2.1.2(supports-color@8.1.1) '@expo/json-file': 10.0.14 - '@expo/metro': 55.1.1 + '@expo/metro': 55.1.1(supports-color@8.1.1) '@expo/spawn-async': 1.7.2 browserslist: 4.28.7 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 hermes-parser: 0.32.1 @@ -8747,21 +9072,21 @@ snapshots: postcss: 8.5.23 resolve-from: 5.0.0 optionalDependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@expo/metro-runtime@55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@expo/metro-runtime@55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: - '@expo/log-box': 55.0.12(up7cgsml7rcrdggwamagoykibu) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) anser: 1.4.10 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) pretty-format: 29.7.0 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 optionalDependencies: @@ -8769,22 +9094,22 @@ snapshots: transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro@55.1.1': + '@expo/metro@55.1.1(supports-color@8.1.1)': dependencies: - metro: 0.83.7 - metro-babel-transformer: 0.83.7 - metro-cache: 0.83.7 + metro: 0.83.7(supports-color@8.1.1) + metro-babel-transformer: 0.83.7(supports-color@8.1.1) + metro-cache: 0.83.7(supports-color@8.1.1) metro-cache-key: 0.83.7 - metro-config: 0.83.7 + metro-config: 0.83.7(supports-color@8.1.1) metro-core: 0.83.7 - metro-file-map: 0.83.7 + metro-file-map: 0.83.7(supports-color@8.1.1) metro-minify-terser: 0.83.7 metro-resolver: 0.83.7 metro-runtime: 0.83.7 - metro-source-map: 0.83.7 - metro-symbolicate: 0.83.7 - metro-transform-plugins: 0.83.7 - metro-transform-worker: 0.83.7 + metro-source-map: 0.83.7(supports-color@8.1.1) + metro-symbolicate: 0.83.7(supports-color@8.1.1) + metro-transform-plugins: 0.83.7(supports-color@8.1.1) + metro-transform-worker: 0.83.7(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - supports-color @@ -8815,16 +9140,16 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5)': + '@expo/prebuild-config@55.0.18(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5)': dependencies: - '@expo/config': 55.0.17(typescript@5.4.5) - '@expo/config-plugins': 55.0.9 + '@expo/config': 55.0.17(supports-color@8.1.1)(typescript@5.4.5) + '@expo/config-plugins': 55.0.9(supports-color@8.1.1) '@expo/config-types': 55.0.5 - '@expo/image-utils': 0.8.14(typescript@5.4.5) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) '@expo/json-file': 10.0.14 '@react-native/normalize-colors': 0.83.6 - debug: 4.4.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + debug: 4.4.3(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) resolve-from: 5.0.0 semver: 7.8.5 xml2js: 0.6.0 @@ -8832,27 +9157,27 @@ snapshots: - supports-color - typescript - '@expo/require-utils@55.0.5(typescript@5.4.5)': + '@expo/require-utils@55.0.5(supports-color@8.1.1)(typescript@5.4.5)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@expo/router-server@55.0.16(yqmkzdykmamv7dzoncd7vqj6ii)': + '@expo/router-server@55.0.16(@expo/metro-runtime@55.0.11)(expo-constants@55.0.16)(expo-font@55.0.7)(expo-router@55.0.14)(expo-server@55.0.9)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(supports-color@8.1.1)': dependencies: - debug: 4.4.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - expo-font: 55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + debug: 4.4.3(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-font: 55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) expo-server: 55.0.9 react: 19.2.0 optionalDependencies: - '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - expo-router: 55.0.14(lw7znn4muny63e22tia4nt7rje) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + expo-router: 55.0.14(cda63964b4377ec86701fe3437763bb4) react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - supports-color @@ -8867,11 +9192,11 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@15.1.1(u2s3lllxuxr7z4d5urz476gcgu)': + '@expo/vector-icons@15.1.1(expo-font@55.0.7)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: - expo-font: 55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + expo-font: 55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) '@expo/ws-tunnel@1.0.6': {} @@ -8895,23 +9220,23 @@ snapshots: dependencies: '@formatjs/fast-memoize': 3.1.6 - '@gorhom/bottom-sheet@5.2.14(@types/react-native@0.70.19)(@types/react@19.2.17)(react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@gorhom/bottom-sheet@5.2.14(cc43a45343e0aaaaddd4d7aa33837760)': dependencies: - '@gorhom/portal': 1.0.14(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@gorhom/portal': 1.0.14(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) invariant: 2.2.4 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) optionalDependencies: '@types/react': 19.2.17 '@types/react-native': 0.70.19 - '@gorhom/portal@1.0.14(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@gorhom/portal@1.0.14(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: nanoid: 3.3.16 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) '@hapi/hoek@9.3.0': optional: true @@ -8925,6 +9250,22 @@ snapshots: dependencies: react-hook-form: 7.52.2(react@19.2.0) + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + '@iabtcf/core@1.5.6': {} '@img/colour@1.1.0': {} @@ -9063,12 +9404,12 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5))': + '@jest/core@29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 + '@jest/reporters': 29.7.0(supports-color@8.1.1) '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 '@types/node': 22.1.0 ansi-escapes: 4.3.2 @@ -9077,15 +9418,15 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 + jest-resolve-dependencies: 29.7.0(supports-color@8.1.1) + jest-runner: 29.7.0(supports-color@8.1.1) + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 @@ -9113,10 +9454,10 @@ snapshots: dependencies: jest-get-type: 29.6.3 - '@jest/expect@29.7.0': + '@jest/expect@29.7.0(supports-color@8.1.1)': dependencies: expect: 29.7.0 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9129,21 +9470,21 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/globals@29.7.0': + '@jest/globals@29.7.0(supports-color@8.1.1)': dependencies: '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0': + '@jest/reporters@29.7.0(supports-color@8.1.1)': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 '@types/node': 22.1.0 @@ -9153,9 +9494,9 @@ snapshots: glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.2(supports-color@8.1.1) istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) istanbul-reports: 3.1.7 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -9191,12 +9532,12 @@ snapshots: jest-haste-map: 29.7.0 slash: 3.0.0 - '@jest/transform@29.7.0': + '@jest/transform@29.7.0(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 @@ -9258,14 +9599,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mdx-js/loader@3.1.1': + '@mdx-js/loader@3.1.1(supports-color@8.1.1)': dependencies: - '@mdx-js/mdx': 3.0.1 + '@mdx-js/mdx': 3.0.1(supports-color@8.1.1) source-map: 0.7.6 transitivePeerDependencies: - supports-color - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.0.1(supports-color@8.1.1)': dependencies: '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 @@ -9277,12 +9618,12 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 + hast-util-to-estree: 3.1.0(supports-color@8.1.1) + hast-util-to-jsx-runtime: 2.3.0(supports-color@8.1.1) markdown-extensions: 2.0.0 periscopic: 3.1.0 - remark-mdx: 3.0.1 - remark-parse: 11.0.0 + remark-mdx: 3.0.1(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.0 source-map: 0.7.6 unified: 11.0.4 @@ -9301,11 +9642,11 @@ snapshots: '@next/env@15.5.22': {} - '@next/mdx@15.5.20(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.0))': + '@next/mdx@15.5.20(@mdx-js/loader@3.1.1(supports-color@8.1.1))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.0))': dependencies: source-map: 0.7.6 optionalDependencies: - '@mdx-js/loader': 3.1.1 + '@mdx-js/loader': 3.1.1(supports-color@8.1.1) '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.0) '@next/swc-darwin-arm64@15.5.22': @@ -9348,118 +9689,118 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@oxfmt/binding-android-arm-eabi@0.49.0': + '@oxfmt/binding-android-arm-eabi@0.60.0': optional: true - '@oxfmt/binding-android-arm64@0.49.0': + '@oxfmt/binding-android-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-arm64@0.49.0': + '@oxfmt/binding-darwin-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-x64@0.49.0': + '@oxfmt/binding-darwin-x64@0.60.0': optional: true - '@oxfmt/binding-freebsd-x64@0.49.0': + '@oxfmt/binding-freebsd-x64@0.60.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.49.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.49.0': + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.49.0': + '@oxfmt/binding-linux-arm64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.49.0': + '@oxfmt/binding-linux-arm64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.49.0': + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.49.0': + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.49.0': + '@oxfmt/binding-linux-riscv64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.49.0': + '@oxfmt/binding-linux-s390x-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.49.0': + '@oxfmt/binding-linux-x64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.49.0': + '@oxfmt/binding-linux-x64-musl@0.60.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.49.0': + '@oxfmt/binding-openharmony-arm64@0.60.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.49.0': + '@oxfmt/binding-win32-arm64-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.49.0': + '@oxfmt/binding-win32-ia32-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.49.0': + '@oxfmt/binding-win32-x64-msvc@0.60.0': optional: true - '@oxlint/binding-android-arm-eabi@1.64.0': + '@oxlint/binding-android-arm-eabi@1.75.0': optional: true - '@oxlint/binding-android-arm64@1.64.0': + '@oxlint/binding-android-arm64@1.75.0': optional: true - '@oxlint/binding-darwin-arm64@1.64.0': + '@oxlint/binding-darwin-arm64@1.75.0': optional: true - '@oxlint/binding-darwin-x64@1.64.0': + '@oxlint/binding-darwin-x64@1.75.0': optional: true - '@oxlint/binding-freebsd-x64@1.64.0': + '@oxlint/binding-freebsd-x64@1.75.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.64.0': + '@oxlint/binding-linux-arm-gnueabihf@1.75.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.64.0': + '@oxlint/binding-linux-arm-musleabihf@1.75.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.64.0': + '@oxlint/binding-linux-arm64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.64.0': + '@oxlint/binding-linux-arm64-musl@1.75.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.64.0': + '@oxlint/binding-linux-ppc64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.64.0': + '@oxlint/binding-linux-riscv64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.64.0': + '@oxlint/binding-linux-riscv64-musl@1.75.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.64.0': + '@oxlint/binding-linux-s390x-gnu@1.75.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.64.0': + '@oxlint/binding-linux-x64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-x64-musl@1.64.0': + '@oxlint/binding-linux-x64-musl@1.75.0': optional: true - '@oxlint/binding-openharmony-arm64@1.64.0': + '@oxlint/binding-openharmony-arm64@1.75.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.64.0': + '@oxlint/binding-win32-arm64-msvc@1.75.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.64.0': + '@oxlint/binding-win32-ia32-msvc@1.75.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.64.0': + '@oxlint/binding-win32-x64-msvc@1.75.0': optional: true '@paralleldrive/cuid2@2.2.2': @@ -9564,10 +9905,10 @@ snapshots: dependencies: '@prisma/debug': 5.17.0 - '@ptomasroos/react-native-multi-slider@2.2.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@ptomasroos/react-native-multi-slider@2.2.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) '@radix-ui/primitive@1.1.3': {} @@ -9774,10 +10115,10 @@ snapshots: dependencies: base-64: 0.1.0 - '@react-native-async-storage/async-storage@2.2.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))': + '@react-native-async-storage/async-storage@2.2.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))': dependencies: merge-options: 3.0.4 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) '@react-native-community/cli-clean@13.6.9': dependencies: @@ -9801,9 +10142,9 @@ snapshots: - encoding optional: true - '@react-native-community/cli-debugger-ui@13.6.9': + '@react-native-community/cli-debugger-ui@13.6.9(supports-color@8.1.1)': dependencies: - serve-static: 1.16.3 + serve-static: 1.16.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color optional: true @@ -9872,16 +10213,16 @@ snapshots: - encoding optional: true - '@react-native-community/cli-server-api@13.6.9': + '@react-native-community/cli-server-api@13.6.9(supports-color@8.1.1)': dependencies: - '@react-native-community/cli-debugger-ui': 13.6.9 + '@react-native-community/cli-debugger-ui': 13.6.9(supports-color@8.1.1) '@react-native-community/cli-tools': 13.6.9 - compression: 1.8.1 - connect: 3.7.0 + compression: 1.8.1(supports-color@8.1.1) + connect: 3.7.0(supports-color@8.1.1) errorhandler: 1.5.2 nocache: 3.0.4 pretty-format: 26.6.2 - serve-static: 1.16.3 + serve-static: 1.16.3(supports-color@8.1.1) ws: 6.2.6 transitivePeerDependencies: - bufferutil @@ -9912,14 +10253,14 @@ snapshots: joi: 17.13.4 optional: true - '@react-native-community/cli@13.6.9': + '@react-native-community/cli@13.6.9(supports-color@8.1.1)': dependencies: '@react-native-community/cli-clean': 13.6.9 '@react-native-community/cli-config': 13.6.9 - '@react-native-community/cli-debugger-ui': 13.6.9 + '@react-native-community/cli-debugger-ui': 13.6.9(supports-color@8.1.1) '@react-native-community/cli-doctor': 13.6.9 '@react-native-community/cli-hermes': 13.6.9 - '@react-native-community/cli-server-api': 13.6.9 + '@react-native-community/cli-server-api': 13.6.9(supports-color@8.1.1) '@react-native-community/cli-tools': 13.6.9 '@react-native-community/cli-types': 13.6.9 chalk: 4.1.2 @@ -9938,120 +10279,120 @@ snapshots: - utf-8-validate optional: true - '@react-native-community/netinfo@11.5.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-native-community/netinfo@11.5.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) '@react-native/assets-registry@0.83.6': {} - '@react-native/babel-plugin-codegen@0.83.6(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 - '@react-native/codegen': 0.83.6(@babel/core@7.29.7) + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@react-native/codegen': 0.83.6(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-plugin-codegen@0.85.3(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 - '@react-native/codegen': 0.85.3(@babel/core@7.29.7) + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@react-native/codegen': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.83.6(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@react-native/babel-preset@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/template': 7.29.7 - '@react-native/babel-plugin-codegen': 0.83.6(@babel/core@7.29.7) + '@react-native/babel-plugin-codegen': 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-syntax-hermes-parser: 0.32.0 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@8.1.1)) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/babel-preset@0.85.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-plugin-codegen': 0.85.3(@babel/core@7.29.7) + '@react-native/babel-preset@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@react-native/babel-plugin-codegen': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-syntax-hermes-parser: 0.33.3 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@8.1.1)) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.83.6(@babel/core@7.29.7)': + '@react-native/codegen@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.7 glob: 7.2.3 hermes-parser: 0.32.0 @@ -10059,9 +10400,9 @@ snapshots: nullthrows: 1.1.1 yargs: 17.7.3 - '@react-native/codegen@0.85.3(@babel/core@7.29.7)': + '@react-native/codegen@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.7 hermes-parser: 0.33.3 invariant: 2.2.4 @@ -10069,18 +10410,18 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.83.6(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))': + '@react-native/community-cli-plugin@0.83.6(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@react-native/dev-middleware': 0.83.6 - debug: 4.4.3 + '@react-native/dev-middleware': 0.83.6(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.83.7 - metro-config: 0.83.7 + metro: 0.83.7(supports-color@8.1.1) + metro-config: 0.83.7(supports-color@8.1.1) metro-core: 0.83.7 semver: 7.8.5 optionalDependencies: - '@react-native-community/cli': 13.6.9 - '@react-native/metro-config': 0.85.3(@babel/core@7.29.7) + '@react-native-community/cli': 13.6.9(supports-color@8.1.1) + '@react-native/metro-config': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - supports-color @@ -10093,19 +10434,19 @@ snapshots: cross-spawn: 7.0.6 fb-dotslash: 0.5.8 - '@react-native/dev-middleware@0.83.6': + '@react-native/dev-middleware@0.83.6(supports-color@8.1.1)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.83.6 '@react-native/debugger-shell': 0.83.6 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.2.0 - connect: 3.7.0 - debug: 4.4.3 + chrome-launcher: 0.15.2(supports-color@8.1.1) + chromium-edge-launcher: 0.2.0(supports-color@8.1.1) + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 nullthrows: 1.1.1 open: 7.4.2 - serve-static: 1.16.3 + serve-static: 1.16.3(supports-color@8.1.1) ws: 7.5.13 transitivePeerDependencies: - bufferutil @@ -10118,20 +10459,20 @@ snapshots: '@react-native/js-polyfills@0.85.3': {} - '@react-native/metro-babel-transformer@0.85.3(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@react-native/babel-preset': 0.85.3(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@react-native/babel-preset': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) hermes-parser: 0.33.3 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.85.3(@babel/core@7.29.7)': + '@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@react-native/js-polyfills': 0.85.3 - '@react-native/metro-babel-transformer': 0.85.3(@babel/core@7.29.7) - metro-config: 0.84.4 + '@react-native/metro-babel-transformer': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + metro-config: 0.84.4(supports-color@8.1.1) metro-runtime: 0.84.4 transitivePeerDependencies: - '@babel/core' @@ -10145,24 +10486,24 @@ snapshots: '@react-native/normalize-colors@0.83.6': {} - '@react-native/virtualized-lists@0.83.6(@types/react@19.2.17)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-native/virtualized-lists@0.83.6(@types/react@19.2.17)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) optionalDependencies: '@types/react': 19.2.17 - '@react-navigation/bottom-tabs@7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-navigation/bottom-tabs@7.16.1(7c2fb8438f660ff35ece7ef93be49ff9)': dependencies: - '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) color: 4.2.3 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -10179,38 +10520,38 @@ snapshots: use-latest-callback: 0.2.6(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) - '@react-navigation/elements@2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-navigation/elements@2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: - '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) color: 4.2.3 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) use-latest-callback: 0.2.6(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) - '@react-navigation/native-stack@7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-navigation/native-stack@7.15.1(7c2fb8438f660ff35ece7ef93be49ff9)': dependencies: - '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-navigation/elements': 2.9.18(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) color: 4.2.3 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: '@react-navigation/core': 7.17.4(react@19.2.0) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 nanoid: 3.3.16 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) use-latest-callback: 0.2.6(react@19.2.0) '@react-navigation/routers@7.5.5': @@ -10282,11 +10623,11 @@ snapshots: '@schummar/icu-type-parser@1.21.5': {} - '@shopify/flash-list@2.0.2(@babel/runtime@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)': + '@shopify/flash-list@2.0.2(@babel/runtime@7.29.7)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)': dependencies: '@babel/runtime': 7.29.7 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) tslib: 2.8.1 '@sideway/address@4.1.5': @@ -10366,54 +10707,54 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.7)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) - '@svgr/babel-preset@8.1.0(@babel/core@7.29.7)': + '@svgr/babel-preset@8.1.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.7) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.7) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.7(supports-color@8.1.1)) - '@svgr/core@8.1.0(typescript@5.4.5)': + '@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.4.5)': dependencies: - '@babel/core': 7.29.7 - '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@5.4.5) snake-case: 3.0.4 @@ -10426,19 +10767,19 @@ snapshots: '@babel/types': 7.29.7 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.4.5))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.4.5))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) - '@svgr/core': 8.1.0(typescript@5.4.5) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@svgr/core': 8.1.0(supports-color@8.1.1)(typescript@5.4.5) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.4.5))(typescript@5.4.5)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.4.5))(typescript@5.4.5)': dependencies: - '@svgr/core': 8.1.0(typescript@5.4.5) + '@svgr/core': 8.1.0(supports-color@8.1.1)(typescript@5.4.5) cosmiconfig: 8.3.6(typescript@5.4.5) deepmerge: 4.3.1 svgo: 3.3.4 @@ -10509,10 +10850,10 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)))': + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)))': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) '@tanstack/query-core@5.51.21': {} @@ -10598,6 +10939,12 @@ snapshots: '@trpc/server@11.0.0-rc.477': {} + '@ts-morph/common@0.29.0': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.17 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -10801,9 +11148,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - '@vercel/analytics@1.6.1(next@15.5.22(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': + '@vercel/analytics@1.6.1(next@15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': optionalDependencies: - next: 15.5.22(@babel/core@7.29.7)(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 '@vercel/cli-config@0.2.0': @@ -10886,6 +11233,13 @@ snapshots: ajv: 8.20.0 fast-deep-equal: 3.1.3 + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -10971,25 +11325,25 @@ snapshots: postcss: 8.5.23 postcss-value-parser: 4.2.0 - babel-jest@29.7.0(@babel/core@7.29.7): + babel-jest@29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 - '@jest/transform': 29.7.0 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@jest/transform': 29.7.0(supports-color@8.1.1) '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.29.7) + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) + babel-preset-jest: 29.6.3(@babel/core@7.29.7(supports-color@8.1.1)) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-plugin-istanbul@6.1.1(supports-color@8.1.1): dependencies: '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 5.2.1(supports-color@8.1.1) test-exclude: 6.0.0 transitivePeerDependencies: - supports-color @@ -11001,27 +11355,27 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@babel/compat-data': 7.29.7 - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -11031,14 +11385,14 @@ snapshots: babel-plugin-react-native-web@0.21.2: {} - babel-plugin-styled-components@2.1.4(@babel/core@7.29.7)(styled-components@6.1.11(patch_hash=7pi476ptgmafuuvkxpwgjc6kq4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): + babel-plugin-styled-components@2.1.4(@babel/core@7.29.7(supports-color@8.1.1))(styled-components@6.1.11(patch_hash=f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(supports-color@8.1.1): dependencies: '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) lodash: 4.18.1 picomatch: 2.3.2 - styled-components: 6.1.11(patch_hash=7pi476ptgmafuuvkxpwgjc6kq4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + styled-components: 6.1.11(patch_hash=f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -11055,66 +11409,66 @@ snapshots: dependencies: hermes-parser: 0.33.3 - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: - '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' - babel-preset-current-node-syntax@1.0.1(@babel/core@7.29.7): + babel-preset-current-node-syntax@1.0.1(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7(supports-color@8.1.1)) - babel-preset-expo@55.0.21(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-refresh@0.14.2): + babel-preset-expo@55.0.21(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@55.0.24)(react-refresh@0.14.2)(supports-color@8.1.1): dependencies: '@babel/generator': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.29.7) - '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/preset-react': 7.24.1(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-preset': 0.83.6(@babel/core@7.29.7) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/preset-react': 7.24.1(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@react-native/babel-preset': 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-react-compiler: 1.0.0 babel-plugin-react-native-web: 0.21.2 babel-plugin-syntax-hermes-parser: 0.32.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) - debug: 4.4.3 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@8.1.1)) + debug: 4.4.3(supports-color@8.1.1) react-refresh: 0.14.2 resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) transitivePeerDependencies: - '@babel/core' - supports-color - babel-preset-jest@29.6.3(@babel/core@7.29.7): + babel-preset-jest@29.6.3(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.29.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.29.7(supports-color@8.1.1)) badgin@1.2.3: {} @@ -11269,21 +11623,21 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chrome-launcher@0.15.2: + chrome-launcher@0.15.2(supports-color@8.1.1): dependencies: '@types/node': 22.1.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 + lighthouse-logger: 1.4.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color - chromium-edge-launcher@0.2.0: + chromium-edge-launcher@0.2.0(supports-color@8.1.1): dependencies: '@types/node': 22.1.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 + lighthouse-logger: 1.4.2(supports-color@8.1.1) mkdirp: 1.0.4 rimraf: 3.0.2 transitivePeerDependencies: @@ -11353,6 +11707,8 @@ snapshots: co@4.6.0: {} + code-block-writer@13.0.3: {} + collapse-white-space@2.1.0: {} collect-v8-coverage@1.0.2: {} @@ -11406,11 +11762,11 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.8.1: + compression@1.8.1(supports-color@8.1.1): dependencies: bytes: 3.1.2 compressible: 2.0.18 - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) negotiator: 0.6.4 on-headers: 1.1.0 safe-buffer: 5.2.1 @@ -11418,10 +11774,10 @@ snapshots: transitivePeerDependencies: - supports-color - connect@3.7.0: + connect@3.7.0(supports-color@8.1.1): dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 + debug: 2.6.9(supports-color@8.1.1) + finalhandler: 1.1.2(supports-color@8.1.1) parseurl: 1.3.3 utils-merge: 1.0.1 transitivePeerDependencies: @@ -11456,13 +11812,13 @@ snapshots: optionalDependencies: typescript: 5.4.5 - create-jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): + create-jest@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -11547,17 +11903,23 @@ snapshots: dayjs@1.11.21: optional: true - debug@2.6.9: + debug@2.6.9(supports-color@8.1.1): dependencies: ms: 2.0.0 + optionalDependencies: + supports-color: 8.1.1 - debug@3.2.7: + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decamelize@1.2.0: optional: true @@ -11570,6 +11932,8 @@ snapshots: dedent@1.5.3: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} defaults@1.0.4: @@ -11748,8 +12112,85 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-plugin-react-native-globals@0.1.2: {} + + eslint-plugin-react-native@5.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1)): + dependencies: + eslint: 9.39.5(jiti@1.21.0)(supports-color@8.1.1) + eslint-plugin-react-native-globals: 0.1.2 + + eslint-plugin-safe-jsx@1.3.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1)): + dependencies: + eslint: 9.39.5(jiti@1.21.0)(supports-color@8.1.1) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2(supports-color@8.1.1) + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6(supports-color@8.1.1) + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1) + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.0 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -11778,6 +12219,8 @@ snapshots: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -11804,148 +12247,148 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-application@55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-application@55.0.16(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) - expo-asset@55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5): + expo-asset@55.0.17(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/image-utils': 0.8.14(typescript@5.4.5) - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - typescript - expo-blur@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-blur@55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-build-properties@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-build-properties@55.0.14(expo@55.0.24): dependencies: '@expo/schema-utils': 55.0.4 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) resolve-from: 5.0.0 semver: 7.8.5 - expo-constants@55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-constants@55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@expo/env': 2.1.2 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + '@expo/env': 2.1.2(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - expo-crypto@55.0.15(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-crypto@55.0.15(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) - expo-device@55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-device@55.0.18(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) ua-parser-js: 0.7.37 expo-eas-client@55.0.5: {} - expo-file-system@55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-file-system@55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-font@55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-font@55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) fontfaceobserver: 2.3.0 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-glass-effect@55.0.11(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-glass-effect@55.0.11(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-haptics@55.0.15(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-haptics@55.0.15(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) - expo-image-loader@55.0.0(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-image-loader@55.0.0(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) - expo-image-manipulator@55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-image-manipulator@55.0.16(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-image-loader: 55.0.0(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-image-loader: 55.0.0(expo@55.0.24) - expo-image-picker@55.0.20(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-image-picker@55.0.20(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-image-loader: 55.0.0(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-image-loader: 55.0.0(expo@55.0.24) - expo-image@55.0.10(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-image@55.0.10(expo@55.0.24)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) sf-symbols-typescript: 2.2.0 optionalDependencies: react-native-web: 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - expo-insights@55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-insights@55.0.17(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-eas-client: 55.0.5 expo-json-utils@55.0.2: {} - expo-keep-awake@55.0.8(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0): + expo-keep-awake@55.0.8(expo@55.0.24)(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - expo-linear-gradient@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-linear-gradient@55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-linking@55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-linking@55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1): dependencies: - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) invariant: 2.2.4 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) transitivePeerDependencies: - expo - supports-color - expo-localization@55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0): + expo-localization@55.0.16(expo@55.0.24)(react@19.2.0): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) react: 19.2.0 rtl-detect: 1.1.2 - expo-location@55.1.10(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5): + expo-location@55.1.10(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/image-utils': 0.8.14(typescript@5.4.5) - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) transitivePeerDependencies: - supports-color - typescript - expo-manifests@55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-manifests@55.0.17(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-json-utils: 55.0.2 - expo-modules-autolinking@55.0.22(typescript@5.4.5): + expo-modules-autolinking@55.0.22(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/require-utils': 55.0.5(typescript@5.4.5) + '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@5.4.5) '@expo/spawn-async': 1.7.2 chalk: 4.1.2 commander: 7.2.0 @@ -11953,68 +12396,68 @@ snapshots: - supports-color - typescript - expo-modules-core@55.0.25(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-modules-core@55.0.25(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: invariant: 2.2.4 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) optionalDependencies: - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native-worklets: 0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) - expo-notifications@55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5): + expo-notifications@55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/image-utils': 0.8.14(typescript@5.4.5) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) abort-controller: 3.0.0 badgin: 1.2.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-application: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-application: 55.0.16(expo@55.0.24) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - typescript - expo-quick-actions@6.0.2(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5): + expo-quick-actions@6.0.2(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/image-utils': 0.8.14(typescript@5.4.5) - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) schema-utils: 4.3.3 sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - supports-color - typescript - expo-router@55.0.14(lw7znn4muny63e22tia4nt7rje): + expo-router@55.0.14(cda63964b4377ec86701fe3437763bb4): dependencies: - '@expo/log-box': 55.0.12(up7cgsml7rcrdggwamagoykibu) - '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@expo/schema-utils': 55.0.4 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.17)(react@19.2.0) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-navigation/bottom-tabs': 7.16.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@react-navigation/native-stack': 7.15.1(@react-navigation/native@7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-navigation/bottom-tabs': 7.16.1(7c2fb8438f660ff35ece7ef93be49ff9) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@react-navigation/native-stack': 7.15.1(7c2fb8438f660ff35ece7ef93be49ff9) client-only: 0.0.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - expo-glass-effect: 55.0.11(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - expo-image: 55.0.10(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - expo-linking: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-glass-effect: 55.0.11(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + expo-image: 55.0.10(expo@55.0.24)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + expo-linking: 55.0.15(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) expo-server: 55.0.9 - expo-symbols: 55.0.8(hrbuehppwoksgs42i44p4qmomy) + expo-symbols: 55.0.8(expo-font@55.0.7)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) fast-deep-equal: 3.1.3 invariant: 2.2.4 nanoid: 3.3.16 query-string: 7.1.3 react: 19.2.0 react-fast-compare: 3.2.2 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-screens: 4.23.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) semver: 7.6.3 server-only: 0.0.1 sf-symbols-typescript: 2.2.0 @@ -12023,8 +12466,8 @@ snapshots: vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) optionalDependencies: react-dom: 19.2.0(react@19.2.0) - react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react-native-web: 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -12033,9 +12476,9 @@ snapshots: - expo-font - supports-color - expo-secure-store@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-secure-store@55.0.14(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-server-sdk@3.10.0: dependencies: @@ -12047,113 +12490,113 @@ snapshots: expo-server@55.0.9: {} - expo-splash-screen@55.0.21(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5): + expo-splash-screen@55.0.21(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@expo/prebuild-config': 55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + '@expo/prebuild-config': 55.0.18(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) transitivePeerDependencies: - supports-color - typescript - expo-status-bar@55.0.6(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-status-bar@55.0.6(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) - expo-store-review@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-store-review@55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) expo-structured-headers@55.0.2: {} - expo-symbols@55.0.8(hrbuehppwoksgs42i44p4qmomy): + expo-symbols@55.0.8(expo-font@55.0.7)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: '@expo-google-fonts/material-symbols': 0.4.38 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-font: 55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-font: 55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) sf-symbols-typescript: 2.2.0 - expo-system-ui@55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-system-ui@55.0.18(expo@55.0.24)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@react-native/normalize-colors': 0.83.6 - debug: 4.4.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + debug: 4.4.3(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) optionalDependencies: react-native-web: 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - supports-color - expo-tracking-transparency@55.0.14(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-tracking-transparency@55.0.14(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo-updates-interface@55.1.6(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)): + expo-updates-interface@55.1.6(expo@55.0.24): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) - expo-updates@55.0.22(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + expo-updates@55.0.22(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1): dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/plist': 0.5.3 '@expo/spawn-async': 1.7.2 arg: 4.1.0 chalk: 4.1.2 - debug: 4.4.3 - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + debug: 4.4.3(supports-color@8.1.1) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) expo-eas-client: 55.0.5 - expo-manifests: 55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + expo-manifests: 55.0.17(expo@55.0.24) expo-structured-headers: 55.0.2 - expo-updates-interface: 55.1.6(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) + expo-updates-interface: 55.1.6(expo@55.0.24) getenv: 2.0.0 glob: 13.0.6 ignore: 5.3.1 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) resolve-from: 5.0.0 transitivePeerDependencies: - supports-color - expo-web-browser@55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + expo-web-browser@55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)): dependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5): + expo@55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 55.0.30(5gf73afq22s4k5bekgf3ygiaqa) - '@expo/config': 55.0.17(typescript@5.4.5) - '@expo/config-plugins': 55.0.9 - '@expo/devtools': 55.0.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@expo/fingerprint': 0.16.7 - '@expo/local-build-cache-provider': 55.0.13(typescript@5.4.5) - '@expo/log-box': 55.0.12(up7cgsml7rcrdggwamagoykibu) - '@expo/metro': 55.1.1 - '@expo/metro-config': 55.0.21(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(typescript@5.4.5) - '@expo/vector-icons': 15.1.1(u2s3lllxuxr7z4d5urz476gcgu) + '@expo/cli': 55.0.30(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-constants@55.0.16)(expo-font@55.0.7)(expo-router@55.0.14)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + '@expo/config': 55.0.17(supports-color@8.1.1)(typescript@5.4.5) + '@expo/config-plugins': 55.0.9(supports-color@8.1.1) + '@expo/devtools': 55.0.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@expo/fingerprint': 0.16.7(supports-color@8.1.1) + '@expo/local-build-cache-provider': 55.0.13(supports-color@8.1.1)(typescript@5.4.5) + '@expo/log-box': 55.0.12(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@expo/metro': 55.1.1(supports-color@8.1.1) + '@expo/metro-config': 55.0.21(expo@55.0.24)(supports-color@8.1.1)(typescript@5.4.5) + '@expo/vector-icons': 15.1.1(expo-font@55.0.7)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) '@ungap/structured-clone': 1.3.1 - babel-preset-expo: 55.0.21(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-refresh@0.14.2) - expo-asset: 55.0.17(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) - expo-constants: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - expo-file-system: 55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - expo-font: 55.0.7(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - expo-keep-awake: 55.0.8(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0) - expo-modules-autolinking: 55.0.22(typescript@5.4.5) - expo-modules-core: 55.0.25(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + babel-preset-expo: 55.0.21(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo@55.0.24)(react-refresh@0.14.2)(supports-color@8.1.1) + expo-asset: 55.0.17(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) + expo-constants: 55.0.16(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1) + expo-file-system: 55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) + expo-font: 55.0.7(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + expo-keep-awake: 55.0.8(expo@55.0.24)(react@19.2.0) + expo-modules-autolinking: 55.0.22(supports-color@8.1.1)(typescript@5.4.5) + expo-modules-core: 55.0.25(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) pretty-format: 29.7.0 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) react-refresh: 0.14.2 whatwg-url-minimum: 0.1.2 optionalDependencies: - '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@expo/dom-webview': 55.0.6(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + '@expo/metro-runtime': 55.0.11(@expo/dom-webview@55.0.6)(expo@55.0.24)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -12184,6 +12627,8 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-levenshtein@2.0.6: {} + fast-uri@3.1.4: {} fast-xml-builder@1.2.0: @@ -12230,15 +12675,19 @@ snapshots: fetch-nodeshim@0.4.10: {} + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 filter-obj@1.1.0: {} - finalhandler@1.1.2: + finalhandler@1.1.2(supports-color@8.1.1): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.3.0 @@ -12257,7 +12706,13 @@ snapshots: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - optional: true + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.3 + keyv: 4.5.4 + + flatted@3.4.3: {} flow-enums-runtime@0.0.6: {} @@ -12347,7 +12802,7 @@ snapshots: dependencies: foreground-child: 3.1.1 jackspeak: 3.4.3 - minimatch: 9.0.9(patch_hash=keuwdskl3w6bv76exewvpi5lxe) + minimatch: 9.0.9(patch_hash=291dd2efac7e5cd6b31364c2548f9e97e74ae39487476509acbf3218cea1b813) minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -12363,10 +12818,12 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5(patch_hash=anzpumbibnypkm6xefxwimexay) + minimatch: 3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1) once: 1.4.0 path-is-absolute: 1.0.1 + globals@14.0.0: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -12402,7 +12859,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-to-estree@3.1.0: + hast-util-to-estree@3.1.0(supports-color@8.1.1): dependencies: '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 @@ -12412,9 +12869,9 @@ snapshots: estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 6.5.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 @@ -12423,7 +12880,7 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.0(supports-color@8.1.1): dependencies: '@types/estree': 1.0.8 '@types/hast': 3.0.4 @@ -12432,9 +12889,9 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 6.5.0 space-separated-tokens: 2.0.2 style-to-object: 1.0.6 @@ -12507,10 +12964,10 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12654,9 +13111,9 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@5.2.1: + istanbul-lib-instrument@5.2.1(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -12664,9 +13121,9 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.2: + istanbul-lib-instrument@6.0.2(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -12680,9 +13137,9 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -12705,10 +13162,10 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@29.7.0(supports-color@8.1.1): dependencies: '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.1.0 @@ -12719,8 +13176,8 @@ snapshots: jest-each: 29.7.0 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 @@ -12731,16 +13188,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): + jest-cli@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + '@jest/core': 29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.3 @@ -12750,23 +13207,23 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.7) + babel-jest: 29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(supports-color@8.1.1) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-runner: 29.7.0 + jest-runner: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-validate: 29.7.0 micromatch: 4.0.8 @@ -12863,10 +13320,10 @@ snapshots: jest-regex-util@29.6.3: {} - jest-resolve-dependencies@29.7.0: + jest-resolve-dependencies@29.7.0(supports-color@8.1.1): dependencies: jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12882,12 +13339,12 @@ snapshots: resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@29.7.0: + jest-runner@29.7.0(supports-color@8.1.1): dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 '@types/node': 22.1.0 chalk: 4.1.2 @@ -12899,7 +13356,7 @@ snapshots: jest-leak-detector: 29.7.0 jest-message-util: 29.7.0 jest-resolve: 29.7.0 - jest-runtime: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-watcher: 29.7.0 jest-worker: 29.7.0 @@ -12908,14 +13365,14 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + jest-runtime@29.7.0(supports-color@8.1.1): dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 + '@jest/globals': 29.7.0(supports-color@8.1.1) '@jest/source-map': 29.6.3 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 '@types/node': 22.1.0 chalk: 4.1.2 @@ -12928,24 +13385,24 @@ snapshots: jest-mock: 29.7.0 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0: + jest-snapshot@29.7.0(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/types': 7.29.7 '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.29.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.29.7(supports-color@8.1.1)) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -12996,12 +13453,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): + jest@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + '@jest/core': 29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13038,13 +13495,19 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: optional: true json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -13084,15 +13547,24 @@ snapshots: jwt-decode@4.0.0: {} + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kleur@3.0.3: {} lan-network@0.2.1: {} leven@3.1.0: {} - lighthouse-logger@1.4.2: + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lighthouse-logger@1.4.2(supports-color@8.1.1): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) marky: 1.2.5 transitivePeerDependencies: - supports-color @@ -13165,7 +13637,6 @@ snapshots: locate-path@6.0.0: dependencies: p-locate: 5.0.0 - optional: true lodash.debounce@4.0.8: {} @@ -13183,6 +13654,8 @@ snapshots: lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} lodash.throttle@4.1.1: {} @@ -13214,10 +13687,10 @@ snapshots: dependencies: js-tokens: 4.0.0 - lottie-react-native@7.3.8(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + lottie-react-native@7.3.8(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) lower-case@2.0.2: dependencies: @@ -13235,6 +13708,25 @@ snapshots: dependencies: react: 19.2.0 + magic-codemods@1.0.0: + dependencies: + ts-morph: 28.0.0 + + magic-oxfmt-config@1.0.0(oxfmt@0.60.0): + optionalDependencies: + oxfmt: 0.60.0 + + magic-oxlint-config@1.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1))(oxlint@1.75.0): + dependencies: + eslint-plugin-react-native: 5.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1)) + eslint-plugin-safe-jsx: 1.3.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1)) + optionalDependencies: + oxlint: 1.75.0 + transitivePeerDependencies: + - eslint + + magic-tsconfig@1.0.0: {} + make-dir@4.0.0: dependencies: semver: 7.8.5 @@ -13251,14 +13743,14 @@ snapshots: math-intrinsics@1.1.0: {} - mdast-util-from-markdown@2.0.0: + mdast-util-from-markdown@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 + micromark: 4.0.0(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-decode-string: 2.0.0 micromark-util-normalize-identifier: 2.0.0 @@ -13268,18 +13760,18 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.0: + mdast-util-mdx-expression@2.0.0(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.1.2(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -13287,7 +13779,7 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -13297,23 +13789,23 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx@3.0.0: + mdast-util-mdx@3.0.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@2.0.1: + mdast-util-mdxjs-esm@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -13368,9 +13860,9 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.83.7: + metro-babel-transformer@0.83.7(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 hermes-parser: 0.35.0 metro-cache-key: 0.83.7 @@ -13378,9 +13870,9 @@ snapshots: transitivePeerDependencies: - supports-color - metro-babel-transformer@0.84.4: + metro-babel-transformer@0.84.4(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 hermes-parser: 0.35.0 metro-cache-key: 0.84.4 @@ -13396,31 +13888,31 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.7: + metro-cache@0.83.7(supports-color@8.1.1): dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@8.1.1) metro-core: 0.83.7 transitivePeerDependencies: - supports-color - metro-cache@0.84.4: + metro-cache@0.84.4(supports-color@8.1.1): dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@8.1.1) metro-core: 0.84.4 transitivePeerDependencies: - supports-color - metro-config@0.83.7: + metro-config@0.83.7(supports-color@8.1.1): dependencies: - connect: 3.7.0 + connect: 3.7.0(supports-color@8.1.1) flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.7 - metro-cache: 0.83.7 + metro: 0.83.7(supports-color@8.1.1) + metro-cache: 0.83.7(supports-color@8.1.1) metro-core: 0.83.7 metro-runtime: 0.83.7 yaml: 2.9.0 @@ -13429,13 +13921,13 @@ snapshots: - supports-color - utf-8-validate - metro-config@0.84.4: + metro-config@0.84.4(supports-color@8.1.1): dependencies: - connect: 3.7.0 + connect: 3.7.0(supports-color@8.1.1) flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.84.4 - metro-cache: 0.84.4 + metro: 0.84.4(supports-color@8.1.1) + metro-cache: 0.84.4(supports-color@8.1.1) metro-core: 0.84.4 metro-runtime: 0.84.4 yaml: 2.9.0 @@ -13456,9 +13948,9 @@ snapshots: lodash.throttle: 4.1.1 metro-resolver: 0.84.4 - metro-file-map@0.83.7: + metro-file-map@0.83.7(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -13470,9 +13962,9 @@ snapshots: transitivePeerDependencies: - supports-color - metro-file-map@0.84.4: + metro-file-map@0.84.4(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -13512,13 +14004,13 @@ snapshots: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.7: + metro-source-map@0.83.7(supports-color@8.1.1): dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.83.7 + metro-symbolicate: 0.83.7(supports-color@8.1.1) nullthrows: 1.1.1 ob1: 0.83.7 source-map: 0.5.7 @@ -13526,13 +14018,13 @@ snapshots: transitivePeerDependencies: - supports-color - metro-source-map@0.84.4: + metro-source-map@0.84.4(supports-color@8.1.1): dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.84.4 + metro-symbolicate: 0.84.4(supports-color@8.1.1) nullthrows: 1.1.1 ob1: 0.84.4 source-map: 0.5.7 @@ -13540,103 +14032,103 @@ snapshots: transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.7: + metro-symbolicate@0.83.7(supports-color@8.1.1): dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.7 + metro-source-map: 0.83.7(supports-color@8.1.1) nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.84.4: + metro-symbolicate@0.84.4(supports-color@8.1.1): dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.84.4 + metro-source-map: 0.84.4(supports-color@8.1.1) nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.7: + metro-transform-plugins@0.83.7(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.84.4: + metro-transform-plugins@0.84.4(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.7: + metro-transform-worker@0.83.7(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 - metro: 0.83.7 - metro-babel-transformer: 0.83.7 - metro-cache: 0.83.7 + metro: 0.83.7(supports-color@8.1.1) + metro-babel-transformer: 0.83.7(supports-color@8.1.1) + metro-cache: 0.83.7(supports-color@8.1.1) metro-cache-key: 0.83.7 metro-minify-terser: 0.83.7 - metro-source-map: 0.83.7 - metro-transform-plugins: 0.83.7 + metro-source-map: 0.83.7(supports-color@8.1.1) + metro-transform-plugins: 0.83.7(supports-color@8.1.1) nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-transform-worker@0.84.4: + metro-transform-worker@0.84.4(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 - metro: 0.84.4 - metro-babel-transformer: 0.84.4 - metro-cache: 0.84.4 + metro: 0.84.4(supports-color@8.1.1) + metro-babel-transformer: 0.84.4(supports-color@8.1.1) + metro-cache: 0.84.4(supports-color@8.1.1) metro-cache-key: 0.84.4 metro-minify-terser: 0.84.4 - metro-source-map: 0.84.4 - metro-transform-plugins: 0.84.4 + metro-source-map: 0.84.4(supports-color@8.1.1) + metro-transform-plugins: 0.84.4(supports-color@8.1.1) nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.7: + metro@0.83.7(supports-color@8.1.1): dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 accepts: 2.0.0 ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -13646,18 +14138,18 @@ snapshots: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.7 - metro-cache: 0.83.7 + metro-babel-transformer: 0.83.7(supports-color@8.1.1) + metro-cache: 0.83.7(supports-color@8.1.1) metro-cache-key: 0.83.7 - metro-config: 0.83.7 + metro-config: 0.83.7(supports-color@8.1.1) metro-core: 0.83.7 - metro-file-map: 0.83.7 + metro-file-map: 0.83.7(supports-color@8.1.1) metro-resolver: 0.83.7 metro-runtime: 0.83.7 - metro-source-map: 0.83.7 - metro-symbolicate: 0.83.7 - metro-transform-plugins: 0.83.7 - metro-transform-worker: 0.83.7 + metro-source-map: 0.83.7(supports-color@8.1.1) + metro-symbolicate: 0.83.7(supports-color@8.1.1) + metro-transform-plugins: 0.83.7(supports-color@8.1.1) + metro-transform-worker: 0.83.7(supports-color@8.1.1) mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -13670,19 +14162,19 @@ snapshots: - supports-color - utf-8-validate - metro@0.84.4: + metro@0.84.4(supports-color@8.1.1): dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 accepts: 2.0.0 ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -13692,18 +14184,18 @@ snapshots: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.84.4 - metro-cache: 0.84.4 + metro-babel-transformer: 0.84.4(supports-color@8.1.1) + metro-cache: 0.84.4(supports-color@8.1.1) metro-cache-key: 0.84.4 - metro-config: 0.84.4 + metro-config: 0.84.4(supports-color@8.1.1) metro-core: 0.84.4 - metro-file-map: 0.84.4 + metro-file-map: 0.84.4(supports-color@8.1.1) metro-resolver: 0.84.4 metro-runtime: 0.84.4 - metro-source-map: 0.84.4 - metro-symbolicate: 0.84.4 - metro-transform-plugins: 0.84.4 - metro-transform-worker: 0.84.4 + metro-source-map: 0.84.4(supports-color@8.1.1) + metro-symbolicate: 0.84.4(supports-color@8.1.1) + metro-transform-plugins: 0.84.4(supports-color@8.1.1) + metro-transform-worker: 0.84.4(supports-color@8.1.1) mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -13900,10 +14392,10 @@ snapshots: micromark-util-types@2.0.0: {} - micromark@4.0.0: + micromark@4.0.0(supports-color@8.1.1): dependencies: '@types/debug': 4.1.12 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -13952,11 +14444,11 @@ snapshots: dependencies: brace-expansion: 5.0.8 - minimatch@3.1.5(patch_hash=anzpumbibnypkm6xefxwimexay): + minimatch@3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1): dependencies: brace-expansion: 5.0.8 - minimatch@9.0.9(patch_hash=keuwdskl3w6bv76exewvpi5lxe): + minimatch@9.0.9(patch_hash=291dd2efac7e5cd6b31364c2548f9e97e74ae39487476509acbf3218cea1b813): dependencies: brace-expansion: 5.0.8 @@ -13994,14 +14486,14 @@ snapshots: next-intl-swc-plugin-extractor@4.13.1: {} - next-intl@4.13.1(next@15.5.22(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.4.5): + next-intl@4.13.1(next@15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.4.5): dependencies: '@formatjs/intl-localematcher': 0.8.10 '@parcel/watcher': 2.5.6 '@swc/core': 1.15.43 icu-minify: 4.13.1 negotiator: 1.0.0 - next: 15.5.22(@babel/core@7.29.7)(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl-swc-plugin-extractor: 4.13.1 po-parser: 2.1.1 react: 19.2.0 @@ -14011,10 +14503,10 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - next-mdx-remote@6.0.0(@types/react@19.2.17)(react@19.2.0): + next-mdx-remote@6.0.0(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1): dependencies: '@babel/code-frame': 7.29.7 - '@mdx-js/mdx': 3.0.1 + '@mdx-js/mdx': 3.0.1(supports-color@8.1.1) '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.0) react: 19.2.0 unist-util-remove: 4.0.0 @@ -14025,7 +14517,7 @@ snapshots: - '@types/react' - supports-color - next@15.5.22(@babel/core@7.29.7)(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 15.5.22 '@swc/helpers': 0.5.15 @@ -14033,7 +14525,7 @@ snapshots: postcss: 8.5.23 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.0) + styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@8.1.1))(react@19.2.0) optionalDependencies: '@next/swc-darwin-arm64': 15.5.22 '@next/swc-darwin-x64': 15.5.22 @@ -14153,6 +14645,15 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + ora@3.4.0: dependencies: chalk: 2.4.2 @@ -14177,51 +14678,51 @@ snapshots: os-paths@4.4.0: {} - oxfmt@0.49.0: + oxfmt@0.60.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.49.0 - '@oxfmt/binding-android-arm64': 0.49.0 - '@oxfmt/binding-darwin-arm64': 0.49.0 - '@oxfmt/binding-darwin-x64': 0.49.0 - '@oxfmt/binding-freebsd-x64': 0.49.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.49.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.49.0 - '@oxfmt/binding-linux-arm64-gnu': 0.49.0 - '@oxfmt/binding-linux-arm64-musl': 0.49.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.49.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.49.0 - '@oxfmt/binding-linux-riscv64-musl': 0.49.0 - '@oxfmt/binding-linux-s390x-gnu': 0.49.0 - '@oxfmt/binding-linux-x64-gnu': 0.49.0 - '@oxfmt/binding-linux-x64-musl': 0.49.0 - '@oxfmt/binding-openharmony-arm64': 0.49.0 - '@oxfmt/binding-win32-arm64-msvc': 0.49.0 - '@oxfmt/binding-win32-ia32-msvc': 0.49.0 - '@oxfmt/binding-win32-x64-msvc': 0.49.0 - - oxlint@1.64.0: + '@oxfmt/binding-android-arm-eabi': 0.60.0 + '@oxfmt/binding-android-arm64': 0.60.0 + '@oxfmt/binding-darwin-arm64': 0.60.0 + '@oxfmt/binding-darwin-x64': 0.60.0 + '@oxfmt/binding-freebsd-x64': 0.60.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.60.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.60.0 + '@oxfmt/binding-linux-arm64-gnu': 0.60.0 + '@oxfmt/binding-linux-arm64-musl': 0.60.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-musl': 0.60.0 + '@oxfmt/binding-linux-s390x-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-musl': 0.60.0 + '@oxfmt/binding-openharmony-arm64': 0.60.0 + '@oxfmt/binding-win32-arm64-msvc': 0.60.0 + '@oxfmt/binding-win32-ia32-msvc': 0.60.0 + '@oxfmt/binding-win32-x64-msvc': 0.60.0 + + oxlint@1.75.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.64.0 - '@oxlint/binding-android-arm64': 1.64.0 - '@oxlint/binding-darwin-arm64': 1.64.0 - '@oxlint/binding-darwin-x64': 1.64.0 - '@oxlint/binding-freebsd-x64': 1.64.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.64.0 - '@oxlint/binding-linux-arm-musleabihf': 1.64.0 - '@oxlint/binding-linux-arm64-gnu': 1.64.0 - '@oxlint/binding-linux-arm64-musl': 1.64.0 - '@oxlint/binding-linux-ppc64-gnu': 1.64.0 - '@oxlint/binding-linux-riscv64-gnu': 1.64.0 - '@oxlint/binding-linux-riscv64-musl': 1.64.0 - '@oxlint/binding-linux-s390x-gnu': 1.64.0 - '@oxlint/binding-linux-x64-gnu': 1.64.0 - '@oxlint/binding-linux-x64-musl': 1.64.0 - '@oxlint/binding-openharmony-arm64': 1.64.0 - '@oxlint/binding-win32-arm64-msvc': 1.64.0 - '@oxlint/binding-win32-ia32-msvc': 1.64.0 - '@oxlint/binding-win32-x64-msvc': 1.64.0 + '@oxlint/binding-android-arm-eabi': 1.75.0 + '@oxlint/binding-android-arm64': 1.75.0 + '@oxlint/binding-darwin-arm64': 1.75.0 + '@oxlint/binding-darwin-x64': 1.75.0 + '@oxlint/binding-freebsd-x64': 1.75.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.75.0 + '@oxlint/binding-linux-arm-musleabihf': 1.75.0 + '@oxlint/binding-linux-arm64-gnu': 1.75.0 + '@oxlint/binding-linux-arm64-musl': 1.75.0 + '@oxlint/binding-linux-ppc64-gnu': 1.75.0 + '@oxlint/binding-linux-riscv64-gnu': 1.75.0 + '@oxlint/binding-linux-riscv64-musl': 1.75.0 + '@oxlint/binding-linux-s390x-gnu': 1.75.0 + '@oxlint/binding-linux-x64-gnu': 1.75.0 + '@oxlint/binding-linux-x64-musl': 1.75.0 + '@oxlint/binding-openharmony-arm64': 1.75.0 + '@oxlint/binding-win32-arm64-msvc': 1.75.0 + '@oxlint/binding-win32-ia32-msvc': 1.75.0 + '@oxlint/binding-win32-x64-msvc': 1.75.0 p-limit@2.3.0: dependencies: @@ -14238,7 +14739,6 @@ snapshots: p-locate@5.0.0: dependencies: p-limit: 3.1.0 - optional: true p-try@2.2.0: {} @@ -14278,6 +14778,8 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + path-dirname@1.0.2: {} path-exists@4.0.0: {} @@ -14344,7 +14846,7 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.23 - postcss-load-config@4.0.2(postcss@8.5.23)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.5.23)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 yaml: 2.9.0 @@ -14383,25 +14885,27 @@ snapshots: optionalDependencies: rxjs: 7.8.1 - posthog-react-native-session-replay@1.6.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + posthog-react-native-session-replay@1.6.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - posthog-react-native@4.54.4(5vspvbqys4mpwu3duw7ly5vpve): + posthog-react-native@4.54.4(dd0719650ac7408b8594bb3923b10638): dependencies: '@posthog/core': 1.39.6 '@posthog/types': 1.392.1 optionalDependencies: - '@react-native-async-storage/async-storage': 2.2.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - expo-application: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) - expo-device: 55.0.18(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5)) - expo-file-system: 55.0.23(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)) - expo-localization: 55.0.16(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0) - posthog-react-native-session-replay: 1.6.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-native-async-storage/async-storage': 2.2.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) + '@react-navigation/native': 7.2.4(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + expo-application: 55.0.16(expo@55.0.24) + expo-device: 55.0.18(expo@55.0.24) + expo-file-system: 55.0.23(expo@55.0.24)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)) + expo-localization: 55.0.16(expo@55.0.24)(react@19.2.0) + posthog-react-native-session-replay: 1.6.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + + prelude-ls@1.2.1: {} pretty-format@26.6.2: dependencies: @@ -14453,6 +14957,8 @@ snapshots: property-information@6.5.0: {} + punycode@2.3.1: {} + pure-rand@6.1.0: {} query-string@7.1.3: @@ -14498,7 +15004,7 @@ snapshots: dependencies: react: 19.2.0 - react-i18next@15.0.0(i18next@23.12.2)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-i18next@15.0.0(i18next@23.12.2)(react-dom@19.2.0(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: '@babel/runtime': 7.29.7 html-parse-stringify: 3.0.1 @@ -14506,7 +15012,7 @@ snapshots: react: 19.2.0 optionalDependencies: react-dom: 19.2.0(react@19.2.0) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) react-is@16.13.1: {} @@ -14517,60 +15023,60 @@ snapshots: react-is@19.2.6: {} - react-native-draggable-grid@2.2.1(patch_hash=v6ayathkzbndn3dcqvsojpmote)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-draggable-grid@2.2.1(patch_hash=b76c67d70eda667cbfa38d0a069bf76d77375bb01a3b87e60be4ff809a0877a2)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-gesture-handler@2.30.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: '@egjs/hammerjs': 2.0.17 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-get-random-values@1.11.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0)): + react-native-get-random-values@1.11.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1)): dependencies: fast-base64-decode: 1.0.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-google-mobile-ads@14.2.1(expo@55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5))(react@19.2.0): + react-native-google-mobile-ads@14.2.1(expo@55.0.24)(react@19.2.0): dependencies: '@iabtcf/core': 1.5.6 use-deep-compare-effect: 1.8.1(react@19.2.0) optionalDependencies: - expo: 55.0.24(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0)(typescript@5.4.5) + expo: 55.0.24(@babel/core@7.29.7(supports-color@8.1.1))(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.14)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1)(typescript@5.4.5) transitivePeerDependencies: - react - react-native-is-edge-to-edge@1.3.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-is-edge-to-edge@1.3.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-magic-modal@7.0.2(jqag6joy54stcznur2ncimavde): + react-native-magic-modal@7.0.2(b96d8217212b0fc32ef895954de141dd): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-gesture-handler: 2.30.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) optionalDependencies: - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native-worklets: 0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) - react-native-magic-toast@0.3.1(react-native-magic-modal@7.0.2(jqag6joy54stcznur2ncimavde))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-magic-toast@0.3.1(react-native-magic-modal@7.0.2(b96d8217212b0fc32ef895954de141dd))(react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-magic-modal: 7.0.2(jqag6joy54stcznur2ncimavde) - react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-magic-modal: 7.0.2(b96d8217212b0fc32ef895954de141dd) + react-native-safe-area-context: 5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) - react-native-maps@1.27.2(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-maps@1.27.2(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: '@types/geojson': 7946.0.14 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) optionalDependencies: react-native-web: 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14578,50 +15084,50 @@ snapshots: dependencies: mime-db: 1.52.0 - react-native-purchases@8.12.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-purchases@8.12.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: '@revenuecat/purchases-typescript-internal': 14.3.0 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-is-edge-to-edge: 1.3.1(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) + react-native-worklets: 0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1) semver: 7.8.5 - react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-safe-area-context@5.6.2(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) - react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-screens@4.23.0(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: react: 19.2.0 react-freeze: 1.0.4(react@19.2.0) - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) warn-once: 0.1.1 - react-native-svg-transformer@1.5.0(react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(typescript@5.4.5): + react-native-svg-transformer@1.5.0(react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.4.5): dependencies: - '@svgr/core': 8.1.0(typescript@5.4.5) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5))(typescript@5.4.5) + '@svgr/core': 8.1.0(supports-color@8.1.1)(typescript@5.4.5) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.4.5))(supports-color@8.1.1) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(supports-color@8.1.1)(typescript@5.4.5))(typescript@5.4.5) path-dirname: 1.0.2 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) - react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) + react-native-svg: 15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) transitivePeerDependencies: - supports-color - typescript - react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): + react-native-svg@15.15.3(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0): dependencies: css-select: 5.1.0 css-tree: 1.1.3 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) warn-once: 0.1.1 react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0): @@ -14639,40 +15145,40 @@ snapshots: transitivePeerDependencies: - encoding - react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0): - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@react-native/metro-config': 0.85.3(@babel/core@7.29.7) + react-native-worklets@0.8.3(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0)(supports-color@8.1.1): + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@react-native/metro-config': 0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) convert-source-map: 2.0.0 react: 19.2.0 - react-native: 0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0) + react-native: 0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1) semver: 7.8.5 transitivePeerDependencies: - supports-color - react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0): + react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.83.6 - '@react-native/codegen': 0.83.6(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.83.6(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)) + '@react-native/codegen': 0.83.6(@babel/core@7.29.7(supports-color@8.1.1)) + '@react-native/community-cli-plugin': 0.83.6(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(supports-color@8.1.1) '@react-native/gradle-plugin': 0.83.6 '@react-native/js-polyfills': 0.83.6 '@react-native/normalize-colors': 0.83.6 - '@react-native/virtualized-lists': 0.83.6(@types/react@19.2.17)(react-native@0.83.6(@babel/core@7.29.7)(@react-native-community/cli@13.6.9)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.0))(react@19.2.0) + '@react-native/virtualized-lists': 0.83.6(@types/react@19.2.17)(react-native@0.83.6(@babel/core@7.29.7(supports-color@8.1.1))(@react-native-community/cli@13.6.9(supports-color@8.1.1))(@react-native/metro-config@0.85.3(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.17)(react@19.2.0)(supports-color@8.1.1))(react@19.2.0) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.29.7) + babel-jest: 29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-syntax-hermes-parser: 0.32.0 base64-js: 1.5.1 commander: 12.1.0 @@ -14683,7 +15189,7 @@ snapshots: jest-environment-node: 29.7.0 memoize-one: 5.2.1 metro-runtime: 0.83.7 - metro-source-map: 0.83.7 + metro-source-map: 0.83.7(supports-color@8.1.1) nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 @@ -14773,7 +15279,7 @@ snapshots: reduce-reducers@1.0.4: {} - redux-saga@1.3.0(patch_hash=fuqywzq4jqd6wsmilvg6dhxzpi): + redux-saga@1.3.0(patch_hash=8c7f7d64fa347d148c073162a8afd0e421c019bb94193fd3f29bccc3024e9a66): dependencies: '@redux-saga/core': 1.3.0 @@ -14810,17 +15316,17 @@ snapshots: dependencies: jsesc: 3.1.0 - remark-mdx@3.0.1: + remark-mdx@3.0.1(supports-color@8.1.1): dependencies: - mdast-util-mdx: 3.0.0 + mdast-util-mdx: 3.0.0(supports-color@8.1.1) micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-parse@11.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) micromark-util-types: 2.0.0 unified: 11.0.4 transitivePeerDependencies: @@ -14916,9 +15422,9 @@ snapshots: semver@7.8.5: {} - send@0.19.2: + send@0.19.2(supports-color@8.1.1): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) depd: 2.0.0 destroy: 1.2.0 encodeurl: 2.0.0 @@ -14936,12 +15442,12 @@ snapshots: serialize-error@2.1.0: {} - serve-static@1.16.3: + serve-static@1.16.3(supports-color@8.1.1): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.2 + send: 0.19.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15129,7 +15635,7 @@ snapshots: dependencies: inline-style-parser: 0.2.3 - styled-components@6.1.11(patch_hash=7pi476ptgmafuuvkxpwgjc6kq4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + styled-components@6.1.11(patch_hash=f45e19fc6acdd728d76107753b80b4415b39780c6f67bdbe97833b41adda3638)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@emotion/is-prop-valid': 1.2.2 '@emotion/unitless': 0.8.1 @@ -15143,12 +15649,12 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.0): + styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@8.1.1))(react@19.2.0): dependencies: client-only: 0.0.1 react: 19.2.0 optionalDependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) styleq@0.1.3: {} @@ -15204,11 +15710,11 @@ snapshots: tailwind-merge@2.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5))): dependencies: - tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) - tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -15227,7 +15733,7 @@ snapshots: postcss: 8.5.23 postcss-import: 15.1.0(postcss@8.5.23) postcss-js: 4.0.1(postcss@8.5.23) - postcss-load-config: 4.0.2(postcss@8.5.23)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.5.23)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) postcss-nested: 6.0.1(postcss@8.5.23) postcss-selector-parser: 6.0.16 resolve: 1.22.12 @@ -15251,7 +15757,7 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.5(patch_hash=anzpumbibnypkm6xefxwimexay) + minimatch: 3.1.5(patch_hash=476a0494e59e628ca5f44098245651424dd99db4757bc172a9e7bf6c4fe9daf1) thenify-all@1.6.0: dependencies: @@ -15288,12 +15794,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)))(typescript@5.4.5): + ts-jest@29.4.9(@babel/core@7.29.7(supports-color@8.1.1))(@jest/transform@29.7.0(supports-color@8.1.1))(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1))(esbuild@0.28.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.9 - jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + jest: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -15302,12 +15808,18 @@ snapshots: typescript: 5.4.5 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.29.7 - '@jest/transform': 29.7.0 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.7) + babel-jest: 29.7.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + esbuild: 0.28.1 jest-util: 29.7.0 + ts-morph@28.0.0: + dependencies: + '@ts-morph/common': 0.29.0 + code-block-writer: 13.0.3 + ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -15347,6 +15859,10 @@ snapshots: '@turbo/windows-64': 2.9.14 '@turbo/windows-arm64': 2.9.14 + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-detect@4.0.8: {} type-fest@0.21.3: {} @@ -15454,6 +15970,10 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.0): dependencies: react: 19.2.0 @@ -15583,6 +16103,8 @@ snapshots: dependencies: isexe: 2.0.0 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@6.2.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f3f0bac..d53969e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,80 @@ packages: - packages/* - tools/* - apps/* + +# Everything below used to live in package.json under the "pnpm" key and in +# .npmrc. pnpm 11 stopped reading either for these settings — it warns +# "The pnpm field in package.json is no longer read by pnpm" and then installs +# without the patches and overrides, which is how an unpatched +# styled-components ends up in a release build. +nodeLinker: hoisted +dedupeDirectDeps: true + +supportedArchitectures: + os: + - win32 + - darwin + - current + cpu: + - x64 + - arm64 + +patchedDependencies: + react-native-draggable-grid@2.2.1: patches/react-native-draggable-grid@2.2.1.patch + styled-components@6.1.11: patches/styled-components@6.1.11.patch + redux-saga@1.3.0: patches/redux-saga@1.3.0.patch + minimatch@3.1.5: patches/minimatch@3.1.5.patch + minimatch@9.0.9: patches/minimatch@9.0.9.patch + +overrides: + "@react-native-async-storage/async-storage": 2.2.0 + react-native-svg: 15.15.3 + "@xmldom/xmldom": ^0.8.13 + brace-expansion: ^5.0.8 + braces: ^3.0.3 + diff@4: ^4.0.4 + esbuild: ^0.28.1 + fast-uri: ^3.1.4 + fast-xml-parser: ^5.7.0 + form-data: ^4.0.6 + image-size@1: ^1.2.1 + js-yaml@3: ^3.15.0 + js-yaml@4: ^4.3.0 + mdast-util-to-hast: ^13.2.1 + micromatch: ^4.0.8 + minimatch@3: ^3.1.4 + minimatch@9: ^9.0.7 + on-headers: ^1.1.0 + picomatch@2: ^2.3.2 + postcss: ^8.5.18 + sharp: ^0.35.3 + shell-quote: ^1.9.0 + svgo@3: ^3.3.4 + uuid: ^11.1.1 + ws@7: ^7.5.11 + ws@8: ^8.21.0 + +# pnpm 11 refuses to resolve a version published less than `minimumReleaseAge` +# ago (24h by default) as a supply-chain guard. The magic-* packages were +# published the same day this migration landed, so without these entries a +# fresh `pnpm install` cannot resolve them at all. +minimumReleaseAgeExclude: + - eslint-plugin-safe-jsx@1.3.0 + - magic-codemods@1.0.0 + - magic-oxfmt-config@1.0.0 + - magic-oxlint-config@1.0.0 + - magic-tsconfig@1.0.0 + +# pnpm 10+ does not run dependency install scripts unless they are listed here, +# and pnpm 11 makes an unanswered list a hard install failure. Every entry ran +# under pnpm 9; core-js is the only one turned off, because its postinstall only +# prints a funding banner. +allowBuilds: + "@parcel/watcher": true + "@posthog/cli": true + "@prisma/client": true + "@prisma/engines": true + "@swc/core": true + core-js: false + esbuild: true + prisma: true From 706654d304e680b1339e97408ea98493a3125691 Mon Sep 17 00:00:00 2001 From: Gabriel Taveira Date: Mon, 27 Jul 2026 02:39:40 -0300 Subject: [PATCH 02/12] chore(lint): extend the shared magic configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the hand-maintained .oxlintrc.json / .oxfmtrc.json with the published presets. The two apps get their own config next to their package.json — oxlint resolves the nearest config walking up from each file, and mobile needs `expo` where the site needs `next`. A nested config replaces rather than merges with the root one, so all three restate `ignorePatterns` (`extends` drops them). Only three local overrides survive the dedupe: the gesture-handler scrollable import ban, the database seeds' console output, and the API service layer's static-method classes. tools/tsconfig is gone in favour of magic-tsconfig — base.json and internal-package.json were byte-identical to the published ones. Claude-Session: https://claude.ai/code/session_01Fe92vvdc4R3F4BDBFoLcw1 --- .oxfmtrc.json | 3 - .oxlintrc.json | 113 --------------------------- apps/mobile/oxlint.config.mts | 55 +++++++++++++ apps/mobile/package.json | 3 +- apps/mobile/tsconfig.json | 2 +- apps/nextjs/oxlint.config.mts | 13 +++ apps/nextjs/package.json | 3 +- apps/nextjs/tsconfig.json | 35 +++------ oxfmt.config.mts | 35 +++++++++ oxlint.config.mts | 51 ++++++++++++ package.json | 9 +-- packages/api/package.json | 2 +- packages/api/tsconfig.json | 2 +- packages/database/package.json | 2 +- packages/database/tsconfig.json | 2 +- packages/shared/package.json | 2 +- packages/shared/tsconfig.json | 2 +- pnpm-lock.yaml | 38 +++++---- pnpm-workspace.yaml | 1 - tools/tsconfig/base.json | 28 ------- tools/tsconfig/internal-package.json | 10 --- tools/tsconfig/package.json | 8 -- 22 files changed, 199 insertions(+), 220 deletions(-) delete mode 100644 .oxfmtrc.json delete mode 100644 .oxlintrc.json create mode 100644 apps/mobile/oxlint.config.mts create mode 100644 apps/nextjs/oxlint.config.mts create mode 100644 oxfmt.config.mts create mode 100644 oxlint.config.mts delete mode 100644 tools/tsconfig/base.json delete mode 100644 tools/tsconfig/internal-package.json delete mode 100644 tools/tsconfig/package.json diff --git a/.oxfmtrc.json b/.oxfmtrc.json deleted file mode 100644 index b424fd4..0000000 --- a/.oxfmtrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignorePatterns": [".github/**"] -} diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index d79cbf4..0000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", - "plugins": [ - "typescript", - "react", - "react-perf", - "unicorn", - "oxc", - "import", - "promise", - "node", - "jsx-a11y" - ], - "categories": { - "correctness": "error", - "suspicious": "warn", - "perf": "warn" - }, - "env": { - "browser": true, - "node": true, - "es2024": true, - "jest": true - }, - "ignorePatterns": [ - "**/dist/**", - "**/build/**", - "**/coverage/**", - "**/.turbo/**", - "**/.next/**", - "**/node_modules/**", - "**/ios/**", - "**/android/**", - "**/.expo/**", - "**/storybook-static/**", - "patches/**", - "pnpm-lock.yaml", - "**/generated/**", - "packages/database/prisma/migrations/**", - "apps/mobile/google-services.json", - "apps/mobile/GoogleService-Info.plist" - ], - "rules": { - "no-console": "error", - "no-void": "off", - "import/no-duplicates": "error", - "react/jsx-key": "error", - "react/jsx-no-useless-fragment": ["error", { "allowExpressions": true }], - "react/jsx-boolean-value": ["error", "never"], - "react/self-closing-comp": "error", - "react/jsx-curly-brace-presence": ["error", { "props": "never", "children": "never" }], - "react/jsx-handler-names": "warn", - "react/no-children-prop": "warn", - "react/react-in-jsx-scope": "off", - "react-hooks/exhaustive-deps": "warn", - "jsx-a11y/no-autofocus": "off", - "typescript/no-unused-vars": [ - "error", - { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } - ], - "typescript/no-explicit-any": "warn", - "typescript/no-require-imports": "off", - "import/no-unassigned-import": "off", - "import/no-named-as-default-member": "off", - "unicorn/no-array-sort": "off", - "unicorn/no-array-reverse": "off", - "no-restricted-imports": [ - "error", - { - "paths": [ - { - "name": "react-native-gesture-handler", - "importNames": ["ScrollView", "FlatList", "SectionList"], - "message": "Import ScrollView/FlatList/SectionList from react-native instead." - } - ] - } - ] - }, - "overrides": [ - { - "files": [ - "**/*.test.ts", - "**/*.test.tsx", - "**/*.spec.ts", - "**/*.spec.tsx", - "**/jest.config.*", - "**/jest.setup.*", - "packages/database/seed.ts", - "packages/database/maestro-seed.ts", - "scripts/**" - ], - "rules": { - "no-console": "off" - } - }, - { - "files": ["apps/mobile/**"], - "rules": { - "react-perf/jsx-no-new-object-as-prop": "off", - "react-perf/jsx-no-new-array-as-prop": "off", - "react-perf/jsx-no-new-function-as-prop": "off", - "react-perf/jsx-no-jsx-as-prop": "off" - } - }, - { - "files": ["packages/api/src/services/**"], - "rules": { - "typescript/no-extraneous-class": "off" - } - } - ] -} diff --git a/apps/mobile/oxlint.config.mts b/apps/mobile/oxlint.config.mts new file mode 100644 index 0000000..75a37e8 --- /dev/null +++ b/apps/mobile/oxlint.config.mts @@ -0,0 +1,55 @@ +import expo from "magic-oxlint-config/expo"; +import { defineConfig } from "oxlint"; + +/** + * A nested config replaces the root one for everything under `apps/mobile`, so + * this file has to be complete on its own — including `ignorePatterns`, which + * `extends` does not carry over. + */ +export default defineConfig({ + extends: [expo], + + ignorePatterns: [ + ...(expo.ignorePatterns ?? []), + "google-services.json", + "GoogleService-Info.plist", + ], + + rules: { + // react-native-gesture-handler ships its own scrollables for use *inside* + // gesture-handler containers. Importing them anywhere else silently loses + // the platform behaviour of the react-native originals. + "no-restricted-imports": [ + "error", + { + paths: [ + { + name: "react-native-gesture-handler", + importNames: ["ScrollView", "FlatList", "SectionList"], + message: + "Import ScrollView/FlatList/SectionList from react-native instead.", + }, + ], + }, + ], + }, + + overrides: [ + { + // Expo config plugins and native target configs run in the build + // toolchain, not in the app: CommonJS, and they log. + files: ["plugins/**", "targets/**"], + rules: { + "no-console": "off", + "typescript/no-require-imports": "off", + "import/no-default-export": "off", + "func-style": "off", + }, + }, + // Must stay last — see the root config for why. + { + files: ["**/__mocks__/**"], + rules: { "unicorn/filename-case": "off" }, + }, + ], +}); diff --git a/apps/mobile/package.json b/apps/mobile/package.json index c89e541..9a8ef5f 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -111,7 +111,8 @@ "@babel/core": "^7.29.0", "@bacons/apple-targets": "^4.0.7", "@pegada/api": "workspace:*", - "@pegada/tsconfig": "workspace:*", + "magic-oxlint-config": "^1.0.0", + "magic-tsconfig": "^1.0.0", "@posthog/cli": "^0.8.1", "@types/color": "^3.0.6", "@types/jest": "^29.5.12", diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 4edc155..ddc17af 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["expo/tsconfig.base", "@pegada/tsconfig/base.json"], + "extends": ["expo/tsconfig.base", "magic-tsconfig/expo.json"], "compilerOptions": { "jsx": "react-native", "baseUrl": ".", diff --git a/apps/nextjs/oxlint.config.mts b/apps/nextjs/oxlint.config.mts new file mode 100644 index 0000000..cb8380a --- /dev/null +++ b/apps/nextjs/oxlint.config.mts @@ -0,0 +1,13 @@ +import next from "magic-oxlint-config/next"; +import { defineConfig } from "oxlint"; + +/** + * A nested config replaces the root one for everything under `apps/nextjs`, so + * this file has to be complete on its own — including `ignorePatterns`, which + * `extends` does not carry over. + */ +export default defineConfig({ + extends: [next], + + ignorePatterns: [...(next.ignorePatterns ?? [])], +}); diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 13c59a3..5db464e 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -41,7 +41,8 @@ "typescript": "*" }, "devDependencies": { - "@pegada/tsconfig": "workspace:*", + "magic-oxlint-config": "^1.0.0", + "magic-tsconfig": "^1.0.0", "@types/node": "22.1.0", "@types/react": "^19.2.14", "@types/react-dom": "~19.2.3" diff --git a/apps/nextjs/tsconfig.json b/apps/nextjs/tsconfig.json index 9e0cc40..c97d37b 100644 --- a/apps/nextjs/tsconfig.json +++ b/apps/nextjs/tsconfig.json @@ -1,36 +1,19 @@ { "$schema": "https://json.schemastore.org/tsconfig", + "extends": "magic-tsconfig/nextjs.json", "compilerOptions": { - "target": "ES2022", - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "moduleDetection": "force", - "isolatedModules": true, - - "forceConsistentCasingInFileNames": true, - - "strict": true, - "noUncheckedIndexedAccess": true, - "strictNullChecks": true, - "checkJs": true, - - "incremental": true, - "disableSourceOfProjectReferenceRedirect": true, - - "moduleResolution": "Bundler", - "noEmit": true, - "lib": ["es2022", "dom", "dom.iterable"], - "jsx": "preserve", "baseUrl": ".", "paths": { "@/*": ["./src/*"] }, - "plugins": [{ "name": "next" }], - "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json", - "module": "esnext" + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", ".next/types/**/*.ts"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.js", + ".next/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/oxfmt.config.mts b/oxfmt.config.mts new file mode 100644 index 0000000..1ae3371 --- /dev/null +++ b/oxfmt.config.mts @@ -0,0 +1,35 @@ +import base from "magic-oxfmt-config"; + +/** + * One formatter config for the whole monorepo — oxfmt has the same nearest-wins + * nesting as oxlint, but nothing here needs per-app formatting, so keeping it + * at the root keeps `oxfmt .` honest. + * + * Spread into a new object rather than re-exported, because the extra ignore + * patterns below have to be merged with the package's own. + */ +const config = { + ...base, + ignorePatterns: [ + ...(base.ignorePatterns ?? []), + // From magic-oxfmt-config's `expo` and `next` variants: this repo has both + // an Expo app and a Next app under one root config. + "**/ios/**", + "**/android/**", + "**/Pods/**", + "**/DerivedData/**", + "**/*.pbxproj", + "**/expo-env.d.ts", + "**/out/**", + "**/next-env.d.ts", + // Workflow JSON/JS embedded in .github, plus the Maestro flows and the + // generated native config files, are not ours to reformat. + ".github/**", + "patches/**", + "apps/mobile/google-services.json", + "apps/mobile/GoogleService-Info.plist", + "packages/database/prisma/migrations/**", + ], +}; + +export default config; diff --git a/oxlint.config.mts b/oxlint.config.mts new file mode 100644 index 0000000..2f1d6d1 --- /dev/null +++ b/oxlint.config.mts @@ -0,0 +1,51 @@ +import base from "magic-oxlint-config/base"; +import { defineConfig } from "oxlint"; + +/** + * Root config: plain TypeScript. It covers `packages/*`, `tools/*`, `scripts/` + * and the root config files. + * + * The two apps have their own config next to their `package.json`, because + * oxlint walks up from each file to the nearest config and the presets they + * need are different (`expo` for mobile, `next` for the site). A nested config + * *replaces* this one rather than merging with it, so each is self-contained — + * which is also why `ignorePatterns` is spelled out in all three: `extends` + * drops the extended config's ignore patterns. + */ +export default defineConfig({ + extends: [base], + + ignorePatterns: [ + ...(base.ignorePatterns ?? []), + "**/storybook-static/**", + "patches/**", + "packages/database/prisma/migrations/**", + "apps/mobile/google-services.json", + "apps/mobile/GoogleService-Info.plist", + ], + + overrides: [ + { + // Seeds are operator-facing scripts that report progress on stdout, they + // just don't live under `scripts/`. + files: ["packages/database/seed.ts", "packages/database/maestro-seed.ts"], + rules: { "no-console": "off" }, + }, + { + // The service layer is a set of static-method namespaces + // (`SuggestionService.suggestFor(...)`). That is this repo's convention + // for the API's domain services, not a general one. + files: ["packages/api/src/services/**"], + rules: { "typescript/no-extraneous-class": "off" }, + }, + { + // Repeated from the preset because an `overrides[]` entry that omits + // `plugins` re-activates category rules for the files it matches, and + // `unicorn/filename-case` is a `style` rule — so the entries above would + // switch it back on for `__mocks__` from underneath the preset. It only + // sticks if it is last. + files: ["**/__mocks__/**"], + rules: { "unicorn/filename-case": "off" }, + }, + ], +}); diff --git a/package.json b/package.json index de137be..e9322db 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "license": "AGPL-3.0-or-later", "workspaces": [ "packages/*", - "tools/*", "apps/*" ], "scripts": { @@ -17,10 +16,10 @@ "database:test": "dotenv -e .env.test -- pnpm -F @pegada/database", "test": "dotenv -e .env.test -- turbo test", "build": "dotenv -e .env.dev -- turbo build", - "lint": "oxlint", - "lint:fix": "oxlint --fix", - "format": "oxfmt --check", - "format:fix": "oxfmt", + "lint": "oxlint --report-unused-disable-directives", + "lint:fix": "oxlint --report-unused-disable-directives --fix", + "format": "oxfmt --check .", + "format:fix": "oxfmt .", "i18n:parse": "npx i18next-parser", "typecheck": "turbo typecheck", "changelog": "python3 .github/scripts/changelog.py --all --repo GSTJ/pegada --output CHANGELOG.md", diff --git a/packages/api/package.json b/packages/api/package.json index a9c3e06..2774732 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -46,7 +46,7 @@ }, "devDependencies": { "@faker-js/faker": "^8.4.1", - "@pegada/tsconfig": "workspace:*", + "magic-tsconfig": "^1.0.0", "@types/jsonwebtoken": "^9.0.10", "@types/node": "^22.1.0", "@types/semver": "^7.7.1", diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index eef2673..d4b4443 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@pegada/tsconfig/internal-package.json", + "extends": "magic-tsconfig/internal-package.json", "compilerOptions": { "outDir": "dist", "noEmit": false, diff --git a/packages/database/package.json b/packages/database/package.json index 77b2c26..3e4dd8b 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -36,7 +36,7 @@ }, "devDependencies": { "@paralleldrive/cuid2": "^2.2.2", - "@pegada/tsconfig": "workspace:*", + "magic-tsconfig": "^1.0.0", "@prisma/client": "^5.17.0", "prisma": "^5.17.0", "tsx": "^4.21.0" diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index 2b0b34d..b962ab7 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@pegada/tsconfig/internal-package.json", + "extends": "magic-tsconfig/internal-package.json", "compilerOptions": { "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" }, diff --git a/packages/shared/package.json b/packages/shared/package.json index 742cdfe..93a29d5 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -15,7 +15,7 @@ "zod-i18n-map": "^2.27.0" }, "devDependencies": { - "@pegada/tsconfig": "workspace:*", + "magic-tsconfig": "^1.0.0", "@total-typescript/ts-reset": "^0.5.1", "i18next": "^23.12.2", "zod": "3.23.8" diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index ba95fcf..02af8b9 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@pegada/tsconfig/internal-package.json", + "extends": "magic-tsconfig/internal-package.json", "compilerOptions": { "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cfa2e04..801a2e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -353,9 +353,6 @@ importers: '@pegada/api': specifier: workspace:* version: link:../../packages/api - '@pegada/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig '@posthog/cli': specifier: ^0.8.1 version: 0.8.1 @@ -389,6 +386,12 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.1.0)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.15.43)(@types/node@22.1.0)(typescript@5.4.5)) + magic-oxlint-config: + specifier: ^1.0.0 + version: 1.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1))(oxlint@1.75.0) + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 apps/nextjs: dependencies: @@ -483,9 +486,6 @@ importers: specifier: '*' version: 5.4.5 devDependencies: - '@pegada/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig '@types/node': specifier: 22.1.0 version: 22.1.0 @@ -495,6 +495,12 @@ importers: '@types/react-dom': specifier: ~19.2.3 version: 19.2.3(@types/react@19.2.17) + magic-oxlint-config: + specifier: ^1.0.0 + version: 1.0.0(eslint@9.39.5(jiti@1.21.0)(supports-color@8.1.1))(oxlint@1.75.0) + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 packages/api: dependencies: @@ -580,9 +586,6 @@ importers: '@faker-js/faker': specifier: ^8.4.1 version: 8.4.1 - '@pegada/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig '@types/jsonwebtoken': specifier: ^9.0.10 version: 9.0.10 @@ -592,6 +595,9 @@ importers: '@types/semver': specifier: ^7.7.1 version: 7.7.1 + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 next: specifier: 15.5.22 version: 15.5.22(@babel/core@7.29.7(supports-color@8.1.1))(@types/node@22.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -608,12 +614,12 @@ importers: '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 - '@pegada/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig '@prisma/client': specifier: ^5.17.0 version: 5.17.0(prisma@5.17.0) + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 prisma: specifier: ^5.17.0 version: 5.17.0 @@ -630,21 +636,19 @@ importers: specifier: ^2.27.0 version: 2.27.0(i18next@23.12.2)(zod@3.23.8) devDependencies: - '@pegada/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 i18next: specifier: ^23.12.2 version: 23.12.2 + magic-tsconfig: + specifier: ^1.0.0 + version: 1.0.0 zod: specifier: 3.23.8 version: 3.23.8 - tools/tsconfig: {} - packages: '@alloc/quick-lru@5.2.0': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d53969e..87d8aed 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ packages: - packages/* - - tools/* - apps/* # Everything below used to live in package.json under the "pnpm" key and in diff --git a/tools/tsconfig/base.json b/tools/tsconfig/base.json deleted file mode 100644 index acd4f2a..0000000 --- a/tools/tsconfig/base.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "lib": ["ES2022"], - "target": "ES2022", - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "moduleDetection": "force", - "isolatedModules": true, - - "forceConsistentCasingInFileNames": true, - - "strict": true, - "noUncheckedIndexedAccess": true, - "strictNullChecks": true, - "checkJs": true, - - "incremental": true, - "disableSourceOfProjectReferenceRedirect": true, - - "module": "Preserve", - "moduleResolution": "Bundler", - "noEmit": true - }, - "exclude": ["node_modules", "build", "dist", ".next", ".expo"] -} diff --git a/tools/tsconfig/internal-package.json b/tools/tsconfig/internal-package.json deleted file mode 100644 index f7990a2..0000000 --- a/tools/tsconfig/internal-package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./base.json", - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "noEmit": false, - "emitDeclarationOnly": true - } -} diff --git a/tools/tsconfig/package.json b/tools/tsconfig/package.json deleted file mode 100644 index c76a757..0000000 --- a/tools/tsconfig/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "@pegada/tsconfig", - "version": "0.1.0", - "private": true, - "files": [ - "*.json" - ] -} From 91bb2411353459392cdc6819a6285407707a98ae Mon Sep 17 00:00:00 2001 From: Gabriel Taveira Date: Mon, 27 Jul 2026 02:42:39 -0300 Subject: [PATCH 03/12] refactor: kebab-case filenames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `unicorn/filename-case` is on at kebabCase in the shared preset. 96 files renamed and 357 import specifiers rewritten by `magic-kebab`, run with apps/mobile/tsconfig.json so the `@/*` aliases were resolved rather than left pointing at names that no longer exist. Three things the codemod reports but will not touch, fixed by hand because they are load-bearing: - workspace subpath imports (`@pegada/api/services/PaymentService`), which go through a package `exports` map rather than a relative path; - the Expo config-plugin paths in app.config.ts, which are plain strings in the `plugins` array — a miss here fails only on a Linux/EAS build, since APFS is case-insensitive. Claude-Session: https://claude.ai/code/session_01Fe92vvdc4R3F4BDBFoLcw1 --- apps/mobile/app.config.ts | 6 ++--- ...ings.js => with-default-locale-strings.js} | 0 ...ride.js => with-initial-theme-override.js} | 0 ...ion.js => with-store-kit-configuration.js} | 0 apps/mobile/src/app/(app)/(tabs)/_layout.tsx | 6 ++--- apps/mobile/src/app/(app)/_layout.tsx | 2 +- apps/mobile/src/app/(app)/chat/[matchId].ts | 2 +- apps/mobile/src/app/(app)/profile/[id].ts | 2 +- apps/mobile/src/app/(app)/profile/edit.ts | 2 +- apps/mobile/src/app/_layout.tsx | 12 +++++----- apps/mobile/src/app/index.tsx | 2 +- .../src/assets/images/{Logo.tsx => logo.tsx} | 0 .../images/{Messages.tsx => messages.tsx} | 0 .../images/{Profile.tsx => profile.tsx} | 0 .../src/components/BottomAction/index.tsx | 2 +- .../src/components/BottomAction/styles.ts | 2 +- .../src/components/BreedPicker/index.tsx | 2 +- apps/mobile/src/components/Button/index.tsx | 2 +- apps/mobile/src/components/Button/styles.ts | 4 ++-- .../src/components/DefaultModal/styles.ts | 2 +- apps/mobile/src/components/Input/index.tsx | 2 +- apps/mobile/src/components/Input/styles.ts | 2 +- .../src/components/LikeLimitReached/index.tsx | 8 +++---- .../{useCountdown.tsx => use-countdown.tsx} | 0 .../MainCard/components/Distance/styles.ts | 4 ++-- .../MainCard/components/Pagination/styles.ts | 2 +- .../components/PersonalInfo/index.tsx | 2 +- .../components/PersonalInfo/styles.ts | 2 +- apps/mobile/src/components/MainCard/index.tsx | 4 ++-- apps/mobile/src/components/MainCard/styles.ts | 2 +- ...ckground.tsx => glass-pill-background.tsx} | 0 .../src/components/MatchActionBar/index.tsx | 2 +- .../src/components/MatchActionBar/styles.ts | 4 ++-- .../src/components/NetworkBoundary/styles.ts | 2 +- apps/mobile/src/components/Picker/index.tsx | 4 ++-- apps/mobile/src/components/Picker/styles.ts | 2 +- .../components/AddUserPhoto/index.tsx | 6 ++--- .../components/AddUserPhoto/styles.ts | 4 ++-- .../components/ProfileImageUploader/index.tsx | 2 +- .../ProfileImageUploader/utils/index.ts | 8 +++---- .../src/components/RadioButtons/index.tsx | 2 +- .../src/components/RadioButtons/styles.ts | 4 ++-- apps/mobile/src/components/Slider/index.tsx | 2 +- .../{BlurView.tsx => blur-view.tsx} | 0 ...CustomBackdrop.tsx => custom-backdrop.tsx} | 0 .../src/components/{Divider.ts => divider.ts} | 0 ...ageBackground.tsx => image-background.tsx} | 0 ...imageProps.test.ts => image-props.test.ts} | 4 ++-- .../{imageProps.ts => image-props.ts} | 0 .../{Image.test.tsx => image.test.tsx} | 2 +- .../src/components/{Image.tsx => image.tsx} | 2 +- .../src/components/{Loading.ts => loading.ts} | 0 .../{PressableArea.tsx => pressable-area.tsx} | 0 .../src/components/{Text.ts => text.ts} | 0 apps/mobile/src/config.ts | 2 +- .../{ThemeProvider.tsx => theme-provider.tsx} | 2 +- .../{trcpContext.tsx => trcp-context.tsx} | 2 +- .../{TRPCProvider.tsx => trpc-provider.tsx} | 4 ++-- ...CityText.tsx => use-current-city-text.tsx} | 2 +- ...ight.tsx => use-delayed-header-height.tsx} | 0 ...> use-keyboard-aware-safe-area-insets.tsx} | 0 .../{usePayments.tsx => use-payments.tsx} | 4 ++-- ...otectedRoute.ts => use-protected-route.ts} | 2 +- ...seTrackScreens.ts => use-track-screens.ts} | 0 ...mUpBrowser.tsx => use-warm-up-browser.tsx} | 2 +- apps/mobile/src/i18n.ts | 2 +- .../services/advertisement/interstitial.ts | 4 ++-- .../{appReview.tsx => app-review.tsx} | 6 ++--- .../{errorTracking.ts => error-tracking.ts} | 0 .../services/{getError.ts => get-error.ts} | 0 ...RouteName.ts => get-initial-route-name.ts} | 8 +++---- ...tLoggedUserID.ts => get-logged-user-id.ts} | 0 .../{getMimeType.ts => get-mime-type.ts} | 0 ...oken.ts => get-push-notification-token.ts} | 2 +- apps/mobile/src/services/haptics.ts | 2 +- ...otification.ts => initial-notification.ts} | 0 .../services/linking/handlers/notification.ts | 4 ++-- .../services/linking/handlers/reply.test.ts | 8 +++---- .../src/services/linking/handlers/reply.ts | 4 ++-- apps/mobile/src/services/linking/index.ts | 4 ++-- apps/mobile/src/services/logout.ts | 8 +++---- .../services/{maskDate.tsx => mask-date.tsx} | 0 .../src/services/matchesWidget/index.ts | 2 +- ...dgetSync.ts => use-matches-widget-sync.ts} | 4 ++-- ...{openWebBrowser.ts => open-web-browser.ts} | 0 apps/mobile/src/services/payments/index.ts | 8 +++---- .../{queryClient.tsx => query-client.tsx} | 0 .../services/quickActions/handlers/action.ts | 4 ++-- .../mobile/src/services/quickActions/index.ts | 2 +- .../{themeUtils.ts => theme-utils.ts} | 0 ...tedYears.ts => use-get-formatted-years.ts} | 2 +- apps/mobile/src/store/reducers/dogs/swipe.ts | 2 +- apps/mobile/src/store/sagas/dogs/list.ts | 4 ++-- apps/mobile/src/store/sagas/dogs/swipe.ts | 12 +++++----- .../src/types/{SceneName.ts => scene-name.ts} | 0 .../src/views/(auth)/AskForLocation/index.tsx | 8 +++---- .../views/(auth)/CompleteProfile/index.tsx | 16 ++++++------- .../views/(auth)/CompleteProfile/styles.ts | 2 +- .../src/views/(auth)/CreateProfile/index.tsx | 14 +++++------ .../OneTimeCode/components/GoBack/styles.ts | 2 +- .../hooks/{useTimer.ts => use-timer.ts} | 0 .../src/views/(auth)/OneTimeCode/index.tsx | 12 +++++----- .../src/views/(auth)/OneTimeCode/styles.ts | 4 ++-- .../SignIn/components/EmailInput/styles.ts | 2 +- .../SignIn/components/HeroText/styles.ts | 2 +- apps/mobile/src/views/(auth)/SignIn/index.tsx | 10 ++++---- apps/mobile/src/views/(auth)/SignIn/styles.ts | 4 ++-- .../Messages/components/Message/index.tsx | 6 ++--- .../Messages/components/Message/styles.ts | 4 ++-- .../Messages/components/Preview/index.tsx | 4 ++-- .../Messages/components/Preview/styles.ts | 4 ++-- .../Messages/components/SearchBar/index.tsx | 2 +- .../{EmptyMessages.tsx => empty-messages.tsx} | 4 ++-- .../src/views/(tabs)/Messages/index.tsx | 16 ++++++------- .../Profile/components/Config/styles.ts | 2 +- .../components/UserDogProfileHeader/index.tsx | 6 ++--- ...PlanConfig.tsx => current-plan-config.tsx} | 6 ++--- ...LanguageConfig.tsx => language-config.tsx} | 2 +- ...LocationConfig.tsx => location-config.tsx} | 4 ++-- .../{ThemeConfig.tsx => theme-config.tsx} | 4 ++-- .../mobile/src/views/(tabs)/Profile/index.tsx | 24 +++++++++---------- .../mobile/src/views/(tabs)/Profile/styles.ts | 2 +- .../{deleteAccount.tsx => delete-account.tsx} | 4 ++-- .../{handleLogout.tsx => handle-logout.tsx} | 0 .../components/SwipeBackButton/index.tsx | 4 ++-- .../components/SwipeBackButton/styles.ts | 2 +- ...seSwipeGesture.ts => use-swipe-gesture.ts} | 0 .../Swipe/components/SwipeHandler/index.tsx | 2 +- .../components/SwipeRequestFeedback/index.tsx | 2 +- .../components/SwipeRequestFeedback/styles.ts | 2 +- ...ChangeLocation.tsx => change-location.tsx} | 8 +++---- apps/mobile/src/views/(tabs)/Swipe/index.tsx | 10 ++++---- .../views/Chat/components/Header/index.tsx | 6 ++--- .../views/Chat/components/Header/styles.tsx | 6 ++--- .../views/Chat/components/Message/index.tsx | 4 ++-- .../views/Chat/components/Message/styles.ts | 4 ++-- .../views/Chat/components/NextDay/styles.ts | 2 +- .../src/views/Chat/components/Send/index.tsx | 4 ++-- .../src/views/Chat/components/Send/styles.ts | 2 +- .../components/{Feedback.tsx => feedback.tsx} | 0 .../src/views/Chat/components/index.tsx | 2 +- ...atPagination.ts => use-chat-pagination.ts} | 8 +++---- ...wMessages.ts => use-fetch-new-messages.ts} | 8 +++---- ...{useSendMessage.ts => use-send-message.ts} | 10 ++++---- apps/mobile/src/views/Chat/index.tsx | 4 ++-- apps/mobile/src/views/Chat/styles.ts | 2 +- .../DogProfile/components/GoBack/styles.ts | 4 ++-- .../{BreedTag.tsx => breed-tag.tsx} | 4 ++-- apps/mobile/src/views/DogProfile/index.tsx | 16 ++++++------- apps/mobile/src/views/DogProfile/styles.ts | 4 ++-- apps/mobile/src/views/EditProfile/index.tsx | 10 ++++---- apps/mobile/src/views/ForceUpdate/index.tsx | 4 ++-- apps/mobile/src/views/ForceUpdate/styles.ts | 2 +- .../LocationMap/components/Bubble/styles.ts | 2 +- apps/mobile/src/views/LocationMap/index.tsx | 4 ++-- .../{AnimatedCards.tsx => animated-cards.tsx} | 4 ++-- ...tiAnimation.tsx => confetti-animation.tsx} | 0 apps/mobile/src/views/NewMatch/index.tsx | 10 ++++---- apps/mobile/src/views/NewMatch/styles.ts | 2 +- apps/mobile/src/views/Preferences/index.tsx | 8 +++---- .../UpgradeWall/components/Benefits/index.tsx | 2 +- .../components/PlanPackages/index.tsx | 4 ++-- .../{PlanCard.tsx => plan-card.tsx} | 2 +- .../components/PlanPackages/styles.ts | 4 ++-- .../components/RestorePurchases/index.tsx | 6 ++--- apps/mobile/src/views/UpgradeWall/index.tsx | 4 ++-- apps/mobile/src/views/UpgradeWall/styles.ts | 6 ++--- .../{Splashscreen.tsx => splashscreen.tsx} | 0 .../nextjs/src/app/[locale]/dog/[id]/page.tsx | 2 +- .../src/app/api/queues/process-image/route.ts | 2 +- .../src/app/api/webhooks/revenuecat/route.ts | 2 +- apps/nextjs/src/lib/translate.ts | 2 +- .../api/src/dtos/{dogDto.ts => dog-dto.ts} | 2 +- ...odeTemplate.ts => verify-code-template.ts} | 0 packages/api/src/queue/enqueue.ts | 2 +- packages/api/src/queue/handlers/mail.ts | 6 ++--- ...essImage.test.ts => process-image.test.ts} | 8 +++---- .../{processImage.ts => process-image.ts} | 8 +++---- packages/api/src/queue/handlers/push.ts | 2 +- packages/api/src/root.ts | 2 +- packages/api/src/routes/authentication.ts | 2 +- packages/api/src/routes/dog.ts | 4 ++-- packages/api/src/routes/echo.ts | 2 +- packages/api/src/routes/image.ts | 2 +- packages/api/src/routes/match.ts | 4 ++-- packages/api/src/routes/message.ts | 4 ++-- .../api/src/routes/{myDog.ts => my-dog.ts} | 4 ++-- packages/api/src/routes/payment.ts | 2 +- packages/api/src/routes/swipe.ts | 6 ++--- packages/api/src/routes/user.ts | 2 +- ...ice.test.ts => suggestion-service.test.ts} | 8 +++---- ...estionService.ts => suggestion-service.ts} | 4 ++-- ...onService.ts => authentication-service.ts} | 0 .../{DogService.ts => dog-service.ts} | 10 ++++---- .../{EchoService.ts => echo-service.ts} | 2 +- .../{FlagService.ts => flag-service.ts} | 2 +- ...Service.ts => image-processing-service.ts} | 4 ++-- .../{ImageService.ts => image-service.ts} | 6 ++--- .../{MailService.ts => mail-service.ts} | 2 +- .../{MatchService.ts => match-service.ts} | 10 ++++---- ...ervice.test.ts => message-service.test.ts} | 2 +- .../{MessageService.ts => message-service.ts} | 6 ++--- .../{PaymentService.ts => payment-service.ts} | 2 +- ...ervice.ts => push-notification-service.ts} | 2 +- .../{SwipeService.ts => swipe-service.ts} | 12 +++++----- ...ationService.ts => translation-service.ts} | 0 .../{UserService.ts => user-service.ts} | 0 ...ultFor.ts => cache-function-result-for.ts} | 0 ...chema.test.ts => dog-input-schema.test.ts} | 2 +- ...{dogInputSchema.ts => dog-input-schema.ts} | 4 ++-- ...fileUpload.test.ts => file-upload.test.ts} | 2 +- .../shared/{fileUpload.ts => file-upload.ts} | 2 +- .../{imageUrl.test.ts => image-url.test.ts} | 2 +- .../src/shared/{imageUrl.ts => image-url.ts} | 0 .../types/{routerTypes.ts => router-types.ts} | 0 .../schemas/{dogSchema.ts => dog-schema.ts} | 0 ...umStrokeSize.ts => minimum-stroke-size.ts} | 0 packages/shared/themes/themes.ts | 2 +- ...rmattedYears.ts => get-formatted-years.ts} | 0 219 files changed, 379 insertions(+), 379 deletions(-) rename apps/mobile/plugins/{withDefaultLocaleStrings.js => with-default-locale-strings.js} (100%) rename apps/mobile/plugins/{withInitialThemeOverride.js => with-initial-theme-override.js} (100%) rename apps/mobile/plugins/{withStoreKitConfiguration.js => with-store-kit-configuration.js} (100%) rename apps/mobile/src/assets/images/{Logo.tsx => logo.tsx} (100%) rename apps/mobile/src/assets/images/{Messages.tsx => messages.tsx} (100%) rename apps/mobile/src/assets/images/{Profile.tsx => profile.tsx} (100%) rename apps/mobile/src/components/LikeLimitReached/{useCountdown.tsx => use-countdown.tsx} (100%) rename apps/mobile/src/components/MatchActionBar/{GlassPillBackground.tsx => glass-pill-background.tsx} (100%) rename apps/mobile/src/components/{BlurView.tsx => blur-view.tsx} (100%) rename apps/mobile/src/components/{CustomBackdrop.tsx => custom-backdrop.tsx} (100%) rename apps/mobile/src/components/{Divider.ts => divider.ts} (100%) rename apps/mobile/src/components/{ImageBackground.tsx => image-background.tsx} (100%) rename apps/mobile/src/components/{imageProps.test.ts => image-props.test.ts} (96%) rename apps/mobile/src/components/{imageProps.ts => image-props.ts} (100%) rename apps/mobile/src/components/{Image.test.tsx => image.test.tsx} (97%) rename apps/mobile/src/components/{Image.tsx => image.tsx} (93%) rename apps/mobile/src/components/{Loading.ts => loading.ts} (100%) rename apps/mobile/src/components/{PressableArea.tsx => pressable-area.tsx} (100%) rename apps/mobile/src/components/{Text.ts => text.ts} (100%) rename apps/mobile/src/contexts/{ThemeProvider.tsx => theme-provider.tsx} (98%) rename apps/mobile/src/contexts/{trcpContext.tsx => trcp-context.tsx} (85%) rename apps/mobile/src/contexts/{TRPCProvider.tsx => trpc-provider.tsx} (96%) rename apps/mobile/src/hooks/{useCurrentCityText.tsx => use-current-city-text.tsx} (93%) rename apps/mobile/src/hooks/{useDelayedHeaderHeight.tsx => use-delayed-header-height.tsx} (100%) rename apps/mobile/src/hooks/{useKeyboardAwareSafeAreaInsets.tsx => use-keyboard-aware-safe-area-insets.tsx} (100%) rename apps/mobile/src/hooks/{usePayments.tsx => use-payments.tsx} (96%) rename apps/mobile/src/hooks/{useProtectedRoute.ts => use-protected-route.ts} (93%) rename apps/mobile/src/hooks/{useTrackScreens.ts => use-track-screens.ts} (100%) rename apps/mobile/src/hooks/{useWarmUpBrowser.tsx => use-warm-up-browser.tsx} (84%) rename apps/mobile/src/services/{appReview.tsx => app-review.tsx} (97%) rename apps/mobile/src/services/{errorTracking.ts => error-tracking.ts} (100%) rename apps/mobile/src/services/{getError.ts => get-error.ts} (100%) rename apps/mobile/src/services/{getInitialRouteName.ts => get-initial-route-name.ts} (84%) rename apps/mobile/src/services/{getLoggedUserID.ts => get-logged-user-id.ts} (100%) rename apps/mobile/src/services/{getMimeType.ts => get-mime-type.ts} (100%) rename apps/mobile/src/services/{getPushNotificationToken.ts => get-push-notification-token.ts} (98%) rename apps/mobile/src/services/linking/handlers/{initialNotification.ts => initial-notification.ts} (100%) rename apps/mobile/src/services/{maskDate.tsx => mask-date.tsx} (100%) rename apps/mobile/src/services/matchesWidget/{useMatchesWidgetSync.ts => use-matches-widget-sync.ts} (93%) rename apps/mobile/src/services/{openWebBrowser.ts => open-web-browser.ts} (100%) rename apps/mobile/src/services/{queryClient.tsx => query-client.tsx} (100%) rename apps/mobile/src/services/{themeUtils.ts => theme-utils.ts} (100%) rename apps/mobile/src/services/{useGetFormattedYears.ts => use-get-formatted-years.ts} (74%) rename apps/mobile/src/types/{SceneName.ts => scene-name.ts} (100%) rename apps/mobile/src/views/(auth)/OneTimeCode/hooks/{useTimer.ts => use-timer.ts} (100%) rename apps/mobile/src/views/(tabs)/Messages/components/{EmptyMessages.tsx => empty-messages.tsx} (95%) rename apps/mobile/src/views/(tabs)/Profile/components/{CurrentPlanConfig.tsx => current-plan-config.tsx} (94%) rename apps/mobile/src/views/(tabs)/Profile/components/{LanguageConfig.tsx => language-config.tsx} (97%) rename apps/mobile/src/views/(tabs)/Profile/components/{LocationConfig.tsx => location-config.tsx} (93%) rename apps/mobile/src/views/(tabs)/Profile/components/{ThemeConfig.tsx => theme-config.tsx} (92%) rename apps/mobile/src/views/(tabs)/Profile/utils/{deleteAccount.tsx => delete-account.tsx} (92%) rename apps/mobile/src/views/(tabs)/Profile/utils/{handleLogout.tsx => handle-logout.tsx} (100%) rename apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/{useSwipeGesture.ts => use-swipe-gesture.ts} (100%) rename apps/mobile/src/views/(tabs)/Swipe/components/{ChangeLocation.tsx => change-location.tsx} (89%) rename apps/mobile/src/views/Chat/components/{Feedback.tsx => feedback.tsx} (100%) rename apps/mobile/src/views/Chat/hooks/{useChatPagination.ts => use-chat-pagination.ts} (87%) rename apps/mobile/src/views/Chat/hooks/{useFetchNewMessages.ts => use-fetch-new-messages.ts} (92%) rename apps/mobile/src/views/Chat/hooks/{useSendMessage.ts => use-send-message.ts} (92%) rename apps/mobile/src/views/DogProfile/components/{BreedTag.tsx => breed-tag.tsx} (91%) rename apps/mobile/src/views/NewMatch/{AnimatedCards.tsx => animated-cards.tsx} (96%) rename apps/mobile/src/views/NewMatch/{ConfettiAnimation.tsx => confetti-animation.tsx} (100%) rename apps/mobile/src/views/UpgradeWall/components/PlanPackages/{PlanCard.tsx => plan-card.tsx} (98%) rename apps/mobile/src/views/{Splashscreen.tsx => splashscreen.tsx} (100%) rename packages/api/src/dtos/{dogDto.ts => dog-dto.ts} (97%) rename packages/api/src/mails/{verifyCodeTemplate.ts => verify-code-template.ts} (100%) rename packages/api/src/queue/handlers/{processImage.test.ts => process-image.test.ts} (85%) rename packages/api/src/queue/handlers/{processImage.ts => process-image.ts} (80%) rename packages/api/src/routes/{myDog.ts => my-dog.ts} (85%) rename packages/api/src/services/SuggestionService/{SuggestionService.test.ts => suggestion-service.test.ts} (98%) rename packages/api/src/services/SuggestionService/{SuggestionService.ts => suggestion-service.ts} (98%) rename packages/api/src/services/{AuthenticationService.ts => authentication-service.ts} (100%) rename packages/api/src/services/{DogService.ts => dog-service.ts} (97%) rename packages/api/src/services/{EchoService.ts => echo-service.ts} (92%) rename packages/api/src/services/{FlagService.ts => flag-service.ts} (91%) rename packages/api/src/services/{ImageProcessingService.ts => image-processing-service.ts} (94%) rename packages/api/src/services/{ImageService.ts => image-service.ts} (96%) rename packages/api/src/services/{MailService.ts => mail-service.ts} (97%) rename packages/api/src/services/{MatchService.ts => match-service.ts} (92%) rename packages/api/src/services/{MessageService.test.ts => message-service.test.ts} (98%) rename packages/api/src/services/{MessageService.ts => message-service.ts} (95%) rename packages/api/src/services/{PaymentService.ts => payment-service.ts} (98%) rename packages/api/src/services/{PushNotificationService.ts => push-notification-service.ts} (95%) rename packages/api/src/services/{SwipeService.ts => swipe-service.ts} (95%) rename packages/api/src/services/{TranslationService.ts => translation-service.ts} (100%) rename packages/api/src/services/{UserService.ts => user-service.ts} (100%) rename packages/api/src/shared/{cacheFunctionResultFor.ts => cache-function-result-for.ts} (100%) rename packages/api/src/shared/{dogInputSchema.test.ts => dog-input-schema.test.ts} (98%) rename packages/api/src/shared/{dogInputSchema.ts => dog-input-schema.ts} (86%) rename packages/api/src/shared/{fileUpload.test.ts => file-upload.test.ts} (98%) rename packages/api/src/shared/{fileUpload.ts => file-upload.ts} (99%) rename packages/api/src/shared/{imageUrl.test.ts => image-url.test.ts} (99%) rename packages/api/src/shared/{imageUrl.ts => image-url.ts} (100%) rename packages/api/src/types/{routerTypes.ts => router-types.ts} (100%) rename packages/shared/schemas/{dogSchema.ts => dog-schema.ts} (100%) rename packages/shared/themes/{minimumStrokeSize.ts => minimum-stroke-size.ts} (100%) rename packages/shared/utils/{getFormattedYears.ts => get-formatted-years.ts} (100%) diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 9dbafd7..8f3545b 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -192,7 +192,7 @@ const config: ExpoConfig = { // scheme so simulator runs (local + CI) can resolve real product pricing // without an App Store sandbox session. Plugin is a no-op when the file // is missing or when the platform isn't iOS. - "./plugins/withStoreKitConfiguration", + "./plugins/with-store-kit-configuration", // Seeds Android's base (unqualified) values/strings.xml with the // primary locale's native strings. Without this, Android Lint's // ExtraTranslation check treats every string in locales.en / @@ -200,12 +200,12 @@ const config: ExpoConfig = { // locale-tagged resource file, absent from the default one) and // FAILS gradlew bundleRelease -- this is what killed the 2026-07-05 // overnight EAS cloud build. See withDefaultLocaleStrings.js. - ["./plugins/withDefaultLocaleStrings", { stringsByKey: defaultLocaleNativeStrings }], + ["./plugins/with-default-locale-strings", { stringsByKey: defaultLocaleNativeStrings }], // Applies the user's in-app theme choice (mirrored to NSUserDefaults by // ThemeProvider) to the iOS window before the splash screen renders, so // a forced dark theme boots with a dark splash instead of blinking // white->dark on light-mode devices. See withInitialThemeOverride.js. - "./plugins/withInitialThemeOverride", + "./plugins/with-initial-theme-override", // Sourcemap upload for Release native builds only (see // posthogSourcemapsEnabled above) -- omitted entirely from the plugins // list otherwise, so a plain local build never has the upload step in diff --git a/apps/mobile/plugins/withDefaultLocaleStrings.js b/apps/mobile/plugins/with-default-locale-strings.js similarity index 100% rename from apps/mobile/plugins/withDefaultLocaleStrings.js rename to apps/mobile/plugins/with-default-locale-strings.js diff --git a/apps/mobile/plugins/withInitialThemeOverride.js b/apps/mobile/plugins/with-initial-theme-override.js similarity index 100% rename from apps/mobile/plugins/withInitialThemeOverride.js rename to apps/mobile/plugins/with-initial-theme-override.js diff --git a/apps/mobile/plugins/withStoreKitConfiguration.js b/apps/mobile/plugins/with-store-kit-configuration.js similarity index 100% rename from apps/mobile/plugins/withStoreKitConfiguration.js rename to apps/mobile/plugins/with-store-kit-configuration.js diff --git a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx index e6ab958..bf045dc 100644 --- a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx +++ b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx @@ -2,9 +2,9 @@ import { useSafeAreaInsets } from "react-native-safe-area-context"; import { Tabs } from "expo-router"; import { useTheme } from "styled-components/native"; -import Logo from "@/assets/images/Logo"; -import Messages from "@/assets/images/Messages"; -import Profile from "@/assets/images/Profile"; +import Logo from "@/assets/images/logo"; +import Messages from "@/assets/images/messages"; +import Profile from "@/assets/images/profile"; interface TabBarIconProps { focused: boolean; diff --git a/apps/mobile/src/app/(app)/_layout.tsx b/apps/mobile/src/app/(app)/_layout.tsx index 2a2972d..a212046 100644 --- a/apps/mobile/src/app/(app)/_layout.tsx +++ b/apps/mobile/src/app/(app)/_layout.tsx @@ -4,7 +4,7 @@ import Color from "color"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import { useMatchesWidgetSync } from "@/services/matchesWidget/useMatchesWidgetSync"; +import { useMatchesWidgetSync } from "@/services/matchesWidget/use-matches-widget-sync"; export default () => { const theme = useTheme(); diff --git a/apps/mobile/src/app/(app)/chat/[matchId].ts b/apps/mobile/src/app/(app)/chat/[matchId].ts index 8fc70c2..2477ca7 100644 --- a/apps/mobile/src/app/(app)/chat/[matchId].ts +++ b/apps/mobile/src/app/(app)/chat/[matchId].ts @@ -1,4 +1,4 @@ -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; export { default } from "@/views/Chat"; diff --git a/apps/mobile/src/app/(app)/profile/[id].ts b/apps/mobile/src/app/(app)/profile/[id].ts index 73d119f..78533ff 100644 --- a/apps/mobile/src/app/(app)/profile/[id].ts +++ b/apps/mobile/src/app/(app)/profile/[id].ts @@ -1,4 +1,4 @@ -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; export { default } from "@/views/DogProfile"; diff --git a/apps/mobile/src/app/(app)/profile/edit.ts b/apps/mobile/src/app/(app)/profile/edit.ts index 7b5ec80..9765e06 100644 --- a/apps/mobile/src/app/(app)/profile/edit.ts +++ b/apps/mobile/src/app/(app)/profile/edit.ts @@ -1,4 +1,4 @@ -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; export { default } from "@/views/EditProfile"; diff --git a/apps/mobile/src/app/_layout.tsx b/apps/mobile/src/app/_layout.tsx index 7d9bf00..a96b86f 100644 --- a/apps/mobile/src/app/_layout.tsx +++ b/apps/mobile/src/app/_layout.tsx @@ -12,14 +12,14 @@ import styled from "styled-components/native"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { config } from "@/services/config"; import { posthog } from "@/services/posthog"; -import { storedThemePromise, ThemeProvider } from "@/contexts/ThemeProvider"; -import { TRPCProvider } from "@/contexts/TRPCProvider"; -import { useProtectedRoute } from "@/hooks/useProtectedRoute"; -import { useTrackScreens } from "@/hooks/useTrackScreens"; -import { sendError } from "@/services/errorTracking"; +import { storedThemePromise, ThemeProvider } from "@/contexts/theme-provider"; +import { TRPCProvider } from "@/contexts/trpc-provider"; +import { useProtectedRoute } from "@/hooks/use-protected-route"; +import { useTrackScreens } from "@/hooks/use-track-screens"; +import { sendError } from "@/services/error-tracking"; import { useGetInitialNotifications } from "@/services/linking"; import { useQuickActions } from "@/services/quickActions"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { store } from "@/store"; // Wait for the assets to load before hiding the SplashScreen diff --git a/apps/mobile/src/app/index.tsx b/apps/mobile/src/app/index.tsx index 0e97700..5713e1c 100644 --- a/apps/mobile/src/app/index.tsx +++ b/apps/mobile/src/app/index.tsx @@ -1 +1 @@ -export { default } from "@/views/Splashscreen"; +export { default } from "@/views/splashscreen"; diff --git a/apps/mobile/src/assets/images/Logo.tsx b/apps/mobile/src/assets/images/logo.tsx similarity index 100% rename from apps/mobile/src/assets/images/Logo.tsx rename to apps/mobile/src/assets/images/logo.tsx diff --git a/apps/mobile/src/assets/images/Messages.tsx b/apps/mobile/src/assets/images/messages.tsx similarity index 100% rename from apps/mobile/src/assets/images/Messages.tsx rename to apps/mobile/src/assets/images/messages.tsx diff --git a/apps/mobile/src/assets/images/Profile.tsx b/apps/mobile/src/assets/images/profile.tsx similarity index 100% rename from apps/mobile/src/assets/images/Profile.tsx rename to apps/mobile/src/assets/images/profile.tsx diff --git a/apps/mobile/src/components/BottomAction/index.tsx b/apps/mobile/src/components/BottomAction/index.tsx index ce9b71f..eb0ef7b 100644 --- a/apps/mobile/src/components/BottomAction/index.tsx +++ b/apps/mobile/src/components/BottomAction/index.tsx @@ -3,7 +3,7 @@ import { Platform } from "react-native"; import { BlurViewProps } from "expo-blur"; import { useTheme } from "styled-components/native"; -import { useKeyboardAwareSafeAreaInsets } from "../../hooks/useKeyboardAwareSafeAreaInsets"; +import { useKeyboardAwareSafeAreaInsets } from "../../hooks/use-keyboard-aware-safe-area-insets"; import { BUTTON_HEIGHT } from "../Button/styles"; import * as S from "./styles"; diff --git a/apps/mobile/src/components/BottomAction/styles.ts b/apps/mobile/src/components/BottomAction/styles.ts index 7a433f3..7ec90b6 100644 --- a/apps/mobile/src/components/BottomAction/styles.ts +++ b/apps/mobile/src/components/BottomAction/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { BlurView } from "@/components/BlurView"; +import { BlurView } from "@/components/blur-view"; export const Container = styled(BlurView)` padding: ${(props) => props.theme.spacing[4]}px; diff --git a/apps/mobile/src/components/BreedPicker/index.tsx b/apps/mobile/src/components/BreedPicker/index.tsx index 3758bbd..daf5626 100644 --- a/apps/mobile/src/components/BreedPicker/index.tsx +++ b/apps/mobile/src/components/BreedPicker/index.tsx @@ -6,7 +6,7 @@ import { Namespace } from "@pegada/shared/i18n/types/types"; import { Input } from "@/components/Input"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { api } from "@/contexts/TRPCProvider"; +import { api } from "@/contexts/trpc-provider"; import { InputPicker } from "../Picker"; interface BreedPickerProps { diff --git a/apps/mobile/src/components/Button/index.tsx b/apps/mobile/src/components/Button/index.tsx index 8f4d809..a92329a 100644 --- a/apps/mobile/src/components/Button/index.tsx +++ b/apps/mobile/src/components/Button/index.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { PressableProps } from "react-native"; -import Loading from "@/components/Loading"; +import Loading from "@/components/loading"; import { ButtonText, Container, ContainerProps } from "./styles"; export interface ButtonProps extends ContainerProps, PressableProps { diff --git a/apps/mobile/src/components/Button/styles.ts b/apps/mobile/src/components/Button/styles.ts index 9012362..280489a 100644 --- a/apps/mobile/src/components/Button/styles.ts +++ b/apps/mobile/src/components/Button/styles.ts @@ -1,7 +1,7 @@ import styled, { css } from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; interface VariantProps { variant?: "outline" | "default"; diff --git a/apps/mobile/src/components/DefaultModal/styles.ts b/apps/mobile/src/components/DefaultModal/styles.ts index 2a1a938..e400470 100644 --- a/apps/mobile/src/components/DefaultModal/styles.ts +++ b/apps/mobile/src/components/DefaultModal/styles.ts @@ -1,7 +1,7 @@ import styled from "styled-components/native"; import { Button } from "@/components/Button"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const OkButton = styled(Button)` width: 100%; diff --git a/apps/mobile/src/components/Input/index.tsx b/apps/mobile/src/components/Input/index.tsx index df0daaa..e2716a6 100644 --- a/apps/mobile/src/components/Input/index.tsx +++ b/apps/mobile/src/components/Input/index.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { TextInput, TextInputProps, ViewProps } from "react-native"; import { useTranslation } from "react-i18next"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import * as S from "./styles"; interface TextFieldContainerProps { diff --git a/apps/mobile/src/components/Input/styles.ts b/apps/mobile/src/components/Input/styles.ts index 866f92d..de11131 100644 --- a/apps/mobile/src/components/Input/styles.ts +++ b/apps/mobile/src/components/Input/styles.ts @@ -2,7 +2,7 @@ import { ActivityIndicator } from "react-native"; import styled from "styled-components/native"; import cancelIcon from "@/assets/images/Cancel.svg"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; export const Container = styled.View` margin-top: ${(props) => props.theme.spacing[4]}px; diff --git a/apps/mobile/src/components/LikeLimitReached/index.tsx b/apps/mobile/src/components/LikeLimitReached/index.tsx index 3d8eaa0..667ef66 100644 --- a/apps/mobile/src/components/LikeLimitReached/index.tsx +++ b/apps/mobile/src/components/LikeLimitReached/index.tsx @@ -12,12 +12,12 @@ import { LikeLimitReachedProps, useCountdown, ZERO_TIME_LEFT, -} from "@/components/LikeLimitReached/useCountdown"; +} from "@/components/LikeLimitReached/use-countdown"; import { CloseIcon } from "@/components/Picker/styles"; -import { Text } from "@/components/Text"; -import { useEligibleForTrial } from "@/hooks/usePayments"; +import { Text } from "@/components/text"; +import { useEligibleForTrial } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { CloseButton } from "@/views/UpgradeWall/styles"; const LikeLimitReached: React.FC = ({ likeLimitResetAt }) => { diff --git a/apps/mobile/src/components/LikeLimitReached/useCountdown.tsx b/apps/mobile/src/components/LikeLimitReached/use-countdown.tsx similarity index 100% rename from apps/mobile/src/components/LikeLimitReached/useCountdown.tsx rename to apps/mobile/src/components/LikeLimitReached/use-countdown.tsx diff --git a/apps/mobile/src/components/MainCard/components/Distance/styles.ts b/apps/mobile/src/components/MainCard/components/Distance/styles.ts index 0aed437..6adaa8d 100644 --- a/apps/mobile/src/components/MainCard/components/Distance/styles.ts +++ b/apps/mobile/src/components/MainCard/components/Distance/styles.ts @@ -1,7 +1,7 @@ import styled from "styled-components/native"; -import { TransparentGlassOrDarkBlurView } from "@/components/BlurView"; -import { Text } from "@/components/Text"; +import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; +import { Text } from "@/components/text"; export const Container = styled(TransparentGlassOrDarkBlurView)` margin: ${(props) => props.theme.spacing[6]}px; diff --git a/apps/mobile/src/components/MainCard/components/Pagination/styles.ts b/apps/mobile/src/components/MainCard/components/Pagination/styles.ts index f4b051c..ef22bd0 100644 --- a/apps/mobile/src/components/MainCard/components/Pagination/styles.ts +++ b/apps/mobile/src/components/MainCard/components/Pagination/styles.ts @@ -1,7 +1,7 @@ import Animated from "react-native-reanimated"; import styled from "styled-components/native"; -import { TransparentGlassOrDarkBlurView } from "@/components/BlurView"; +import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; export const Content = styled.View` padding: ${(props) => props.theme.spacing[1]}px; diff --git a/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx b/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx index 3807646..a49cdd1 100644 --- a/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx +++ b/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { ViewProps } from "react-native"; import { LinearGradient } from "expo-linear-gradient"; -import { useGetFormattedYears } from "@/services/useGetFormattedYears"; +import { useGetFormattedYears } from "@/services/use-get-formatted-years"; import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { Age, Container, Description, Name } from "./styles"; diff --git a/apps/mobile/src/components/MainCard/components/PersonalInfo/styles.ts b/apps/mobile/src/components/MainCard/components/PersonalInfo/styles.ts index 3819134..e607212 100644 --- a/apps/mobile/src/components/MainCard/components/PersonalInfo/styles.ts +++ b/apps/mobile/src/components/MainCard/components/PersonalInfo/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.View` padding: ${(props) => props.theme.spacing[6]}px; diff --git a/apps/mobile/src/components/MainCard/index.tsx b/apps/mobile/src/components/MainCard/index.tsx index a687ba1..79150ad 100644 --- a/apps/mobile/src/components/MainCard/index.tsx +++ b/apps/mobile/src/components/MainCard/index.tsx @@ -10,8 +10,8 @@ import { import { LinearGradient } from "expo-linear-gradient"; import { useRouter } from "expo-router"; -import { PressableArea } from "@/components/PressableArea"; -import { SceneName } from "@/types/SceneName"; +import { PressableArea } from "@/components/pressable-area"; +import { SceneName } from "@/types/scene-name"; import Distance from "./components/Distance"; import Pagination from "./components/Pagination"; import PersonalInfo from "./components/PersonalInfo"; diff --git a/apps/mobile/src/components/MainCard/styles.ts b/apps/mobile/src/components/MainCard/styles.ts index 575263e..b56a208 100644 --- a/apps/mobile/src/components/MainCard/styles.ts +++ b/apps/mobile/src/components/MainCard/styles.ts @@ -1,7 +1,7 @@ import Animated from "react-native-reanimated"; import styled, { css } from "styled-components/native"; -import { Image } from "@/components/Image"; +import { Image } from "@/components/image"; export const absoluteFill = css` position: absolute; diff --git a/apps/mobile/src/components/MatchActionBar/GlassPillBackground.tsx b/apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx similarity index 100% rename from apps/mobile/src/components/MatchActionBar/GlassPillBackground.tsx rename to apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx diff --git a/apps/mobile/src/components/MatchActionBar/index.tsx b/apps/mobile/src/components/MatchActionBar/index.tsx index 0d62766..8b6677e 100644 --- a/apps/mobile/src/components/MatchActionBar/index.tsx +++ b/apps/mobile/src/components/MatchActionBar/index.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import Animated, { FadeInDown, ZoomOutDown } from "react-native-reanimated"; import { ActionItem, ConfusedEmoji, Container, HeartEyesEmoji, ThinkingEmoji } from "./styles"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; interface MatchActionBarProps extends React.ComponentProps { onNope: () => void; diff --git a/apps/mobile/src/components/MatchActionBar/styles.ts b/apps/mobile/src/components/MatchActionBar/styles.ts index 2c06aa8..bfd798a 100644 --- a/apps/mobile/src/components/MatchActionBar/styles.ts +++ b/apps/mobile/src/components/MatchActionBar/styles.ts @@ -6,8 +6,8 @@ import styled from "styled-components/native"; import confusedEmoji from "@/assets/images/ConfusedEmoji.webp"; import heartEyesEmoji from "@/assets/images/HeartEyesEmoji.webp"; import thinkingEmoji from "@/assets/images/ThinkingEmoji.webp"; -import { Image } from "@/components/Image"; -import { TransparentGlassOrDarkBlurView } from "@/components/BlurView"; +import { Image } from "@/components/image"; +import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; // Apple HIG recommends a minimum 44x44pt hit area for tappable targets. const MIN_TOUCH_TARGET = 44; diff --git a/apps/mobile/src/components/NetworkBoundary/styles.ts b/apps/mobile/src/components/NetworkBoundary/styles.ts index 44e195d..deaa6fc 100644 --- a/apps/mobile/src/components/NetworkBoundary/styles.ts +++ b/apps/mobile/src/components/NetworkBoundary/styles.ts @@ -1,7 +1,7 @@ import LottieView from "lottie-react-native"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.ScrollView.attrs({ contentContainerStyle: { flex: 1 }, diff --git a/apps/mobile/src/components/Picker/index.tsx b/apps/mobile/src/components/Picker/index.tsx index 8c0841c..db03986 100644 --- a/apps/mobile/src/components/Picker/index.tsx +++ b/apps/mobile/src/components/Picker/index.tsx @@ -7,9 +7,9 @@ import { BottomSheetFlatListProps } from "@gorhom/bottom-sheet/lib/typescript/co import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import { renderCustomBackdrop } from "@/components/CustomBackdrop"; +import { renderCustomBackdrop } from "@/components/custom-backdrop"; import { Input } from "@/components/Input"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { CloseIcon, Container, diff --git a/apps/mobile/src/components/Picker/styles.ts b/apps/mobile/src/components/Picker/styles.ts index 067d8fd..ff2e2eb 100644 --- a/apps/mobile/src/components/Picker/styles.ts +++ b/apps/mobile/src/components/Picker/styles.ts @@ -2,7 +2,7 @@ import { BottomSheetTextInput } from "@gorhom/bottom-sheet"; import styled from "styled-components/native"; import Close from "@/assets/images/Close.svg"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; export const TitleContainer = styled.View` flex-direction: row; diff --git a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx index 8c43099..cb399ca 100644 --- a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx +++ b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx @@ -7,7 +7,7 @@ import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import AddRemove from "@/assets/images/AddRemove.svg"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; import { getMaestroPlaceholderUri, ImagePickerError, @@ -17,8 +17,8 @@ import { showImagePickerOptions, uploadProfileImage, } from "@/components/ProfileImageUploader/utils"; -import { Text } from "@/components/Text"; -import { sendError } from "@/services/errorTracking"; +import { Text } from "@/components/text"; +import { sendError } from "@/services/error-tracking"; import * as S from "./styles"; type AddUserPhotoProps = { diff --git a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/styles.ts b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/styles.ts index a5f56cf..a08c79a 100644 --- a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/styles.ts +++ b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/styles.ts @@ -2,8 +2,8 @@ import Animated from "react-native-reanimated"; import styled from "styled-components/native"; import Dog from "@/assets/images/Dog.svg"; -import { Image } from "@/components/Image"; -import { PressableArea } from "@/components/PressableArea"; +import { Image } from "@/components/image"; +import { PressableArea } from "@/components/pressable-area"; import { width } from "@/constants"; export const containerPadding = 16; diff --git a/apps/mobile/src/components/ProfileImageUploader/index.tsx b/apps/mobile/src/components/ProfileImageUploader/index.tsx index 174e9c3..c5c91b9 100644 --- a/apps/mobile/src/components/ProfileImageUploader/index.tsx +++ b/apps/mobile/src/components/ProfileImageUploader/index.tsx @@ -8,7 +8,7 @@ import { Picture, sortByUrl, } from "@/components/ProfileImageUploader/utils"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { AddUserPhoto } from "./components/AddUserPhoto"; import { dogPictureHeight, numOfColumns } from "./components/AddUserPhoto/styles"; diff --git a/apps/mobile/src/components/ProfileImageUploader/utils/index.ts b/apps/mobile/src/components/ProfileImageUploader/utils/index.ts index 5991ad8..e87ff86 100644 --- a/apps/mobile/src/components/ProfileImageUploader/utils/index.ts +++ b/apps/mobile/src/components/ProfileImageUploader/utils/index.ts @@ -11,13 +11,13 @@ import { import { manipulateAsync, SaveFormat } from "expo-image-manipulator"; import * as ImagePicker from "expo-image-picker"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; import i18n from "@/i18n"; import { config } from "@/services/config"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { sendError } from "@/services/errorTracking"; -import { getMimeType } from "@/services/getMimeType"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { sendError } from "@/services/error-tracking"; +import { getMimeType } from "@/services/get-mime-type"; export interface Picture { id: string; diff --git a/apps/mobile/src/components/RadioButtons/index.tsx b/apps/mobile/src/components/RadioButtons/index.tsx index d7f139e..04ca93e 100644 --- a/apps/mobile/src/components/RadioButtons/index.tsx +++ b/apps/mobile/src/components/RadioButtons/index.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { Container } from "@/components/Input/styles"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { Content, OptionButtonProps, RadioButtonContainer, TextButton } from "./styles"; interface RadioButtonsProps { diff --git a/apps/mobile/src/components/RadioButtons/styles.ts b/apps/mobile/src/components/RadioButtons/styles.ts index 8badbc1..0c77f5f 100644 --- a/apps/mobile/src/components/RadioButtons/styles.ts +++ b/apps/mobile/src/components/RadioButtons/styles.ts @@ -1,8 +1,8 @@ import { PressableProps } from "react-native"; import styled, { css } from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; export interface OptionButtonProps extends PressableProps { marked?: boolean; diff --git a/apps/mobile/src/components/Slider/index.tsx b/apps/mobile/src/components/Slider/index.tsx index 31d0f8b..c5e2c72 100644 --- a/apps/mobile/src/components/Slider/index.tsx +++ b/apps/mobile/src/components/Slider/index.tsx @@ -3,7 +3,7 @@ import { View } from "react-native"; import MultiSlider, { LabelProps, MultiSliderProps } from "@ptomasroos/react-native-multi-slider"; import { useTheme } from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { LabelContainer, Marker, TitleContainer, Triangle, WIDTH } from "./styles"; interface TitleProps { diff --git a/apps/mobile/src/components/BlurView.tsx b/apps/mobile/src/components/blur-view.tsx similarity index 100% rename from apps/mobile/src/components/BlurView.tsx rename to apps/mobile/src/components/blur-view.tsx diff --git a/apps/mobile/src/components/CustomBackdrop.tsx b/apps/mobile/src/components/custom-backdrop.tsx similarity index 100% rename from apps/mobile/src/components/CustomBackdrop.tsx rename to apps/mobile/src/components/custom-backdrop.tsx diff --git a/apps/mobile/src/components/Divider.ts b/apps/mobile/src/components/divider.ts similarity index 100% rename from apps/mobile/src/components/Divider.ts rename to apps/mobile/src/components/divider.ts diff --git a/apps/mobile/src/components/ImageBackground.tsx b/apps/mobile/src/components/image-background.tsx similarity index 100% rename from apps/mobile/src/components/ImageBackground.tsx rename to apps/mobile/src/components/image-background.tsx diff --git a/apps/mobile/src/components/imageProps.test.ts b/apps/mobile/src/components/image-props.test.ts similarity index 96% rename from apps/mobile/src/components/imageProps.test.ts rename to apps/mobile/src/components/image-props.test.ts index 217c4f5..7ead0f9 100644 --- a/apps/mobile/src/components/imageProps.test.ts +++ b/apps/mobile/src/components/image-props.test.ts @@ -1,7 +1,7 @@ import type { ComponentProps } from "react"; -import type { Image } from "./Image"; -import { resolveImagePresentationProps } from "./imageProps"; +import type { Image } from "./image"; +import { resolveImagePresentationProps } from "./image-props"; const blurhash = "LEHV6nWB2yk8pyo0adR*.7kCMdnj"; const uri = "https://images.pegada.app/luna.webp"; diff --git a/apps/mobile/src/components/imageProps.ts b/apps/mobile/src/components/image-props.ts similarity index 100% rename from apps/mobile/src/components/imageProps.ts rename to apps/mobile/src/components/image-props.ts diff --git a/apps/mobile/src/components/Image.test.tsx b/apps/mobile/src/components/image.test.tsx similarity index 97% rename from apps/mobile/src/components/Image.test.tsx rename to apps/mobile/src/components/image.test.tsx index e9e33ad..d6c001c 100644 --- a/apps/mobile/src/components/Image.test.tsx +++ b/apps/mobile/src/components/image.test.tsx @@ -1,7 +1,7 @@ import { renderToStaticMarkup } from "react-dom/server"; import { Image as ExpoImage } from "expo-image"; -import { Image } from "./Image"; +import { Image } from "./image"; jest.mock("expo-image", () => ({ Image: jest.fn(() => null) })); diff --git a/apps/mobile/src/components/Image.tsx b/apps/mobile/src/components/image.tsx similarity index 93% rename from apps/mobile/src/components/Image.tsx rename to apps/mobile/src/components/image.tsx index 8d2ce7d..79b108a 100644 --- a/apps/mobile/src/components/Image.tsx +++ b/apps/mobile/src/components/image.tsx @@ -1,7 +1,7 @@ import { forwardRef, type ComponentRef } from "react"; import { Image as ExpoImage, type ImageProps } from "expo-image"; -import { resolveImagePresentationProps } from "./imageProps"; +import { resolveImagePresentationProps } from "./image-props"; export type LocalImageProps = ImageProps; diff --git a/apps/mobile/src/components/Loading.ts b/apps/mobile/src/components/loading.ts similarity index 100% rename from apps/mobile/src/components/Loading.ts rename to apps/mobile/src/components/loading.ts diff --git a/apps/mobile/src/components/PressableArea.tsx b/apps/mobile/src/components/pressable-area.tsx similarity index 100% rename from apps/mobile/src/components/PressableArea.tsx rename to apps/mobile/src/components/pressable-area.tsx diff --git a/apps/mobile/src/components/Text.ts b/apps/mobile/src/components/text.ts similarity index 100% rename from apps/mobile/src/components/Text.ts rename to apps/mobile/src/components/text.ts diff --git a/apps/mobile/src/config.ts b/apps/mobile/src/config.ts index 07e2d9e..d5ffec0 100644 --- a/apps/mobile/src/config.ts +++ b/apps/mobile/src/config.ts @@ -6,7 +6,7 @@ import mobileAds, { MaxAdContentRating } from "react-native-google-mobile-ads"; import * as Updates from "expo-updates"; import { config } from "@/services/config"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { posthog } from "@/services/posthog"; mobileAds() diff --git a/apps/mobile/src/contexts/ThemeProvider.tsx b/apps/mobile/src/contexts/theme-provider.tsx similarity index 98% rename from apps/mobile/src/contexts/ThemeProvider.tsx rename to apps/mobile/src/contexts/theme-provider.tsx index f692fcc..f363db9 100644 --- a/apps/mobile/src/contexts/ThemeProvider.tsx +++ b/apps/mobile/src/contexts/theme-provider.tsx @@ -11,7 +11,7 @@ import { ThemeProvider as StyledThemeProvider } from "styled-components/native"; import { DarkTheme, LightTheme } from "@pegada/shared/themes/themes"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { deleteData, getData, diff --git a/apps/mobile/src/contexts/trcpContext.tsx b/apps/mobile/src/contexts/trcp-context.tsx similarity index 85% rename from apps/mobile/src/contexts/trcpContext.tsx rename to apps/mobile/src/contexts/trcp-context.tsx index 84042d6..0c9084e 100644 --- a/apps/mobile/src/contexts/trcpContext.tsx +++ b/apps/mobile/src/contexts/trcp-context.tsx @@ -1,4 +1,4 @@ -import { api } from "./TRPCProvider"; +import { api } from "./trpc-provider"; let trcpContext = undefined as unknown as ReturnType; diff --git a/apps/mobile/src/contexts/TRPCProvider.tsx b/apps/mobile/src/contexts/trpc-provider.tsx similarity index 96% rename from apps/mobile/src/contexts/TRPCProvider.tsx rename to apps/mobile/src/contexts/trpc-provider.tsx index 846e5d1..58af7a4 100644 --- a/apps/mobile/src/contexts/TRPCProvider.tsx +++ b/apps/mobile/src/contexts/trpc-provider.tsx @@ -10,11 +10,11 @@ import superjson from "superjson"; import type { AppRouter } from "@pegada/api"; import { RequestHeaders } from "@pegada/shared/types/types"; -import { setTrcpContext } from "@/contexts/trcpContext"; +import { setTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { config } from "@/services/config"; import { logout } from "@/services/logout"; -import { queryClient } from "@/services/queryClient"; +import { queryClient } from "@/services/query-client"; import { getData, StorageKeys } from "@/services/storage"; export { type RouterInputs, type RouterOutputs } from "@pegada/api"; diff --git a/apps/mobile/src/hooks/useCurrentCityText.tsx b/apps/mobile/src/hooks/use-current-city-text.tsx similarity index 93% rename from apps/mobile/src/hooks/useCurrentCityText.tsx rename to apps/mobile/src/hooks/use-current-city-text.tsx index 7c52489..8cfa92f 100644 --- a/apps/mobile/src/hooks/useCurrentCityText.tsx +++ b/apps/mobile/src/hooks/use-current-city-text.tsx @@ -1,6 +1,6 @@ import { useTranslation } from "react-i18next"; -import { api } from "@/contexts/TRPCProvider"; +import { api } from "@/contexts/trpc-provider"; export const useCurrentCityText = () => { const { t } = useTranslation(); diff --git a/apps/mobile/src/hooks/useDelayedHeaderHeight.tsx b/apps/mobile/src/hooks/use-delayed-header-height.tsx similarity index 100% rename from apps/mobile/src/hooks/useDelayedHeaderHeight.tsx rename to apps/mobile/src/hooks/use-delayed-header-height.tsx diff --git a/apps/mobile/src/hooks/useKeyboardAwareSafeAreaInsets.tsx b/apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx similarity index 100% rename from apps/mobile/src/hooks/useKeyboardAwareSafeAreaInsets.tsx rename to apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx diff --git a/apps/mobile/src/hooks/usePayments.tsx b/apps/mobile/src/hooks/use-payments.tsx similarity index 96% rename from apps/mobile/src/hooks/usePayments.tsx rename to apps/mobile/src/hooks/use-payments.tsx index c0eae1a..1b5bc69 100644 --- a/apps/mobile/src/hooks/usePayments.tsx +++ b/apps/mobile/src/hooks/use-payments.tsx @@ -2,9 +2,9 @@ import { useEffect } from "react"; import { CustomerInfo, PurchasesPackage } from "react-native-purchases"; import { useSuspenseQuery } from "@tanstack/react-query"; -import { identifyUser } from "@/services/getInitialRouteName"; +import { identifyUser } from "@/services/get-initial-route-name"; import { PaymentCacheKey, payments, UserPlan } from "@/services/payments"; -import { queryClient } from "@/services/queryClient"; +import { queryClient } from "@/services/query-client"; // This is only called once const usePaymentsLogin = () => { diff --git a/apps/mobile/src/hooks/useProtectedRoute.ts b/apps/mobile/src/hooks/use-protected-route.ts similarity index 93% rename from apps/mobile/src/hooks/useProtectedRoute.ts rename to apps/mobile/src/hooks/use-protected-route.ts index 4b11fb0..f04e68a 100644 --- a/apps/mobile/src/hooks/useProtectedRoute.ts +++ b/apps/mobile/src/hooks/use-protected-route.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { useSegments } from "expo-router"; -import { getInitialRouteName } from "@/services/getInitialRouteName"; +import { getInitialRouteName } from "@/services/get-initial-route-name"; type InitialRoute = Awaited>; diff --git a/apps/mobile/src/hooks/useTrackScreens.ts b/apps/mobile/src/hooks/use-track-screens.ts similarity index 100% rename from apps/mobile/src/hooks/useTrackScreens.ts rename to apps/mobile/src/hooks/use-track-screens.ts diff --git a/apps/mobile/src/hooks/useWarmUpBrowser.tsx b/apps/mobile/src/hooks/use-warm-up-browser.tsx similarity index 84% rename from apps/mobile/src/hooks/useWarmUpBrowser.tsx rename to apps/mobile/src/hooks/use-warm-up-browser.tsx index 5d32ac3..25440cb 100644 --- a/apps/mobile/src/hooks/useWarmUpBrowser.tsx +++ b/apps/mobile/src/hooks/use-warm-up-browser.tsx @@ -1,7 +1,7 @@ import { useFocusEffect } from "expo-router"; import * as WebBrowser from "expo-web-browser"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; export const useWarmUpBrowser = () => { useFocusEffect(() => { diff --git a/apps/mobile/src/i18n.ts b/apps/mobile/src/i18n.ts index ec44a57..0dbad92 100644 --- a/apps/mobile/src/i18n.ts +++ b/apps/mobile/src/i18n.ts @@ -4,7 +4,7 @@ import { initReactI18next } from "react-i18next"; import { initI18n } from "@pegada/shared/i18n/i18n"; -import { sendError } from "./services/errorTracking"; +import { sendError } from "./services/error-tracking"; import { getData, StorageKeys, storeData } from "./services/storage"; export const getSystemLanguage = () => { diff --git a/apps/mobile/src/services/advertisement/interstitial.ts b/apps/mobile/src/services/advertisement/interstitial.ts index ca83536..08daf41 100644 --- a/apps/mobile/src/services/advertisement/interstitial.ts +++ b/apps/mobile/src/services/advertisement/interstitial.ts @@ -2,9 +2,9 @@ import { useEffect } from "react"; import { Platform } from "react-native"; import { AdEventType, InterstitialAd, TestIds } from "react-native-google-mobile-ads"; -import { useUnsafeIsPremium } from "@/hooks/usePayments"; +import { useUnsafeIsPremium } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; const DEFAULT_AD_KEYWORDS = ["dog", "animals", "pets", "puppies"]; diff --git a/apps/mobile/src/services/appReview.tsx b/apps/mobile/src/services/app-review.tsx similarity index 97% rename from apps/mobile/src/services/appReview.tsx rename to apps/mobile/src/services/app-review.tsx index b9f5564..e033b6e 100644 --- a/apps/mobile/src/services/appReview.tsx +++ b/apps/mobile/src/services/app-review.tsx @@ -10,10 +10,10 @@ import styled from "styled-components/native"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; -import { Text } from "@/components/Text"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { Text } from "@/components/text"; +import { getTrcpContext } from "@/contexts/trcp-context"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { getData, StorageKeys, storeData } from "@/services/storage"; const Container = styled.View` diff --git a/apps/mobile/src/services/errorTracking.ts b/apps/mobile/src/services/error-tracking.ts similarity index 100% rename from apps/mobile/src/services/errorTracking.ts rename to apps/mobile/src/services/error-tracking.ts diff --git a/apps/mobile/src/services/getError.ts b/apps/mobile/src/services/get-error.ts similarity index 100% rename from apps/mobile/src/services/getError.ts rename to apps/mobile/src/services/get-error.ts diff --git a/apps/mobile/src/services/getInitialRouteName.ts b/apps/mobile/src/services/get-initial-route-name.ts similarity index 84% rename from apps/mobile/src/services/getInitialRouteName.ts rename to apps/mobile/src/services/get-initial-route-name.ts index 0f04c4b..1386c20 100644 --- a/apps/mobile/src/services/getInitialRouteName.ts +++ b/apps/mobile/src/services/get-initial-route-name.ts @@ -1,11 +1,11 @@ import { Platform } from "react-native"; import Constants from "expo-constants"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import { analytics } from "@/services/analytics"; -import { getLoggedUserID } from "@/services/getLoggedUserID"; -import { SceneName } from "@/types/SceneName"; -import { sendError } from "./errorTracking"; +import { getLoggedUserID } from "@/services/get-logged-user-id"; +import { SceneName } from "@/types/scene-name"; +import { sendError } from "./error-tracking"; export const identifyUser = async (props: Parameters[1]) => { try { diff --git a/apps/mobile/src/services/getLoggedUserID.ts b/apps/mobile/src/services/get-logged-user-id.ts similarity index 100% rename from apps/mobile/src/services/getLoggedUserID.ts rename to apps/mobile/src/services/get-logged-user-id.ts diff --git a/apps/mobile/src/services/getMimeType.ts b/apps/mobile/src/services/get-mime-type.ts similarity index 100% rename from apps/mobile/src/services/getMimeType.ts rename to apps/mobile/src/services/get-mime-type.ts diff --git a/apps/mobile/src/services/getPushNotificationToken.ts b/apps/mobile/src/services/get-push-notification-token.ts similarity index 98% rename from apps/mobile/src/services/getPushNotificationToken.ts rename to apps/mobile/src/services/get-push-notification-token.ts index f6ac081..e0a2dec 100644 --- a/apps/mobile/src/services/getPushNotificationToken.ts +++ b/apps/mobile/src/services/get-push-notification-token.ts @@ -11,7 +11,7 @@ import { } from "@pegada/shared/constants/notifications"; import { LightTheme } from "@pegada/shared/themes/themes"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; Notifications.setNotificationHandler({ diff --git a/apps/mobile/src/services/haptics.ts b/apps/mobile/src/services/haptics.ts index 5033ce7..46ef487 100644 --- a/apps/mobile/src/services/haptics.ts +++ b/apps/mobile/src/services/haptics.ts @@ -1,7 +1,7 @@ import { Platform } from "react-native"; import * as Haptics from "expo-haptics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; // Every call is wrapped so a haptics failure (unsupported device, simulator, // etc.) never throws into calling code — it's purely a "nice to have". diff --git a/apps/mobile/src/services/linking/handlers/initialNotification.ts b/apps/mobile/src/services/linking/handlers/initial-notification.ts similarity index 100% rename from apps/mobile/src/services/linking/handlers/initialNotification.ts rename to apps/mobile/src/services/linking/handlers/initial-notification.ts diff --git a/apps/mobile/src/services/linking/handlers/notification.ts b/apps/mobile/src/services/linking/handlers/notification.ts index d8408ab..ed32531 100644 --- a/apps/mobile/src/services/linking/handlers/notification.ts +++ b/apps/mobile/src/services/linking/handlers/notification.ts @@ -1,8 +1,8 @@ import * as Notifications from "expo-notifications"; import { router } from "expo-router"; -import { sendError } from "@/services/errorTracking"; -import { SceneName } from "@/types/SceneName"; +import { sendError } from "@/services/error-tracking"; +import { SceneName } from "@/types/scene-name"; export enum NotificationUrl { Match = "match/", diff --git a/apps/mobile/src/services/linking/handlers/reply.test.ts b/apps/mobile/src/services/linking/handlers/reply.test.ts index bc354a9..18a6c2e 100644 --- a/apps/mobile/src/services/linking/handlers/reply.test.ts +++ b/apps/mobile/src/services/linking/handlers/reply.test.ts @@ -2,15 +2,15 @@ import * as Notifications from "expo-notifications"; import { NOTIFICATION_ACTION, NOTIFICATION_CATEGORY } from "@pegada/shared/constants/notifications"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { sendError } from "@/services/errorTracking"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { sendError } from "@/services/error-tracking"; import { getMatchIdFromUrl, handleReplyAction, isReplyAction } from "./reply"; jest.mock("expo-notifications", () => ({ scheduleNotificationAsync: jest.fn() })); // Pulled in transitively by ./notification, and untransformed by jest. jest.mock("expo-router", () => ({ router: { push: jest.fn() } })); -jest.mock("@/contexts/trcpContext", () => ({ getTrcpContext: jest.fn() })); -jest.mock("@/services/errorTracking", () => ({ sendError: jest.fn() })); +jest.mock("@/contexts/trcp-context", () => ({ getTrcpContext: jest.fn() })); +jest.mock("@/services/error-tracking", () => ({ sendError: jest.fn() })); jest.mock("@/i18n", () => ({ __esModule: true, default: { t: (key: string) => key } })); const mutate = jest.fn(); diff --git a/apps/mobile/src/services/linking/handlers/reply.ts b/apps/mobile/src/services/linking/handlers/reply.ts index 2e692a6..29ea3d8 100644 --- a/apps/mobile/src/services/linking/handlers/reply.ts +++ b/apps/mobile/src/services/linking/handlers/reply.ts @@ -2,9 +2,9 @@ import * as Notifications from "expo-notifications"; import { NOTIFICATION_ACTION, NOTIFICATION_CATEGORY } from "@pegada/shared/constants/notifications"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { getNotificationUrl, NotificationUrl } from "./notification"; // Chat-message pushes carry `chat//` in `data.url` (see diff --git a/apps/mobile/src/services/linking/index.ts b/apps/mobile/src/services/linking/index.ts index d6d4375..37cb7b3 100644 --- a/apps/mobile/src/services/linking/index.ts +++ b/apps/mobile/src/services/linking/index.ts @@ -1,8 +1,8 @@ import { useEffect } from "react"; import * as Notifications from "expo-notifications"; -import { sendError } from "@/services/errorTracking"; -import { initialNotification, setInitialNotification } from "./handlers/initialNotification"; +import { sendError } from "@/services/error-tracking"; +import { initialNotification, setInitialNotification } from "./handlers/initial-notification"; import { customNotificationHandler, getNotificationUrl } from "./handlers/notification"; import { handleReplyAction, isReplyAction } from "./handlers/reply"; diff --git a/apps/mobile/src/services/logout.ts b/apps/mobile/src/services/logout.ts index 0ec6442..365c6ed 100644 --- a/apps/mobile/src/services/logout.ts +++ b/apps/mobile/src/services/logout.ts @@ -1,13 +1,13 @@ import { router } from "expo-router"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { syncMatchesWidgetLoggedOut } from "@/services/matchesWidget"; import { payments } from "@/services/payments"; -import { queryClient } from "@/services/queryClient"; +import { queryClient } from "@/services/query-client"; import { store } from "@/store"; import { Actions } from "@/store/reducers/dogs"; -import { SceneName } from "@/types/SceneName"; -import { setInitialNotification } from "./linking/handlers/initialNotification"; +import { SceneName } from "@/types/scene-name"; +import { setInitialNotification } from "./linking/handlers/initial-notification"; import { deleteData, StorageKeys } from "./storage"; export const logout = async () => { diff --git a/apps/mobile/src/services/maskDate.tsx b/apps/mobile/src/services/mask-date.tsx similarity index 100% rename from apps/mobile/src/services/maskDate.tsx rename to apps/mobile/src/services/mask-date.tsx diff --git a/apps/mobile/src/services/matchesWidget/index.ts b/apps/mobile/src/services/matchesWidget/index.ts index beec0c5..9a96234 100644 --- a/apps/mobile/src/services/matchesWidget/index.ts +++ b/apps/mobile/src/services/matchesWidget/index.ts @@ -6,7 +6,7 @@ import { WidgetSnapshot, } from "../../../modules/pegada-widget"; import i18n from "@/i18n"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { clearWidgetAvatars, downloadWidgetAvatars } from "./avatars"; type Matches = RouterOutputs["match"]["getAll"]; diff --git a/apps/mobile/src/services/matchesWidget/useMatchesWidgetSync.ts b/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts similarity index 93% rename from apps/mobile/src/services/matchesWidget/useMatchesWidgetSync.ts rename to apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts index 6be2d8d..d163fda 100644 --- a/apps/mobile/src/services/matchesWidget/useMatchesWidgetSync.ts +++ b/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts @@ -1,8 +1,8 @@ import { useEffect } from "react"; import { AppState, AppStateStatus } from "react-native"; -import { api } from "@/contexts/TRPCProvider"; -import { sendError } from "@/services/errorTracking"; +import { api } from "@/contexts/trpc-provider"; +import { sendError } from "@/services/error-tracking"; import { syncMatchesWidget } from "./index"; /** diff --git a/apps/mobile/src/services/openWebBrowser.ts b/apps/mobile/src/services/open-web-browser.ts similarity index 100% rename from apps/mobile/src/services/openWebBrowser.ts rename to apps/mobile/src/services/open-web-browser.ts diff --git a/apps/mobile/src/services/payments/index.ts b/apps/mobile/src/services/payments/index.ts index 4c5de9f..3e47ba3 100644 --- a/apps/mobile/src/services/payments/index.ts +++ b/apps/mobile/src/services/payments/index.ts @@ -8,11 +8,11 @@ import Purchases, { import * as Device from "expo-device"; import { get } from "lodash"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import { config } from "@/services/config"; -import { sendError } from "@/services/errorTracking"; -import { getLoggedUserID } from "@/services/getLoggedUserID"; -import { queryClient } from "@/services/queryClient"; +import { sendError } from "@/services/error-tracking"; +import { getLoggedUserID } from "@/services/get-logged-user-id"; +import { queryClient } from "@/services/query-client"; export enum PaymentCacheKey { CustomerInfo = "PAYMENT_CUSTOMER_INFO_KEY", diff --git a/apps/mobile/src/services/queryClient.tsx b/apps/mobile/src/services/query-client.tsx similarity index 100% rename from apps/mobile/src/services/queryClient.tsx rename to apps/mobile/src/services/query-client.tsx diff --git a/apps/mobile/src/services/quickActions/handlers/action.ts b/apps/mobile/src/services/quickActions/handlers/action.ts index 7cff311..2afe926 100644 --- a/apps/mobile/src/services/quickActions/handlers/action.ts +++ b/apps/mobile/src/services/quickActions/handlers/action.ts @@ -1,8 +1,8 @@ import * as QuickActions from "expo-quick-actions"; import { router } from "expo-router"; -import { sendError } from "@/services/errorTracking"; -import { SceneName } from "@/types/SceneName"; +import { sendError } from "@/services/error-tracking"; +import { SceneName } from "@/types/scene-name"; export enum QuickActionId { Matches = "matches", diff --git a/apps/mobile/src/services/quickActions/index.ts b/apps/mobile/src/services/quickActions/index.ts index 3f40d6a..20d0f85 100644 --- a/apps/mobile/src/services/quickActions/index.ts +++ b/apps/mobile/src/services/quickActions/index.ts @@ -2,7 +2,7 @@ import { useEffect } from "react"; import * as QuickActions from "expo-quick-actions"; import { useTranslation } from "react-i18next"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { customQuickActionHandler, flushPendingQuickAction, diff --git a/apps/mobile/src/services/themeUtils.ts b/apps/mobile/src/services/theme-utils.ts similarity index 100% rename from apps/mobile/src/services/themeUtils.ts rename to apps/mobile/src/services/theme-utils.ts diff --git a/apps/mobile/src/services/useGetFormattedYears.ts b/apps/mobile/src/services/use-get-formatted-years.ts similarity index 74% rename from apps/mobile/src/services/useGetFormattedYears.ts rename to apps/mobile/src/services/use-get-formatted-years.ts index 3ed4bae..96a6e7e 100644 --- a/apps/mobile/src/services/useGetFormattedYears.ts +++ b/apps/mobile/src/services/use-get-formatted-years.ts @@ -1,6 +1,6 @@ import { useTranslation } from "react-i18next"; -import { getFormattedYears } from "@pegada/shared/utils/getFormattedYears"; +import { getFormattedYears } from "@pegada/shared/utils/get-formatted-years"; export const useGetFormattedYears = () => { const { i18n } = useTranslation(); diff --git a/apps/mobile/src/store/reducers/dogs/swipe.ts b/apps/mobile/src/store/reducers/dogs/swipe.ts index 6b64190..512f8cf 100644 --- a/apps/mobile/src/store/reducers/dogs/swipe.ts +++ b/apps/mobile/src/store/reducers/dogs/swipe.ts @@ -3,7 +3,7 @@ import { ActionType, createAction, createAsyncAction, createReducer } from "type import type { RouterOutputs } from "@pegada/api"; -import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture"; +import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; export type SwipeDog = RouterOutputs["swipe"]["all"][number]; diff --git a/apps/mobile/src/store/sagas/dogs/list.ts b/apps/mobile/src/store/sagas/dogs/list.ts index 52cf695..f31633c 100644 --- a/apps/mobile/src/store/sagas/dogs/list.ts +++ b/apps/mobile/src/store/sagas/dogs/list.ts @@ -1,8 +1,8 @@ import { all, call, put, select, takeLatest } from "redux-saga/effects"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { Actions, RootReducer } from "@/store/reducers"; import { ListAction } from "@/store/reducers/dogs/list"; diff --git a/apps/mobile/src/store/sagas/dogs/swipe.ts b/apps/mobile/src/store/sagas/dogs/swipe.ts index 07d8f59..25a9206 100644 --- a/apps/mobile/src/store/sagas/dogs/swipe.ts +++ b/apps/mobile/src/store/sagas/dogs/swipe.ts @@ -6,14 +6,14 @@ import { ActionType } from "typesafe-actions"; import { LikeLimitReached } from "@pegada/shared/errors/errors"; import { showLikeLimitReached } from "@/components/LikeLimitReached"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { getUnsafeIsPremium } from "@/hooks/usePayments"; -import { sendError } from "@/services/errorTracking"; -import { getError } from "@/services/getError"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { getUnsafeIsPremium } from "@/hooks/use-payments"; +import { sendError } from "@/services/error-tracking"; +import { getError } from "@/services/get-error"; import { Actions, RootReducer } from "@/store/reducers"; import { SwipeAction } from "@/store/reducers/dogs/swipe"; -import { SceneName } from "@/types/SceneName"; -import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture"; +import { SceneName } from "@/types/scene-name"; +import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; function* swipeUserRequest({ payload }: ActionType): any { const { id, swipeType: _swipeType } = payload; diff --git a/apps/mobile/src/types/SceneName.ts b/apps/mobile/src/types/scene-name.ts similarity index 100% rename from apps/mobile/src/types/SceneName.ts rename to apps/mobile/src/types/scene-name.ts diff --git a/apps/mobile/src/views/(auth)/AskForLocation/index.tsx b/apps/mobile/src/views/(auth)/AskForLocation/index.tsx index 23a00e9..47843bf 100644 --- a/apps/mobile/src/views/(auth)/AskForLocation/index.tsx +++ b/apps/mobile/src/views/(auth)/AskForLocation/index.tsx @@ -10,10 +10,10 @@ import { useTheme } from "styled-components/native"; import Information from "@/assets/images/Information.svg"; import LocationIcon from "@/assets/images/Location.svg"; import { Button } from "@/components/Button"; -import { Text } from "@/components/Text"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { sendError } from "@/services/errorTracking"; -import { SceneName } from "@/types/SceneName"; +import { Text } from "@/components/text"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { sendError } from "@/services/error-tracking"; +import { SceneName } from "@/types/scene-name"; import { BottomView, Container, InformationRow, LocationView } from "./styles"; enum UpdateLocationError { diff --git a/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx b/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx index 2a95559..9e83291 100644 --- a/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx +++ b/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx @@ -6,22 +6,22 @@ import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import { DogCompleteClientSchema, dogCompleteClientSchema } from "@pegada/shared/schemas/dogSchema"; +import { DogCompleteClientSchema, dogCompleteClientSchema } from "@pegada/shared/schemas/dog-schema"; import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import BreedPicker from "@/components/BreedPicker"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; import { InputPicker } from "@/components/Picker"; -import { Text } from "@/components/Text"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api } from "@/contexts/TRPCProvider"; -import { useDelayedHeaderHeight } from "@/hooks/useDelayedHeaderHeight"; +import { Text } from "@/components/text"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api } from "@/contexts/trpc-provider"; +import { useDelayedHeaderHeight } from "@/hooks/use-delayed-header-height"; import { analytics } from "@/services/analytics"; import { colors, sizes } from "@/services/consts"; -import { sendError } from "@/services/errorTracking"; -import { maskDate } from "@/services/maskDate"; -import { SceneName } from "@/types/SceneName"; +import { sendError } from "@/services/error-tracking"; +import { maskDate } from "@/services/mask-date"; +import { SceneName } from "@/types/scene-name"; import { Container, ImageContainer, ProfileImage } from "./styles"; const CompleteProfile = () => { diff --git a/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts b/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts index 4c824e8..846711b 100644 --- a/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts +++ b/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { Image } from "@/components/Image"; +import { Image } from "@/components/image"; export const Container = styled.ScrollView` flex-grow: 1; diff --git a/apps/mobile/src/views/(auth)/CreateProfile/index.tsx b/apps/mobile/src/views/(auth)/CreateProfile/index.tsx index 9311646..6c60a61 100644 --- a/apps/mobile/src/views/(auth)/CreateProfile/index.tsx +++ b/apps/mobile/src/views/(auth)/CreateProfile/index.tsx @@ -7,7 +7,7 @@ import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import { DogQuickClientSchema, dogQuickClientSchema } from "@pegada/shared/schemas/dogSchema"; +import { DogQuickClientSchema, dogQuickClientSchema } from "@pegada/shared/schemas/dog-schema"; import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import { Button } from "@/components/Button"; @@ -18,13 +18,13 @@ import { } from "@/components/ProfileImageUploader"; import { Picture, pictures } from "@/components/ProfileImageUploader/utils"; import { RadioButtons } from "@/components/RadioButtons"; -import { Text } from "@/components/Text"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api } from "@/contexts/TRPCProvider"; -import { useDelayedHeaderHeight } from "@/hooks/useDelayedHeaderHeight"; +import { Text } from "@/components/text"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api } from "@/contexts/trpc-provider"; +import { useDelayedHeaderHeight } from "@/hooks/use-delayed-header-height"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; -import { SceneName } from "@/types/SceneName"; +import { sendError } from "@/services/error-tracking"; +import { SceneName } from "@/types/scene-name"; import { Container } from "./styles"; const DEFAULT_VALUES: DogQuickClientSchema = { diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/styles.ts b/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/styles.ts index dd5bd1d..50206dd 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/styles.ts +++ b/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; export const Container = styled(PressableArea)` border-radius: ${(props) => props.theme.radii.md}px; diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/hooks/useTimer.ts b/apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts similarity index 100% rename from apps/mobile/src/views/(auth)/OneTimeCode/hooks/useTimer.ts rename to apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx b/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx index a0d946e..6c7208b 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx +++ b/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx @@ -8,18 +8,18 @@ import { useTranslation } from "react-i18next"; import { InvalidOTPCodeError, OTPRequiredError } from "@pegada/shared/errors/errors"; -import { Text } from "@/components/Text"; -import { api } from "@/contexts/TRPCProvider"; +import { Text } from "@/components/text"; +import { api } from "@/contexts/trpc-provider"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; -import { getError } from "@/services/getError"; -import { getInitialRouteName } from "@/services/getInitialRouteName"; +import { sendError } from "@/services/error-tracking"; +import { getError } from "@/services/get-error"; +import { getInitialRouteName } from "@/services/get-initial-route-name"; import { StorageKeys, storeData } from "@/services/storage"; import { useDidMountEffect } from "@/services/utils"; import { Underline } from "../SignIn/components/HeroText"; import GoBack from "./components/GoBack"; import OTPInput, { OtpInputRef } from "./components/OtpInput"; -import useTimer from "./hooks/useTimer"; +import useTimer from "./hooks/use-timer"; import { Container, Content, diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/styles.ts b/apps/mobile/src/views/(auth)/OneTimeCode/styles.ts index 93fd0ae..c868997 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/styles.ts +++ b/apps/mobile/src/views/(auth)/OneTimeCode/styles.ts @@ -1,8 +1,8 @@ import { KeyboardAvoidingView } from "react-native"; import styled from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; export const Container = styled.View` flex: 1; diff --git a/apps/mobile/src/views/(auth)/SignIn/components/EmailInput/styles.ts b/apps/mobile/src/views/(auth)/SignIn/components/EmailInput/styles.ts index df50033..e8ce4b0 100644 --- a/apps/mobile/src/views/(auth)/SignIn/components/EmailInput/styles.ts +++ b/apps/mobile/src/views/(auth)/SignIn/components/EmailInput/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.View` margin-top: ${(props) => props.theme.spacing[5]}px; diff --git a/apps/mobile/src/views/(auth)/SignIn/components/HeroText/styles.ts b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/styles.ts index ebc5b14..81aaea3 100644 --- a/apps/mobile/src/views/(auth)/SignIn/components/HeroText/styles.ts +++ b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.View` align-items: center; diff --git a/apps/mobile/src/views/(auth)/SignIn/index.tsx b/apps/mobile/src/views/(auth)/SignIn/index.tsx index 4bcac63..c22df62 100644 --- a/apps/mobile/src/views/(auth)/SignIn/index.tsx +++ b/apps/mobile/src/views/(auth)/SignIn/index.tsx @@ -9,11 +9,11 @@ import { useTheme } from "styled-components/native"; import { OTPRequiredError } from "@pegada/shared/errors/errors"; import { Button } from "@/components/Button"; -import { api } from "@/contexts/TRPCProvider"; -import { useKeyboardAwareSafeAreaInsets } from "@/hooks/useKeyboardAwareSafeAreaInsets"; -import { sendError } from "@/services/errorTracking"; -import { getError } from "@/services/getError"; -import { SceneName } from "@/types/SceneName"; +import { api } from "@/contexts/trpc-provider"; +import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe-area-insets"; +import { sendError } from "@/services/error-tracking"; +import { getError } from "@/services/get-error"; +import { SceneName } from "@/types/scene-name"; import EmailInput from "./components/EmailInput"; import HeroText from "./components/HeroText"; import { diff --git a/apps/mobile/src/views/(auth)/SignIn/styles.ts b/apps/mobile/src/views/(auth)/SignIn/styles.ts index 5573783..5c30097 100644 --- a/apps/mobile/src/views/(auth)/SignIn/styles.ts +++ b/apps/mobile/src/views/(auth)/SignIn/styles.ts @@ -2,8 +2,8 @@ import { KeyboardAvoidingView, Pressable } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import styled from "styled-components/native"; -import Logo from "@/assets/images/Logo"; -import { Text } from "@/components/Text"; +import Logo from "@/assets/images/logo"; +import { Text } from "@/components/text"; export const Container = styled(SafeAreaView).attrs({ edges: ["left", "right"], diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx index 88fea4c..8e8a039 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx @@ -4,9 +4,9 @@ import { useRouter } from "expo-router"; import { useTranslation } from "react-i18next"; import { ThinkingEmoji } from "@/components/MatchActionBar/styles"; -import { Text } from "@/components/Text"; -import { SceneName } from "@/types/SceneName"; -import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture"; +import { Text } from "@/components/text"; +import { SceneName } from "@/types/scene-name"; +import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; import { Match } from "../.."; import { Container, EmojiContainer, Picture } from "./styles"; diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts b/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts index ce0b6dd..017529d 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts +++ b/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts @@ -1,7 +1,7 @@ import styled from "styled-components/native"; -import { Image } from "@/components/Image"; -import { PressableArea } from "@/components/PressableArea"; +import { Image } from "@/components/image"; +import { PressableArea } from "@/components/pressable-area"; export const Container = styled(PressableArea).attrs({ accessible: true })` padding: ${(props) => props.theme.spacing[4]}px; diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx index 7226503..f4c27d7 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx @@ -1,9 +1,9 @@ import * as React from "react"; import { useRouter } from "expo-router"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { SwipeDog } from "@/store/reducers/dogs/swipe"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Container, Content, Picture } from "./styles"; interface PreviewProps { diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Preview/styles.ts b/apps/mobile/src/views/(tabs)/Messages/components/Preview/styles.ts index 3f36012..2d14c89 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Preview/styles.ts +++ b/apps/mobile/src/views/(tabs)/Messages/components/Preview/styles.ts @@ -1,7 +1,7 @@ import styled from "styled-components/native"; -import { Image } from "@/components/Image"; -import { PressableArea } from "@/components/PressableArea"; +import { Image } from "@/components/image"; +import { PressableArea } from "@/components/pressable-area"; export const Content = styled.View` width: 65px; diff --git a/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx index 725673f..375f81a 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { Container, SearchFieldContainer, TextField } from "./styles"; export const SearchBar: React.FC> = (props) => { diff --git a/apps/mobile/src/views/(tabs)/Messages/components/EmptyMessages.tsx b/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx similarity index 95% rename from apps/mobile/src/views/(tabs)/Messages/components/EmptyMessages.tsx rename to apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx index 66e3d35..71f2ab8 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/EmptyMessages.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx @@ -6,8 +6,8 @@ import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import { Button } from "@/components/Button"; -import { Text } from "@/components/Text"; -import { SceneName } from "@/types/SceneName"; +import { Text } from "@/components/text"; +import { SceneName } from "@/types/scene-name"; import { EmptyAnimation } from "@/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles"; interface EmptyMessagesProps { diff --git a/apps/mobile/src/views/(tabs)/Messages/index.tsx b/apps/mobile/src/views/(tabs)/Messages/index.tsx index 66c5a8a..fb080ff 100644 --- a/apps/mobile/src/views/(tabs)/Messages/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/index.tsx @@ -5,18 +5,18 @@ import { useScrollToTop } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import Divider from "@/components/Divider"; +import Divider from "@/components/divider"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { Text } from "@/components/Text"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api, RouterOutputs } from "@/contexts/TRPCProvider"; -import { handleRequestAppReview } from "@/services/appReview"; -import { sendError } from "@/services/errorTracking"; +import { Text } from "@/components/text"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api, RouterOutputs } from "@/contexts/trpc-provider"; +import { handleRequestAppReview } from "@/services/app-review"; +import { sendError } from "@/services/error-tracking"; import { syncMatchesWidget } from "@/services/matchesWidget"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Header } from "@/views/(tabs)/Messages/components/Header"; import { Message } from "@/views/(tabs)/Messages/components/Message"; -import { EmptyMessages } from "./components/EmptyMessages"; +import { EmptyMessages } from "./components/empty-messages"; import { SearchBar } from "./components/SearchBar"; import { Container, DividerContainer, Title } from "./styles"; diff --git a/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts b/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts index b421758..31d69a5 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts +++ b/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts @@ -1,7 +1,7 @@ import { Pressable } from "react-native"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Root = styled(Pressable)` flex-direction: row; diff --git a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx index 4a58d81..17bdac6 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx @@ -8,10 +8,10 @@ import { BIO_NUMBER_OF_LINES } from "@/components/MainCard/components/PersonalIn import * as PersonalInfo from "@/components/MainCard/components/PersonalInfo/styles"; import { Container, Picture } from "@/components/MainCard/styles"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { api } from "@/contexts/TRPCProvider"; -import { useCustomerPlan } from "@/hooks/usePayments"; +import { api } from "@/contexts/trpc-provider"; +import { useCustomerPlan } from "@/hooks/use-payments"; import { UserPlan } from "@/services/payments"; -import { useGetFormattedYears } from "@/services/useGetFormattedYears"; +import { useGetFormattedYears } from "@/services/use-get-formatted-years"; import { ProfileContainer, ProfileUnknownError, diff --git a/apps/mobile/src/views/(tabs)/Profile/components/CurrentPlanConfig.tsx b/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx similarity index 94% rename from apps/mobile/src/views/(tabs)/Profile/components/CurrentPlanConfig.tsx rename to apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx index 7d08b06..93d4b8b 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/CurrentPlanConfig.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx @@ -6,10 +6,10 @@ import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components/native"; import Premium from "@/assets/images/Badge.svg"; -import Loading from "@/components/Loading"; -import { useCustomerPlan } from "@/hooks/usePayments"; +import Loading from "@/components/loading"; +import { useCustomerPlan } from "@/hooks/use-payments"; import { UserPlan } from "@/services/payments"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Config } from "./Config"; const PlanLoading = styled.View` diff --git a/apps/mobile/src/views/(tabs)/Profile/components/LanguageConfig.tsx b/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx similarity index 97% rename from apps/mobile/src/views/(tabs)/Profile/components/LanguageConfig.tsx rename to apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx index dfef5bf..d107d89 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/LanguageConfig.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx @@ -7,7 +7,7 @@ import { Language } from "@pegada/shared/i18n/types/types"; import Translate from "@/assets/images/Translate.svg"; import { PickerSheet } from "@/components/Picker"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { Config } from "./Config"; // Not translating languages for now, as it's useful to diff --git a/apps/mobile/src/views/(tabs)/Profile/components/LocationConfig.tsx b/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx similarity index 93% rename from apps/mobile/src/views/(tabs)/Profile/components/LocationConfig.tsx rename to apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx index 78e85a2..d022441 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/LocationConfig.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx @@ -5,8 +5,8 @@ import { useTheme } from "styled-components/native"; import Location from "@/assets/images/Location.svg"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { useCurrentCityText } from "@/hooks/useCurrentCityText"; -import { SceneName } from "@/types/SceneName"; +import { useCurrentCityText } from "@/hooks/use-current-city-text"; +import { SceneName } from "@/types/scene-name"; import { Config } from "./Config"; const CurrentLocation = () => { diff --git a/apps/mobile/src/views/(tabs)/Profile/components/ThemeConfig.tsx b/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx similarity index 92% rename from apps/mobile/src/views/(tabs)/Profile/components/ThemeConfig.tsx rename to apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx index c19d3b3..9988081 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/ThemeConfig.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx @@ -5,8 +5,8 @@ import { useTheme } from "styled-components/native"; import LightMode from "@/assets/images/LightMode.svg"; import { PickerSheet } from "@/components/Picker"; -import { ActiveTheme, useActiveTheme } from "@/contexts/ThemeProvider"; -import { sendError } from "@/services/errorTracking"; +import { ActiveTheme, useActiveTheme } from "@/contexts/theme-provider"; +import { sendError } from "@/services/error-tracking"; import { Config } from "./Config"; export const ThemeConfig = () => { diff --git a/apps/mobile/src/views/(tabs)/Profile/index.tsx b/apps/mobile/src/views/(tabs)/Profile/index.tsx index 9249466..91196cb 100644 --- a/apps/mobile/src/views/(tabs)/Profile/index.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/index.tsx @@ -21,19 +21,19 @@ import Erase from "@/assets/images/Erase.svg"; import Filters from "@/assets/images/Filters.svg"; import Paperwork from "@/assets/images/Paperwork.svg"; import SignOut from "@/assets/images/SignOut.svg"; -import Divider from "@/components/Divider"; -import { Text } from "@/components/Text"; -import { useWarmUpBrowser } from "@/hooks/useWarmUpBrowser"; +import Divider from "@/components/divider"; +import { Text } from "@/components/text"; +import { useWarmUpBrowser } from "@/hooks/use-warm-up-browser"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; -import { openWebBrowser } from "@/services/openWebBrowser"; +import { sendError } from "@/services/error-tracking"; +import { openWebBrowser } from "@/services/open-web-browser"; import { StorageKeys, storeData } from "@/services/storage"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Config } from "./components/Config"; -import { CurrentPlanConfig } from "./components/CurrentPlanConfig"; -import { LanguageConfig } from "./components/LanguageConfig"; -import { LocationConfig } from "./components/LocationConfig"; -import { ThemeConfig } from "./components/ThemeConfig"; +import { CurrentPlanConfig } from "./components/current-plan-config"; +import { LanguageConfig } from "./components/language-config"; +import { LocationConfig } from "./components/location-config"; +import { ThemeConfig } from "./components/theme-config"; import UserDogProfileHeader, { useDogProfileHeight } from "./components/UserDogProfileHeader"; import { BackgroundOverlay, @@ -43,8 +43,8 @@ import { ScrollContainer, SettingsList, } from "./styles"; -import { deleteAccount } from "./utils/deleteAccount"; -import { handleLogout } from "./utils/handleLogout"; +import { deleteAccount } from "./utils/delete-account"; +import { handleLogout } from "./utils/handle-logout"; const openTermsOfUse = () => { analytics.track({ event_type: "Open Terms Of Use" }); diff --git a/apps/mobile/src/views/(tabs)/Profile/styles.ts b/apps/mobile/src/views/(tabs)/Profile/styles.ts index d0f6157..69d3ba3 100644 --- a/apps/mobile/src/views/(tabs)/Profile/styles.ts +++ b/apps/mobile/src/views/(tabs)/Profile/styles.ts @@ -2,7 +2,7 @@ import Animated from "react-native-reanimated"; import Color from "color"; import styled from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; export const PlanContainer = styled(PressableArea)` position: absolute; diff --git a/apps/mobile/src/views/(tabs)/Profile/utils/deleteAccount.tsx b/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx similarity index 92% rename from apps/mobile/src/views/(tabs)/Profile/utils/deleteAccount.tsx rename to apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx index 818595b..4e5e00d 100644 --- a/apps/mobile/src/views/(tabs)/Profile/utils/deleteAccount.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx @@ -1,10 +1,10 @@ import { Alert } from "react-native"; import { t } from "i18next"; -import { getTrcpContext } from "@/contexts/trcpContext"; +import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { logout } from "@/services/logout"; export const deleteAccount = () => { diff --git a/apps/mobile/src/views/(tabs)/Profile/utils/handleLogout.tsx b/apps/mobile/src/views/(tabs)/Profile/utils/handle-logout.tsx similarity index 100% rename from apps/mobile/src/views/(tabs)/Profile/utils/handleLogout.tsx rename to apps/mobile/src/views/(tabs)/Profile/utils/handle-logout.tsx diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx index 680ef1e..6bf73d2 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx @@ -4,11 +4,11 @@ import { useDispatch, useSelector } from "react-redux"; import { useTheme } from "styled-components/native"; import SwipeBackArrow from "@/assets/images/SwipeBackArrow.svg"; -import { useUnsafeIsPremium } from "@/hooks/usePayments"; +import { useUnsafeIsPremium } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; import { Actions } from "@/store/reducers"; import { getLastCardId } from "@/store/selectors"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Container, GoBack } from "./styles"; const SwipeBackButton = () => { diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/styles.ts b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/styles.ts index 3e3d630..5be8d61 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/styles.ts +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/styles.ts @@ -1,7 +1,7 @@ import Animated from "react-native-reanimated"; import styled from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; +import { PressableArea } from "@/components/pressable-area"; export const Container = styled(Animated.View)` z-index: 20; diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture.ts b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts similarity index 100% rename from apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture.ts rename to apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx index e786841..66ffecd 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx @@ -16,7 +16,7 @@ import { useDidMountEffect } from "@/services/utils"; import { Actions } from "@/store/reducers"; import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { getCurrentCardId } from "@/store/selectors"; -import { Swipe, useSwipeGesture } from "./hooks/useSwipeGesture"; +import { Swipe, useSwipeGesture } from "./hooks/use-swipe-gesture"; const ROTATION_DEG = 8; diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx index 5bfc044..a821ca4 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx @@ -12,7 +12,7 @@ import { } from "@/components/NetworkBoundary"; import { Container, Content } from "@/components/NetworkBoundary/styles"; import { Actions, RootReducer } from "@/store/reducers"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Description, EmptyAnimation, LogoLoading, Title } from "./styles"; export const EmptyComponent = () => { diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts index c6b3136..ef136d3 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts @@ -2,7 +2,7 @@ import LottieView from "lottie-react-native"; import styled from "styled-components/native"; import * as LikeFeedbackStyles from "@/components/FeedbackCard/components/LikeFeedback/styles"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled(LikeFeedbackStyles.Container)` background-color: transparent; diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/ChangeLocation.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx similarity index 89% rename from apps/mobile/src/views/(tabs)/Swipe/components/ChangeLocation.tsx rename to apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx index 8068590..0509337 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/ChangeLocation.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx @@ -6,10 +6,10 @@ import { useTheme } from "styled-components/native"; import ArrowDown from "@/assets/images/ArrowDown.svg"; import Location from "@/assets/images/Location.svg"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; -import { SceneName } from "@/types/SceneName"; -import { useCurrentCityText } from "../../../../hooks/useCurrentCityText"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; +import { SceneName } from "@/types/scene-name"; +import { useCurrentCityText } from "../../../../hooks/use-current-city-text"; const CurrentLocation = () => { const currentCityText = useCurrentCityText(); diff --git a/apps/mobile/src/views/(tabs)/Swipe/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/index.tsx index 9cf21df..aa2c861 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/index.tsx @@ -4,20 +4,20 @@ import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useDispatch, useSelector } from "react-redux"; import { MatchActionBar } from "@/components/MatchActionBar"; -import { sendError } from "@/services/errorTracking"; -import { trackUser } from "@/services/getInitialRouteName"; +import { sendError } from "@/services/error-tracking"; +import { trackUser } from "@/services/get-initial-route-name"; import { getPushNotificationToken, NotificationTokenError, setPushNotificationToken, -} from "@/services/getPushNotificationToken"; +} from "@/services/get-push-notification-token"; import { processLinks } from "@/services/linking"; import { Actions } from "@/store/reducers/dogs"; import { getCards, getCurrentCardId } from "@/store/selectors"; -import { ChangeLocation } from "./components/ChangeLocation"; +import { ChangeLocation } from "./components/change-location"; import SwipeBackButton from "./components/SwipeBackButton"; import SwipeHandler, { swipeHandlerRef } from "./components/SwipeHandler"; -import { Swipe } from "./components/SwipeHandler/hooks/useSwipeGesture"; +import { Swipe } from "./components/SwipeHandler/hooks/use-swipe-gesture"; import SwipeRequestFeedback from "./components/SwipeRequestFeedback"; import { Container } from "./styles"; diff --git a/apps/mobile/src/views/Chat/components/Header/index.tsx b/apps/mobile/src/views/Chat/components/Header/index.tsx index cfc58c5..1422d7a 100644 --- a/apps/mobile/src/views/Chat/components/Header/index.tsx +++ b/apps/mobile/src/views/Chat/components/Header/index.tsx @@ -6,9 +6,9 @@ import { useTheme } from "styled-components/native"; import BackArrow from "@/assets/images/BackArrow.svg"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { Text } from "@/components/Text"; -import { api } from "@/contexts/TRPCProvider"; -import { SceneName } from "@/types/SceneName"; +import { Text } from "@/components/text"; +import { api } from "@/contexts/trpc-provider"; +import { SceneName } from "@/types/scene-name"; import * as S from "./styles"; export const HEADER_HEIGHT = 65; diff --git a/apps/mobile/src/views/Chat/components/Header/styles.tsx b/apps/mobile/src/views/Chat/components/Header/styles.tsx index 207057c..94125a4 100644 --- a/apps/mobile/src/views/Chat/components/Header/styles.tsx +++ b/apps/mobile/src/views/Chat/components/Header/styles.tsx @@ -1,9 +1,9 @@ import Color from "color"; import styled from "styled-components/native"; -import { BlurView } from "@/components/BlurView"; -import { Image } from "@/components/Image"; -import { PressableArea } from "@/components/PressableArea"; +import { BlurView } from "@/components/blur-view"; +import { Image } from "@/components/image"; +import { PressableArea } from "@/components/pressable-area"; export const BackTouchArea = styled(PressableArea)` padding: ${(props) => props.theme.spacing[4]}px; diff --git a/apps/mobile/src/views/Chat/components/Message/index.tsx b/apps/mobile/src/views/Chat/components/Message/index.tsx index 9cf00fc..71de809 100644 --- a/apps/mobile/src/views/Chat/components/Message/index.tsx +++ b/apps/mobile/src/views/Chat/components/Message/index.tsx @@ -2,8 +2,8 @@ import * as React from "react"; import { SlideInLeft, SlideInRight, SlideOutRight } from "react-native-reanimated"; import { format } from "date-fns"; -import { Text } from "@/components/Text"; -import Feedback, { FeedbackStatus } from "../Feedback"; +import { Text } from "@/components/text"; +import Feedback, { FeedbackStatus } from "../feedback"; import { Info, Message, Time } from "./styles"; interface MessageComponentProps { diff --git a/apps/mobile/src/views/Chat/components/Message/styles.ts b/apps/mobile/src/views/Chat/components/Message/styles.ts index ecc5bb0..d81c527 100644 --- a/apps/mobile/src/views/Chat/components/Message/styles.ts +++ b/apps/mobile/src/views/Chat/components/Message/styles.ts @@ -2,8 +2,8 @@ import Animated from "react-native-reanimated"; import Color from "color"; import styled, { css } from "styled-components/native"; -import { Text } from "@/components/Text"; -import { FeedbackStatus } from "../Feedback"; +import { Text } from "@/components/text"; +import { FeedbackStatus } from "../feedback"; interface MessageProps { sending: boolean; diff --git a/apps/mobile/src/views/Chat/components/NextDay/styles.ts b/apps/mobile/src/views/Chat/components/NextDay/styles.ts index e3edd41..95d2aeb 100644 --- a/apps/mobile/src/views/Chat/components/NextDay/styles.ts +++ b/apps/mobile/src/views/Chat/components/NextDay/styles.ts @@ -1,7 +1,7 @@ import Color from "color"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.View` margin: ${(props) => props.theme.spacing[4]}px auto ${(props) => props.theme.spacing[5]}px auto; diff --git a/apps/mobile/src/views/Chat/components/Send/index.tsx b/apps/mobile/src/views/Chat/components/Send/index.tsx index 1e09aa3..6c02a50 100644 --- a/apps/mobile/src/views/Chat/components/Send/index.tsx +++ b/apps/mobile/src/views/Chat/components/Send/index.tsx @@ -1,8 +1,8 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { useKeyboardAwareSafeAreaInsets } from "@/hooks/useKeyboardAwareSafeAreaInsets"; -import { useSendMessage } from "../../hooks/useSendMessage"; +import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe-area-insets"; +import { useSendMessage } from "../../hooks/use-send-message"; import { Container, Input } from "./styles"; export const SEND_HEIGHT = 65; diff --git a/apps/mobile/src/views/Chat/components/Send/styles.ts b/apps/mobile/src/views/Chat/components/Send/styles.ts index 820e38b..5b5cded 100644 --- a/apps/mobile/src/views/Chat/components/Send/styles.ts +++ b/apps/mobile/src/views/Chat/components/Send/styles.ts @@ -1,6 +1,6 @@ import styled from "styled-components/native"; -import { BlurView } from "@/components/BlurView"; +import { BlurView } from "@/components/blur-view"; export const Input = styled.TextInput.attrs((props) => ({ placeholderTextColor: props.theme.colors.placeholder, diff --git a/apps/mobile/src/views/Chat/components/Feedback.tsx b/apps/mobile/src/views/Chat/components/feedback.tsx similarity index 100% rename from apps/mobile/src/views/Chat/components/Feedback.tsx rename to apps/mobile/src/views/Chat/components/feedback.tsx diff --git a/apps/mobile/src/views/Chat/components/index.tsx b/apps/mobile/src/views/Chat/components/index.tsx index e1038e5..b492804 100644 --- a/apps/mobile/src/views/Chat/components/index.tsx +++ b/apps/mobile/src/views/Chat/components/index.tsx @@ -1,4 +1,4 @@ -export { default as Feedback } from "./Feedback"; +export { default as Feedback } from "./feedback"; export { default as Header } from "./Header"; export { default as Message } from "./Message"; export { default as NextDay } from "./NextDay"; diff --git a/apps/mobile/src/views/Chat/hooks/useChatPagination.ts b/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts similarity index 87% rename from apps/mobile/src/views/Chat/hooks/useChatPagination.ts rename to apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts index 94097e2..49244f7 100644 --- a/apps/mobile/src/views/Chat/hooks/useChatPagination.ts +++ b/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts @@ -1,10 +1,10 @@ import { useLocalSearchParams } from "expo-router"; import { useSuspenseInfiniteQuery } from "@tanstack/react-query"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { RouterOutputs } from "@/contexts/TRPCProvider"; -import { FeedbackStatus } from "../components/Feedback"; -import { useFetchNewMessages } from "./useFetchNewMessages"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { RouterOutputs } from "@/contexts/trpc-provider"; +import { FeedbackStatus } from "../components/feedback"; +import { useFetchNewMessages } from "./use-fetch-new-messages"; const PAGE_SIZE = 20; diff --git a/apps/mobile/src/views/Chat/hooks/useFetchNewMessages.ts b/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts similarity index 92% rename from apps/mobile/src/views/Chat/hooks/useFetchNewMessages.ts rename to apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts index 9f8588e..8af86af 100644 --- a/apps/mobile/src/views/Chat/hooks/useFetchNewMessages.ts +++ b/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts @@ -1,10 +1,10 @@ import { useEffect, useRef } from "react"; import { useLocalSearchParams } from "expo-router"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { sendError } from "@/services/errorTracking"; -import { queryClient } from "@/services/queryClient"; -import { MessageProps } from "./useChatPagination"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { sendError } from "@/services/error-tracking"; +import { queryClient } from "@/services/query-client"; +import { MessageProps } from "./use-chat-pagination"; const REFRESH_INTERVAL = 5000; export const useFetchNewMessages = () => { diff --git a/apps/mobile/src/views/Chat/hooks/useSendMessage.ts b/apps/mobile/src/views/Chat/hooks/use-send-message.ts similarity index 92% rename from apps/mobile/src/views/Chat/hooks/useSendMessage.ts rename to apps/mobile/src/views/Chat/hooks/use-send-message.ts index bf1fe1d..ba2cb1a 100644 --- a/apps/mobile/src/views/Chat/hooks/useSendMessage.ts +++ b/apps/mobile/src/views/Chat/hooks/use-send-message.ts @@ -1,11 +1,11 @@ import { useLocalSearchParams } from "expo-router"; import * as uuid from "uuid"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { sendError } from "@/services/errorTracking"; -import { queryClient } from "@/services/queryClient"; -import { FeedbackStatus } from "../components/Feedback"; -import { MessageProps } from "./useChatPagination"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { sendError } from "@/services/error-tracking"; +import { queryClient } from "@/services/query-client"; +import { FeedbackStatus } from "../components/feedback"; +import { MessageProps } from "./use-chat-pagination"; export const useSendMessage = () => { const { matchId } = useLocalSearchParams(); diff --git a/apps/mobile/src/views/Chat/index.tsx b/apps/mobile/src/views/Chat/index.tsx index 25655cb..03f137f 100644 --- a/apps/mobile/src/views/Chat/index.tsx +++ b/apps/mobile/src/views/Chat/index.tsx @@ -5,11 +5,11 @@ import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { useKeyboardAwareSafeAreaInsets } from "@/hooks/useKeyboardAwareSafeAreaInsets"; +import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe-area-insets"; import { Header, Message, NextDay, Send } from "@/views/Chat/components"; import { HEADER_HEIGHT } from "./components/Header"; import { SEND_HEIGHT } from "./components/Send"; -import { MessageProps, useChatPagination } from "./hooks/useChatPagination"; +import { MessageProps, useChatPagination } from "./hooks/use-chat-pagination"; import { Background, CenteredText, CenteredView, Container } from "./styles"; const Empty = () => { diff --git a/apps/mobile/src/views/Chat/styles.ts b/apps/mobile/src/views/Chat/styles.ts index 4a0ab72..b1600a0 100644 --- a/apps/mobile/src/views/Chat/styles.ts +++ b/apps/mobile/src/views/Chat/styles.ts @@ -1,7 +1,7 @@ import Animated, { FadeInUp } from "react-native-reanimated"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled.KeyboardAvoidingView` background-color: ${(props) => props.theme.colors.background}; diff --git a/apps/mobile/src/views/DogProfile/components/GoBack/styles.ts b/apps/mobile/src/views/DogProfile/components/GoBack/styles.ts index 6ba2881..0b019fc 100644 --- a/apps/mobile/src/views/DogProfile/components/GoBack/styles.ts +++ b/apps/mobile/src/views/DogProfile/components/GoBack/styles.ts @@ -1,7 +1,7 @@ import styled from "styled-components/native"; -import { TransparentGlassOrDarkBlurView } from "@/components/BlurView"; -import { PressableArea } from "@/components/PressableArea"; +import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; +import { PressableArea } from "@/components/pressable-area"; const BACK_CONTAINER_SIZE = 60; const HIT_SLOP = { diff --git a/apps/mobile/src/views/DogProfile/components/BreedTag.tsx b/apps/mobile/src/views/DogProfile/components/breed-tag.tsx similarity index 91% rename from apps/mobile/src/views/DogProfile/components/BreedTag.tsx rename to apps/mobile/src/views/DogProfile/components/breed-tag.tsx index 7a9056d..7b34e88 100644 --- a/apps/mobile/src/views/DogProfile/components/BreedTag.tsx +++ b/apps/mobile/src/views/DogProfile/components/breed-tag.tsx @@ -5,9 +5,9 @@ import styled from "styled-components/native"; import { BreedSlug } from "@pegada/shared/i18n/i18n"; import { Namespace } from "@pegada/shared/i18n/types/types"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { SwipeDog } from "@/store/reducers/dogs/swipe"; -import { TransparentGlassOrDarkBlurView } from "@/components/BlurView"; +import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; const GlassmorphismStyled = styled(TransparentGlassOrDarkBlurView).attrs({ glassEffectStyle: "regular", diff --git a/apps/mobile/src/views/DogProfile/index.tsx b/apps/mobile/src/views/DogProfile/index.tsx index 56e47be..ef45c26 100644 --- a/apps/mobile/src/views/DogProfile/index.tsx +++ b/apps/mobile/src/views/DogProfile/index.tsx @@ -13,20 +13,20 @@ import { useTheme } from "styled-components/native"; import MainCard from "@/components/MainCard"; import { MatchActionBar } from "@/components/MatchActionBar"; import { NetworkBoundary, UnknownErrorComponent } from "@/components/NetworkBoundary"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { APP_SHARE_LINK_BASE } from "@/constants"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api } from "@/contexts/TRPCProvider"; -import { sendError } from "@/services/errorTracking"; -import { useGetFormattedYears } from "@/services/useGetFormattedYears"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api } from "@/contexts/trpc-provider"; +import { sendError } from "@/services/error-tracking"; +import { useGetFormattedYears } from "@/services/use-get-formatted-years"; import { Actions } from "@/store/reducers"; import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { getCurrentCardId } from "@/store/selectors"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { useCustomTopInset } from "@/views/(tabs)/Swipe"; import { swipeHandlerRef } from "@/views/(tabs)/Swipe/components/SwipeHandler"; -import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/useSwipeGesture"; -import { BreedTag } from "@/views/DogProfile/components/BreedTag"; +import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; +import { BreedTag } from "@/views/DogProfile/components/breed-tag"; import GoBack from "@/views/DogProfile/components/GoBack"; import * as S from "./styles"; diff --git a/apps/mobile/src/views/DogProfile/styles.ts b/apps/mobile/src/views/DogProfile/styles.ts index 4676b24..71850f2 100644 --- a/apps/mobile/src/views/DogProfile/styles.ts +++ b/apps/mobile/src/views/DogProfile/styles.ts @@ -3,8 +3,8 @@ import Color from "color"; import { clamp } from "lodash"; import styled from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; import { height, width } from "@/constants"; const ASPECT_RATIO = 4 / 3; diff --git a/apps/mobile/src/views/EditProfile/index.tsx b/apps/mobile/src/views/EditProfile/index.tsx index 815c9eb..ce042da 100644 --- a/apps/mobile/src/views/EditProfile/index.tsx +++ b/apps/mobile/src/views/EditProfile/index.tsx @@ -10,7 +10,7 @@ import { useTranslation } from "react-i18next"; import { useDispatch } from "react-redux"; import { useTheme } from "styled-components/native"; -import { dogClientSchema } from "@pegada/shared/schemas/dogSchema"; +import { dogClientSchema } from "@pegada/shared/schemas/dog-schema"; import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import BreedPicker from "@/components/BreedPicker"; @@ -24,12 +24,12 @@ import { } from "@/components/ProfileImageUploader"; import { Picture, pictures } from "@/components/ProfileImageUploader/utils"; import { RadioButtons } from "@/components/RadioButtons"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api, RouterInputs } from "@/contexts/TRPCProvider"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api, RouterInputs } from "@/contexts/trpc-provider"; import { analytics } from "@/services/analytics"; import { colors, sizes } from "@/services/consts"; -import { sendError } from "@/services/errorTracking"; -import { maskDate } from "@/services/maskDate"; +import { sendError } from "@/services/error-tracking"; +import { maskDate } from "@/services/mask-date"; import { Actions } from "@/store/reducers"; import { Container } from "./styles"; diff --git a/apps/mobile/src/views/ForceUpdate/index.tsx b/apps/mobile/src/views/ForceUpdate/index.tsx index bbc4d99..f15f7f2 100644 --- a/apps/mobile/src/views/ForceUpdate/index.tsx +++ b/apps/mobile/src/views/ForceUpdate/index.tsx @@ -3,11 +3,11 @@ import { Linking } from "react-native"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; -import Logo from "@/assets/images/Logo"; +import Logo from "@/assets/images/logo"; import { BottomAction } from "@/components/BottomAction"; import { Button } from "@/components/Button"; import { APP_SHARE_LINK_BASE } from "@/constants"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { CenterText, Container } from "./styles"; const ForceUpdate: React.FC = () => { diff --git a/apps/mobile/src/views/ForceUpdate/styles.ts b/apps/mobile/src/views/ForceUpdate/styles.ts index 8c50589..227ec1b 100644 --- a/apps/mobile/src/views/ForceUpdate/styles.ts +++ b/apps/mobile/src/views/ForceUpdate/styles.ts @@ -1,7 +1,7 @@ import { SafeAreaView } from "react-native-safe-area-context"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Container = styled(SafeAreaView)` align-items: center; diff --git a/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts b/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts index af267cf..9bb0d9e 100644 --- a/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts +++ b/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts @@ -2,7 +2,7 @@ import Animated from "react-native-reanimated"; import LottieView from "lottie-react-native"; import styled from "styled-components/native"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; export const Swipe = styled(LottieView).attrs({ resizeMode: "cover", diff --git a/apps/mobile/src/views/LocationMap/index.tsx b/apps/mobile/src/views/LocationMap/index.tsx index c779a53..de708a2 100644 --- a/apps/mobile/src/views/LocationMap/index.tsx +++ b/apps/mobile/src/views/LocationMap/index.tsx @@ -11,8 +11,8 @@ import { useTheme } from "styled-components/native"; import { useBottomActionStyle } from "@/components/BottomAction"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { api } from "@/contexts/TRPCProvider"; -import { sendError } from "@/services/errorTracking"; +import { api } from "@/contexts/trpc-provider"; +import { sendError } from "@/services/error-tracking"; import { Actions } from "@/store/reducers"; import { updateUserLocation } from "../(auth)/AskForLocation"; import { Marker } from "./components/Marker"; diff --git a/apps/mobile/src/views/NewMatch/AnimatedCards.tsx b/apps/mobile/src/views/NewMatch/animated-cards.tsx similarity index 96% rename from apps/mobile/src/views/NewMatch/AnimatedCards.tsx rename to apps/mobile/src/views/NewMatch/animated-cards.tsx index 7293dde..27eac7c 100644 --- a/apps/mobile/src/views/NewMatch/AnimatedCards.tsx +++ b/apps/mobile/src/views/NewMatch/animated-cards.tsx @@ -4,9 +4,9 @@ import { useWindowDimensions, View } from "react-native"; import { useAnimatedStyle, useSharedValue, withDelay, withTiming } from "react-native-reanimated"; import { useTheme } from "styled-components"; -import { Image } from "@/components/Image"; +import { Image } from "@/components/image"; import { DefaultLoadingComponent, NetworkBoundary } from "@/components/NetworkBoundary"; -import { api, RouterOutputs } from "@/contexts/TRPCProvider"; +import { api, RouterOutputs } from "@/contexts/trpc-provider"; import { HeartEyesContainer, RotatedImageLeft, RotatedImageRight } from "./styles"; interface AnimatedCardsProps { diff --git a/apps/mobile/src/views/NewMatch/ConfettiAnimation.tsx b/apps/mobile/src/views/NewMatch/confetti-animation.tsx similarity index 100% rename from apps/mobile/src/views/NewMatch/ConfettiAnimation.tsx rename to apps/mobile/src/views/NewMatch/confetti-animation.tsx diff --git a/apps/mobile/src/views/NewMatch/index.tsx b/apps/mobile/src/views/NewMatch/index.tsx index 0d534ab..da01555 100644 --- a/apps/mobile/src/views/NewMatch/index.tsx +++ b/apps/mobile/src/views/NewMatch/index.tsx @@ -9,14 +9,14 @@ import { useTheme } from "styled-components"; import { Button } from "@/components/Button"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { Text } from "@/components/Text"; -import { api } from "@/contexts/TRPCProvider"; +import { Text } from "@/components/text"; +import { api } from "@/contexts/trpc-provider"; import { useForAdRequestTracked } from "@/services/advertisement/interstitial"; import { analytics } from "@/services/analytics"; import { haptics } from "@/services/haptics"; -import { SceneName } from "@/types/SceneName"; -import AnimatedCards from "./AnimatedCards"; -import { ConfettiAnimation } from "./ConfettiAnimation"; +import { SceneName } from "@/types/scene-name"; +import AnimatedCards from "./animated-cards"; +import { ConfettiAnimation } from "./confetti-animation"; import { Container, Content } from "./styles"; const NewMatch: React.FC = () => { diff --git a/apps/mobile/src/views/NewMatch/styles.ts b/apps/mobile/src/views/NewMatch/styles.ts index 54feac4..f807d57 100644 --- a/apps/mobile/src/views/NewMatch/styles.ts +++ b/apps/mobile/src/views/NewMatch/styles.ts @@ -3,7 +3,7 @@ import { SafeAreaView } from "react-native-safe-area-context"; import Color from "color"; import styled from "styled-components/native"; -import { Image } from "@/components/Image"; +import { Image } from "@/components/image"; export const Container = styled.View` background-color: ${(props) => props.theme.colors.background}; diff --git a/apps/mobile/src/views/Preferences/index.tsx b/apps/mobile/src/views/Preferences/index.tsx index 7480acd..c6f1942 100644 --- a/apps/mobile/src/views/Preferences/index.tsx +++ b/apps/mobile/src/views/Preferences/index.tsx @@ -17,13 +17,13 @@ import { Button } from "@/components/Button"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { InputPicker } from "@/components/Picker"; import { Slider } from "@/components/Slider"; -import { getTrcpContext } from "@/contexts/trcpContext"; -import { api, RouterInputs } from "@/contexts/TRPCProvider"; +import { getTrcpContext } from "@/contexts/trcp-context"; +import { api, RouterInputs } from "@/contexts/trpc-provider"; import { analytics } from "@/services/analytics"; import { colors, sizes } from "@/services/consts"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { Actions } from "@/store/reducers"; -import { SceneName } from "@/types/SceneName"; +import { SceneName } from "@/types/scene-name"; import { Container, DistanceContainer, InputRow, InputSpace, SliderContainer } from "./styles"; const { width } = Dimensions.get("window"); diff --git a/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx b/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx index 68de1d8..337415b 100644 --- a/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import SwipeBackArrow from "@/assets/images/SwipeBackArrow.svg"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import AdsOff from "@/views/UpgradeWall/assets/AdsOff.svg"; import HighPriority from "@/views/UpgradeWall/assets/HighPriority.svg"; import Infinite from "@/views/UpgradeWall/assets/Infinite.svg"; diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx index d4e397d..33c2966 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx @@ -6,9 +6,9 @@ import * as Device from "expo-device"; import { useRouter } from "expo-router"; import { useTranslation } from "react-i18next"; -import { useOfferings } from "@/hooks/usePayments"; +import { useOfferings } from "@/hooks/use-payments"; import { Container } from "@/views/UpgradeWall/components/PlanPackages/styles"; -import { PlanCard } from "./PlanCard"; +import { PlanCard } from "./plan-card"; const periodToDays = (period: string) => { const match = period.match(/P(\d+)(D|W|M|Y)/); diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/PlanCard.tsx b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx similarity index 98% rename from apps/mobile/src/views/UpgradeWall/components/PlanPackages/PlanCard.tsx rename to apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx index b30fc05..ada9d9f 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/PlanCard.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { PurchasesPackage } from "react-native-purchases"; import { useTranslation } from "react-i18next"; -import { Text } from "@/components/Text"; +import { Text } from "@/components/text"; import { Checkbox } from "@/views/UpgradeWall/components/Checkbox"; import { Flex, diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts index b6cbe22..2f8e23e 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts @@ -1,8 +1,8 @@ import Color from "color"; import styled, { css } from "styled-components/native"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; interface CheckContainerProps { selected?: boolean; diff --git a/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx b/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx index bd7e1e1..4ad45dd 100644 --- a/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx @@ -6,10 +6,10 @@ import { useMutation } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { payments } from "@/services/payments"; const RestorePurchases: React.FC = () => { diff --git a/apps/mobile/src/views/UpgradeWall/index.tsx b/apps/mobile/src/views/UpgradeWall/index.tsx index 87aeadd..7c77a1a 100644 --- a/apps/mobile/src/views/UpgradeWall/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/index.tsx @@ -11,9 +11,9 @@ import { useTheme } from "styled-components"; import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import { Button } from "@/components/Button"; -import { useEligibleForTrial } from "@/hooks/usePayments"; +import { useEligibleForTrial } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; -import { sendError } from "@/services/errorTracking"; +import { sendError } from "@/services/error-tracking"; import { haptics } from "@/services/haptics"; import { payments } from "@/services/payments"; import Benefits from "@/views/UpgradeWall/components/Benefits"; diff --git a/apps/mobile/src/views/UpgradeWall/styles.ts b/apps/mobile/src/views/UpgradeWall/styles.ts index b67d735..8ca3e6a 100644 --- a/apps/mobile/src/views/UpgradeWall/styles.ts +++ b/apps/mobile/src/views/UpgradeWall/styles.ts @@ -4,9 +4,9 @@ import Color from "color"; import styled from "styled-components/native"; import Close from "@/assets/images/Close.svg"; -import { BlurView } from "@/components/BlurView"; -import { PressableArea } from "@/components/PressableArea"; -import { Text } from "@/components/Text"; +import { BlurView } from "@/components/blur-view"; +import { PressableArea } from "@/components/pressable-area"; +import { Text } from "@/components/text"; export const Container = styled.View` flex: 1; diff --git a/apps/mobile/src/views/Splashscreen.tsx b/apps/mobile/src/views/splashscreen.tsx similarity index 100% rename from apps/mobile/src/views/Splashscreen.tsx rename to apps/mobile/src/views/splashscreen.tsx diff --git a/apps/nextjs/src/app/[locale]/dog/[id]/page.tsx b/apps/nextjs/src/app/[locale]/dog/[id]/page.tsx index 43c52ac..3255d06 100644 --- a/apps/nextjs/src/app/[locale]/dog/[id]/page.tsx +++ b/apps/nextjs/src/app/[locale]/dog/[id]/page.tsx @@ -3,7 +3,7 @@ import { notFound } from "next/navigation"; import prisma from "@pegada/database"; import { BreedSlug } from "@pegada/shared/i18n/i18n"; import { Namespace } from "@pegada/shared/i18n/types/types"; -import { getFormattedYears } from "@pegada/shared/utils/getFormattedYears"; +import { getFormattedYears } from "@pegada/shared/utils/get-formatted-years"; import { getSafeLocale } from "@/lib/get-safe-locale"; import { t } from "@/lib/translate"; diff --git a/apps/nextjs/src/app/api/queues/process-image/route.ts b/apps/nextjs/src/app/api/queues/process-image/route.ts index fc7c5d9..f952bc9 100644 --- a/apps/nextjs/src/app/api/queues/process-image/route.ts +++ b/apps/nextjs/src/app/api/queues/process-image/route.ts @@ -1,6 +1,6 @@ import { handleCallback } from "@vercel/queue"; -import { handleProcessImage } from "@pegada/api/queue/handlers/processImage"; +import { handleProcessImage } from "@pegada/api/queue/handlers/process-image"; import { IProcessImageJobData } from "@pegada/api/queue/topics"; export const maxDuration = 120; diff --git a/apps/nextjs/src/app/api/webhooks/revenuecat/route.ts b/apps/nextjs/src/app/api/webhooks/revenuecat/route.ts index 47de5c8..fe1e750 100644 --- a/apps/nextjs/src/app/api/webhooks/revenuecat/route.ts +++ b/apps/nextjs/src/app/api/webhooks/revenuecat/route.ts @@ -1,6 +1,6 @@ import { NextRequest } from "next/server"; -import PaymentService from "@pegada/api/services/PaymentService"; +import PaymentService from "@pegada/api/services/payment-service"; import { getSession } from "@pegada/api/trpc"; import { RequestHeaders } from "@pegada/shared/types/types"; diff --git a/apps/nextjs/src/lib/translate.ts b/apps/nextjs/src/lib/translate.ts index e56b893..485568c 100644 --- a/apps/nextjs/src/lib/translate.ts +++ b/apps/nextjs/src/lib/translate.ts @@ -1,6 +1,6 @@ import { ParseKeys, TOptions } from "i18next"; -import { TranslationService } from "@pegada/api/services/TranslationService"; +import { TranslationService } from "@pegada/api/services/translation-service"; import { Namespace } from "@pegada/shared/i18n/types/types"; import { getSafeLocale } from "@/lib/get-safe-locale"; diff --git a/packages/api/src/dtos/dogDto.ts b/packages/api/src/dtos/dog-dto.ts similarity index 97% rename from packages/api/src/dtos/dogDto.ts rename to packages/api/src/dtos/dog-dto.ts index c6f4095..5e89198 100644 --- a/packages/api/src/dtos/dogDto.ts +++ b/packages/api/src/dtos/dog-dto.ts @@ -1,7 +1,7 @@ import { Prisma } from "@prisma/client"; import { z } from "zod"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; import { config } from "../shared/config"; diff --git a/packages/api/src/mails/verifyCodeTemplate.ts b/packages/api/src/mails/verify-code-template.ts similarity index 100% rename from packages/api/src/mails/verifyCodeTemplate.ts rename to packages/api/src/mails/verify-code-template.ts diff --git a/packages/api/src/queue/enqueue.ts b/packages/api/src/queue/enqueue.ts index bacd38a..6d6b712 100644 --- a/packages/api/src/queue/enqueue.ts +++ b/packages/api/src/queue/enqueue.ts @@ -11,7 +11,7 @@ const INLINE_HANDLERS: { [T in Topic]: () => Promise<(payload: TopicPayloads[T]) => Promise>; } = { [TOPICS.MAIL]: () => import("./handlers/mail").then((m) => m.handleMail), - [TOPICS.PROCESS_IMAGE]: () => import("./handlers/processImage").then((m) => m.handleProcessImage), + [TOPICS.PROCESS_IMAGE]: () => import("./handlers/process-image").then((m) => m.handleProcessImage), [TOPICS.SEND_PUSH]: () => import("./handlers/push").then((m) => m.handleSendPushNotification), [TOPICS.CHECK_PUSH_RECEIPTS]: () => import("./handlers/push").then((m) => m.handleCheckPushReceipts), diff --git a/packages/api/src/queue/handlers/mail.ts b/packages/api/src/queue/handlers/mail.ts index 3225f0a..7919441 100644 --- a/packages/api/src/queue/handlers/mail.ts +++ b/packages/api/src/queue/handlers/mail.ts @@ -1,6 +1,6 @@ -import { VERIFY_CODE_TEMPLATE } from "../../mails/verifyCodeTemplate"; -import { MailService } from "../../services/MailService"; -import { TranslationService } from "../../services/TranslationService"; +import { VERIFY_CODE_TEMPLATE } from "../../mails/verify-code-template"; +import { MailService } from "../../services/mail-service"; +import { TranslationService } from "../../services/translation-service"; import { IMailJobData } from "../topics"; export const handleMail = async ({ code, language, email }: IMailJobData) => { diff --git a/packages/api/src/queue/handlers/processImage.test.ts b/packages/api/src/queue/handlers/process-image.test.ts similarity index 85% rename from packages/api/src/queue/handlers/processImage.test.ts rename to packages/api/src/queue/handlers/process-image.test.ts index 02951ee..384ed23 100644 --- a/packages/api/src/queue/handlers/processImage.test.ts +++ b/packages/api/src/queue/handlers/process-image.test.ts @@ -1,19 +1,19 @@ -jest.mock("../../services/ImageProcessingService", () => ({ +jest.mock("../../services/image-processing-service", () => ({ ImageProcessingService: { checkForProfanity: jest.fn().mockResolvedValue("APPROVED"), createBlurhash: jest.fn().mockResolvedValue("blur"), }, })); -jest.mock("../../services/ImageService", () => ({ +jest.mock("../../services/image-service", () => ({ ImageService: { updateImage: jest.fn().mockResolvedValue({}) }, })); jest.mock("../../errors/errors", () => ({ sendError: jest.fn() })); -import { ImageService } from "../../services/ImageService"; +import { ImageService } from "../../services/image-service"; import { config } from "../../shared/config"; -import { handleProcessImage } from "./processImage"; +import { handleProcessImage } from "./process-image"; const BUCKET_URL = `https://${config.AWS_S3_BUCKET_NAME}.s3.${config.AWS_REGION}.amazonaws.com`; diff --git a/packages/api/src/queue/handlers/processImage.ts b/packages/api/src/queue/handlers/process-image.ts similarity index 80% rename from packages/api/src/queue/handlers/processImage.ts rename to packages/api/src/queue/handlers/process-image.ts index 6846c46..2e74b43 100644 --- a/packages/api/src/queue/handlers/processImage.ts +++ b/packages/api/src/queue/handlers/process-image.ts @@ -1,9 +1,9 @@ -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; import { sendError } from "../../errors/errors"; -import { ImageProcessingService } from "../../services/ImageProcessingService"; -import { ImageService } from "../../services/ImageService"; -import { assertAllowedImageUrl } from "../../shared/imageUrl"; +import { ImageProcessingService } from "../../services/image-processing-service"; +import { ImageService } from "../../services/image-service"; +import { assertAllowedImageUrl } from "../../shared/image-url"; import { IProcessImageJobData } from "../topics"; export const handleProcessImage = async (image: IProcessImageJobData) => { diff --git a/packages/api/src/queue/handlers/push.ts b/packages/api/src/queue/handlers/push.ts index 1ca729b..b2b4a1e 100644 --- a/packages/api/src/queue/handlers/push.ts +++ b/packages/api/src/queue/handlers/push.ts @@ -1,7 +1,7 @@ import { Expo, ExpoPushMessage } from "expo-server-sdk"; import { sendError } from "../../errors/errors"; -import { UserService } from "../../services/UserService"; +import { UserService } from "../../services/user-service"; import { config } from "../../shared/config"; import { enqueue } from "../enqueue"; import { ICheckPushNotificationReceiptsJobData, ISendNotificationJobData, TOPICS } from "../topics"; diff --git a/packages/api/src/root.ts b/packages/api/src/root.ts index deff9e9..80916fd 100644 --- a/packages/api/src/root.ts +++ b/packages/api/src/root.ts @@ -5,7 +5,7 @@ import { echoRouter } from "./routes/echo"; import { imageRouter } from "./routes/image"; import { matchRouter } from "./routes/match"; import { messageRouter } from "./routes/message"; -import { myDogRouter } from "./routes/myDog"; +import { myDogRouter } from "./routes/my-dog"; import { paymentRouter } from "./routes/payment"; import { swipeRouter } from "./routes/swipe"; import { userRouter } from "./routes/user"; diff --git a/packages/api/src/routes/authentication.ts b/packages/api/src/routes/authentication.ts index 96935de..aad7a64 100644 --- a/packages/api/src/routes/authentication.ts +++ b/packages/api/src/routes/authentication.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -import { AuthenticationService } from "../services/AuthenticationService"; +import { AuthenticationService } from "../services/authentication-service"; import { createTRPCRouter, publicProcedure } from "../trpc"; const authenticationBodySchema = z.object({ diff --git a/packages/api/src/routes/dog.ts b/packages/api/src/routes/dog.ts index d76a11d..bae21b0 100644 --- a/packages/api/src/routes/dog.ts +++ b/packages/api/src/routes/dog.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -import { DogService } from "../services/DogService"; -import { dogInputSchema } from "../shared/dogInputSchema"; +import { DogService } from "../services/dog-service"; +import { dogInputSchema } from "../shared/dog-input-schema"; import { createTRPCRouter, protectedProcedure } from "../trpc"; const getDogSchema = z.object({ diff --git a/packages/api/src/routes/echo.ts b/packages/api/src/routes/echo.ts index 2cf56aa..ae24cf2 100644 --- a/packages/api/src/routes/echo.ts +++ b/packages/api/src/routes/echo.ts @@ -1,6 +1,6 @@ import { RequestHeaders } from "@pegada/shared/types/types"; -import { EchoService } from "../services/EchoService"; +import { EchoService } from "../services/echo-service"; import { semverSchema } from "../shared/config"; import { createTRPCRouter, publicProcedure } from "../trpc"; diff --git a/packages/api/src/routes/image.ts b/packages/api/src/routes/image.ts index 68de561..4e417e9 100644 --- a/packages/api/src/routes/image.ts +++ b/packages/api/src/routes/image.ts @@ -1,4 +1,4 @@ -import { ImageService } from "../services/ImageService"; +import { ImageService } from "../services/image-service"; import { createTRPCRouter, protectedProcedure } from "../trpc"; export const imageRouter = createTRPCRouter({ diff --git a/packages/api/src/routes/match.ts b/packages/api/src/routes/match.ts index 15744aa..3df9b49 100644 --- a/packages/api/src/routes/match.ts +++ b/packages/api/src/routes/match.ts @@ -1,5 +1,5 @@ -import { DogService } from "../services/DogService"; -import MatchService from "../services/MatchService"; +import { DogService } from "../services/dog-service"; +import MatchService from "../services/match-service"; import { createTRPCRouter, protectedProcedure } from "../trpc"; export const matchRouter = createTRPCRouter({ diff --git a/packages/api/src/routes/message.ts b/packages/api/src/routes/message.ts index 8559de3..2f513a1 100644 --- a/packages/api/src/routes/message.ts +++ b/packages/api/src/routes/message.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -import { DogService } from "../services/DogService"; -import MessageService from "../services/MessageService"; +import { DogService } from "../services/dog-service"; +import MessageService from "../services/message-service"; import { createTRPCRouter, protectedProcedure } from "../trpc"; const allByMatchSchema = z.object({ diff --git a/packages/api/src/routes/myDog.ts b/packages/api/src/routes/my-dog.ts similarity index 85% rename from packages/api/src/routes/myDog.ts rename to packages/api/src/routes/my-dog.ts index 02b7b49..ca37166 100644 --- a/packages/api/src/routes/myDog.ts +++ b/packages/api/src/routes/my-dog.ts @@ -1,5 +1,5 @@ -import { DogService } from "../services/DogService"; -import { dogInputSchema } from "../shared/dogInputSchema"; +import { DogService } from "../services/dog-service"; +import { dogInputSchema } from "../shared/dog-input-schema"; import { createTRPCRouter, protectedProcedure } from "../trpc"; export const myDogRouter = createTRPCRouter({ diff --git a/packages/api/src/routes/payment.ts b/packages/api/src/routes/payment.ts index 0b8e431..7032aac 100644 --- a/packages/api/src/routes/payment.ts +++ b/packages/api/src/routes/payment.ts @@ -1,7 +1,7 @@ import { PlanType } from "@prisma/client"; import { TRPCError } from "@trpc/server"; -import PaymentService from "../services/PaymentService"; +import PaymentService from "../services/payment-service"; import { config } from "../shared/config"; import { createTRPCRouter, protectedProcedure } from "../trpc"; diff --git a/packages/api/src/routes/swipe.ts b/packages/api/src/routes/swipe.ts index a40412c..929931d 100644 --- a/packages/api/src/routes/swipe.ts +++ b/packages/api/src/routes/swipe.ts @@ -1,8 +1,8 @@ import { z } from "zod"; -import { DogService } from "../services/DogService"; -import { SuggestionService } from "../services/SuggestionService/SuggestionService"; -import { SwipeService } from "../services/SwipeService"; +import { DogService } from "../services/dog-service"; +import { SuggestionService } from "../services/SuggestionService/suggestion-service"; +import { SwipeService } from "../services/swipe-service"; import { createTRPCRouter, protectedProcedure } from "../trpc"; const DEFAULT_LIMIT = 10; diff --git a/packages/api/src/routes/user.ts b/packages/api/src/routes/user.ts index fba5aea..8e56948 100644 --- a/packages/api/src/routes/user.ts +++ b/packages/api/src/routes/user.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -import { UserService } from "../services/UserService"; +import { UserService } from "../services/user-service"; import { createTRPCRouter, protectedProcedure } from "../trpc"; export const userSchema = z.object({ diff --git a/packages/api/src/services/SuggestionService/SuggestionService.test.ts b/packages/api/src/services/SuggestionService/suggestion-service.test.ts similarity index 98% rename from packages/api/src/services/SuggestionService/SuggestionService.test.ts rename to packages/api/src/services/SuggestionService/suggestion-service.test.ts index 8a08cd3..fe049ed 100644 --- a/packages/api/src/services/SuggestionService/SuggestionService.test.ts +++ b/packages/api/src/services/SuggestionService/suggestion-service.test.ts @@ -5,11 +5,11 @@ import { z } from "zod"; import prisma from "@pegada/database"; import { breedData } from "@pegada/database/__mocks__/breed-data"; import { generateFakeUserWithDog } from "@pegada/database/__mocks__/generate-fake-user-with-dog"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { dogSafeSchema } from "../../dtos/dogDto"; -import { SwipeService } from "../SwipeService"; -import { SuggestionService } from "./SuggestionService"; +import { dogSafeSchema } from "../../dtos/dog-dto"; +import { SwipeService } from "../swipe-service"; +import { SuggestionService } from "./suggestion-service"; jest.mock("../../shared/posthog", () => ({ posthog: { diff --git a/packages/api/src/services/SuggestionService/SuggestionService.ts b/packages/api/src/services/SuggestionService/suggestion-service.ts similarity index 98% rename from packages/api/src/services/SuggestionService/SuggestionService.ts rename to packages/api/src/services/SuggestionService/suggestion-service.ts index 24845e4..6ab0b30 100644 --- a/packages/api/src/services/SuggestionService/SuggestionService.ts +++ b/packages/api/src/services/SuggestionService/suggestion-service.ts @@ -3,9 +3,9 @@ import { Sql } from "@prisma/client/runtime/library"; import { z } from "zod"; import prisma from "@pegada/database"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { dogSafeSchema } from "../../dtos/dogDto"; +import { dogSafeSchema } from "../../dtos/dog-dto"; type DogSafeSchema = z.infer; export class SuggestionService { diff --git a/packages/api/src/services/AuthenticationService.ts b/packages/api/src/services/authentication-service.ts similarity index 100% rename from packages/api/src/services/AuthenticationService.ts rename to packages/api/src/services/authentication-service.ts diff --git a/packages/api/src/services/DogService.ts b/packages/api/src/services/dog-service.ts similarity index 97% rename from packages/api/src/services/DogService.ts rename to packages/api/src/services/dog-service.ts index 5be9a1c..1e8882a 100644 --- a/packages/api/src/services/DogService.ts +++ b/packages/api/src/services/dog-service.ts @@ -1,12 +1,12 @@ import prisma from "@pegada/database"; -import { DogServerSchema, IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { DogServerSchema, IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { dogSelect, selfDogSelect, serverOnlyFullDogSelect } from "../dtos/dogDto"; +import { dogSelect, selfDogSelect, serverOnlyFullDogSelect } from "../dtos/dog-dto"; import { enqueue } from "../queue/enqueue"; import { TOPICS } from "../queue/topics"; -import { deleteImageFromS3 } from "../shared/fileUpload"; -import { ImageService } from "./ImageService"; -import { SwipeService } from "./SwipeService"; +import { deleteImageFromS3 } from "../shared/file-upload"; +import { ImageService } from "./image-service"; +import { SwipeService } from "./swipe-service"; type DogImagesWithId = (DogServerSchema["images"][number] & { id: string })[]; diff --git a/packages/api/src/services/EchoService.ts b/packages/api/src/services/echo-service.ts similarity index 92% rename from packages/api/src/services/EchoService.ts rename to packages/api/src/services/echo-service.ts index 3760882..9a80063 100644 --- a/packages/api/src/services/EchoService.ts +++ b/packages/api/src/services/echo-service.ts @@ -1,7 +1,7 @@ import semver from "semver"; import { config } from "../shared/config"; -import { UserService } from "./UserService"; +import { UserService } from "./user-service"; export class EchoService { /** diff --git a/packages/api/src/services/FlagService.ts b/packages/api/src/services/flag-service.ts similarity index 91% rename from packages/api/src/services/FlagService.ts rename to packages/api/src/services/flag-service.ts index c7490e8..e1d78f5 100644 --- a/packages/api/src/services/FlagService.ts +++ b/packages/api/src/services/flag-service.ts @@ -1,5 +1,5 @@ import { sendError } from "../errors/errors"; -import { cacheFunctionResultFor } from "../shared/cacheFunctionResultFor"; +import { cacheFunctionResultFor } from "../shared/cache-function-result-for"; import { posthog } from "../shared/posthog"; const FIVE_SECONDS = 5000; diff --git a/packages/api/src/services/ImageProcessingService.ts b/packages/api/src/services/image-processing-service.ts similarity index 94% rename from packages/api/src/services/ImageProcessingService.ts rename to packages/api/src/services/image-processing-service.ts index 5f58ccb..cd9f860 100644 --- a/packages/api/src/services/ImageProcessingService.ts +++ b/packages/api/src/services/image-processing-service.ts @@ -1,9 +1,9 @@ import * as Blurhash from "blurhash"; import sharp from "sharp"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { FEATURES, FlagService } from "./FlagService"; +import { FEATURES, FlagService } from "./flag-service"; export class ImageProcessingService { static checkForProfanity = async ({ diff --git a/packages/api/src/services/ImageService.ts b/packages/api/src/services/image-service.ts similarity index 96% rename from packages/api/src/services/ImageService.ts rename to packages/api/src/services/image-service.ts index 9130e1f..46eb1b5 100644 --- a/packages/api/src/services/ImageService.ts +++ b/packages/api/src/services/image-service.ts @@ -3,11 +3,11 @@ import * as RequestPresigner from "@aws-sdk/s3-request-presigner"; import { Image } from "@prisma/client"; import prisma from "@pegada/database"; -import { DogServerSchema } from "@pegada/shared/schemas/dogSchema"; +import { DogServerSchema } from "@pegada/shared/schemas/dog-schema"; import { config } from "../shared/config"; -import * as FileUpload from "../shared/fileUpload"; -import { TEMPORARY_UPLOAD_PREFIX, getPublicUrl, moveImageToFolder } from "../shared/fileUpload"; +import * as FileUpload from "../shared/file-upload"; +import { TEMPORARY_UPLOAD_PREFIX, getPublicUrl, moveImageToFolder } from "../shared/file-upload"; const PERMANENT_STORAGE_FOLDER = "dogs"; diff --git a/packages/api/src/services/MailService.ts b/packages/api/src/services/mail-service.ts similarity index 97% rename from packages/api/src/services/MailService.ts rename to packages/api/src/services/mail-service.ts index 9d59557..2136865 100644 --- a/packages/api/src/services/MailService.ts +++ b/packages/api/src/services/mail-service.ts @@ -5,7 +5,7 @@ import { ParseKeys } from "i18next"; import { Language, Namespace } from "@pegada/shared/i18n/types/types"; import { config } from "../shared/config"; -import { TranslationService } from "./TranslationService"; +import { TranslationService } from "./translation-service"; const cloudflare = new Cloudflare({ apiToken: config.CLOUDFLARE_EMAIL_API_TOKEN }); diff --git a/packages/api/src/services/MatchService.ts b/packages/api/src/services/match-service.ts similarity index 92% rename from packages/api/src/services/MatchService.ts rename to packages/api/src/services/match-service.ts index 5df3e43..ac94028 100644 --- a/packages/api/src/services/MatchService.ts +++ b/packages/api/src/services/match-service.ts @@ -1,12 +1,12 @@ import prisma from "@pegada/database"; import { Language } from "@pegada/shared/i18n/types/types"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { dogSelect } from "../dtos/dogDto"; +import { dogSelect } from "../dtos/dog-dto"; import { sendError } from "../errors/errors"; -import { PushNotificationService } from "./PushNotificationService"; -import { SwipeService } from "./SwipeService"; -import { TranslationService } from "./TranslationService"; +import { PushNotificationService } from "./push-notification-service"; +import { SwipeService } from "./swipe-service"; +import { TranslationService } from "./translation-service"; class MatchService { language?: Language; diff --git a/packages/api/src/services/MessageService.test.ts b/packages/api/src/services/message-service.test.ts similarity index 98% rename from packages/api/src/services/MessageService.test.ts rename to packages/api/src/services/message-service.test.ts index 1469dbd..db6ab07 100644 --- a/packages/api/src/services/MessageService.test.ts +++ b/packages/api/src/services/message-service.test.ts @@ -2,7 +2,7 @@ import prisma from "@pegada/database"; import { breedData } from "@pegada/database/__mocks__/breed-data"; import { generateFakeUserWithDog } from "@pegada/database/__mocks__/generate-fake-user-with-dog"; -import MessageService from "./MessageService"; +import MessageService from "./message-service"; jest.mock("../shared/posthog", () => ({ posthog: { diff --git a/packages/api/src/services/MessageService.ts b/packages/api/src/services/message-service.ts similarity index 95% rename from packages/api/src/services/MessageService.ts rename to packages/api/src/services/message-service.ts index 979319e..0f9fa90 100644 --- a/packages/api/src/services/MessageService.ts +++ b/packages/api/src/services/message-service.ts @@ -4,10 +4,10 @@ import { NOTIFICATION_CHANNEL, } from "@pegada/shared/constants/notifications"; import { Language } from "@pegada/shared/i18n/types/types"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dogSchema"; +import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; -import { PushNotificationService } from "./PushNotificationService"; -import { TranslationService } from "./TranslationService"; +import { PushNotificationService } from "./push-notification-service"; +import { TranslationService } from "./translation-service"; class MessageService { // Default pagination settings diff --git a/packages/api/src/services/PaymentService.ts b/packages/api/src/services/payment-service.ts similarity index 98% rename from packages/api/src/services/PaymentService.ts rename to packages/api/src/services/payment-service.ts index df84cbb..901f90f 100644 --- a/packages/api/src/services/PaymentService.ts +++ b/packages/api/src/services/payment-service.ts @@ -3,7 +3,7 @@ import { PlanType } from "@prisma/client"; import prisma from "@pegada/database"; import { Event } from "../types/revenuecat"; -import { UserService } from "./UserService"; +import { UserService } from "./user-service"; enum RevenueCatEntitlement { PREMIUM = "premium", diff --git a/packages/api/src/services/PushNotificationService.ts b/packages/api/src/services/push-notification-service.ts similarity index 95% rename from packages/api/src/services/PushNotificationService.ts rename to packages/api/src/services/push-notification-service.ts index 05f36da..9f76d80 100644 --- a/packages/api/src/services/PushNotificationService.ts +++ b/packages/api/src/services/push-notification-service.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { sendError } from "../errors/errors"; import { enqueue } from "../queue/enqueue"; import { ISendNotificationJobData, TOPICS } from "../queue/topics"; -import { UserService } from "./UserService"; +import { UserService } from "./user-service"; export class PushNotificationService { static async enqueuePushNotification(notification: ISendNotificationJobData) { diff --git a/packages/api/src/services/SwipeService.ts b/packages/api/src/services/swipe-service.ts similarity index 95% rename from packages/api/src/services/SwipeService.ts rename to packages/api/src/services/swipe-service.ts index 6685f9f..c244e22 100644 --- a/packages/api/src/services/SwipeService.ts +++ b/packages/api/src/services/swipe-service.ts @@ -8,13 +8,13 @@ import { FREE_DAILY_SWIPE_LIMIT } from "@pegada/shared/constants/constants"; import { LikeLimitReached } from "@pegada/shared/errors/errors"; import { Language } from "@pegada/shared/i18n/types/types"; -import { dogSafeSchema } from "../dtos/dogDto"; +import { dogSafeSchema } from "../dtos/dog-dto"; import { sendError } from "../errors/errors"; -import { DogService } from "./DogService"; -import MatchService from "./MatchService"; -import { PushNotificationService } from "./PushNotificationService"; -import { TranslationService } from "./TranslationService"; -import { UserService } from "./UserService"; +import { DogService } from "./dog-service"; +import MatchService from "./match-service"; +import { PushNotificationService } from "./push-notification-service"; +import { TranslationService } from "./translation-service"; +import { UserService } from "./user-service"; type DogSafeSchema = z.infer; diff --git a/packages/api/src/services/TranslationService.ts b/packages/api/src/services/translation-service.ts similarity index 100% rename from packages/api/src/services/TranslationService.ts rename to packages/api/src/services/translation-service.ts diff --git a/packages/api/src/services/UserService.ts b/packages/api/src/services/user-service.ts similarity index 100% rename from packages/api/src/services/UserService.ts rename to packages/api/src/services/user-service.ts diff --git a/packages/api/src/shared/cacheFunctionResultFor.ts b/packages/api/src/shared/cache-function-result-for.ts similarity index 100% rename from packages/api/src/shared/cacheFunctionResultFor.ts rename to packages/api/src/shared/cache-function-result-for.ts diff --git a/packages/api/src/shared/dogInputSchema.test.ts b/packages/api/src/shared/dog-input-schema.test.ts similarity index 98% rename from packages/api/src/shared/dogInputSchema.test.ts rename to packages/api/src/shared/dog-input-schema.test.ts index 758e31a..c10ac26 100644 --- a/packages/api/src/shared/dogInputSchema.test.ts +++ b/packages/api/src/shared/dog-input-schema.test.ts @@ -1,5 +1,5 @@ import { config } from "./config"; -import { dogInputSchema } from "./dogInputSchema"; +import { dogInputSchema } from "./dog-input-schema"; /** * .env.test leaves R2 and AWS_S3_ENDPOINT unset, so the only allowed origin diff --git a/packages/api/src/shared/dogInputSchema.ts b/packages/api/src/shared/dog-input-schema.ts similarity index 86% rename from packages/api/src/shared/dogInputSchema.ts rename to packages/api/src/shared/dog-input-schema.ts index 60d0074..f582d5e 100644 --- a/packages/api/src/shared/dogInputSchema.ts +++ b/packages/api/src/shared/dog-input-schema.ts @@ -1,8 +1,8 @@ import { z } from "zod"; -import { dogServerSchema } from "@pegada/shared/schemas/dogSchema"; +import { dogServerSchema } from "@pegada/shared/schemas/dog-schema"; -import { allowedImageOrigins, isAllowedImageUrl } from "./imageUrl"; +import { allowedImageOrigins, isAllowedImageUrl } from "./image-url"; /** * `dogServerSchema` with every image URL pinned to a configured storage diff --git a/packages/api/src/shared/fileUpload.test.ts b/packages/api/src/shared/file-upload.test.ts similarity index 98% rename from packages/api/src/shared/fileUpload.test.ts rename to packages/api/src/shared/file-upload.test.ts index ee7ba0e..1ef17df 100644 --- a/packages/api/src/shared/fileUpload.test.ts +++ b/packages/api/src/shared/file-upload.test.ts @@ -12,7 +12,7 @@ jest.mock("@aws-sdk/client-s3", () => { import { CopyObjectCommand, DeleteObjectCommand } from "@aws-sdk/client-s3"; import { config } from "./config"; -import { deleteImageFromS3, moveImageToFolder } from "./fileUpload"; +import { deleteImageFromS3, moveImageToFolder } from "./file-upload"; const { send } = jest.requireMock("@aws-sdk/client-s3") as { send: jest.Mock }; diff --git a/packages/api/src/shared/fileUpload.ts b/packages/api/src/shared/file-upload.ts similarity index 99% rename from packages/api/src/shared/fileUpload.ts rename to packages/api/src/shared/file-upload.ts index 99f1b95..213ceb3 100644 --- a/packages/api/src/shared/fileUpload.ts +++ b/packages/api/src/shared/file-upload.ts @@ -1,7 +1,7 @@ import { CopyObjectCommand, DeleteObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { config } from "../shared/config"; -import { assertAllowedImageUrl } from "./imageUrl"; +import { assertAllowedImageUrl } from "./image-url"; /** * Legacy S3 client (shipped app binaries upload here via `image.signedUrl`). diff --git a/packages/api/src/shared/imageUrl.test.ts b/packages/api/src/shared/image-url.test.ts similarity index 99% rename from packages/api/src/shared/imageUrl.test.ts rename to packages/api/src/shared/image-url.test.ts index eb81521..72ba412 100644 --- a/packages/api/src/shared/imageUrl.test.ts +++ b/packages/api/src/shared/image-url.test.ts @@ -1,4 +1,4 @@ -import { buildAllowedImageOrigins, isAllowedImageUrl } from "./imageUrl"; +import { buildAllowedImageOrigins, isAllowedImageUrl } from "./image-url"; const R2_CONFIG = { publicImagesBaseUrl: "https://images.pegada.app", diff --git a/packages/api/src/shared/imageUrl.ts b/packages/api/src/shared/image-url.ts similarity index 100% rename from packages/api/src/shared/imageUrl.ts rename to packages/api/src/shared/image-url.ts diff --git a/packages/api/src/types/routerTypes.ts b/packages/api/src/types/router-types.ts similarity index 100% rename from packages/api/src/types/routerTypes.ts rename to packages/api/src/types/router-types.ts diff --git a/packages/shared/schemas/dogSchema.ts b/packages/shared/schemas/dog-schema.ts similarity index 100% rename from packages/shared/schemas/dogSchema.ts rename to packages/shared/schemas/dog-schema.ts diff --git a/packages/shared/themes/minimumStrokeSize.ts b/packages/shared/themes/minimum-stroke-size.ts similarity index 100% rename from packages/shared/themes/minimumStrokeSize.ts rename to packages/shared/themes/minimum-stroke-size.ts diff --git a/packages/shared/themes/themes.ts b/packages/shared/themes/themes.ts index d4c991f..8c2e8ab 100644 --- a/packages/shared/themes/themes.ts +++ b/packages/shared/themes/themes.ts @@ -1,4 +1,4 @@ -import { minimumStrokeSize } from "./minimumStrokeSize"; +import { minimumStrokeSize } from "./minimum-stroke-size"; export enum Font { GilroyLight = "Gilroy-Light", diff --git a/packages/shared/utils/getFormattedYears.ts b/packages/shared/utils/get-formatted-years.ts similarity index 100% rename from packages/shared/utils/getFormattedYears.ts rename to packages/shared/utils/get-formatted-years.ts From f09045cd6c7fec67621fc41b9fb42c2201f0dd58 Mon Sep 17 00:00:00 2001 From: Gabriel Taveira Date: Mon, 27 Jul 2026 03:33:48 -0300 Subject: [PATCH 04/12] fix(lint): clear every diagnostic the shared preset reports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 739 errors on first contact, down to zero. The bulk of it: - 63 inline styles moved into the co-located `styles.ts` as styled components, plus three shared layout primitives in `@/components/layout` that six form screens were each spelling out as `style={{ flex: 1 }}`. Style props that cannot be a component (`contentContainerStyle`, the navigation header slots) become `StyleSheet.create` entries next to them. - 23 `async` functions with nothing to await lost the keyword. Two of those changed real behaviour and were fixed properly rather than reverted: `customNotificationHandler` is synchronous, so the `.catch(sendError)` on its call sites never saw the "Invalid notification url" it throws — those are try/catch now. - `packages/api`'s services/match/swipe import cycle is broken by moving `transformDistanceBetweenUserAndDog` to `shared/dog-distance.ts`, where its three callers can reach it without going through SwipeService. - `packages/database/__mocks__` is now `fixtures/`: nothing in it is a jest mock, it is seed data three suites import directly, which is what `jest/no-mocks-import` was reporting. - `env.ts` in packages/database and the queue-driver vars in the API config module, so `process.env` is read in one place per package. - A real bug in `packages/database/seed.ts`: 100 fake users were created inside a `forEach` passed to `Promise.all`, so the seed could return before they were written. - `LikeLimitReached` renamed to `LikeLimitReachedError`, and every error class now sets `name` — `instanceof` does not survive tRPC serialization. Four oxlint autofixes had to be undone or repaired; they are listed in the PR body. The rest of the disable comments carry a reason each. Local overrides added, all repo-specific: the gesture-handler scrollable ban, expo-* and `./styles` namespace imports, the two env boundary modules, the API's static-method service classes, the single-module error taxonomy, sequential seeding, `unicorn/no-array-reverse` (Hermes has no `toReversed`), `react/react-compiler` (bails out on reanimated and react-hook-form) and `no-warning-comments`. Claude-Session: https://claude.ai/code/session_01Fe92vvdc4R3F4BDBFoLcw1 --- apps/mobile/app.config.ts | 27 +- apps/mobile/metro.config.js | 7 +- apps/mobile/modules/pegada-widget/index.ts | 24 +- apps/mobile/oxlint.config.mts | 41 +++ apps/mobile/package.json | 7 +- .../plugins/with-default-locale-strings.js | 5 +- .../plugins/with-initial-theme-override.js | 9 +- .../plugins/with-store-kit-configuration.js | 6 +- apps/mobile/src/app/(app)/(tabs)/_layout.tsx | 33 ++- apps/mobile/src/app/(app)/_layout.tsx | 8 +- apps/mobile/src/app/(auth)/_layout.tsx | 5 +- apps/mobile/src/app/+html.tsx | 5 +- apps/mobile/src/app/_layout.tsx | 15 +- .../assets/animations/inverseLoadingDots.json | 15 +- apps/mobile/src/assets/animations/swipe.json | 20 +- apps/mobile/src/assets/images/logo.tsx | 4 +- apps/mobile/src/assets/images/messages.tsx | 22 +- apps/mobile/src/assets/images/profile.tsx | 4 +- .../src/components/BottomAction/index.tsx | 4 +- .../src/components/BreedPicker/index.tsx | 31 ++- apps/mobile/src/components/Button/index.tsx | 8 +- apps/mobile/src/components/Button/styles.ts | 3 +- .../src/components/DefaultModal/index.tsx | 8 +- .../src/components/FeedbackCard/index.tsx | 39 ++- .../src/components/FeedbackCard/styles.ts | 3 +- apps/mobile/src/components/Input/index.tsx | 28 +- apps/mobile/src/components/Input/styles.ts | 1 + .../src/components/LikeLimitReached/index.tsx | 31 ++- .../src/components/LikeLimitReached/styles.ts | 8 + .../LikeLimitReached/use-countdown.tsx | 11 +- .../MainCard/components/Distance/index.tsx | 15 +- .../MainCard/components/Pagination/index.tsx | 8 +- .../components/PersonalInfo/index.tsx | 27 +- apps/mobile/src/components/MainCard/index.tsx | 44 ++-- apps/mobile/src/components/MainCard/styles.ts | 11 + .../MatchActionBar/glass-pill-background.tsx | 2 + .../src/components/MatchActionBar/index.tsx | 16 +- .../src/components/MatchActionBar/styles.ts | 7 +- .../src/components/NetworkBoundary/index.tsx | 41 ++- apps/mobile/src/components/Picker/index.tsx | 33 ++- apps/mobile/src/components/Picker/styles.ts | 10 +- .../components/AddUserPhoto/index.tsx | 72 +++-- .../components/ProfileImageUploader/index.tsx | 34 ++- .../ProfileImageUploader/utils/index.ts | 96 ++++--- .../src/components/RadioButtons/index.tsx | 18 +- .../src/components/RadioButtons/styles.ts | 6 +- apps/mobile/src/components/Slider/index.tsx | 79 ++++-- apps/mobile/src/components/blur-view.tsx | 62 +++-- .../mobile/src/components/custom-backdrop.tsx | 25 +- .../src/components/image-background.tsx | 7 +- .../mobile/src/components/image-props.test.ts | 17 +- apps/mobile/src/components/image-props.ts | 12 +- apps/mobile/src/components/image.test.tsx | 8 +- apps/mobile/src/components/image.tsx | 18 +- apps/mobile/src/components/layout.ts | 25 ++ apps/mobile/src/components/pressable-area.tsx | 4 +- apps/mobile/src/components/text.ts | 4 +- apps/mobile/src/config.ts | 20 +- apps/mobile/src/contexts/theme-provider.tsx | 47 ++-- apps/mobile/src/contexts/trcp-context.tsx | 2 +- apps/mobile/src/contexts/trpc-provider.tsx | 21 +- .../src/hooks/use-current-city-text.tsx | 4 +- .../src/hooks/use-delayed-header-height.tsx | 1 + .../use-keyboard-aware-safe-area-insets.tsx | 11 +- apps/mobile/src/hooks/use-payments.tsx | 6 +- apps/mobile/src/hooks/use-protected-route.ts | 1 + apps/mobile/src/hooks/use-track-screens.ts | 1 + apps/mobile/src/i18n.ts | 10 +- .../services/advertisement/interstitial.ts | 21 +- apps/mobile/src/services/analytics/index.ts | 8 +- apps/mobile/src/services/app-review.tsx | 18 +- apps/mobile/src/services/config.ts | 12 +- apps/mobile/src/services/error-tracking.ts | 4 +- apps/mobile/src/services/get-error.ts | 18 +- .../src/services/get-initial-route-name.ts | 17 +- .../mobile/src/services/get-logged-user-id.ts | 1 - apps/mobile/src/services/get-mime-type.ts | 5 +- .../services/get-push-notification-token.ts | 56 ++-- apps/mobile/src/services/haptics.ts | 1 + .../linking/handlers/initial-notification.ts | 14 +- .../services/linking/handlers/notification.ts | 11 +- .../services/linking/handlers/reply.test.ts | 83 ++++-- .../src/services/linking/handlers/reply.ts | 14 +- apps/mobile/src/services/linking/index.ts | 51 ++-- apps/mobile/src/services/logout.ts | 1 + apps/mobile/src/services/mask-date.tsx | 4 +- .../src/services/matchesWidget/avatars.ts | 21 +- .../src/services/matchesWidget/index.ts | 14 +- .../matchesWidget/use-matches-widget-sync.ts | 16 +- apps/mobile/src/services/open-web-browser.ts | 2 +- apps/mobile/src/services/payments/index.ts | 45 +++- apps/mobile/src/services/query-client.tsx | 13 +- .../services/quickActions/handlers/action.ts | 9 +- .../services/quickActions/handlers/icons.ts | 10 +- .../mobile/src/services/quickActions/index.ts | 4 + apps/mobile/src/services/storage.ts | 5 +- apps/mobile/src/services/theme-utils.ts | 4 +- .../src/services/use-get-formatted-years.ts | 6 +- apps/mobile/src/services/utils.ts | 9 +- apps/mobile/src/store/reducers/dogs/index.ts | 36 ++- apps/mobile/src/store/reducers/dogs/list.ts | 25 +- apps/mobile/src/store/reducers/dogs/logout.ts | 4 +- apps/mobile/src/store/reducers/dogs/swipe.ts | 25 +- apps/mobile/src/store/reducers/index.ts | 16 +- apps/mobile/src/store/sagas/dogs/index.ts | 6 +- apps/mobile/src/store/sagas/dogs/list.ts | 16 +- apps/mobile/src/store/sagas/dogs/swipe.ts | 48 ++-- apps/mobile/src/store/selectors.ts | 18 +- apps/mobile/src/types/styled-components.d.ts | 5 +- .../src/views/(auth)/AskForLocation/index.tsx | 63 +++-- .../src/views/(auth)/AskForLocation/styles.ts | 37 +++ .../views/(auth)/CompleteProfile/index.tsx | 96 ++++--- .../views/(auth)/CompleteProfile/styles.ts | 17 +- .../src/views/(auth)/CreateProfile/index.tsx | 63 +++-- .../src/views/(auth)/CreateProfile/styles.ts | 17 +- .../OneTimeCode/components/GoBack/index.tsx | 2 + .../OneTimeCode/components/OtpDigit/index.tsx | 129 +++++---- .../OneTimeCode/components/OtpDigit/styles.ts | 1 + .../OneTimeCode/components/OtpInput/index.tsx | 136 +++++----- .../(auth)/OneTimeCode/hooks/use-timer.ts | 8 +- .../src/views/(auth)/OneTimeCode/index.tsx | 26 +- .../src/views/(auth)/OneTimeCode/styles.ts | 1 + .../SignIn/components/HeroText/index.test.jsx | 35 --- .../SignIn/components/HeroText/index.test.tsx | 43 +++ .../SignIn/components/HeroText/index.tsx | 1 + apps/mobile/src/views/(auth)/SignIn/index.tsx | 33 ++- apps/mobile/src/views/(auth)/SignIn/styles.ts | 8 +- .../Messages/components/Header/index.tsx | 10 +- .../Messages/components/Header/styles.ts | 5 + .../Messages/components/Message/index.tsx | 15 +- .../Messages/components/Message/styles.ts | 10 + .../Messages/components/Preview/index.tsx | 5 +- .../Messages/components/SearchBar/index.tsx | 5 +- .../Messages/components/empty-messages.tsx | 47 ++-- .../src/views/(tabs)/Messages/index.tsx | 43 ++- .../src/views/(tabs)/Messages/styles.ts | 22 ++ .../Profile/components/Config/index.tsx | 11 +- .../Profile/components/Config/styles.ts | 7 + .../components/UserDogProfileHeader/index.tsx | 57 ++-- .../components/UserDogProfileHeader/styles.ts | 37 ++- .../components/current-plan-config.tsx | 24 +- .../Profile/components/language-config.tsx | 21 +- .../Profile/components/location-config.tsx | 19 +- .../Profile/components/theme-config.tsx | 13 +- .../mobile/src/views/(tabs)/Profile/index.tsx | 92 ++++--- .../mobile/src/views/(tabs)/Profile/styles.ts | 25 +- .../(tabs)/Profile/utils/delete-account.tsx | 57 ++-- .../components/SwipeBackButton/index.tsx | 4 +- .../SwipeHandler/hooks/use-swipe-gesture.ts | 35 ++- .../Swipe/components/SwipeHandler/index.tsx | 36 ++- .../components/SwipeRequestFeedback/index.tsx | 18 +- .../components/SwipeRequestFeedback/styles.ts | 2 + .../Swipe/components/change-location.tsx | 16 +- apps/mobile/src/views/(tabs)/Swipe/index.tsx | 2 + apps/mobile/src/views/(tabs)/Swipe/styles.ts | 11 + .../views/Chat/components/Header/index.tsx | 10 +- .../views/Chat/components/Header/styles.tsx | 3 +- .../views/Chat/components/Message/index.tsx | 11 +- .../views/Chat/components/Message/styles.ts | 9 +- .../views/Chat/components/NextDay/index.tsx | 25 +- .../views/Chat/components/NextDay/styles.ts | 11 +- .../src/views/Chat/components/Send/index.tsx | 2 + .../src/views/Chat/components/Send/styles.ts | 3 +- .../views/Chat/hooks/use-chat-pagination.ts | 33 ++- .../Chat/hooks/use-fetch-new-messages.ts | 14 +- .../src/views/Chat/hooks/use-send-message.ts | 16 +- apps/mobile/src/views/Chat/index.tsx | 42 ++- apps/mobile/src/views/Chat/styles.ts | 3 +- .../DogProfile/components/GoBack/index.tsx | 2 + .../views/DogProfile/components/breed-tag.tsx | 14 +- apps/mobile/src/views/DogProfile/index.tsx | 110 +++++--- apps/mobile/src/views/DogProfile/styles.ts | 25 +- apps/mobile/src/views/EditProfile/index.tsx | 127 +++++---- apps/mobile/src/views/EditProfile/styles.ts | 18 +- apps/mobile/src/views/ForceUpdate/index.tsx | 2 + .../LocationMap/components/Bubble/index.tsx | 18 +- .../LocationMap/components/Bubble/styles.ts | 5 +- .../LocationMap/components/Marker/index.tsx | 11 +- .../LocationMap/components/Submit/index.tsx | 19 +- apps/mobile/src/views/LocationMap/index.tsx | 21 +- .../src/views/NewMatch/animated-cards.tsx | 85 +++--- .../src/views/NewMatch/confetti-animation.tsx | 5 +- apps/mobile/src/views/NewMatch/index.tsx | 59 +++-- apps/mobile/src/views/NewMatch/styles.ts | 54 +++- apps/mobile/src/views/Preferences/index.tsx | 50 +++- .../UpgradeWall/components/Benefits/index.tsx | 1 + .../UpgradeWall/components/Benefits/styles.ts | 6 +- .../UpgradeWall/components/Checkbox/index.tsx | 1 + .../UpgradeWall/components/Checkbox/styles.ts | 3 +- .../components/PlanPackages/index.tsx | 41 ++- .../components/PlanPackages/plan-card.tsx | 62 +++-- .../components/PlanPackages/styles.ts | 10 +- .../components/RestorePurchases/index.tsx | 2 + apps/mobile/src/views/UpgradeWall/index.tsx | 49 +++- apps/mobile/src/views/UpgradeWall/styles.ts | 10 +- apps/mobile/src/views/splashscreen.tsx | 25 +- apps/mobile/tsconfig.json | 8 +- apps/nextjs/i18n.ts | 3 +- apps/nextjs/package.json | 6 +- .../nextjs/src/app/[locale]/dog/[id]/page.tsx | 26 +- apps/nextjs/src/app/[locale]/page.tsx | 6 +- .../api/queues/check-push-receipts/route.ts | 12 +- apps/nextjs/src/app/api/queues/mail/route.ts | 4 +- .../src/app/api/queues/process-image/route.ts | 4 +- .../src/app/api/queues/send-push/route.ts | 4 +- apps/nextjs/src/app/api/trpc/[trpc]/route.ts | 20 +- .../src/app/api/webhooks/revenuecat/route.ts | 6 +- apps/nextjs/src/app/error.tsx | 10 +- apps/nextjs/src/app/layout.tsx | 8 +- apps/nextjs/src/app/not-found.tsx | 3 +- apps/nextjs/src/app/store/route.ts | 5 +- apps/nextjs/src/components/cta.tsx | 21 +- apps/nextjs/src/components/custom-mdx.tsx | 4 +- apps/nextjs/src/components/hero-image.tsx | 2 +- .../src/components/localized-mdx-screen.tsx | 16 +- apps/nextjs/src/components/logo.tsx | 9 +- apps/nextjs/src/components/store-button.tsx | 7 +- apps/nextjs/src/lib/get-safe-locale.tsx | 4 +- apps/nextjs/src/lib/translate.ts | 4 +- apps/nextjs/src/lib/utils.ts | 1 + apps/nextjs/src/middleware.ts | 7 +- apps/nextjs/tailwind.config.ts | 3 +- oxlint.config.mts | 38 ++- packages/api/jest.config.ts | 3 + packages/api/package.json | 2 +- packages/api/src/dtos/dog-dto.ts | 35 +-- packages/api/src/errors/errors.ts | 8 +- packages/api/src/index.ts | 14 +- packages/api/src/queue/enqueue.ts | 25 +- packages/api/src/queue/handlers/mail.ts | 3 +- .../src/queue/handlers/process-image.test.ts | 11 +- .../api/src/queue/handlers/process-image.ts | 3 +- packages/api/src/queue/handlers/push.ts | 78 +++--- packages/api/src/queue/topics.ts | 18 +- packages/api/src/routes/authentication.ts | 46 ++-- packages/api/src/routes/dog.ts | 16 +- packages/api/src/routes/image.ts | 2 +- packages/api/src/routes/message.ts | 66 +++-- packages/api/src/routes/my-dog.ts | 12 +- packages/api/src/routes/swipe.ts | 36 +-- packages/api/src/routes/user.ts | 12 +- .../suggestion-service.test.ts | 245 ++++++++++++------ .../SuggestionService/suggestion-service.ts | 20 +- .../src/services/authentication-service.ts | 48 +++- packages/api/src/services/dog-service.ts | 51 ++-- packages/api/src/services/echo-service.ts | 2 +- .../src/services/image-processing-service.ts | 22 +- packages/api/src/services/image-service.ts | 47 ++-- packages/api/src/services/mail-service.ts | 19 +- packages/api/src/services/match-service.ts | 17 +- .../api/src/services/message-service.test.ts | 22 +- packages/api/src/services/message-service.ts | 34 ++- packages/api/src/services/payment-service.ts | 21 +- .../src/services/push-notification-service.ts | 9 +- packages/api/src/services/swipe-service.ts | 97 +++---- .../api/src/services/translation-service.ts | 3 +- packages/api/src/services/user-service.ts | 19 +- .../src/shared/cache-function-result-for.ts | 2 +- packages/api/src/shared/config.ts | 16 +- packages/api/src/shared/dog-distance.ts | 53 ++++ .../api/src/shared/dog-input-schema.test.ts | 36 ++- packages/api/src/shared/dog-input-schema.ts | 21 +- packages/api/src/shared/file-upload.test.ts | 56 ++-- packages/api/src/shared/file-upload.ts | 29 ++- packages/api/src/shared/image-url.test.ts | 18 +- packages/api/src/shared/image-url.ts | 14 +- packages/api/src/trpc.ts | 20 +- packages/api/src/types/revenuecat.ts | 20 +- packages/api/src/types/router-types.ts | 3 +- packages/database/env.ts | 13 + .../{__mocks__ => fixtures}/breed-data.ts | 2 +- .../fixed-dogs-data.ts | 3 +- .../generate-fake-user-with-dog.ts | 20 +- packages/database/index.ts | 6 +- packages/database/maestro-seed.ts | 84 +++--- packages/database/package.json | 5 +- packages/database/seed.ts | 27 +- packages/shared/errors/errors.ts | 36 ++- packages/shared/i18n/i18n.ts | 8 +- packages/shared/i18n/locales/en/index.ts | 4 +- packages/shared/i18n/locales/pt-BR/index.ts | 4 +- packages/shared/i18n/types/types.ts | 2 +- packages/shared/package.json | 2 +- packages/shared/schemas/dog-schema.ts | 57 ++-- packages/shared/themes/minimum-stroke-size.ts | 27 +- packages/shared/themes/themes.ts | 2 +- packages/shared/utils/get-formatted-years.ts | 24 +- pnpm-lock.yaml | 3 + scripts/srgb-to-p3-widget-colors.js | 14 +- 289 files changed, 4186 insertions(+), 2087 deletions(-) create mode 100644 apps/mobile/src/components/layout.ts delete mode 100644 apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.test.jsx create mode 100644 apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.test.tsx create mode 100644 packages/api/src/shared/dog-distance.ts create mode 100644 packages/database/env.ts rename packages/database/{__mocks__ => fixtures}/breed-data.ts (98%) rename packages/database/{__mocks__ => fixtures}/fixed-dogs-data.ts (97%) rename packages/database/{__mocks__ => fixtures}/generate-fake-user-with-dog.ts (85%) diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 8f3545b..2be6f93 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -1,10 +1,9 @@ -import { ExpoConfig } from "expo/config"; +import type { ExpoConfig } from "expo/config"; // The primary/fallback locale's native strings (permission descriptions, // etc.), also used verbatim by the `locales` map below. Reused here to // seed Android's base values/strings.xml via withDefaultLocaleStrings, // see that plugin's file for why this is needed. -// eslint-disable-next-line @typescript-eslint/no-var-requires const defaultLocaleNativeStrings = require("@pegada/shared/i18n/locales/en/native.json"); // The posthog-react-native/expo config plugin wires a sourcemap-upload step @@ -74,7 +73,8 @@ const config: ExpoConfig = { "react-native-maps", { iosGoogleMapsApiKey: process.env.EXPO_PUBLIC_IOS_GOOGLE_MAPS_API_KEY, - androidGoogleMapsApiKey: process.env.EXPO_PUBLIC_ANDROID_GOOGLE_MAPS_API_KEY, + androidGoogleMapsApiKey: + process.env.EXPO_PUBLIC_ANDROID_GOOGLE_MAPS_API_KEY, }, ], [ @@ -86,7 +86,8 @@ const config: ExpoConfig = { }, android: { // https://docs.page/invertase/react-native-google-mobile-ads/european-user-consent#handling-consent - extraProguardRules: "-keep class com.google.android.gms.internal.consent_sdk.** { *; }", + extraProguardRules: + "-keep class com.google.android.gms.internal.consent_sdk.** { *; }", }, }, ], @@ -178,14 +179,17 @@ const config: ExpoConfig = { [ "expo-location", { - locationWhenInUsePermission: "The app uses your location to find doggies near you.", + locationWhenInUsePermission: + "The app uses your location to find doggies near you.", }, ], [ "expo-image-picker", { - photosPermission: "The app allows you to choose photos for your doggie's profile.", - cameraPermission: "The app allows you to take photos for your doggie's profile.", + photosPermission: + "The app allows you to choose photos for your doggie's profile.", + cameraPermission: + "The app allows you to take photos for your doggie's profile.", }, ], // Wires the source-controlled `Pegada.storekit` fixture into the iOS @@ -200,7 +204,10 @@ const config: ExpoConfig = { // locale-tagged resource file, absent from the default one) and // FAILS gradlew bundleRelease -- this is what killed the 2026-07-05 // overnight EAS cloud build. See withDefaultLocaleStrings.js. - ["./plugins/with-default-locale-strings", { stringsByKey: defaultLocaleNativeStrings }], + [ + "./plugins/with-default-locale-strings", + { stringsByKey: defaultLocaleNativeStrings }, + ], // Applies the user's in-app theme choice (mirrored to NSUserDefaults by // ThemeProvider) to the iOS window before the splash screen renders, so // a forced dark theme boots with a dark splash instead of blinking @@ -210,7 +217,9 @@ const config: ExpoConfig = { // posthogSourcemapsEnabled above) -- omitted entirely from the plugins // list otherwise, so a plain local build never has the upload step in // its generated Xcode/Gradle project. - ...(posthogSourcemapsEnabled ? (["posthog-react-native/expo"] as const) : []), + ...(posthogSourcemapsEnabled + ? (["posthog-react-native/expo"] as const) + : []), ], androidStatusBar: { barStyle: "dark-content", diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 9d2ae6d..88d7d2d 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -27,8 +27,11 @@ config.watcher = { }; // SVG Support -config.transformer.babelTransformerPath = require.resolve("react-native-svg-transformer"); -config.resolver.assetExts = config.resolver.assetExts.filter((ext) => ext !== "svg"); +config.transformer.babelTransformerPath = + require.resolve("react-native-svg-transformer"); +config.resolver.assetExts = config.resolver.assetExts.filter( + (ext) => ext !== "svg", +); config.resolver.sourceExts.push("svg"); // dotLottie Support diff --git a/apps/mobile/modules/pegada-widget/index.ts b/apps/mobile/modules/pegada-widget/index.ts index f61bdb6..7e4dc0d 100644 --- a/apps/mobile/modules/pegada-widget/index.ts +++ b/apps/mobile/modules/pegada-widget/index.ts @@ -14,10 +14,10 @@ export const WIDGET_APP_GROUP = "group.app.pegada"; * scheme) readable by the widget process: inside the App Group container on * iOS, inside the app's document directory on Android. */ -export type WidgetSnapshotDog = { +export interface WidgetSnapshotDog { name: string; avatar: string | null; -}; +} /** * All user-facing strings arrive pre-localized from JS (i18next), so the @@ -31,29 +31,33 @@ export type WidgetSnapshotDog = { * `message` isn't the "waiting for reply" variant (all caught up, logged * out). */ -export type WidgetSnapshot = { +export interface WidgetSnapshot { loggedIn: boolean; count: number; message: string; messageCountless: string | null; dogs: WidgetSnapshotDog[]; -}; +} -type PegadaWidgetNativeModule = { - setSnapshot(json: string): Promise; -}; +interface PegadaWidgetNativeModule { + setSnapshot: (json: string) => Promise; +} // Optional so web (and any environment without the native module, e.g. // tests) degrades to a no-op instead of throwing at import time. -const nativeModule = requireOptionalNativeModule("PegadaWidget"); +const nativeModule = + requireOptionalNativeModule("PegadaWidget"); /** * Persists the snapshot where the home-screen widgets can read it * (App Group UserDefaults on iOS, SharedPreferences on Android) and asks * the OS to re-render the widget timelines. */ -export const setWidgetSnapshot = async (snapshot: WidgetSnapshot): Promise => { +export const setWidgetSnapshot = async ( + snapshot: WidgetSnapshot, +): Promise => { await nativeModule?.setSnapshot(JSON.stringify(snapshot)); }; -export const isWidgetModuleAvailable = () => nativeModule != null; +export const isWidgetModuleAvailable = () => + nativeModule !== undefined && nativeModule !== null; diff --git a/apps/mobile/oxlint.config.mts b/apps/mobile/oxlint.config.mts index 75a37e8..2660183 100644 --- a/apps/mobile/oxlint.config.mts +++ b/apps/mobile/oxlint.config.mts @@ -16,6 +16,40 @@ export default defineConfig({ ], rules: { + // See the root config: a nested config replaces the root one outright, so + // repo-wide decisions have to be restated here. + "no-warning-comments": "off", + + // The preset bans namespace imports and allows `react` / `@radix-ui/*`. + // Per-rule config replaces rather than merges, so `react` is restated. + // + // Two additions, both cases where the namespace *is* the documented API: + // every `expo-*` module exports only named functions and the SDK docs are + // written as `import * as Notifications from "expo-notifications"`, and a + // `styles.ts` next to a component is this repo's styled-components + // convention — `S.Container` is how you tell a styled node from a real one. + "import/no-namespace": [ + "error", + { ignore: ["react", "expo-*", "**/styles"] }, + ], + + // The React Compiler rule is `nursery`, and DECISIONS.md in the magic repo + // says to switch it off locally rather than fight it. Everything it reports + // here is a bailout on a library this app is built on and none of it is a + // bug: reanimated shared-value writes (`Immutability: This value cannot be + // modified`), react-native-gesture-handler's `Gesture.Pan()` factories + // (`CapitalizedCalls`), and react-hook-form (`Compilation Skipped: Use of + // incompatible library`). The compiler itself already skips these + // components at build time; the lint rule only restates that as an error. + "react/react-compiler": "off", + + // Same call as the preset makes for `unicorn/no-array-sort`, for the same + // reason: the autofix rewrites `.reverse()` to `.toReversed()`, which is + // ES2023. This app compiles against `lib: ES2022` and ships on Hermes, + // where change-array-by-copy is not something to bet a release on. Both + // sites already reverse a fresh array, so there is no mutation to fix. + "unicorn/no-array-reverse": "off", + // react-native-gesture-handler ships its own scrollables for use *inside* // gesture-handler containers. Importing them anywhere else silently loses // the platform behaviour of the react-native originals. @@ -35,6 +69,13 @@ export default defineConfig({ }, overrides: [ + { + // This is the app's env boundary: the one module that reads + // `process.env.EXPO_PUBLIC_*` and hands back a zod-parsed object. The + // preset exempts `env.ts`; here the file is called `config.ts`. + files: ["src/services/config.ts"], + rules: { "no-restricted-properties": "off" }, + }, { // Expo config plugins and native target configs run in the build // toolchain, not in the app: CommonJS, and they log. diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 9a8ef5f..16b90af 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -111,8 +111,6 @@ "@babel/core": "^7.29.0", "@bacons/apple-targets": "^4.0.7", "@pegada/api": "workspace:*", - "magic-oxlint-config": "^1.0.0", - "magic-tsconfig": "^1.0.0", "@posthog/cli": "^0.8.1", "@types/color": "^3.0.6", "@types/jest": "^29.5.12", @@ -123,9 +121,12 @@ "@types/react-test-renderer": "^18.3.0", "babel-jest": "^29.7.0", "babel-plugin-styled-components": "^2.1.4", - "jest": "^29.7.0" + "jest": "^29.7.0", + "magic-oxlint-config": "^1.0.0", + "magic-tsconfig": "^1.0.0" }, "jest": { + "clearMocks": true, "moduleNameMapper": { "^@/(.*)$": "/src/$1" } diff --git a/apps/mobile/plugins/with-default-locale-strings.js b/apps/mobile/plugins/with-default-locale-strings.js index a04efa1..02bcc7f 100644 --- a/apps/mobile/plugins/with-default-locale-strings.js +++ b/apps/mobile/plugins/with-default-locale-strings.js @@ -36,7 +36,10 @@ const withDefaultLocaleStrings = (config, { stringsByKey }) => { return withStringsXml(config, (modConfig) => { let strings = modConfig.modResults; for (const [name, value] of Object.entries(stringsByKey)) { - strings = AndroidConfig.Strings.setStringItem([{ $: { name }, _: value }], strings); + strings = AndroidConfig.Strings.setStringItem( + [{ $: { name }, _: value }], + strings, + ); } modConfig.modResults = strings; return modConfig; diff --git a/apps/mobile/plugins/with-initial-theme-override.js b/apps/mobile/plugins/with-initial-theme-override.js index 9980e07..8130120 100644 --- a/apps/mobile/plugins/with-initial-theme-override.js +++ b/apps/mobile/plugins/with-initial-theme-override.js @@ -30,7 +30,9 @@ * following the system appearance — exactly today's behavior. */ const { withAppDelegate } = require("expo/config-plugins"); -const { mergeContents } = require("@expo/config-plugins/build/utils/generateCode"); +const { + mergeContents, +} = require("@expo/config-plugins/build/utils/generateCode"); const OVERRIDE_SNIPPET = ` if let themeOverride = UserDefaults.standard.string(forKey: "pegadaThemeOverride"), themeOverride == "dark" || themeOverride == "light" { @@ -41,8 +43,9 @@ const withInitialThemeOverride = (config) => { return withAppDelegate(config, (modConfig) => { if (modConfig.modResults.language !== "swift") { throw new Error( - "withInitialThemeOverride: expected a Swift AppDelegate, found " + - modConfig.modResults.language, + `withInitialThemeOverride: expected a Swift AppDelegate, found ${ + modConfig.modResults.language + }`, ); } diff --git a/apps/mobile/plugins/with-store-kit-configuration.js b/apps/mobile/plugins/with-store-kit-configuration.js index 47ee236..8682c2e 100644 --- a/apps/mobile/plugins/with-store-kit-configuration.js +++ b/apps/mobile/plugins/with-store-kit-configuration.js @@ -35,8 +35,8 @@ const fs = require("fs"); const STOREKIT_FILE_NAME = "Pegada.storekit"; const withStoreKitConfiguration = (config) => { - return withXcodeProject(config, async (modConfig) => { - const projectRoot = modConfig.modRequest.projectRoot; + return withXcodeProject(config, (modConfig) => { + const { projectRoot } = modConfig.modRequest; const platformRoot = modConfig.modRequest.platformProjectRoot; const sourcePath = path.join(projectRoot, STOREKIT_FILE_NAME); @@ -44,7 +44,6 @@ const withStoreKitConfiguration = (config) => { // No .storekit file in the mobile app root — silently skip. This // keeps the plugin safe for environments that don't have the file // (e.g. fresh clones before the file has been pulled). - // eslint-disable-next-line no-console console.warn( `[withStoreKitConfiguration] ${STOREKIT_FILE_NAME} not found at ${sourcePath} — skipping StoreKit wiring.`, ); @@ -108,7 +107,6 @@ const withStoreKitConfiguration = (config) => { fs.writeFileSync(schemePath, schemeContent, "utf8"); } } else { - // eslint-disable-next-line no-console console.warn( `[withStoreKitConfiguration] scheme file not found at ${schemePath} — StoreKit file copied but not activated.`, ); diff --git a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx index bf045dc..38bda80 100644 --- a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx +++ b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx @@ -1,5 +1,6 @@ -import { useSafeAreaInsets } from "react-native-safe-area-context"; import { Tabs } from "expo-router"; + +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components/native"; import Logo from "@/assets/images/logo"; @@ -11,7 +12,21 @@ interface TabBarIconProps { color: string; } -export default () => { +// Hoisted out of the layout: an inline `tabBarIcon` is a fresh component type +// on every render, which remounts the icon whenever the tab bar updates. +const SwipeTabIcon = ({ color }: TabBarIconProps) => ( + +); + +const MessagesTabIcon = ({ color }: TabBarIconProps) => ( + +); + +const ProfileTabIcon = ({ color }: TabBarIconProps) => ( + +); + +const TabsLayout = () => { const theme = useTheme(); const insets = useSafeAreaInsets(); @@ -40,29 +55,25 @@ export default () => { name="swipe" options={{ tabBarButtonTestID: "tab-swipe", - tabBarIcon: ({ color }: TabBarIconProps) => ( - - ), + tabBarIcon: SwipeTabIcon, }} /> ( - - ), + tabBarIcon: MessagesTabIcon, }} /> ( - - ), + tabBarIcon: ProfileTabIcon, }} /> ); }; + +export default TabsLayout; diff --git a/apps/mobile/src/app/(app)/_layout.tsx b/apps/mobile/src/app/(app)/_layout.tsx index a212046..13cd8a7 100644 --- a/apps/mobile/src/app/(app)/_layout.tsx +++ b/apps/mobile/src/app/(app)/_layout.tsx @@ -1,12 +1,14 @@ import { Platform } from "react-native"; + import { Stack } from "expo-router"; + import Color from "color"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import { useMatchesWidgetSync } from "@/services/matchesWidget/use-matches-widget-sync"; -export default () => { +const AppLayout = () => { const theme = useTheme(); const { t } = useTranslation(); @@ -39,7 +41,7 @@ export default () => { // BlurEffect doesn't work on Android, so opacity is not necessary backgroundColor: Platform.OS === "ios" - ? Color(theme.colors.background).alpha(0.5).toString() + ? new Color(theme.colors.background).alpha(0.5).toString() : theme.colors.background, }, @@ -102,3 +104,5 @@ export default () => { ); }; + +export default AppLayout; diff --git a/apps/mobile/src/app/(auth)/_layout.tsx b/apps/mobile/src/app/(auth)/_layout.tsx index b76ba9e..da9ecff 100644 --- a/apps/mobile/src/app/(auth)/_layout.tsx +++ b/apps/mobile/src/app/(auth)/_layout.tsx @@ -1,8 +1,9 @@ import { Stack } from "expo-router"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -export default () => { +const AuthLayout = () => { const theme = useTheme(); const { t } = useTranslation(); @@ -49,3 +50,5 @@ export default () => { ); }; + +export default AuthLayout; diff --git a/apps/mobile/src/app/+html.tsx b/apps/mobile/src/app/+html.tsx index 640da02..c7d54a5 100644 --- a/apps/mobile/src/app/+html.tsx +++ b/apps/mobile/src/app/+html.tsx @@ -1,7 +1,8 @@ import * as React from "react"; + import { ScrollViewStyleReset } from "expo-router/html"; -export default ({ children }: { children: React.ReactNode }) => ( +const HtmlDocument = ({ children }: { children: React.ReactNode }) => ( @@ -16,3 +17,5 @@ export default ({ children }: { children: React.ReactNode }) => ( {children} ); + +export default HtmlDocument; diff --git a/apps/mobile/src/app/_layout.tsx b/apps/mobile/src/app/_layout.tsx index a96b86f..8d16ca4 100644 --- a/apps/mobile/src/app/_layout.tsx +++ b/apps/mobile/src/app/_layout.tsx @@ -1,26 +1,27 @@ import "@/config"; - import { useEffect, useState } from "react"; -import { GestureHandlerRootView } from "react-native-gesture-handler"; -import { magicModal, MagicModalPortal } from "react-native-magic-modal"; -import { PostHogProvider } from "posthog-react-native"; + import { router, SplashScreen, Stack } from "expo-router"; + import { BottomSheetModalProvider } from "@gorhom/bottom-sheet"; +import { PostHogProvider } from "posthog-react-native"; +import { GestureHandlerRootView } from "react-native-gesture-handler"; +import { magicModal, MagicModalPortal } from "react-native-magic-modal"; import { Provider } from "react-redux"; import styled from "styled-components/native"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { config } from "@/services/config"; -import { posthog } from "@/services/posthog"; import { storedThemePromise, ThemeProvider } from "@/contexts/theme-provider"; import { TRPCProvider } from "@/contexts/trpc-provider"; import { useProtectedRoute } from "@/hooks/use-protected-route"; import { useTrackScreens } from "@/hooks/use-track-screens"; +import { config } from "@/services/config"; import { sendError } from "@/services/error-tracking"; import { useGetInitialNotifications } from "@/services/linking"; +import { posthog } from "@/services/posthog"; import { useQuickActions } from "@/services/quickActions"; -import { SceneName } from "@/types/scene-name"; import { store } from "@/store"; +import { SceneName } from "@/types/scene-name"; // Wait for the assets to load before hiding the SplashScreen SplashScreen.preventAutoHideAsync()?.catch(sendError); diff --git a/apps/mobile/src/assets/animations/inverseLoadingDots.json b/apps/mobile/src/assets/animations/inverseLoadingDots.json index 7ef7c5c..ad47877 100644 --- a/apps/mobile/src/assets/animations/inverseLoadingDots.json +++ b/apps/mobile/src/assets/animations/inverseLoadingDots.json @@ -82,7 +82,10 @@ "ty": "fl", "c": { "a": 0, - "k": [0.10196078431372549, 0.10588235294117647, 0.10196078431372549, 1], + "k": [ + 0.10196078431372549, 0.10588235294117647, 0.10196078431372549, + 1 + ], "ix": 4 }, "o": { "a": 0, "k": 100, "ix": 5 }, @@ -189,7 +192,10 @@ "ty": "fl", "c": { "a": 0, - "k": [0.10196078431372549, 0.10588235294117647, 0.10196078431372549, 1], + "k": [ + 0.10196078431372549, 0.10588235294117647, 0.10196078431372549, + 1 + ], "ix": 4 }, "o": { "a": 0, "k": 100, "ix": 5 }, @@ -296,7 +302,10 @@ "ty": "fl", "c": { "a": 0, - "k": [0.10196078431372549, 0.10588235294117647, 0.10196078431372549, 1], + "k": [ + 0.10196078431372549, 0.10588235294117647, 0.10196078431372549, + 1 + ], "ix": 4 }, "o": { "a": 0, "k": 100, "ix": 5 }, diff --git a/apps/mobile/src/assets/animations/swipe.json b/apps/mobile/src/assets/animations/swipe.json index ff8c842..77a726a 100644 --- a/apps/mobile/src/assets/animations/swipe.json +++ b/apps/mobile/src/assets/animations/swipe.json @@ -124,7 +124,9 @@ "ty": "st", "c": { "a": 0, - "k": [0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1], + "k": [ + 0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1 + ], "ix": 3 }, "o": { "a": 0, "k": 100, "ix": 4 }, @@ -191,7 +193,9 @@ "ty": "st", "c": { "a": 0, - "k": [0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1], + "k": [ + 0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1 + ], "ix": 3 }, "o": { "a": 0, "k": 100, "ix": 4 }, @@ -277,7 +281,9 @@ "ty": "st", "c": { "a": 0, - "k": [0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1], + "k": [ + 0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1 + ], "ix": 3 }, "o": { "a": 0, "k": 100, "ix": 4 }, @@ -344,7 +350,9 @@ "ty": "st", "c": { "a": 0, - "k": [0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1], + "k": [ + 0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1 + ], "ix": 3 }, "o": { "a": 0, "k": 100, "ix": 4 }, @@ -559,7 +567,9 @@ "ty": "st", "c": { "a": 0, - "k": [0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1], + "k": [ + 0.36470588235294116, 0.3843137254901961, 0.4588235294117647, 1 + ], "ix": 3 }, "o": { "a": 0, "k": 100, "ix": 4 }, diff --git a/apps/mobile/src/assets/images/logo.tsx b/apps/mobile/src/assets/images/logo.tsx index 3b1bec3..7ca9288 100644 --- a/apps/mobile/src/assets/images/logo.tsx +++ b/apps/mobile/src/assets/images/logo.tsx @@ -1,4 +1,6 @@ -import Svg, { Defs, LinearGradient, Path, Stop, SvgProps } from "react-native-svg"; +import type { SvgProps } from "react-native-svg"; + +import Svg, { Defs, LinearGradient, Path, Stop } from "react-native-svg"; const SvgComponent = ({ colorStopOne, diff --git a/apps/mobile/src/assets/images/messages.tsx b/apps/mobile/src/assets/images/messages.tsx index 14df8a8..76c604f 100644 --- a/apps/mobile/src/assets/images/messages.tsx +++ b/apps/mobile/src/assets/images/messages.tsx @@ -1,4 +1,6 @@ -import Svg, { Defs, LinearGradient, Path, Stop, SvgProps } from "react-native-svg"; +import type { SvgProps } from "react-native-svg"; + +import Svg, { Defs, LinearGradient, Path, Stop } from "react-native-svg"; const SvgComponent = ({ colorStopOne, @@ -18,11 +20,25 @@ const SvgComponent = ({ d="m13.443 25.343-5.806 5.985a1.584 1.584 0 0 1-2.72-1.102v-6.412a4.522 4.522 0 0 1-.21-.12c-2.753-1.73-4.54-4.521-4.54-7.67 0-5.247 4.962-9.5 11.083-9.5s11.083 4.253 11.083 9.5c0 4.316-3.358 7.96-7.957 9.117-.309.079-.62.146-.933.202Z" /> - + - + diff --git a/apps/mobile/src/assets/images/profile.tsx b/apps/mobile/src/assets/images/profile.tsx index 7e3023d..27b3192 100644 --- a/apps/mobile/src/assets/images/profile.tsx +++ b/apps/mobile/src/assets/images/profile.tsx @@ -1,4 +1,6 @@ -import Svg, { Defs, LinearGradient, Path, Stop, SvgProps } from "react-native-svg"; +import type { SvgProps } from "react-native-svg"; + +import Svg, { Defs, LinearGradient, Path, Stop } from "react-native-svg"; const SvgComponent = ({ colorStopOne, diff --git a/apps/mobile/src/components/BottomAction/index.tsx b/apps/mobile/src/components/BottomAction/index.tsx index eb0ef7b..a50b57e 100644 --- a/apps/mobile/src/components/BottomAction/index.tsx +++ b/apps/mobile/src/components/BottomAction/index.tsx @@ -1,6 +1,8 @@ +import type { BlurViewProps } from "expo-blur"; + import * as React from "react"; import { Platform } from "react-native"; -import { BlurViewProps } from "expo-blur"; + import { useTheme } from "styled-components/native"; import { useKeyboardAwareSafeAreaInsets } from "../../hooks/use-keyboard-aware-safe-area-insets"; diff --git a/apps/mobile/src/components/BreedPicker/index.tsx b/apps/mobile/src/components/BreedPicker/index.tsx index daf5626..bc2bf2c 100644 --- a/apps/mobile/src/components/BreedPicker/index.tsx +++ b/apps/mobile/src/components/BreedPicker/index.tsx @@ -1,12 +1,13 @@ -import { useTranslation } from "react-i18next"; -import styled from "styled-components/native"; +import type { BreedSlug } from "@pegada/shared/i18n/i18n"; -import { BreedSlug } from "@pegada/shared/i18n/i18n"; import { Namespace } from "@pegada/shared/i18n/types/types"; +import { useTranslation } from "react-i18next"; +import styled from "styled-components/native"; import { Input } from "@/components/Input"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { api } from "@/contexts/trpc-provider"; + import { InputPicker } from "../Picker"; interface BreedPickerProps { @@ -19,7 +20,12 @@ interface BreedPickerProps { testID?: string; } -const BreedPicker = ({ breed, setBreed, hasAnyOption = false, ...props }: BreedPickerProps) => { +const BreedPicker = ({ + breed, + setBreed, + hasAnyOption = false, + ...props +}: BreedPickerProps) => { const { t } = useTranslation(); const [breedsData] = api.breed.all.useSuspenseQuery(undefined, { refetchOnMount: false, @@ -55,7 +61,13 @@ const DisabledInput = styled(Input)` const BreedPickerLoading = () => { const { t } = useTranslation(); - return ; + return ( + + ); }; const BreedPickerError = () => { @@ -71,8 +83,13 @@ const BreedPickerError = () => { ); }; -export default (props: BreedPickerProps) => ( - } errorFallback={BreedPickerError}> +const BreedPickerBoundary = (props: BreedPickerProps) => ( + } + errorFallback={BreedPickerError} + > ); + +export default BreedPickerBoundary; diff --git a/apps/mobile/src/components/Button/index.tsx b/apps/mobile/src/components/Button/index.tsx index a92329a..d370872 100644 --- a/apps/mobile/src/components/Button/index.tsx +++ b/apps/mobile/src/components/Button/index.tsx @@ -1,8 +1,12 @@ +import type { ContainerProps } from "./styles"; + +import type { PressableProps } from "react-native"; + import * as React from "react"; -import { PressableProps } from "react-native"; import Loading from "@/components/loading"; -import { ButtonText, Container, ContainerProps } from "./styles"; + +import { ButtonText, Container } from "./styles"; export interface ButtonProps extends ContainerProps, PressableProps { children: string; diff --git a/apps/mobile/src/components/Button/styles.ts b/apps/mobile/src/components/Button/styles.ts index 280489a..3e64a60 100644 --- a/apps/mobile/src/components/Button/styles.ts +++ b/apps/mobile/src/components/Button/styles.ts @@ -38,5 +38,6 @@ export const Container = styled(PressableArea)` `; export const ButtonText = styled(Text)` - color: ${(props) => (props.variant === "outline" ? props.theme.colors.primary : "white")}; + color: ${(props) => + props.variant === "outline" ? props.theme.colors.primary : "white"}; `; diff --git a/apps/mobile/src/components/DefaultModal/index.tsx b/apps/mobile/src/components/DefaultModal/index.tsx index 97a07bc..9091f28 100644 --- a/apps/mobile/src/components/DefaultModal/index.tsx +++ b/apps/mobile/src/components/DefaultModal/index.tsx @@ -1,6 +1,7 @@ import * as React from "react"; -import { useMagicModal } from "react-native-magic-modal"; + import { useTranslation } from "react-i18next"; +import { useMagicModal } from "react-native-magic-modal"; import { Container, Description, OkButton, Title } from "./styles"; @@ -9,7 +10,10 @@ interface DefaultModalProps { description: string; } -export const DefaultModal: React.FC = ({ title, description }) => { +export const DefaultModal: React.FC = ({ + title, + description, +}) => { const { t } = useTranslation(); const { hide } = useMagicModal(); diff --git a/apps/mobile/src/components/FeedbackCard/index.tsx b/apps/mobile/src/components/FeedbackCard/index.tsx index 8d18f3d..31099d0 100644 --- a/apps/mobile/src/components/FeedbackCard/index.tsx +++ b/apps/mobile/src/components/FeedbackCard/index.tsx @@ -1,8 +1,16 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; +import type { SharedValue } from "react-native-reanimated"; + import * as React from "react"; -import { Extrapolation, interpolate, SharedValue, useAnimatedStyle } from "react-native-reanimated"; + +import { + Extrapolation, + interpolate, + useAnimatedStyle, +} from "react-native-reanimated"; import { ACTION_OFFSET } from "@/constants"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; + import LikeFeedback from "./components/LikeFeedback"; import MaybeFeedback from "./components/MaybeFeedback"; import NopeFeedback from "./components/NopeFeedback"; @@ -17,25 +25,44 @@ interface FeedbackCardProps { isFirst: boolean; } -const FeedbackCard: React.FC = ({ dog, translation, isFirst }) => { +const FeedbackCard: React.FC = ({ + dog, + translation, + isFirst, +}) => { const likeOpacity = useAnimatedStyle(() => { "worklet"; return { - opacity: interpolate(translation.x.value, [10, ACTION_OFFSET], [0, 1], Extrapolation.CLAMP), + opacity: interpolate( + translation.x.value, + [10, ACTION_OFFSET], + [0, 1], + Extrapolation.CLAMP, + ), }; }); const nopeOpacity = useAnimatedStyle(() => { "worklet"; return { - opacity: interpolate(translation.x.value, [-ACTION_OFFSET, -10], [1, 0], Extrapolation.CLAMP), + opacity: interpolate( + translation.x.value, + [-ACTION_OFFSET, -10], + [1, 0], + Extrapolation.CLAMP, + ), }; }); const maybeOpacity = useAnimatedStyle(() => { "worklet"; return { - opacity: interpolate(translation.y.value, [-ACTION_OFFSET, -10], [1, 0], Extrapolation.CLAMP), + opacity: interpolate( + translation.y.value, + [-ACTION_OFFSET, -10], + [1, 0], + Extrapolation.CLAMP, + ), }; }); diff --git a/apps/mobile/src/components/FeedbackCard/styles.ts b/apps/mobile/src/components/FeedbackCard/styles.ts index 0a7a577..d445331 100644 --- a/apps/mobile/src/components/FeedbackCard/styles.ts +++ b/apps/mobile/src/components/FeedbackCard/styles.ts @@ -9,7 +9,8 @@ interface IContainer { } export const Container = styled(Animated.View)` - margin: ${(props) => props.theme.spacing[1]}px ${(props) => props.theme.spacing[1.5]}px; + margin: ${(props) => props.theme.spacing[1]}px + ${(props) => props.theme.spacing[1.5]}px; flex: 1; border-radius: ${(props) => props.theme.radii.lg}px; background-color: ${(props) => props.theme.colors.background}; diff --git a/apps/mobile/src/components/Input/index.tsx b/apps/mobile/src/components/Input/index.tsx index e2716a6..ada122a 100644 --- a/apps/mobile/src/components/Input/index.tsx +++ b/apps/mobile/src/components/Input/index.tsx @@ -1,8 +1,11 @@ +import type { TextInput, TextInputProps, ViewProps } from "react-native"; + import * as React from "react"; -import { TextInput, TextInputProps, ViewProps } from "react-native"; + import { useTranslation } from "react-i18next"; import { Text } from "@/components/text"; + import * as S from "./styles"; interface TextFieldContainerProps { @@ -30,7 +33,17 @@ interface InputProps extends TextInputProps { } export const Input = React.forwardRef( - ({ title, canCancel = true, error, loading = false, optional = false, ...props }, ref) => { + ( + { + title, + canCancel = true, + error, + loading = false, + optional = false, + ...props + }, + ref, + ) => { const { t } = useTranslation(); return ( @@ -40,11 +53,18 @@ export const Input = React.forwardRef( {title} - {optional ? {t("common.optional")} : null} + {optional ? ( + {t("common.optional")} + ) : null} )} - + {Boolean(props.value) && canCancel ? ( props.onChangeText?.("")}> diff --git a/apps/mobile/src/components/Input/styles.ts b/apps/mobile/src/components/Input/styles.ts index de11131..7130b8d 100644 --- a/apps/mobile/src/components/Input/styles.ts +++ b/apps/mobile/src/components/Input/styles.ts @@ -1,4 +1,5 @@ import { ActivityIndicator } from "react-native"; + import styled from "styled-components/native"; import cancelIcon from "@/assets/images/Cancel.svg"; diff --git a/apps/mobile/src/components/LikeLimitReached/index.tsx b/apps/mobile/src/components/LikeLimitReached/index.tsx index 667ef66..90da15a 100644 --- a/apps/mobile/src/components/LikeLimitReached/index.tsx +++ b/apps/mobile/src/components/LikeLimitReached/index.tsx @@ -1,15 +1,21 @@ +import type { LikeLimitReachedProps } from "@/components/LikeLimitReached/use-countdown"; + import { useEffect } from "react"; import * as React from "react"; -import { magicModal, useMagicModal } from "react-native-magic-modal"; + import { useRouter } from "expo-router"; -import { Trans, useTranslation } from "react-i18next"; import { FREE_DAILY_SWIPE_LIMIT } from "@pegada/shared/constants/constants"; +import { Trans, useTranslation } from "react-i18next"; +import { magicModal, useMagicModal } from "react-native-magic-modal"; import { Description, OkButton, Title } from "@/components/DefaultModal/styles"; -import { Container, CountdownContainer, Header } from "@/components/LikeLimitReached/styles"; import { - LikeLimitReachedProps, + Container, + CountdownContainer, + Header, +} from "@/components/LikeLimitReached/styles"; +import { useCountdown, ZERO_TIME_LEFT, } from "@/components/LikeLimitReached/use-countdown"; @@ -18,9 +24,12 @@ import { Text } from "@/components/text"; import { useEligibleForTrial } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; import { SceneName } from "@/types/scene-name"; -import { CloseButton } from "@/views/UpgradeWall/styles"; -const LikeLimitReached: React.FC = ({ likeLimitResetAt }) => { +import { PinnedCloseButton } from "./styles"; + +const LikeLimitReached: React.FC = ({ + likeLimitResetAt, +}) => { const timeLeft = useCountdown(likeLimitResetAt); const { t } = useTranslation(); const router = useRouter(); @@ -56,7 +65,7 @@ const LikeLimitReached: React.FC = ({ likeLimitResetAt }) {t("likeLimit.remaining")} { + onPress={() => { hide(); // Need to wait a bit to avoid the modal transition @@ -65,11 +74,13 @@ const LikeLimitReached: React.FC = ({ likeLimitResetAt }) }, 150); }} > - {isEligibleForTrial ? t("likeLimit.winFreeTrial") : t("likeLimit.getPremium")} + {isEligibleForTrial + ? t("likeLimit.winFreeTrial") + : t("likeLimit.getPremium")} - hide()}> + hide()}> - + ); }; diff --git a/apps/mobile/src/components/LikeLimitReached/styles.ts b/apps/mobile/src/components/LikeLimitReached/styles.ts index 9a035bb..deee5b8 100644 --- a/apps/mobile/src/components/LikeLimitReached/styles.ts +++ b/apps/mobile/src/components/LikeLimitReached/styles.ts @@ -1,6 +1,14 @@ import styled from "styled-components/native"; import * as ModalStyles from "@/components/DefaultModal/styles"; +import { CloseButton } from "@/views/UpgradeWall/styles"; + +/** The UpgradeWall close button, pinned to this modal's top-right corner. */ +export const PinnedCloseButton = styled(CloseButton)` + position: absolute; + top: 10px; + right: 10px; +`; export const Container = styled(ModalStyles.Container)` gap: ${(props) => props.theme.spacing[2]}px; diff --git a/apps/mobile/src/components/LikeLimitReached/use-countdown.tsx b/apps/mobile/src/components/LikeLimitReached/use-countdown.tsx index 27f8bc6..e9a52a6 100644 --- a/apps/mobile/src/components/LikeLimitReached/use-countdown.tsx +++ b/apps/mobile/src/components/LikeLimitReached/use-countdown.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from "react"; + import { differenceInSeconds } from "date-fns"; export interface LikeLimitReachedProps { @@ -16,9 +17,8 @@ const formatTimeLeft = (totalSeconds: number) => { return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; }; export const useCountdown = (likeLimitResetAt: Date) => { - const [timeLeft, setTimeLeft] = useState( - formatTimeLeft(differenceInSeconds(likeLimitResetAt, new Date())), - ); + const secondsLeft = differenceInSeconds(likeLimitResetAt, new Date()); + const [timeLeft, setTimeLeft] = useState(formatTimeLeft(secondsLeft)); useEffect(() => { const interval = setInterval(() => { @@ -27,10 +27,7 @@ export const useCountdown = (likeLimitResetAt: Date) => { setTimeLeft(formatTimeLeft(distanceInSeconds)); - if (distanceInSeconds <= 0) { - clearInterval(interval); - return; - } + if (distanceInSeconds <= 0) clearInterval(interval); }, 1000); // Update every second return () => clearInterval(interval); diff --git a/apps/mobile/src/components/MainCard/components/Distance/index.tsx b/apps/mobile/src/components/MainCard/components/Distance/index.tsx index aa7a822..3d16f17 100644 --- a/apps/mobile/src/components/MainCard/components/Distance/index.tsx +++ b/apps/mobile/src/components/MainCard/components/Distance/index.tsx @@ -1,9 +1,12 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + import * as React from "react"; import { View } from "react-native"; + import { useTranslation } from "react-i18next"; import Location from "@/assets/images/Location.svg"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; + import { Container, Content, DistanceText } from "./styles"; interface DistanceProps { @@ -14,7 +17,9 @@ interface DistanceProps { const formatDistance = (distance: number, locale: string) => { // Countries that use miles instead of kilometers const countriesUsingMiles = ["US", "GB", "LR", "MM"]; // United States, United Kingdom, Liberia, Myanmar - const usesMiles = countriesUsingMiles.some((countryCode) => locale.includes(countryCode)); + const usesMiles = countriesUsingMiles.some((countryCode) => + locale.includes(countryCode), + ); const unit = usesMiles ? " miles" : "km"; const conversionFactor = 0.621371; // conversion factor from km to miles @@ -23,7 +28,7 @@ const formatDistance = (distance: number, locale: string) => { const convertedDistance = usesMiles ? distance * conversionFactor : distance; return ( - Intl.NumberFormat(locale, { + new Intl.NumberFormat(locale, { style: "decimal", maximumFractionDigits: 1, }).format(convertedDistance) + unit @@ -45,7 +50,9 @@ const Distance: React.FC = ({ dog }) => { - {formatDistance(dog.distance ?? 0, i18n.language)} + + {formatDistance(dog.distance ?? 0, i18n.language)} + ); diff --git a/apps/mobile/src/components/MainCard/components/Pagination/index.tsx b/apps/mobile/src/components/MainCard/components/Pagination/index.tsx index dbf07dd..4e36934 100644 --- a/apps/mobile/src/components/MainCard/components/Pagination/index.tsx +++ b/apps/mobile/src/components/MainCard/components/Pagination/index.tsx @@ -1,4 +1,5 @@ import * as React from "react"; + import { useAnimatedStyle, withTiming } from "react-native-reanimated"; import { Container, Content, Dot } from "./styles"; @@ -30,7 +31,12 @@ const Pagination: React.FC = ({ pages, currentPage }) => { {Array.from({ length: pages }).map((_, index) => ( - + ))} diff --git a/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx b/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx index a49cdd1..5963698 100644 --- a/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx +++ b/apps/mobile/src/components/MainCard/components/PersonalInfo/index.tsx @@ -1,24 +1,39 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + +import type { ViewProps } from "react-native"; + import * as React from "react"; -import { ViewProps } from "react-native"; + import { LinearGradient } from "expo-linear-gradient"; import { useGetFormattedYears } from "@/services/use-get-formatted-years"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; + import { Age, Container, Description, Name } from "./styles"; export const BIO_NUMBER_OF_LINES = 3; -const PersonalInfo: React.FC<{ dog: SwipeDog } & ViewProps> = ({ dog, ...rest }) => { +const PersonalInfo: React.FC<{ dog: SwipeDog } & ViewProps> = ({ + dog, + ...rest +}) => { const getFormattedYears = useGetFormattedYears(); return ( - + {dog.name} - {dog.birthDate ? , {getFormattedYears(dog.birthDate)} : null} + {dog.birthDate ? ( + , {getFormattedYears(dog.birthDate)} + ) : null} - {dog.bio ? {dog.bio} : null} + {dog.bio ? ( + + {dog.bio} + + ) : null} ); diff --git a/apps/mobile/src/components/MainCard/index.tsx b/apps/mobile/src/components/MainCard/index.tsx index 79150ad..ba87aaf 100644 --- a/apps/mobile/src/components/MainCard/index.tsx +++ b/apps/mobile/src/components/MainCard/index.tsx @@ -1,17 +1,20 @@ import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + import { useState } from "react"; import * as React from "react"; + +import { useRouter } from "expo-router"; + import { useAnimatedStyle, useSharedValue, withSequence, withSpring, } from "react-native-reanimated"; -import { LinearGradient } from "expo-linear-gradient"; -import { useRouter } from "expo-router"; import { PressableArea } from "@/components/pressable-area"; import { SceneName } from "@/types/scene-name"; + import Distance from "./components/Distance"; import Pagination from "./components/Pagination"; import PersonalInfo from "./components/PersonalInfo"; @@ -21,6 +24,7 @@ import { NextImage, Picture, PreviousImage, + Scrim, UpperPart, } from "./styles"; @@ -28,7 +32,9 @@ const springConfig = { mass: 0.2 }; const START_IMAGE_INDEX = 0; -export interface VisitingCardProps extends React.ComponentProps { +export interface VisitingCardProps extends React.ComponentProps< + typeof Container +> { dog: SwipeDog; shouldShowPersonalInfo?: boolean; startImageIndex?: number; @@ -63,8 +69,10 @@ const VisitingCard: React.FC = ({ if (currentImage !== 0) return setCurrentImage((index) => index - 1); - // eslint-disable-next-line react-compiler/react-compiler -- false positive - rotation.value = withSequence(withSpring(-0.5, springConfig), withSpring(0, springConfig)); + rotation.value = withSequence( + withSpring(-0.5, springConfig), + withSpring(0, springConfig), + ); }; const gotoNextImage = () => { @@ -75,7 +83,10 @@ const VisitingCard: React.FC = ({ if (currentImage + 1 < images.length) { return setCurrentImage((index) => index + 1); } - rotation.value = withSequence(withSpring(0.5, springConfig), withSpring(0, springConfig)); + rotation.value = withSequence( + withSpring(0.5, springConfig), + withSpring(0, springConfig), + ); }; const transform = useAnimatedStyle(() => { @@ -94,15 +105,13 @@ const VisitingCard: React.FC = ({ }} key={images[currentImage]?.id} /> - @@ -113,7 +122,10 @@ const VisitingCard: React.FC = ({ {Boolean(shouldShowPersonalInfo) && ( - + )} diff --git a/apps/mobile/src/components/MainCard/styles.ts b/apps/mobile/src/components/MainCard/styles.ts index b56a208..e149c71 100644 --- a/apps/mobile/src/components/MainCard/styles.ts +++ b/apps/mobile/src/components/MainCard/styles.ts @@ -1,3 +1,5 @@ +import { LinearGradient } from "expo-linear-gradient"; + import Animated from "react-native-reanimated"; import styled, { css } from "styled-components/native"; @@ -38,3 +40,12 @@ export const PreviousImage = styled.Pressable` export const NextImage = styled.Pressable` flex: 1; `; + +/** Full-bleed gradient that darkens the top of the card. */ +export const Scrim = styled(LinearGradient)` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +`; diff --git a/apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx b/apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx index b95f4d1..2b48d7e 100644 --- a/apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx +++ b/apps/mobile/src/components/MatchActionBar/glass-pill-background.tsx @@ -1,5 +1,7 @@ import * as React from "react"; + import { GlassView } from "expo-glass-effect"; + import styled from "styled-components/native"; const StyledGlassView = styled(GlassView)` diff --git a/apps/mobile/src/components/MatchActionBar/index.tsx b/apps/mobile/src/components/MatchActionBar/index.tsx index 8b6677e..65308e4 100644 --- a/apps/mobile/src/components/MatchActionBar/index.tsx +++ b/apps/mobile/src/components/MatchActionBar/index.tsx @@ -1,9 +1,17 @@ import * as React from "react"; + import Animated, { FadeInDown, ZoomOutDown } from "react-native-reanimated"; -import { ActionItem, ConfusedEmoji, Container, HeartEyesEmoji, ThinkingEmoji } from "./styles"; import { PressableArea } from "@/components/pressable-area"; +import { + ActionItem, + ConfusedEmoji, + Container, + HeartEyesEmoji, + ThinkingEmoji, +} from "./styles"; + interface MatchActionBarProps extends React.ComponentProps { onNope: () => void; onYep: () => void; @@ -26,7 +34,11 @@ export const MatchActionBar: React.FC = ({ return ( - + diff --git a/apps/mobile/src/components/MatchActionBar/styles.ts b/apps/mobile/src/components/MatchActionBar/styles.ts index bfd798a..c4cebe2 100644 --- a/apps/mobile/src/components/MatchActionBar/styles.ts +++ b/apps/mobile/src/components/MatchActionBar/styles.ts @@ -1,13 +1,13 @@ -import Animated from "react-native-reanimated"; import Color from "color"; +import Animated from "react-native-reanimated"; import styled from "styled-components/native"; // Should preload for a better dog experience, so no inline requires import confusedEmoji from "@/assets/images/ConfusedEmoji.webp"; import heartEyesEmoji from "@/assets/images/HeartEyesEmoji.webp"; import thinkingEmoji from "@/assets/images/ThinkingEmoji.webp"; -import { Image } from "@/components/image"; import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; +import { Image } from "@/components/image"; // Apple HIG recommends a minimum 44x44pt hit area for tappable targets. const MIN_TOUCH_TARGET = 44; @@ -64,7 +64,8 @@ export const ActionItemFallbackBackground = styled.View` left: 0; right: 0; bottom: 0; - background-color: ${(props) => Color(props.theme.colors.primary).alpha(0.1).rgb().string()}; + background-color: ${(props) => + new Color(props.theme.colors.primary).alpha(0.1).rgb().string()}; `; export const ConfusedEmoji = styled(Image).attrs({ diff --git a/apps/mobile/src/components/NetworkBoundary/index.tsx b/apps/mobile/src/components/NetworkBoundary/index.tsx index 648c718..39f6596 100644 --- a/apps/mobile/src/components/NetworkBoundary/index.tsx +++ b/apps/mobile/src/components/NetworkBoundary/index.tsx @@ -1,14 +1,21 @@ -import { PropsWithChildren, Suspense, useEffect, useState } from "react"; +import type { PropsWithChildren } from "react"; +import type { ViewProps } from "react-native"; + +import { Suspense, useEffect, useState } from "react"; import * as React from "react"; -import { ActivityIndicator, ViewProps } from "react-native"; +import { ActivityIndicator } from "react-native"; + import NetInfo from "@react-native-community/netinfo"; -import { QueryErrorResetBoundary, useQueryErrorResetBoundary } from "@tanstack/react-query"; +import { + QueryErrorResetBoundary, + useQueryErrorResetBoundary, +} from "@tanstack/react-query"; +import { PostHogErrorBoundary } from "posthog-react-native"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; -import { PostHogErrorBoundary } from "posthog-react-native"; - import { Button } from "@/components/Button"; + import { ContainedText, Container, @@ -27,7 +34,9 @@ export const OfflineComponent = ({ reset }: { reset: () => void }) => { {t("networkBoundary.offline.title")} {t("networkBoundary.offline.message")} - + ); @@ -41,7 +50,9 @@ export const RequestErrorComponent = ({ reset }: { reset: () => void }) => { {t("networkBoundary.requestError.title")} - {t("networkBoundary.requestError.message")} + + {t("networkBoundary.requestError.message")} + @@ -58,7 +69,9 @@ export const UnknownErrorComponent = (props: ViewProps) => { {t("networkBoundary.unknownError.title")} - {t("networkBoundary.unknownError.message")} + + {t("networkBoundary.unknownError.message")} + ); @@ -92,7 +105,9 @@ interface QueryErrorResetBoundaryValue { reset: () => void; } -export type IErrorBoundary = (props: QueryErrorResetBoundaryValue) => React.ReactNode; +export type IErrorBoundary = ( + props: QueryErrorResetBoundaryValue, +) => React.ReactNode; export const DefaultErrorComponent: IErrorBoundary = ({ reset, isReset }) => { const offline = useIsOffline(); @@ -114,11 +129,11 @@ export const DefaultLoadingComponent = () => { ); }; -type NetworkBoundaryProps = { +interface NetworkBoundaryProps { children: React.ReactNode; suspenseFallback?: React.ReactNode; errorFallback?: IErrorBoundary; -}; +} const QueryAwareErrorBoundary = ({ children, @@ -144,7 +159,9 @@ export const NetworkBoundary = ({ }: NetworkBoundaryProps) => { return ( - }>{children} + }> + {children} + ); }; diff --git a/apps/mobile/src/components/Picker/index.tsx b/apps/mobile/src/components/Picker/index.tsx index db03986..03037e8 100644 --- a/apps/mobile/src/components/Picker/index.tsx +++ b/apps/mobile/src/components/Picker/index.tsx @@ -1,15 +1,20 @@ +import type { BottomSheetFlatListProps } from "@gorhom/bottom-sheet/lib/typescript/components/bottomSheetScrollable/types"; + +import type { ListRenderItemInfo } from "react-native"; + import { useState } from "react"; import * as React from "react"; -import { ListRenderItemInfo, Pressable, useWindowDimensions } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { Pressable, useWindowDimensions } from "react-native"; + import { BottomSheetFlatList, BottomSheetModal } from "@gorhom/bottom-sheet"; -import { BottomSheetFlatListProps } from "@gorhom/bottom-sheet/lib/typescript/components/bottomSheetScrollable/types"; import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components/native"; import { renderCustomBackdrop } from "@/components/custom-backdrop"; import { Input } from "@/components/Input"; import { Text } from "@/components/text"; + import { CloseIcon, Container, @@ -19,10 +24,10 @@ import { TitleContainer, } from "./styles"; -export type Item = { +export interface Item { id: string | null; name: string; -}; +} export interface InputPickerProps extends Partial< Omit, "ref"> @@ -117,7 +122,9 @@ const UnForwardedPickerSheet = ( const { height: screenHeight } = useWindowDimensions(); const data = filter - ? props.data.filter((item) => item.name.toLowerCase().includes(filter.toLowerCase())) + ? props.data.filter((item) => + item.name.toLowerCase().includes(filter.toLowerCase()), + ) : props.data; const backgroundStyle = { @@ -144,7 +151,9 @@ const UnForwardedPickerSheet = ( value={value} onChange={onChange} onClose={onClose} - testID={itemTestIDPrefix ? `${itemTestIDPrefix}${item.id ?? "any"}` : undefined} + testID={ + itemTestIDPrefix ? `${itemTestIDPrefix}${item.id ?? "any"}` : undefined + } /> ); @@ -191,7 +200,9 @@ const UnForwardedPickerSheet = ( ); }; -export const PickerSheet = React.forwardRef(UnForwardedPickerSheet) as ( +export const PickerSheet = React.forwardRef(UnForwardedPickerSheet) as < + T extends Item, +>( props: InputPickerProps & { ref?: React.Ref }, ) => React.ReactElement; @@ -220,7 +231,11 @@ export const InputPicker = (props: InputPickerProps) => { {/* Long/searchable lists (breeds, sizes, colors) keep a tall fixed sheet; direct PickerSheet users without snapPoints get content-fit sizing. */} - + ); }; diff --git a/apps/mobile/src/components/Picker/styles.ts b/apps/mobile/src/components/Picker/styles.ts index ff2e2eb..d289600 100644 --- a/apps/mobile/src/components/Picker/styles.ts +++ b/apps/mobile/src/components/Picker/styles.ts @@ -13,9 +13,9 @@ export const TitleContainer = styled.View` border-color: ${(props) => props.theme.colors.border}; `; -type SelectedItemProps = { +interface SelectedItemProps { selected?: boolean; -}; +} export const SelectItem = styled(PressableArea)` padding: ${(props) => props.theme.spacing[4]}px; @@ -26,7 +26,8 @@ export const SelectItem = styled(PressableArea)` `; export const SearchContainer = styled.View` - padding: ${(props) => props.theme.spacing[2]}px ${(props) => props.theme.spacing[1.5]}px; + padding: ${(props) => props.theme.spacing[2]}px + ${(props) => props.theme.spacing[1.5]}px; border-bottom-width: ${(props) => props.theme.stroke.md}px; border-color: ${(props) => props.theme.colors.border}; background-color: ${(props) => props.theme.colors.background}; @@ -40,7 +41,8 @@ export const SearchInput = styled(BottomSheetTextInput).attrs((props) => ({ font-family: ${(props) => props.theme.typography.fontFamily.medium}; font-weight: medium; font-size: ${(props) => props.theme.typography.sizes.xs.size}px; - padding: ${(props) => props.theme.spacing[1.5]}px ${(props) => props.theme.spacing[2]}px; + padding: ${(props) => props.theme.spacing[1.5]}px + ${(props) => props.theme.spacing[2]}px; border-radius: ${(props) => props.theme.radii.sm}px; border-width: ${(props) => props.theme.stroke.md}px; border-color: ${(props) => props.theme.colors.border}; diff --git a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx index cb399ca..4fc2779 100644 --- a/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx +++ b/apps/mobile/src/components/ProfileImageUploader/components/AddUserPhoto/index.tsx @@ -1,9 +1,19 @@ +import type { + Picture, + ProfileImageUploadStage, +} from "@/components/ProfileImageUploader/utils"; + import { useState } from "react"; import * as React from "react"; import { ActivityIndicator } from "react-native"; -import { magicToast } from "react-native-magic-toast"; -import Animated, { FadeOut, useAnimatedStyle, withSpring } from "react-native-reanimated"; + import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; +import Animated, { + FadeOut, + useAnimatedStyle, + withSpring, +} from "react-native-reanimated"; import { useTheme } from "styled-components/native"; import AddRemove from "@/assets/images/AddRemove.svg"; @@ -11,17 +21,16 @@ import { PressableArea } from "@/components/pressable-area"; import { getMaestroPlaceholderUri, ImagePickerError, - Picture, - ProfileImageUploadStage, shouldOfferMaestroPlaceholder, showImagePickerOptions, uploadProfileImage, } from "@/components/ProfileImageUploader/utils"; import { Text } from "@/components/text"; import { sendError } from "@/services/error-tracking"; + import * as S from "./styles"; -type AddUserPhotoProps = { +interface AddUserPhotoProps { picture: Picture; onDelete: () => void; onAdd: ({ url }: { url: string }) => void; @@ -31,7 +40,10 @@ type AddUserPhotoProps = { * can target a specific cell without depending on screen coordinates. */ index?: number; -}; +} + +const photoActionTestID = (index: number, hasPicture: boolean) => + hasPicture ? `remove-photo-${index}` : `add-photo-button-${index}`; const hitSlop = { top: 150, @@ -40,7 +52,12 @@ const hitSlop = { right: 100, }; -export const AddUserPhoto: React.FC = ({ picture, onDelete, onAdd, index }) => { +export const AddUserPhoto: React.FC = ({ + picture, + onDelete, + onAdd, + index, +}) => { const [localPicture, setLocalPicture] = useState(picture.url); const { t } = useTranslation(); @@ -79,7 +96,9 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o sendError(trackedError); if (__DEV__) { - magicToast.alert(t("imagePicker.uploadFailedDev", { reason: `[${stage}] ${reason}` })); + magicToast.alert( + t("imagePicker.uploadFailedDev", { reason: `[${stage}] ${reason}` }), + ); } else { magicToast.alert(t("imagePicker.uploadFailed")); } @@ -99,20 +118,26 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o }); onAdd({ url: finalUrl }); - } catch (err) { + } catch (error) { // When the user cancels the image picker, we don't want to show an error - if (err instanceof Error && err.message === ImagePickerError.CANCELED) { + if ( + error instanceof Error && + error.message === ImagePickerError.CANCELED + ) { return; } // Permissions denied — pickImage/takeImage already showed a native alert // explaining what to do. Don't double-toast. - if (err instanceof Error && err.message === ImagePickerError.NO_PERMISSION) { + if ( + error instanceof Error && + error.message === ImagePickerError.NO_PERMISSION + ) { handleDelete(); return; } - reportUploadFailure(err, stage, "ProfileImageUploader.handleAdd"); + reportUploadFailure(error, stage, "ProfileImageUploader.handleAdd"); handleDelete(); } }; @@ -147,8 +172,12 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o }); onAdd({ url: finalUrl }); - } catch (err) { - reportUploadFailure(err, stage, "ProfileImageUploader.handleMaestroPlaceholderUpload"); + } catch (error) { + reportUploadFailure( + error, + stage, + "ProfileImageUploader.handleMaestroPlaceholderUpload", + ); handleDelete(); } }; @@ -158,7 +187,8 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o // `shouldOfferMaestroPlaceholder()` short-circuits on // `config.ENV === "production"` so App Store builds always evaluate to // `false` here regardless of EXPO_PUBLIC_MAESTRO_E2E misconfiguration. - const showMaestroSkip = !hasPicture && !isLoading && shouldOfferMaestroPlaceholder(); + const showMaestroSkip = + !hasPicture && !isLoading && shouldOfferMaestroPlaceholder(); return ( @@ -176,7 +206,9 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o ) : null} {!hasPicture && ( = ({ picture, onDelete, o {showMaestroSkip ? ( @@ -221,9 +255,7 @@ export const AddUserPhoto: React.FC = ({ picture, onDelete, o ; + return ( + + ); }; export const ProfileImagesUploader: React.FC = ({ @@ -81,7 +93,11 @@ export const ProfileImagesUploader: React.FC = ({ const index = value.findIndex((p) => p.id === item.id); return ( - + ); }; diff --git a/apps/mobile/src/components/ProfileImageUploader/utils/index.ts b/apps/mobile/src/components/ProfileImageUploader/utils/index.ts index e87ff86..6c471b9 100644 --- a/apps/mobile/src/components/ProfileImageUploader/utils/index.ts +++ b/apps/mobile/src/components/ProfileImageUploader/utils/index.ts @@ -1,4 +1,7 @@ +import type { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; + import { Alert } from "react-native"; + import { Asset } from "expo-asset"; import { cacheDirectory, @@ -11,11 +14,9 @@ import { import { manipulateAsync, SaveFormat } from "expo-image-manipulator"; import * as ImagePicker from "expo-image-picker"; -import { IMAGE_STATUS } from "@pegada/shared/schemas/dog-schema"; - +import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { config } from "@/services/config"; -import { getTrcpContext } from "@/contexts/trcp-context"; import { sendError } from "@/services/error-tracking"; import { getMimeType } from "@/services/get-mime-type"; @@ -32,18 +33,17 @@ export interface Picture { export type DeletedPicture = Omit; -export const pictures: Picture[] = Array(6) - .fill(null) - .map( - (_data, index): Picture => ({ - id: `image-id-${index}`, - key: `image-key-${index}`, - url: "", - disabledDrag: true, - disabledReSorted: true, - position: index, - }), - ); +export const pictures: Picture[] = Array.from( + { length: 6 }, + (_data, index): Picture => ({ + id: `image-id-${index}`, + key: `image-key-${index}`, + url: "", + disabledDrag: true, + disabledReSorted: true, + position: index, + }), +); export const sortByUrl = ( firstItem: Picture | DeletedPicture, @@ -106,7 +106,9 @@ export const normaliseAssetUri = async (uri: string): Promise => { if (!targetDir) { // No writable directory — extremely unlikely on a real device, but // surface a clear error rather than silently failing the upload. - throw new Error("No writable file-system directory available for image copy"); + throw new Error( + "No writable file-system directory available for image copy", + ); } const extension = (() => { // PH URIs sometimes carry an "?ext=jpg" hint; otherwise default to jpg. @@ -148,7 +150,8 @@ export enum ImagePickerError { } export const pickImage = async () => { - const cameraRollStatus = await ImagePicker.requestMediaLibraryPermissionsAsync(); + const cameraRollStatus = + await ImagePicker.requestMediaLibraryPermissionsAsync(); if (cameraRollStatus.status !== "granted") { Alert.alert( @@ -169,7 +172,7 @@ export const pickImage = async () => { throw new Error(ImagePickerError.CANCELED); } - const image = result.assets[0]; + const [image] = result.assets; if (!image) { throw new Error(ImagePickerError.NO_IMAGE); @@ -200,7 +203,7 @@ export const takeImage = async () => { throw new Error(ImagePickerError.CANCELED); } - const image = result.assets[0]; + const [image] = result.assets; if (!image) { throw new Error(ImagePickerError.NO_IMAGE); @@ -214,11 +217,19 @@ export const takeImage = async () => { * the catch site in `AddUserPhoto` can attach the failing stage to the error * payload sent to PostHog without stringly-typed magic values. */ -export type ProfileImageUploadStage = "presign" | "compress" | "upload" | "finalize"; +export type ProfileImageUploadStage = + | "presign" + | "compress" + | "upload" + | "finalize"; export class ProfileImageUploadError extends Error { readonly stage: ProfileImageUploadStage; - constructor(stage: ProfileImageUploadStage, message: string, options?: { cause?: unknown }) { + constructor( + stage: ProfileImageUploadStage, + message: string, + options?: { cause?: unknown }, + ) { super(message, options); this.name = "ProfileImageUploadError"; this.stage = stage; @@ -254,13 +265,19 @@ export const uploadProfileImage = async ( onProgress?.("presign"); const upload = await getTrcpContext() .image.signedUpload.fetch() - .catch((cause) => { - throw new ProfileImageUploadError("presign", "Failed to fetch upload descriptor", { cause }); + .catch((error) => { + throw new ProfileImageUploadError( + "presign", + "Failed to fetch upload descriptor", + { cause: error }, + ); }); onProgress?.("compress"); - const compressedImage = await compressImage(localUri).catch((cause) => { - throw new ProfileImageUploadError("compress", "compressImage failed", { cause }); + const compressedImage = await compressImage(localUri).catch((error) => { + throw new ProfileImageUploadError("compress", "compressImage failed", { + cause: error, + }); }); onProgress?.("upload"); @@ -269,12 +286,17 @@ export const uploadProfileImage = async ( uploadType: FileSystemUploadType.BINARY_CONTENT, httpMethod: upload.method, headers: upload.headers, - }).catch((cause) => { - throw new ProfileImageUploadError("upload", "uploadAsync threw", { cause }); + }).catch((error) => { + throw new ProfileImageUploadError("upload", "uploadAsync threw", { + cause: error, + }); }); if (response.status !== 200) { - throw new ProfileImageUploadError("upload", `upload PUT returned ${response.status}`); + throw new ProfileImageUploadError( + "upload", + `upload PUT returned ${response.status}`, + ); } onProgress?.("finalize"); @@ -332,12 +354,16 @@ export const shouldOfferMaestroPlaceholder = (): boolean => { * execute it even though the bundler may still ship the PNG. */ export const getMaestroPlaceholderUri = async (): Promise => { - const asset = Asset.fromModule(require("@/assets/images/maestro-placeholder.png")); + const asset = Asset.fromModule( + require("@/assets/images/maestro-placeholder.png"), + ); await asset.downloadAsync(); const localUri = asset.localUri ?? asset.uri; if (!localUri) { - throw new Error("Maestro placeholder asset has no localUri/uri after downloadAsync"); + throw new Error( + "Maestro placeholder asset has no localUri/uri after downloadAsync", + ); } // Re-use the same normaliser the real picker pipeline uses so we end up with @@ -361,7 +387,10 @@ export const showImagePickerOptions = (): Promise<{ takeImage() .then((imageUrl) => resolve(imageUrl)) .catch((error) => { - if (error instanceof Error && error.message !== ImagePickerError.CANCELED) { + if ( + error instanceof Error && + error.message !== ImagePickerError.CANCELED + ) { sendError(error); } @@ -375,7 +404,10 @@ export const showImagePickerOptions = (): Promise<{ pickImage() .then((imageUrl) => resolve(imageUrl)) .catch((error) => { - if (error instanceof Error && error.message !== ImagePickerError.CANCELED) { + if ( + error instanceof Error && + error.message !== ImagePickerError.CANCELED + ) { sendError(error); } diff --git a/apps/mobile/src/components/RadioButtons/index.tsx b/apps/mobile/src/components/RadioButtons/index.tsx index 04ca93e..9fbfe42 100644 --- a/apps/mobile/src/components/RadioButtons/index.tsx +++ b/apps/mobile/src/components/RadioButtons/index.tsx @@ -1,8 +1,11 @@ +import type { OptionButtonProps } from "./styles"; + import * as React from "react"; import { Container } from "@/components/Input/styles"; import { Text } from "@/components/text"; -import { Content, OptionButtonProps, RadioButtonContainer, TextButton } from "./styles"; + +import { Content, RadioButtonContainer, TextButton } from "./styles"; interface RadioButtonsProps { title: string; @@ -17,7 +20,11 @@ interface RadioButtonProps extends OptionButtonProps { const RadioButton: React.FC = (props) => { return ( - + {props.children} @@ -25,7 +32,12 @@ const RadioButton: React.FC = (props) => { ); }; -export const RadioButtons: React.FC = ({ title, data, onChange, value }) => { +export const RadioButtons: React.FC = ({ + title, + data, + onChange, + value, +}) => { return ( diff --git a/apps/mobile/src/components/RadioButtons/styles.ts b/apps/mobile/src/components/RadioButtons/styles.ts index 0c77f5f..d21a8b8 100644 --- a/apps/mobile/src/components/RadioButtons/styles.ts +++ b/apps/mobile/src/components/RadioButtons/styles.ts @@ -1,4 +1,5 @@ -import { PressableProps } from "react-native"; +import type { PressableProps } from "react-native"; + import styled, { css } from "styled-components/native"; import { PressableArea } from "@/components/pressable-area"; @@ -18,7 +19,8 @@ export const Content = styled.View` `; export const RadioButtonContainer = styled(PressableArea)` - padding: ${(props) => props.theme.spacing[3]}px ${(props) => props.theme.spacing[4]}px; + padding: ${(props) => props.theme.spacing[3]}px + ${(props) => props.theme.spacing[4]}px; background-color: ${(props) => props.theme.colors.background}; diff --git a/apps/mobile/src/components/Slider/index.tsx b/apps/mobile/src/components/Slider/index.tsx index c5e2c72..d5f5b17 100644 --- a/apps/mobile/src/components/Slider/index.tsx +++ b/apps/mobile/src/components/Slider/index.tsx @@ -1,10 +1,23 @@ +import type { + LabelProps, + MultiSliderProps, +} from "@ptomasroos/react-native-multi-slider"; + import * as React from "react"; import { View } from "react-native"; -import MultiSlider, { LabelProps, MultiSliderProps } from "@ptomasroos/react-native-multi-slider"; + +import MultiSlider from "@ptomasroos/react-native-multi-slider"; import { useTheme } from "styled-components/native"; import { Text } from "@/components/text"; -import { LabelContainer, Marker, TitleContainer, Triangle, WIDTH } from "./styles"; + +import { + LabelContainer, + Marker, + TitleContainer, + Triangle, + WIDTH, +} from "./styles"; interface TitleProps { title: string; @@ -55,6 +68,33 @@ const markerHitSlop = { const CustomMarker = () => ; +/** + * Hoisted out of `Root` so it keeps its identity between renders — a component + * declared during render remounts its subtree every time the parent updates. + * `max` comes in as a prop instead of a closure variable. + */ +const CustomLabels = ({ max, ...label }: LabelProps & { max: number }) => { + const oneMarkerValue = + Number(label.oneMarkerValue) >= max ? "∞" : label.oneMarkerValue; + const twoMarkerValue = + Number(label.twoMarkerValue) >= max ? "∞" : label.twoMarkerValue; + + return ( + <> + {Number(label.oneMarkerValue) >= 0 && ( + + {oneMarkerValue} + + )} + {Number(label.twoMarkerValue) >= 0 && ( + + {twoMarkerValue} + + )} + + ); +}; + export const Root = (props: MultiSliderProps) => { const theme = useTheme(); @@ -62,9 +102,13 @@ export const Root = (props: MultiSliderProps) => { // gets claimed by the OS navigation gesture (iOS interactive pop / Android // system back) instead of the slider, sending the user back a screen. Inset // the track on both platforms so no marker sits in that edge gesture zone. - const safePadding = theme.spacing[7]; + const sliderLength = (props?.sliderLength ?? 0) - theme.spacing[7] * 2; - const sliderLength = (props?.sliderLength ?? 0) - safePadding * 2; + const max = props.max ?? 0; + const renderCustomLabels = React.useCallback( + (label: LabelProps) => , + [max], + ); const hasSecondMarker = (props.values?.length ?? 0) > 1; @@ -72,32 +116,13 @@ export const Root = (props: MultiSliderProps) => { const safeBorderStyle = { height: stroke, - width: safePadding, + width: theme.spacing[7], backgroundColor: theme.colors.border, zIndex: -1, borderTopRightRadius: theme.radii.md, borderBottomRightRadius: theme.radii.md, }; - const CustomLabels = (label: LabelProps) => { - const oneMarkerValue = - Number(label.oneMarkerValue) >= (props.max ?? 0) ? "∞" : label.oneMarkerValue; - - const twoMarkerValue = - Number(label.twoMarkerValue) >= (props.max ?? 0) ? "∞" : label.twoMarkerValue; - - return ( - <> - {Number(label.oneMarkerValue) >= 0 && ( - {oneMarkerValue} - )} - {Number(label.twoMarkerValue) >= 0 && ( - {twoMarkerValue} - )} - - ); - }; - const style = { flexDirection: "row", alignItems: "center", @@ -116,13 +141,15 @@ export const Root = (props: MultiSliderProps) => { style={[ safeBorderStyle, { - backgroundColor: hasSecondMarker ? theme.colors.border : theme.colors.primary, + backgroundColor: hasSecondMarker + ? theme.colors.border + : theme.colors.primary, }, ]} /> ` +const FallbackBlurView = styled(ContainerComponent).attrs( + getProps, +)` background-color: ${(props) => { if (Platform.OS === "android") return props.theme.colors.background; - return Color(props.theme.colors.background).alpha(0.5).string(); + return new Color(props.theme.colors.background).alpha(0.5).string(); }}; `; @@ -37,7 +49,7 @@ export const TransparentAndroidDarkBlurView = styled(ContainerComponent).attrs({ })` background-color: ${(props) => { if (Platform.OS === "android") return "#00000090"; - return Color(props.theme.colors.black).alpha(0.5).string(); + return new Color(props.theme.colors.black).alpha(0.5).string(); }}; `; @@ -54,7 +66,8 @@ let cachedGlassAvailable: boolean | undefined; export const isLiquidGlassAvailableSafe = (): boolean => { if (cachedGlassAvailable === undefined) { try { - cachedGlassAvailable = isLiquidGlassAvailable() && isGlassEffectAPIAvailable(); + cachedGlassAvailable = + isLiquidGlassAvailable() && isGlassEffectAPIAvailable(); } catch { cachedGlassAvailable = false; } @@ -84,8 +97,8 @@ export const BlurView = React.forwardRef((props, ref) => { if (isLiquidGlassAvailableSafe()) { return ( ( - (props, ref) => { - const theme = useTheme(); +export const TransparentGlassOrDarkBlurView = React.forwardRef< + View, + BlurViewProps +>((props, ref) => { + const theme = useTheme(); - return isLiquidGlassAvailableSafe() ? ( - - ) : ( - - ); - }, -); + return isLiquidGlassAvailableSafe() ? ( + + ) : ( + + ); +}); TransparentGlassOrDarkBlurView.displayName = "TransparentGlassOrDarkBlurView"; diff --git a/apps/mobile/src/components/custom-backdrop.tsx b/apps/mobile/src/components/custom-backdrop.tsx index 90724ac..744d737 100644 --- a/apps/mobile/src/components/custom-backdrop.tsx +++ b/apps/mobile/src/components/custom-backdrop.tsx @@ -1,21 +1,36 @@ +import type { BottomSheetBackdropProps } from "@gorhom/bottom-sheet"; + import React from "react"; import { Pressable, StyleSheet, useWindowDimensions } from "react-native"; -import Animated, { Extrapolation, interpolate, useAnimatedStyle } from "react-native-reanimated"; -import { BottomSheetBackdropProps, useBottomSheetModal } from "@gorhom/bottom-sheet"; -const CustomBackdrop = ({ style, animatedPosition }: BottomSheetBackdropProps) => { +import { useBottomSheetModal } from "@gorhom/bottom-sheet"; +import Animated, { + Extrapolation, + interpolate, + useAnimatedStyle, +} from "react-native-reanimated"; + +const CustomBackdrop = ({ + style, + animatedPosition, +}: BottomSheetBackdropProps) => { const { height } = useWindowDimensions(); const { dismissAll } = useBottomSheetModal(); const containerAnimatedStyle = useAnimatedStyle(() => { "worklet"; return { - opacity: interpolate(animatedPosition.value, [0, height], [0.9, 0], Extrapolation.CLAMP), + opacity: interpolate( + animatedPosition.value, + [0, height], + [0.9, 0], + Extrapolation.CLAMP, + ), }; }); return ( diff --git a/apps/mobile/src/components/image-background.tsx b/apps/mobile/src/components/image-background.tsx index 3fb4e4d..f81311c 100644 --- a/apps/mobile/src/components/image-background.tsx +++ b/apps/mobile/src/components/image-background.tsx @@ -1,7 +1,6 @@ -import { - ImageBackground as ExpoImageBackground, - ImageBackgroundProps as ExpoImageBackgroundProps, -} from "expo-image"; +import type { ImageBackgroundProps as ExpoImageBackgroundProps } from "expo-image"; + +import { ImageBackground as ExpoImageBackground } from "expo-image"; export type ImageBackgroundProps = ExpoImageBackgroundProps; diff --git a/apps/mobile/src/components/image-props.test.ts b/apps/mobile/src/components/image-props.test.ts index 7ead0f9..3c0e0bb 100644 --- a/apps/mobile/src/components/image-props.test.ts +++ b/apps/mobile/src/components/image-props.test.ts @@ -1,6 +1,7 @@ +import type { Image } from "./image"; + import type { ComponentProps } from "react"; -import type { Image } from "./image"; import { resolveImagePresentationProps } from "./image-props"; const blurhash = "LEHV6nWB2yk8pyo0adR*.7kCMdnj"; @@ -19,7 +20,7 @@ const forwardedProps = { } satisfies ComponentProps; test("moves an API blurhash onto the placeholder and keeps the source clean", () => { - expect(resolveImagePresentationProps(forwardedProps)).toEqual({ + expect(resolveImagePresentationProps(forwardedProps)).toStrictEqual({ source: { uri }, placeholder: { blurhash }, contentFit: "contain", @@ -29,7 +30,9 @@ test("moves an API blurhash onto the placeholder and keeps the source clean", () }); test("defaults the blurhash fit to cover when the caller sets no contentFit", () => { - expect(resolveImagePresentationProps({ source: { uri, blurhash } })).toEqual({ + expect( + resolveImagePresentationProps({ source: { uri, blurhash } }), + ).toStrictEqual({ source: { uri }, placeholder: { blurhash }, contentFit: undefined, @@ -48,7 +51,7 @@ test("leaves a caller-provided placeholder and cache policy alone", () => { placeholderContentFit: "scale-down", cachePolicy: "disk", }), - ).toEqual({ + ).toStrictEqual({ source: { uri }, placeholder, contentFit: undefined, @@ -64,7 +67,7 @@ test("treats an explicit null placeholder and cache policy as opting out", () => placeholder: null, cachePolicy: null, }), - ).toEqual({ + ).toStrictEqual({ source: { uri }, placeholder: null, contentFit: undefined, @@ -76,7 +79,7 @@ test("treats an explicit null placeholder and cache policy as opting out", () => test.each([42, "https://images.pegada.app/static.webp", null] as const)( "passes a %p source straight through", (source) => { - expect(resolveImagePresentationProps({ source })).toEqual({ + expect(resolveImagePresentationProps({ source })).toStrictEqual({ source, placeholder: undefined, contentFit: undefined, @@ -92,7 +95,7 @@ test("passes a responsive source array straight through", () => { { uri: "https://images.pegada.app/luna-large.webp", width: 1280 }, ]; - expect(resolveImagePresentationProps({ source })).toEqual({ + expect(resolveImagePresentationProps({ source })).toStrictEqual({ source, placeholder: undefined, contentFit: undefined, diff --git a/apps/mobile/src/components/image-props.ts b/apps/mobile/src/components/image-props.ts index a233be1..7262388 100644 --- a/apps/mobile/src/components/image-props.ts +++ b/apps/mobile/src/components/image-props.ts @@ -4,7 +4,11 @@ const DEFAULT_CACHE_POLICY = "memory-disk" as const; type ImagePresentationProps = Pick< ImageProps, - "cachePolicy" | "contentFit" | "placeholder" | "placeholderContentFit" | "source" + | "cachePolicy" + | "contentFit" + | "placeholder" + | "placeholderContentFit" + | "source" >; const isBlurhashSource = ( @@ -34,7 +38,8 @@ export const resolveImagePresentationProps = ({ placeholder, contentFit, placeholderContentFit, - cachePolicy: cachePolicy === undefined ? DEFAULT_CACHE_POLICY : cachePolicy, + cachePolicy: + cachePolicy === undefined ? DEFAULT_CACHE_POLICY : cachePolicy, }; } @@ -46,7 +51,8 @@ export const resolveImagePresentationProps = ({ placeholder: usesSourceBlurhash ? { blurhash } : placeholder, contentFit, placeholderContentFit: - placeholderContentFit ?? (usesSourceBlurhash ? (contentFit ?? "cover") : undefined), + placeholderContentFit ?? + (usesSourceBlurhash ? (contentFit ?? "cover") : undefined), cachePolicy: cachePolicy === undefined ? DEFAULT_CACHE_POLICY : cachePolicy, }; }; diff --git a/apps/mobile/src/components/image.test.tsx b/apps/mobile/src/components/image.test.tsx index d6c001c..f65104d 100644 --- a/apps/mobile/src/components/image.test.tsx +++ b/apps/mobile/src/components/image.test.tsx @@ -1,11 +1,15 @@ import { renderToStaticMarkup } from "react-dom/server"; + import { Image as ExpoImage } from "expo-image"; import { Image } from "./image"; -jest.mock("expo-image", () => ({ Image: jest.fn(() => null) })); +// `Partial<...>`: the factory replaces the one export this suite renders. +jest.mock>("expo-image", () => ({ + Image: jest.fn(() => null) as unknown as typeof import("expo-image").Image, +})); -const expoImage = ExpoImage as unknown as jest.Mock; +const expoImage = jest.mocked(ExpoImage); const blurhash = "LEHV6nWB2yk8pyo0adR*.7kCMdnj"; const uri = "https://images.pegada.app/luna.webp"; diff --git a/apps/mobile/src/components/image.tsx b/apps/mobile/src/components/image.tsx index 79b108a..3d038c5 100644 --- a/apps/mobile/src/components/image.tsx +++ b/apps/mobile/src/components/image.tsx @@ -1,4 +1,5 @@ import { forwardRef, type ComponentRef } from "react"; + import { Image as ExpoImage, type ImageProps } from "expo-image"; import { resolveImagePresentationProps } from "./image-props"; @@ -12,8 +13,21 @@ export type LocalImageProps = ImageProps; * would require manually separating every current and future Image prop from * View props, which is how options such as contentFit and onDisplay were lost. */ -export const Image = forwardRef, LocalImageProps>( - ({ source, placeholder, contentFit, placeholderContentFit, cachePolicy, ...props }, ref) => { +export const Image = forwardRef< + ComponentRef, + LocalImageProps +>( + ( + { + source, + placeholder, + contentFit, + placeholderContentFit, + cachePolicy, + ...props + }, + ref, + ) => { const presentationProps = resolveImagePresentationProps({ source, placeholder, diff --git a/apps/mobile/src/components/layout.ts b/apps/mobile/src/components/layout.ts new file mode 100644 index 0000000..b2919d3 --- /dev/null +++ b/apps/mobile/src/components/layout.ts @@ -0,0 +1,25 @@ +import { KeyboardAvoidingView } from "react-native"; + +import styled from "styled-components/native"; + +/** + * The layout primitives that were being written as inline style objects in + * every form screen. `react-native/no-inline-styles` is on, and repeating + * `styled.View\`flex: 1\`` in six `styles.ts` files is worse than naming them + * once. + */ + +/** Takes all the space its parent gives it. */ +export const Fill = styled.View` + flex: 1; +`; + +/** Lays its children out left to right. */ +export const Row = styled.View` + flex-direction: row; +`; + +/** A screen root that grows to the space left over by the keyboard. */ +export const KeyboardScreen = styled(KeyboardAvoidingView)` + flex-grow: 1; +`; diff --git a/apps/mobile/src/components/pressable-area.tsx b/apps/mobile/src/components/pressable-area.tsx index 49fd34d..129a972 100644 --- a/apps/mobile/src/components/pressable-area.tsx +++ b/apps/mobile/src/components/pressable-area.tsx @@ -1,5 +1,7 @@ +import type { PressableProps } from "react-native"; + import * as React from "react"; -import { Pressable, PressableProps } from "react-native"; +import { Pressable } from "react-native"; const ACTIVE_OPACITY = 0.9; export const PressableArea: React.FC = ({ style, ...rest }) => { diff --git a/apps/mobile/src/components/text.ts b/apps/mobile/src/components/text.ts index 5c5b253..2a3e3a9 100644 --- a/apps/mobile/src/components/text.ts +++ b/apps/mobile/src/components/text.ts @@ -1,4 +1,6 @@ -import styled, { css, DefaultTheme as DefaultThemeProps } from "styled-components/native"; +import type { DefaultTheme as DefaultThemeProps } from "styled-components/native"; + +import styled, { css } from "styled-components/native"; export interface TextProps { fontSize?: keyof DefaultThemeProps["typography"]["sizes"]; diff --git a/apps/mobile/src/config.ts b/apps/mobile/src/config.ts index d5ffec0..7326a32 100644 --- a/apps/mobile/src/config.ts +++ b/apps/mobile/src/config.ts @@ -1,10 +1,11 @@ // https://github.com/uuidjs/uuid#getrandomvalues-not-supported import "react-native-get-random-values"; - import { LogBox, Text } from "react-native"; -import mobileAds, { MaxAdContentRating } from "react-native-google-mobile-ads"; + import * as Updates from "expo-updates"; +import mobileAds, { MaxAdContentRating } from "react-native-google-mobile-ads"; + import { config } from "@/services/config"; import { sendError } from "@/services/error-tracking"; import { posthog } from "@/services/posthog"; @@ -21,11 +22,11 @@ mobileAds() mobileAds().initialize().catch(sendError); -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -Text.defaultProps = Text.defaultProps || {}; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore +// oxlint-disable-next-line typescript/ban-ts-comment -- React Native's Text.defaultProps is untyped but is the only way to set app-wide font scaling. +// @ts-expect-error +Text.defaultProps ||= {}; +// oxlint-disable-next-line typescript/ban-ts-comment -- React Native's Text.defaultProps is untyped but is the only way to set app-wide font scaling. +// @ts-expect-error Text.defaultProps.allowFontScaling = false; // Not helpful as there is nothing I can do about them @@ -37,9 +38,10 @@ LogBox.ignoreLogs([ // Attach env + release to every event (analytics and errors), the way // Bugsnag's releaseStage / metadata used to. codeBundleId ties errors to // the exact OTA update group. -const manifest = Updates.manifest; +const { manifest } = Updates; const metadata = "metadata" in manifest ? manifest.metadata : undefined; -const updateGroup = metadata && "updateGroup" in metadata ? metadata.updateGroup : undefined; +const updateGroup = + metadata && "updateGroup" in metadata ? metadata.updateGroup : undefined; posthog.register({ environment: config.ENV, diff --git a/apps/mobile/src/contexts/theme-provider.tsx b/apps/mobile/src/contexts/theme-provider.tsx index f363db9..e65f0b3 100644 --- a/apps/mobile/src/contexts/theme-provider.tsx +++ b/apps/mobile/src/contexts/theme-provider.tsx @@ -1,21 +1,25 @@ +import type { StorageDataTypes } from "@/services/storage"; + +import type { ColorSchemeName } from "react-native"; + import { useContext, useEffect, useMemo, useState } from "react"; import * as React from "react"; -import { Appearance, ColorSchemeName, Platform, Settings, useColorScheme } from "react-native"; +import { Appearance, Platform, Settings, useColorScheme } from "react-native"; + +import * as SystemUI from "expo-system-ui"; + +import { DarkTheme, LightTheme } from "@pegada/shared/themes/themes"; import { DarkTheme as NavigationDarkTheme, DefaultTheme as NavigationLightTheme, ThemeProvider as NavigationThemeProvider, } from "@react-navigation/native"; -import * as SystemUI from "expo-system-ui"; import { ThemeProvider as StyledThemeProvider } from "styled-components/native"; -import { DarkTheme, LightTheme } from "@pegada/shared/themes/themes"; - import { sendError } from "@/services/error-tracking"; import { deleteData, getData, - StorageDataTypes, StorageKeys, storeData, Theme, @@ -33,12 +37,12 @@ export type ActiveTheme = StorageDataTypes[StorageKeys.Theme] | null; // (see app/_layout.tsx), so the first visible frame already uses the right // theme instead of painting the system one and then flipping — the // white/dark "blink" at boot. -export const storedThemePromise: Promise = getData(StorageKeys.Theme).catch( - (error) => { - sendError(error); - return null; - }, -); +export const storedThemePromise: Promise = getData( + StorageKeys.Theme, +).catch((error) => { + sendError(error); + return null; +}); // Mirrors the forced theme into iOS UserDefaults so the native layer can // apply it to the window BEFORE the splash screen renders on the next cold @@ -63,7 +67,9 @@ export const useActiveTheme = () => { return context; }; -export const ThemeProvider: React.FC<{ children: React.ReactElement }> = ({ children }) => { +export const ThemeProvider: React.FC<{ children: React.ReactElement }> = ({ + children, +}) => { const colorScheme = useColorScheme(); const [activeTheme, setActiveTheme] = useState(null); @@ -71,7 +77,8 @@ export const ThemeProvider: React.FC<{ children: React.ReactElement }> = ({ chil useEffect(() => { const applyStoredTheme = async () => { const storedTheme = await storedThemePromise; - if (storedTheme) Appearance.setColorScheme(storedTheme as ColorSchemeName); + if (storedTheme) + Appearance.setColorScheme(storedTheme as ColorSchemeName); persistNativeThemeOverride(storedTheme); setActiveTheme(storedTheme); }; @@ -114,7 +121,7 @@ export const ThemeProvider: React.FC<{ children: React.ReactElement }> = ({ chil }; }, [theme]); - const handleActiveThemeChange = async (theme: ActiveTheme) => { + const handleActiveThemeChange = (theme: ActiveTheme) => { if (theme) Appearance.setColorScheme(theme as ColorSchemeName); persistNativeThemeOverride(theme); setActiveTheme(theme); @@ -123,13 +130,13 @@ export const ThemeProvider: React.FC<{ children: React.ReactElement }> = ({ chil return storeData(StorageKeys.Theme, theme); }; + const themeContextValue = useMemo( + () => ({ activeTheme, setActiveTheme: handleActiveThemeChange }), + [activeTheme], + ); + return ( - + {children} diff --git a/apps/mobile/src/contexts/trcp-context.tsx b/apps/mobile/src/contexts/trcp-context.tsx index 0c9084e..2925ada 100644 --- a/apps/mobile/src/contexts/trcp-context.tsx +++ b/apps/mobile/src/contexts/trcp-context.tsx @@ -1,4 +1,4 @@ -import { api } from "./trpc-provider"; +import type { api } from "./trpc-provider"; let trcpContext = undefined as unknown as ReturnType; diff --git a/apps/mobile/src/contexts/trpc-provider.tsx b/apps/mobile/src/contexts/trpc-provider.tsx index 58af7a4..dc80ac1 100644 --- a/apps/mobile/src/contexts/trpc-provider.tsx +++ b/apps/mobile/src/contexts/trpc-provider.tsx @@ -1,15 +1,17 @@ +import type { AppRouter } from "@pegada/api"; + import { useEffect } from "react"; import * as React from "react"; import { Alert } from "react-native"; + import Constants from "expo-constants"; + +import { RequestHeaders } from "@pegada/shared/types/types"; import { QueryClientProvider } from "@tanstack/react-query"; import { httpBatchLink } from "@trpc/client"; import { createTRPCReact } from "@trpc/react-query"; import superjson from "superjson"; -import type { AppRouter } from "@pegada/api"; -import { RequestHeaders } from "@pegada/shared/types/types"; - import { setTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { config } from "@/services/config"; @@ -24,18 +26,18 @@ export { type RouterInputs, type RouterOutputs } from "@pegada/api"; */ export const api = createTRPCReact(); -type ResponseJSON = { +interface ResponseJSON { error?: { json?: { message?: string; }; }; -}; +} export const trpcQueryClient = api.createClient({ links: [ httpBatchLink({ - url: config.API_URL + "/trpc", + url: `${config.API_URL}/trpc`, transformer: superjson, headers: async () => { const headers = new Map(); @@ -77,7 +79,10 @@ export const trpcQueryClient = api.createClient({ }); if (unauthorized) { - Alert.alert(i18n.t("session.expired"), i18n.t("session.expiredMessage")); + Alert.alert( + i18n.t("session.expired"), + i18n.t("session.expiredMessage"), + ); throw logout(); } } @@ -85,7 +90,7 @@ export const trpcQueryClient = api.createClient({ return { ...res, // Already decoded here - json: async () => responsesJSON, + json: () => Promise.resolve(responsesJSON), }; }, }), diff --git a/apps/mobile/src/hooks/use-current-city-text.tsx b/apps/mobile/src/hooks/use-current-city-text.tsx index 8cfa92f..425ef36 100644 --- a/apps/mobile/src/hooks/use-current-city-text.tsx +++ b/apps/mobile/src/hooks/use-current-city-text.tsx @@ -11,7 +11,9 @@ export const useCurrentCityText = () => { const hasLatLng = myDog?.user?.latitude && myDog.user?.longitude; - const currentCityFallback = hasLatLng ? t("common.nearYou") : t("common.unknown"); + const currentCityFallback = hasLatLng + ? t("common.nearYou") + : t("common.unknown"); const currentCityText = myDog?.user?.city ?? currentCityFallback; diff --git a/apps/mobile/src/hooks/use-delayed-header-height.tsx b/apps/mobile/src/hooks/use-delayed-header-height.tsx index 45a2c6e..e50d193 100644 --- a/apps/mobile/src/hooks/use-delayed-header-height.tsx +++ b/apps/mobile/src/hooks/use-delayed-header-height.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from "react"; + import { useHeaderHeight } from "@react-navigation/elements"; /** diff --git a/apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx b/apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx index 009fb89..7e4aab5 100644 --- a/apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx +++ b/apps/mobile/src/hooks/use-keyboard-aware-safe-area-insets.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from "react"; import { Keyboard } from "react-native"; + import { useSafeAreaInsets } from "react-native-safe-area-context"; export const useKeyboardAwareSafeAreaInsets = () => { @@ -7,11 +8,13 @@ export const useKeyboardAwareSafeAreaInsets = () => { const [keyboardOpen, setKeyboardOpen] = useState(false); useEffect(() => { - const keyboardDidShowListener = Keyboard.addListener("keyboardWillShow", () => - setKeyboardOpen(true), + const keyboardDidShowListener = Keyboard.addListener( + "keyboardWillShow", + () => setKeyboardOpen(true), ); - const keyboardDidHideListener = Keyboard.addListener("keyboardWillHide", () => - setKeyboardOpen(false), + const keyboardDidHideListener = Keyboard.addListener( + "keyboardWillHide", + () => setKeyboardOpen(false), ); return () => { diff --git a/apps/mobile/src/hooks/use-payments.tsx b/apps/mobile/src/hooks/use-payments.tsx index 1b5bc69..601928a 100644 --- a/apps/mobile/src/hooks/use-payments.tsx +++ b/apps/mobile/src/hooks/use-payments.tsx @@ -1,5 +1,7 @@ +import type { CustomerInfo, PurchasesPackage } from "react-native-purchases"; + import { useEffect } from "react"; -import { CustomerInfo, PurchasesPackage } from "react-native-purchases"; + import { useSuspenseQuery } from "@tanstack/react-query"; import { identifyUser } from "@/services/get-initial-route-name"; @@ -107,7 +109,7 @@ payments.init(); // Guarded so that a misbehaving / unconfigured RevenueCat (e.g. stub API key) // can't take down the rest of the app at module-import time. try { - payments.addCustomerInfoUpdateListener(async (customerInfo: CustomerInfo) => { + payments.addCustomerInfoUpdateListener((customerInfo: CustomerInfo) => { queryClient.setQueryData([PaymentCacheKey.CustomerInfo], customerInfo); }); } catch { diff --git a/apps/mobile/src/hooks/use-protected-route.ts b/apps/mobile/src/hooks/use-protected-route.ts index f04e68a..19d6645 100644 --- a/apps/mobile/src/hooks/use-protected-route.ts +++ b/apps/mobile/src/hooks/use-protected-route.ts @@ -1,4 +1,5 @@ import { useEffect, useState } from "react"; + import { useSegments } from "expo-router"; import { getInitialRouteName } from "@/services/get-initial-route-name"; diff --git a/apps/mobile/src/hooks/use-track-screens.ts b/apps/mobile/src/hooks/use-track-screens.ts index 4390851..bb5659f 100644 --- a/apps/mobile/src/hooks/use-track-screens.ts +++ b/apps/mobile/src/hooks/use-track-screens.ts @@ -1,4 +1,5 @@ import { useEffect, useRef } from "react"; + import { usePathname } from "expo-router"; import { analytics } from "@/services/analytics"; diff --git a/apps/mobile/src/i18n.ts b/apps/mobile/src/i18n.ts index 0dbad92..88f0c4b 100644 --- a/apps/mobile/src/i18n.ts +++ b/apps/mobile/src/i18n.ts @@ -1,8 +1,12 @@ +import type { LanguageDetectorAsyncModule } from "i18next"; + import { getLocales } from "expo-localization"; -import i18n, { LanguageDetectorAsyncModule } from "i18next"; -import { initReactI18next } from "react-i18next"; +import i18n from "i18next"; + +export { default } from "i18next"; import { initI18n } from "@pegada/shared/i18n/i18n"; +import { initReactI18next } from "react-i18next"; import { sendError } from "./services/error-tracking"; import { getData, StorageKeys, storeData } from "./services/storage"; @@ -39,5 +43,3 @@ const languageDetector: LanguageDetectorAsyncModule = { }; initI18n(i18n.use(languageDetector).use(initReactI18next)).catch(sendError); - -export default i18n; diff --git a/apps/mobile/src/services/advertisement/interstitial.ts b/apps/mobile/src/services/advertisement/interstitial.ts index 08daf41..b8ac900 100644 --- a/apps/mobile/src/services/advertisement/interstitial.ts +++ b/apps/mobile/src/services/advertisement/interstitial.ts @@ -1,6 +1,11 @@ import { useEffect } from "react"; import { Platform } from "react-native"; -import { AdEventType, InterstitialAd, TestIds } from "react-native-google-mobile-ads"; + +import { + AdEventType, + InterstitialAd, + TestIds, +} from "react-native-google-mobile-ads"; import { useUnsafeIsPremium } from "@/hooks/use-payments"; import { analytics } from "@/services/analytics"; @@ -56,7 +61,10 @@ export const createForAdRequestTracked = ( const adLoadedPromise = waitForEvent(AdEventType.LOADED); // Used to catch errors before the AD is loaded - const removeErrorListener = interstitial.addAdEventListener(AdEventType.ERROR, sendError); + const removeErrorListener = interstitial.addAdEventListener( + AdEventType.ERROR, + sendError, + ); const safeLoadAndShow = async () => { try { @@ -72,8 +80,8 @@ export const createForAdRequestTracked = ( await interstitial.show(); await adClosedPromise; - } catch (err) { - sendError(err); + } catch (error) { + sendError(error); } finally { interstitial.removeAllListeners(); } @@ -107,7 +115,10 @@ export const useForAdRequestTracked: typeof createForAdRequestTracked = ( interstitialAdIds, keywords, ) => { - const result = useCreateFreeOnlyForAdRequestTracked(interstitialAdIds, keywords); + const result = useCreateFreeOnlyForAdRequestTracked( + interstitialAdIds, + keywords, + ); useEffect(() => { result.interstitial.load(); diff --git a/apps/mobile/src/services/analytics/index.ts b/apps/mobile/src/services/analytics/index.ts index 0123390..221521b 100644 --- a/apps/mobile/src/services/analytics/index.ts +++ b/apps/mobile/src/services/analytics/index.ts @@ -12,15 +12,15 @@ type LooseProperties = Record; const toEventProperties = (properties?: LooseProperties) => properties as EventProperties | undefined; -type TrackEvent = { +interface TrackEvent { event_type: string; event_properties?: LooseProperties; -}; +} -type ScreenViewed = { +interface ScreenViewed { screen: string; referringScreen?: string; -}; +} // Keeps the Amplitude-era call shape (`{ event_type, event_properties }`) // so the existing call sites don't change, mapping it onto PostHog's diff --git a/apps/mobile/src/services/app-review.tsx b/apps/mobile/src/services/app-review.tsx index e033b6e..d617870 100644 --- a/apps/mobile/src/services/app-review.tsx +++ b/apps/mobile/src/services/app-review.tsx @@ -1,10 +1,12 @@ import { useEffect } from "react"; import * as React from "react"; import { KeyboardAvoidingView, Platform } from "react-native"; -import { magicModal, useMagicModal } from "react-native-magic-modal"; -import { magicToast } from "react-native-magic-toast"; + import * as StoreReview from "expo-store-review"; + import { useTranslation } from "react-i18next"; +import { magicModal, useMagicModal } from "react-native-magic-modal"; +import { magicToast } from "react-native-magic-toast"; import { useTheme } from "styled-components"; import styled from "styled-components/native"; @@ -80,7 +82,9 @@ const NotLikingTheAppModal: React.FC = () => { }; return ( - + {t("appReview.notLikingTheAppModal.title")} @@ -96,7 +100,9 @@ const NotLikingTheAppModal: React.FC = () => { placeholder={t("appReview.notLikingTheAppModal.placeholder")} /> - {t("appReview.notLikingTheAppModal.send")} + + {t("appReview.notLikingTheAppModal.send")} + @@ -140,7 +146,9 @@ const AreYouLikingTheAppModal: React.FC = () => { return ( {t("appReview.areYouLikingTheAppModal.title")} - {t("appReview.areYouLikingTheAppModal.description")} + + {t("appReview.areYouLikingTheAppModal.description")} + {t("appReview.areYouLikingTheAppModal.no")} diff --git a/apps/mobile/src/services/config.ts b/apps/mobile/src/services/config.ts index 20c0599..2171d40 100644 --- a/apps/mobile/src/services/config.ts +++ b/apps/mobile/src/services/config.ts @@ -22,15 +22,17 @@ const _config = configSchema.safeParse({ POSTHOG_API_KEY: process.env.EXPO_PUBLIC_POSTHOG_API_KEY, POSTHOG_HOST: process.env.EXPO_PUBLIC_POSTHOG_HOST, IOS_GOOGLE_MAPS_API_KEY: process.env.EXPO_PUBLIC_IOS_GOOGLE_MAPS_API_KEY, - ANDROID_GOOGLE_MAPS_API_KEY: process.env.EXPO_PUBLIC_ANDROID_GOOGLE_MAPS_API_KEY, + ANDROID_GOOGLE_MAPS_API_KEY: + process.env.EXPO_PUBLIC_ANDROID_GOOGLE_MAPS_API_KEY, REVENUE_CAT_IOS_API_KEY: process.env.EXPO_PUBLIC_REVENUE_CAT_IOS_API_KEY, - REVENUE_CAT_ANDROID_API_KEY: process.env.EXPO_PUBLIC_REVENUE_CAT_ANDROID_API_KEY, + REVENUE_CAT_ANDROID_API_KEY: + process.env.EXPO_PUBLIC_REVENUE_CAT_ANDROID_API_KEY, API_URL: process.env.EXPO_PUBLIC_API_URL, MAESTRO_E2E: process.env.EXPO_PUBLIC_MAESTRO_E2E, }); if (!_config.success) { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console -- The process is about to throw on invalid env; this is the only way to say why. console.error("❌ Invalid environment variables", _config.error.format()); throw new Error("Invalid environment variables."); } @@ -43,7 +45,9 @@ if (!_config.success) { * URL always hits the handler directly, regardless of the built env value. */ const normalizeApiUrl = (raw: string): string => - raw.replace(/\/+$/, "").replace(/^(https?:\/\/)pegada\.app(\/|$)/, "$1www.pegada.app$2"); + raw + .replace(/\/+$/, "") + .replace(/^(https?:\/\/)pegada\.app(\/|$)/, "$1www.pegada.app$2"); export const config = { ..._config.data, diff --git a/apps/mobile/src/services/error-tracking.ts b/apps/mobile/src/services/error-tracking.ts index f6948c4..bc02436 100644 --- a/apps/mobile/src/services/error-tracking.ts +++ b/apps/mobile/src/services/error-tracking.ts @@ -1,10 +1,10 @@ import { config } from "./config"; import { posthog } from "./posthog"; -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any -- Anything can be thrown, and this is the boundary that has to accept it. export const sendError = (error: any) => { if (config.ENV === "development") { - // eslint-disable-next-line no-console + // oxlint-disable-next-line no-console -- Development-only mirror of what gets reported to PostHog. console.error(error); } else { posthog.captureException(error); diff --git a/apps/mobile/src/services/get-error.ts b/apps/mobile/src/services/get-error.ts index 7378d06..e07e193 100644 --- a/apps/mobile/src/services/get-error.ts +++ b/apps/mobile/src/services/get-error.ts @@ -1,21 +1,31 @@ import { get } from "lodash"; -type GenericClass = new (...args: any[]) => any; +type GenericClass = new (...args: never[]) => unknown; + +/** + * Recover a typed error from something the tRPC client threw. + * + * `instanceof` only works locally: over the wire the class is gone and all + * that survives is the `error_code` the server put in the payload, so both + * paths have to be checked. + */ export const getError = < T extends GenericClass & { error_code: string; }, >( - error: any, + error: unknown, instance: T, ): InstanceType | undefined => { if (error instanceof instance) { - return error; + return error as InstanceType; } const errorCode = get(error, "data.error.error_code"); if (errorCode === instance.error_code) { - return error.data.error; + return get(error, "data.error") as InstanceType; } + + return undefined; }; diff --git a/apps/mobile/src/services/get-initial-route-name.ts b/apps/mobile/src/services/get-initial-route-name.ts index 1386c20..107e282 100644 --- a/apps/mobile/src/services/get-initial-route-name.ts +++ b/apps/mobile/src/services/get-initial-route-name.ts @@ -1,18 +1,22 @@ import { Platform } from "react-native"; + import Constants from "expo-constants"; import { getTrcpContext } from "@/contexts/trcp-context"; import { analytics } from "@/services/analytics"; import { getLoggedUserID } from "@/services/get-logged-user-id"; import { SceneName } from "@/types/scene-name"; + import { sendError } from "./error-tracking"; -export const identifyUser = async (props: Parameters[1]) => { +export const identifyUser = async ( + props: Parameters[1], +) => { try { const userId = await getLoggedUserID(); return analytics.identify(userId, props); - } catch (e) { - sendError(e); + } catch (error) { + sendError(error); } }; @@ -26,7 +30,8 @@ export const trackUser = () => { export const getInitialRouteName = async () => { try { - const { authenticated, forceUpdate } = await getTrcpContext().client.echo.get.query(); + const { authenticated, forceUpdate } = + await getTrcpContext().client.echo.get.query(); if (forceUpdate) { return SceneName.ForceUpdate; @@ -47,8 +52,8 @@ export const getInitialRouteName = async () => { } return SceneName.Swipe; - } catch (e) { - sendError(e); + } catch (error) { + sendError(error); return SceneName.SignIn; } }; diff --git a/apps/mobile/src/services/get-logged-user-id.ts b/apps/mobile/src/services/get-logged-user-id.ts index 1e0305e..6ac7996 100644 --- a/apps/mobile/src/services/get-logged-user-id.ts +++ b/apps/mobile/src/services/get-logged-user-id.ts @@ -1,6 +1,5 @@ // Necessary for jwt-decode to work with react-native import "@react-native-anywhere/polyfill-base64"; - import { jwtDecode } from "jwt-decode"; import { getData, StorageKeys } from "./storage"; diff --git a/apps/mobile/src/services/get-mime-type.ts b/apps/mobile/src/services/get-mime-type.ts index 30aa05c..fd697dc 100644 --- a/apps/mobile/src/services/get-mime-type.ts +++ b/apps/mobile/src/services/get-mime-type.ts @@ -1,8 +1,9 @@ +import type { ImagePickerAsset } from "expo-image-picker"; + import mime from "react-native-mime-types"; -import { ImagePickerAsset } from "expo-image-picker"; const getMimeTypeFromUri = (uri: string) => { - const fileName = uri?.substring(uri.lastIndexOf("/") + 1, uri.length); + const fileName = uri?.slice(uri.lastIndexOf("/") + 1); const mimeByFileName = mime.lookup(fileName); if (mimeByFileName) { return mimeByFileName; diff --git a/apps/mobile/src/services/get-push-notification-token.ts b/apps/mobile/src/services/get-push-notification-token.ts index e0a2dec..32c67cd 100644 --- a/apps/mobile/src/services/get-push-notification-token.ts +++ b/apps/mobile/src/services/get-push-notification-token.ts @@ -1,8 +1,8 @@ import { Platform } from "react-native"; + import Constants from "expo-constants"; import * as Device from "expo-device"; import * as Notifications from "expo-notifications"; -import Color from "color"; import { NOTIFICATION_ACTION, @@ -10,18 +10,20 @@ import { NOTIFICATION_CHANNEL, } from "@pegada/shared/constants/notifications"; import { LightTheme } from "@pegada/shared/themes/themes"; +import Color from "color"; import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; Notifications.setNotificationHandler({ - handleNotification: async () => ({ - shouldShowAlert: true, - shouldShowBanner: true, - shouldShowList: true, - shouldPlaySound: false, - shouldSetBadge: false, - }), + handleNotification: () => + Promise.resolve({ + shouldShowAlert: true, + shouldShowBanner: true, + shouldShowList: true, + shouldPlaySound: false, + shouldSetBadge: false, + }), }); export enum NotificationTokenError { @@ -32,16 +34,19 @@ export enum NotificationTokenError { // platforms, so the user can answer straight from the notification // without opening the app. Handled in `services/linking`. const registerNotificationCategories = async () => { - await Notifications.setNotificationCategoryAsync(NOTIFICATION_CATEGORY.ChatMessage, [ - { - identifier: NOTIFICATION_ACTION.Reply, - buttonTitle: i18n.t("chat.replyAction"), - textInput: { - submitButtonTitle: i18n.t("chat.replyAction"), - placeholder: "", + await Notifications.setNotificationCategoryAsync( + NOTIFICATION_CATEGORY.ChatMessage, + [ + { + identifier: NOTIFICATION_ACTION.Reply, + buttonTitle: i18n.t("chat.replyAction"), + textInput: { + submitButtonTitle: i18n.t("chat.replyAction"), + placeholder: "", + }, }, - }, - ]); + ], + ); }; export const getPushNotificationToken = async () => { @@ -52,17 +57,20 @@ export const getPushNotificationToken = async () => { name: "default", importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], - lightColor: Color(LightTheme.colors.primary).alpha(0.7).hex(), + lightColor: new Color(LightTheme.colors.primary).alpha(0.7).hex(), }); // Dedicated channel for chat-message pushes, matched server-side by the // same shared id (see MessageService). - await Notifications.setNotificationChannelAsync(NOTIFICATION_CHANNEL.ChatMessage, { - name: i18n.t("chat.notificationChannelName"), - importance: Notifications.AndroidImportance.MAX, - vibrationPattern: [0, 250, 250, 250], - lightColor: Color(LightTheme.colors.primary).alpha(0.7).hex(), - }); + await Notifications.setNotificationChannelAsync( + NOTIFICATION_CHANNEL.ChatMessage, + { + name: i18n.t("chat.notificationChannelName"), + importance: Notifications.AndroidImportance.MAX, + vibrationPattern: [0, 250, 250, 250], + lightColor: new Color(LightTheme.colors.primary).alpha(0.7).hex(), + }, + ); } await registerNotificationCategories(); diff --git a/apps/mobile/src/services/haptics.ts b/apps/mobile/src/services/haptics.ts index 46ef487..1c57170 100644 --- a/apps/mobile/src/services/haptics.ts +++ b/apps/mobile/src/services/haptics.ts @@ -1,4 +1,5 @@ import { Platform } from "react-native"; + import * as Haptics from "expo-haptics"; import { sendError } from "@/services/error-tracking"; diff --git a/apps/mobile/src/services/linking/handlers/initial-notification.ts b/apps/mobile/src/services/linking/handlers/initial-notification.ts index 9be0ba0..e449f69 100644 --- a/apps/mobile/src/services/linking/handlers/initial-notification.ts +++ b/apps/mobile/src/services/linking/handlers/initial-notification.ts @@ -1,5 +1,15 @@ -export let initialNotification: string | undefined; +/** + * The notification URL the app was cold-launched from, if any. + * + * Held in a module-local binding with an accessor rather than exported as a + * `let`: a re-exported mutable binding is a live view of someone else's + * variable, which is exactly the shape `import/no-mutable-exports` exists to + * stop, and callers only ever need "read it" and "clear it". + */ +let initialNotificationUrl: string | undefined; + +export const getInitialNotification = () => initialNotificationUrl; export const setInitialNotification = (url?: string) => { - initialNotification = url; + initialNotificationUrl = url; }; diff --git a/apps/mobile/src/services/linking/handlers/notification.ts b/apps/mobile/src/services/linking/handlers/notification.ts index ed32531..b6e8ebc 100644 --- a/apps/mobile/src/services/linking/handlers/notification.ts +++ b/apps/mobile/src/services/linking/handlers/notification.ts @@ -1,4 +1,5 @@ -import * as Notifications from "expo-notifications"; +import type * as Notifications from "expo-notifications"; + import { router } from "expo-router"; import { sendError } from "@/services/error-tracking"; @@ -19,21 +20,21 @@ const handleUnknownNotification = (url: string) => { sendError(new Error(`Unknown notification: ${url}`)); }; -const handleMatchNotification = async (matchId: string, dogId: string) => { +const handleMatchNotification = (matchId: string, dogId: string) => { return router.push({ pathname: SceneName.NewMatch, - params: { matchDogId: dogId, matchId: matchId }, + params: { matchDogId: dogId, matchId }, }); }; -const handleChatNotification = async (matchId: string, dogId: string) => { +const handleChatNotification = (matchId: string, dogId: string) => { return router.push({ pathname: `${SceneName.Chat}/[matchId]`, params: { dogId, matchId }, }); }; -export const customNotificationHandler = async (url?: string) => { +export const customNotificationHandler = (url?: string) => { if (!url) return; if (url.startsWith(NotificationUrl.Match)) { diff --git a/apps/mobile/src/services/linking/handlers/reply.test.ts b/apps/mobile/src/services/linking/handlers/reply.test.ts index 18a6c2e..1d07b10 100644 --- a/apps/mobile/src/services/linking/handlers/reply.test.ts +++ b/apps/mobile/src/services/linking/handlers/reply.test.ts @@ -1,23 +1,56 @@ import * as Notifications from "expo-notifications"; -import { NOTIFICATION_ACTION, NOTIFICATION_CATEGORY } from "@pegada/shared/constants/notifications"; +import { + NOTIFICATION_ACTION, + NOTIFICATION_CATEGORY, +} from "@pegada/shared/constants/notifications"; import { getTrcpContext } from "@/contexts/trcp-context"; import { sendError } from "@/services/error-tracking"; + import { getMatchIdFromUrl, handleReplyAction, isReplyAction } from "./reply"; -jest.mock("expo-notifications", () => ({ scheduleNotificationAsync: jest.fn() })); +// `Partial<...>` rather than the bare module type: these factories replace the +// one export each test touches, and typing them as the whole module would +// demand a full reimplementation of expo-notifications. +jest.mock>( + "expo-notifications", + () => ({ + scheduleNotificationAsync: jest.fn(), + }), +); // Pulled in transitively by ./notification, and untransformed by jest. -jest.mock("expo-router", () => ({ router: { push: jest.fn() } })); -jest.mock("@/contexts/trcp-context", () => ({ getTrcpContext: jest.fn() })); -jest.mock("@/services/error-tracking", () => ({ sendError: jest.fn() })); -jest.mock("@/i18n", () => ({ __esModule: true, default: { t: (key: string) => key } })); +jest.mock>("expo-router", () => ({ + router: { push: jest.fn() } as unknown as typeof import("expo-router").router, +})); +jest.mock>( + "@/contexts/trcp-context", + () => ({ + getTrcpContext: jest.fn(), + }), +); +jest.mock>( + "@/services/error-tracking", + () => ({ + sendError: jest.fn(), + }), +); +jest.mock>("@/i18n", () => ({ + __esModule: true, + default: { + t: (key: string) => key, + } as unknown as typeof import("@/i18n").default, +})); const mutate = jest.fn(); -const scheduleNotificationAsync = Notifications.scheduleNotificationAsync as jest.Mock; -const sendErrorMock = sendError as jest.Mock; +const scheduleNotificationAsync = jest.mocked( + Notifications.scheduleNotificationAsync, +); +const sendErrorMock = jest.mocked(sendError); -(getTrcpContext as jest.Mock).mockReturnValue({ client: { message: { send: { mutate } } } }); +jest.mocked(getTrcpContext).mockReturnValue({ + client: { message: { send: { mutate } } }, +} as unknown as ReturnType); const response = (overrides: { actionIdentifier?: string; @@ -31,29 +64,32 @@ const response = (overrides: { notification: { request: { content: { - categoryIdentifier: overrides.categoryIdentifier ?? NOTIFICATION_CATEGORY.ChatMessage, + categoryIdentifier: + overrides.categoryIdentifier ?? NOTIFICATION_CATEGORY.ChatMessage, data: { url: overrides.url ?? "chat/match-1/dog-2" }, }, }, }, }) as unknown as Notifications.NotificationResponse; -beforeEach(() => { - jest.clearAllMocks(); -}); - describe("isReplyAction", () => { - test("only claims a reply on the chat-message category", () => { + it("only claims a reply on the chat-message category", () => { expect(isReplyAction(response({}))).toBe(true); expect( - isReplyAction(response({ actionIdentifier: "expo.modules.notifications.actions.DEFAULT" })), + isReplyAction( + response({ + actionIdentifier: "expo.modules.notifications.actions.DEFAULT", + }), + ), ).toBe(false); - expect(isReplyAction(response({ categoryIdentifier: "match" }))).toBe(false); + expect(isReplyAction(response({ categoryIdentifier: "match" }))).toBe( + false, + ); }); }); describe("getMatchIdFromUrl", () => { - test.each([ + it.each([ ["chat/match-1/dog-2", "match-1"], ["match/match-1/dog-2", undefined], [undefined, undefined], @@ -63,14 +99,17 @@ describe("getMatchIdFromUrl", () => { }); describe("handleReplyAction", () => { - test("sends the typed text to the match the push came from", async () => { + it("sends the typed text to the match the push came from", async () => { await handleReplyAction(response({ userText: " on my way " })); - expect(mutate).toHaveBeenCalledWith({ matchId: "match-1", content: "on my way" }); + expect(mutate).toHaveBeenCalledWith({ + matchId: "match-1", + content: "on my way", + }); expect(scheduleNotificationAsync).not.toHaveBeenCalled(); }); - test.each([ + it.each([ ["empty text", { userText: " " }], ["a non-chat url", { userText: "hi", url: "match/match-1/dog-2" }], ])("reports %s instead of sending", async (_label, overrides) => { @@ -80,7 +119,7 @@ describe("handleReplyAction", () => { expect(sendErrorMock).toHaveBeenCalled(); }); - test("tells the user when the send fails, since the notification is already gone", async () => { + it("tells the user when the send fails, since the notification is already gone", async () => { const error = new Error("offline"); mutate.mockRejectedValueOnce(error); diff --git a/apps/mobile/src/services/linking/handlers/reply.ts b/apps/mobile/src/services/linking/handlers/reply.ts index 29ea3d8..ecd17b7 100644 --- a/apps/mobile/src/services/linking/handlers/reply.ts +++ b/apps/mobile/src/services/linking/handlers/reply.ts @@ -1,10 +1,14 @@ import * as Notifications from "expo-notifications"; -import { NOTIFICATION_ACTION, NOTIFICATION_CATEGORY } from "@pegada/shared/constants/notifications"; +import { + NOTIFICATION_ACTION, + NOTIFICATION_CATEGORY, +} from "@pegada/shared/constants/notifications"; import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { sendError } from "@/services/error-tracking"; + import { getNotificationUrl, NotificationUrl } from "./notification"; // Chat-message pushes carry `chat//` in `data.url` (see @@ -46,13 +50,17 @@ const warnReplyFailed = () => * on the action) brings it to the foreground first so this can run; there is no * reliable way with expo-notifications alone to send the reply without that. */ -export const handleReplyAction = async (response: Notifications.NotificationResponse) => { +export const handleReplyAction = async ( + response: Notifications.NotificationResponse, +) => { const content = response.userText?.trim(); const url = getNotificationUrl(response); const matchId = getMatchIdFromUrl(url); if (!content || !matchId) { - sendError(new Error("Invalid reply notification: missing content or matchId")); + sendError( + new Error("Invalid reply notification: missing content or matchId"), + ); return; } diff --git a/apps/mobile/src/services/linking/index.ts b/apps/mobile/src/services/linking/index.ts index 37cb7b3..67b18ea 100644 --- a/apps/mobile/src/services/linking/index.ts +++ b/apps/mobile/src/services/linking/index.ts @@ -1,30 +1,50 @@ import { useEffect } from "react"; + import * as Notifications from "expo-notifications"; import { sendError } from "@/services/error-tracking"; -import { initialNotification, setInitialNotification } from "./handlers/initial-notification"; -import { customNotificationHandler, getNotificationUrl } from "./handlers/notification"; + +import { + getInitialNotification, + setInitialNotification, +} from "./handlers/initial-notification"; +import { + customNotificationHandler, + getNotificationUrl, +} from "./handlers/notification"; import { handleReplyAction, isReplyAction } from "./handlers/reply"; export const processLinks = () => { + const initialNotification = getInitialNotification(); + if (initialNotification) { - customNotificationHandler(initialNotification).catch(sendError); + // The handler is synchronous — expo-router's push is — so a rejected + // promise was never the failure mode here; a thrown "Invalid notification + // url" was, and `.catch` never saw it. + try { + customNotificationHandler(initialNotification); + } catch (error) { + sendError(error); + } } setInitialNotification(undefined); // When the app is already running, and the user clicks on a notification - const notificationSubscription = Notifications.addNotificationResponseReceivedListener( - (response) => { + const notificationSubscription = + Notifications.addNotificationResponseReceivedListener((response) => { // The "Reply" action is already handled by the root listener in // `useGetInitialNotifications` - skip it here so we don't send the // message twice or navigate into the chat the user didn't tap into. if (isReplyAction(response)) return; const url = getNotificationUrl(response); - customNotificationHandler(url).catch(sendError); - }, - ); + try { + customNotificationHandler(url); + } catch (error) { + sendError(error); + } + }); return { remove: () => { @@ -47,21 +67,21 @@ export const useGetInitialNotifications = () => { // NotificationCenterManager.pendingResponses on iOS and // NotificationManager's listener replay on Android). Sending from the // listener alone silently dropped the message. - if (isReplyAction(response)) { - handleReplyAction(response).catch(sendError); - return; - } + // Returned rather than chained: the outer `.catch` below is the one + // error path, and a nested `.catch` here is a second one nobody reads. + if (isReplyAction(response)) return handleReplyAction(response); const url = getNotificationUrl(response); setInitialNotification(url); + return undefined; }) .catch(sendError); // Registered here (root, mounted for the whole app lifetime) rather // than in `processLinks`, so the "Reply" action on a chat-message push // is handled even if the user never navigates to the Swipe screen. - const notificationSubscription = Notifications.addNotificationResponseReceivedListener( - (response) => { + const notificationSubscription = + Notifications.addNotificationResponseReceivedListener((response) => { if (isReplyAction(response)) { handleReplyAction(response).catch(sendError); return; @@ -69,8 +89,7 @@ export const useGetInitialNotifications = () => { const url = getNotificationUrl(response); setInitialNotification(url); - }, - ); + }); return () => { notificationSubscription.remove(); diff --git a/apps/mobile/src/services/logout.ts b/apps/mobile/src/services/logout.ts index 365c6ed..16e7c17 100644 --- a/apps/mobile/src/services/logout.ts +++ b/apps/mobile/src/services/logout.ts @@ -7,6 +7,7 @@ import { queryClient } from "@/services/query-client"; import { store } from "@/store"; import { Actions } from "@/store/reducers/dogs"; import { SceneName } from "@/types/scene-name"; + import { setInitialNotification } from "./linking/handlers/initial-notification"; import { deleteData, StorageKeys } from "./storage"; diff --git a/apps/mobile/src/services/mask-date.tsx b/apps/mobile/src/services/mask-date.tsx index 5c22893..db3ce18 100644 --- a/apps/mobile/src/services/mask-date.tsx +++ b/apps/mobile/src/services/mask-date.tsx @@ -3,10 +3,10 @@ export const maskDate = (input: string): string => { const dateRegex = new RegExp(/^\d{0,2}\/?\d{0,2}\/?\d{0,4}$/); let maskedInput = input - .replace(/[^\d]/g, "") // Remove any non-digit characters + .replaceAll(/[^\d]/g, "") // Remove any non-digit characters .slice(0, 8); // Limit to a maximum of 8 digits - if (!dateRegex.exec(maskedInput)) { + if (!dateRegex.test(maskedInput)) { return ""; // If the input doesn't match the regex, return an empty string } diff --git a/apps/mobile/src/services/matchesWidget/avatars.ts b/apps/mobile/src/services/matchesWidget/avatars.ts index a37f73d..eac87cb 100644 --- a/apps/mobile/src/services/matchesWidget/avatars.ts +++ b/apps/mobile/src/services/matchesWidget/avatars.ts @@ -1,14 +1,15 @@ import { Platform } from "react-native"; + import { Directory, File, Paths } from "expo-file-system"; import { WIDGET_APP_GROUP } from "../../../modules/pegada-widget"; const AVATARS_DIRECTORY_NAME = "widget-avatars"; -export type WidgetAvatarSource = { +export interface WidgetAvatarSource { dogId: string; url: string | undefined; -}; +} /** * Platform-split storage backend for the widget avatars. @@ -37,17 +38,25 @@ const getAvatarsDirectory = (): Directory | null => { }; // Native file APIs (UIImage/BitmapFactory) expect plain paths, not file:// URIs. -const toNativePath = (file: File) => decodeURI(file.uri).replace(/^file:\/\//, ""); +const toNativePath = (file: File) => + decodeURI(file.uri).replace(/^file:\/\//, ""); -// Tiny stable hash (djb2) so a dog changing its main photo produces a new -// cache filename, and the stale one gets swept below. +/** + * Tiny stable hash (djb2) so a dog changing its main photo produces a new + * cache filename, and the stale one gets swept below. + * + * The bitwise operators are the algorithm, not a micro-optimisation: `^` is + * what mixes each character in and `>>> 0` is what makes the result unsigned. + */ +/* oxlint-disable no-bitwise -- djb2 is defined in terms of xor and an unsigned shift */ const hash = (value: string) => { let result = 5381; for (let index = 0; index < value.length; index++) { - result = (result * 33) ^ value.charCodeAt(index); + result = (result * 33) ^ (value.codePointAt(index) ?? 0); } return (result >>> 0).toString(36); }; +/* oxlint-enable no-bitwise */ /** * Downloads (at most 3, enforced by the caller) avatars into the widget diff --git a/apps/mobile/src/services/matchesWidget/index.ts b/apps/mobile/src/services/matchesWidget/index.ts index 9a96234..5ab4837 100644 --- a/apps/mobile/src/services/matchesWidget/index.ts +++ b/apps/mobile/src/services/matchesWidget/index.ts @@ -1,12 +1,13 @@ +import type { WidgetSnapshot } from "../../../modules/pegada-widget"; import type { RouterOutputs } from "@pegada/api"; +import i18n from "@/i18n"; +import { sendError } from "@/services/error-tracking"; + import { isWidgetModuleAvailable, setWidgetSnapshot, - WidgetSnapshot, } from "../../../modules/pegada-widget"; -import i18n from "@/i18n"; -import { sendError } from "@/services/error-tracking"; import { clearWidgetAvatars, downloadWidgetAvatars } from "./avatars"; type Matches = RouterOutputs["match"]["getAll"]; @@ -44,7 +45,9 @@ export const syncMatchesWidget = async (matches: Matches): Promise => { try { const waiting = matches.filter(isWaitingForReply); - const dogsOnWidget = waiting.slice(0, MAX_WIDGET_DOGS).map((match) => match.dog); + const dogsOnWidget = waiting + .slice(0, MAX_WIDGET_DOGS) + .map((match) => match.dog); const avatarPathByDogId = await downloadWidgetAvatars( dogsOnWidget.map((dog) => ({ dogId: dog.id, url: dog.images[0]?.url })), @@ -60,7 +63,8 @@ export const syncMatchesWidget = async (matches: Matches): Promise => { // Only meaningful alongside the "waiting for reply" state: layouts // that render the count as its own numeral (MEDIUM) use this instead // of `message` so the count isn't shown twice. - messageCountless: waiting.length > 0 ? i18n.t("widget.waitingForReplyCountless") : null, + messageCountless: + waiting.length > 0 ? i18n.t("widget.waitingForReplyCountless") : null, dogs: dogsOnWidget.map((dog) => ({ name: dog.name, avatar: avatarPathByDogId.get(dog.id) ?? null, diff --git a/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts b/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts index d163fda..238146f 100644 --- a/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts +++ b/apps/mobile/src/services/matchesWidget/use-matches-widget-sync.ts @@ -1,8 +1,11 @@ +import type { AppStateStatus } from "react-native"; + import { useEffect } from "react"; -import { AppState, AppStateStatus } from "react-native"; +import { AppState } from "react-native"; import { api } from "@/contexts/trpc-provider"; import { sendError } from "@/services/error-tracking"; + import { syncMatchesWidget } from "./index"; /** @@ -42,10 +45,13 @@ export const useMatchesWidgetSync = () => { syncFromServer(); - const subscription = AppState.addEventListener("change", (status: AppStateStatus) => { - if (status === "active") syncFromServer(); - if (status === "background") syncFromCache(); - }); + const subscription = AppState.addEventListener( + "change", + (status: AppStateStatus) => { + if (status === "active") syncFromServer(); + if (status === "background") syncFromCache(); + }, + ); return () => { disposed = true; diff --git a/apps/mobile/src/services/open-web-browser.ts b/apps/mobile/src/services/open-web-browser.ts index fe6643e..f8c3ec4 100644 --- a/apps/mobile/src/services/open-web-browser.ts +++ b/apps/mobile/src/services/open-web-browser.ts @@ -16,6 +16,6 @@ import * as WebBrowser from "expo-web-browser"; * Apple recommends for Terms / Privacy hand-offs. Users dismiss with * the standard "Done" chrome on iOS or system back on Android. */ -export const openWebBrowser = async (url: string) => { +export const openWebBrowser = (url: string) => { return WebBrowser.openBrowserAsync(url); }; diff --git a/apps/mobile/src/services/payments/index.ts b/apps/mobile/src/services/payments/index.ts index 3e47ba3..852264d 100644 --- a/apps/mobile/src/services/payments/index.ts +++ b/apps/mobile/src/services/payments/index.ts @@ -1,12 +1,15 @@ -import { Alert, Platform } from "react-native"; -import Purchases, { +import type { CustomerInfo, - LOG_LEVEL, PurchasesOffering, PurchasesPackage, } from "react-native-purchases"; + +import { Alert, Platform } from "react-native"; + import * as Device from "expo-device"; + import { get } from "lodash"; +import Purchases, { LOG_LEVEL } from "react-native-purchases"; import { getTrcpContext } from "@/contexts/trcp-context"; import { config } from "@/services/config"; @@ -41,7 +44,8 @@ const isStubRevenueCatKey = revenueCatApiKey === "ci-stub" || revenueCatApiKey.startsWith("ci-stub") || revenueCatApiKey.startsWith("placeholder") || - (!revenueCatApiKey.startsWith("appl_") && !revenueCatApiKey.startsWith("goog_")); + (!revenueCatApiKey.startsWith("appl_") && + !revenueCatApiKey.startsWith("goog_")); const init = () => { if (__DEV__) { @@ -65,7 +69,9 @@ const logIn = async () => { const userID = await getLoggedUserID(); if (!userID) { - throw new Error("Make sure the login is only called when the user is authenticated"); + throw new Error( + "Make sure the login is only called when the user is authenticated", + ); } if (isStubRevenueCatKey) { @@ -75,7 +81,10 @@ const logIn = async () => { try { const userData = await Purchases.logIn(userID); - queryClient.setQueryData([PaymentCacheKey.CustomerInfo], () => userData.customerInfo); + queryClient.setQueryData( + [PaymentCacheKey.CustomerInfo], + () => userData.customerInfo, + ); // Asynchronously set the email and display name getTrcpContext() @@ -354,10 +363,14 @@ const maestroMockPurchase = async (pkg: PurchasesPackage) => { }; }; -const purchasePackage = async (...props: Parameters) => { +const purchasePackage = async ( + ...props: Parameters +) => { if (isMaestroMockMode) { const [pkg] = props; - return maestroMockPurchase(pkg) as unknown as ReturnType; + return maestroMockPurchase(pkg) as unknown as ReturnType< + typeof Purchases.purchasePackage + >; } if (isIosSimulator) { @@ -373,13 +386,15 @@ const purchasePackage = async (...props: Parameters { } for (const entitlement of Object.values(Entitlement)) { - if (typeof customerInfo.entitlements.active[entitlement] !== "undefined") { + if (customerInfo.entitlements.active[entitlement] !== undefined) { return { ...customerInfo.entitlements.active[entitlement], userPlan: getPlanByEntitlement(entitlement), @@ -418,7 +433,9 @@ const restorePurchases = async () => { "Simulator Detected", "Restore is not available in the IOS simulator. Please try on a real device.", ); - throw new Error("Restore is not available in the IOS simulator. Please try on a real device."); + throw new Error( + "Restore is not available in the IOS simulator. Please try on a real device.", + ); } await Purchases.restorePurchases(); @@ -430,7 +447,7 @@ export const payments = { purchasePackage, getPlan, logIn, - restorePurchases: restorePurchases, + restorePurchases, logOut: Purchases.logOut, getCustomerInfo, addCustomerInfoUpdateListener: Purchases.addCustomerInfoUpdateListener, diff --git a/apps/mobile/src/services/query-client.tsx b/apps/mobile/src/services/query-client.tsx index eb821a8..45c643a 100644 --- a/apps/mobile/src/services/query-client.tsx +++ b/apps/mobile/src/services/query-client.tsx @@ -1,12 +1,19 @@ -import { AppState, AppStateStatus, Platform } from "react-native"; +import type { AppStateStatus } from "react-native"; + +import { AppState, Platform } from "react-native"; + import NetInfo from "@react-native-community/netinfo"; -import { focusManager, onlineManager, QueryClient } from "@tanstack/react-query"; +import { + focusManager, + onlineManager, + QueryClient, +} from "@tanstack/react-query"; export const queryClient = new QueryClient(); onlineManager.setEventListener((setOnline) => { return NetInfo.addEventListener((state) => { - setOnline(!!state.isConnected); + setOnline(Boolean(state.isConnected)); }); }); diff --git a/apps/mobile/src/services/quickActions/handlers/action.ts b/apps/mobile/src/services/quickActions/handlers/action.ts index 2afe926..d1544ae 100644 --- a/apps/mobile/src/services/quickActions/handlers/action.ts +++ b/apps/mobile/src/services/quickActions/handlers/action.ts @@ -1,4 +1,5 @@ -import * as QuickActions from "expo-quick-actions"; +import type * as QuickActions from "expo-quick-actions"; + import { router } from "expo-router"; import { sendError } from "@/services/error-tracking"; @@ -11,7 +12,7 @@ export enum QuickActionId { // Holds a quick action tapped before we know whether the user is // authenticated and fully onboarded (mirrors `initialNotification` in -// `services/linking/handlers/initialNotification.ts`). Cleared once +// `services/linking/handlers/initial-notification.ts`). Cleared once // consumed so it doesn't replay on a later, unrelated auth resolution. let pendingQuickAction: QuickActions.Action | undefined; @@ -23,7 +24,9 @@ const handleUnknownQuickAction = (id: string) => { sendError(new Error(`Unknown quick action: ${id}`)); }; -export const customQuickActionHandler = (action?: QuickActions.Action | null) => { +export const customQuickActionHandler = ( + action?: QuickActions.Action | null, +) => { if (!action) return; if (action.id === QuickActionId.Matches) { diff --git a/apps/mobile/src/services/quickActions/handlers/icons.ts b/apps/mobile/src/services/quickActions/handlers/icons.ts index fc85542..3748af1 100644 --- a/apps/mobile/src/services/quickActions/handlers/icons.ts +++ b/apps/mobile/src/services/quickActions/handlers/icons.ts @@ -5,6 +5,12 @@ import { Platform } from "react-native"; // only custom drawables via its config plugin -- so we pass `undefined` // there and let the shortcut fall back to the app's own icon, which keeps // this simple without shipping extra icon assets. -export const matchesIcon = Platform.select({ ios: "symbol:message.fill", default: undefined }); +export const matchesIcon = Platform.select({ + ios: "symbol:message.fill", + default: undefined, +}); -export const editProfileIcon = Platform.select({ ios: "symbol:person.fill", default: undefined }); +export const editProfileIcon = Platform.select({ + ios: "symbol:person.fill", + default: undefined, +}); diff --git a/apps/mobile/src/services/quickActions/index.ts b/apps/mobile/src/services/quickActions/index.ts index 20d0f85..3efb30b 100644 --- a/apps/mobile/src/services/quickActions/index.ts +++ b/apps/mobile/src/services/quickActions/index.ts @@ -1,8 +1,11 @@ import { useEffect } from "react"; + import * as QuickActions from "expo-quick-actions"; + import { useTranslation } from "react-i18next"; import { sendError } from "@/services/error-tracking"; + import { customQuickActionHandler, flushPendingQuickAction, @@ -27,6 +30,7 @@ export const useQuickActions = (enabled: boolean) => { useEffect(() => { // When the app is not already running, and the user taps a quick action + // oxlint-disable-next-line import/namespace -- `initial` is exported by expo-quick-actions; oxlint's resolver misses the optional-chained re-export setPendingQuickAction(QuickActions.initial); }, []); diff --git a/apps/mobile/src/services/storage.ts b/apps/mobile/src/services/storage.ts index 448aa75..06846e7 100644 --- a/apps/mobile/src/services/storage.ts +++ b/apps/mobile/src/services/storage.ts @@ -23,7 +23,10 @@ export interface StorageDataTypes { [StorageKeys.AppReviewStatus]: "completed"; } -export const storeData = async (key: T, value: StorageDataTypes[T]) => { +export const storeData = async ( + key: T, + value: StorageDataTypes[T], +) => { await AsyncStorage.setItem(key, value); return value; }; diff --git a/apps/mobile/src/services/theme-utils.ts b/apps/mobile/src/services/theme-utils.ts index b93c724..1a2e572 100644 --- a/apps/mobile/src/services/theme-utils.ts +++ b/apps/mobile/src/services/theme-utils.ts @@ -1,7 +1,7 @@ -import { DefaultTheme } from "styled-components/native"; +import type { DefaultTheme } from "styled-components/native"; export const getSpacing = (spacing: keyof DefaultTheme["spacing"]) => ({ theme }: { theme: DefaultTheme }) => { - return theme.spacing[spacing] + "px"; + return `${theme.spacing[spacing]}px`; }; diff --git a/apps/mobile/src/services/use-get-formatted-years.ts b/apps/mobile/src/services/use-get-formatted-years.ts index 96a6e7e..5d0a4f4 100644 --- a/apps/mobile/src/services/use-get-formatted-years.ts +++ b/apps/mobile/src/services/use-get-formatted-years.ts @@ -1,9 +1,9 @@ -import { useTranslation } from "react-i18next"; - import { getFormattedYears } from "@pegada/shared/utils/get-formatted-years"; +import { useTranslation } from "react-i18next"; export const useGetFormattedYears = () => { const { i18n } = useTranslation(); - return (birthDate: string | Date) => getFormattedYears({ birthDate, lng: i18n.language }); + return (birthDate: string | Date) => + getFormattedYears({ birthDate, lng: i18n.language }); }; diff --git a/apps/mobile/src/services/utils.ts b/apps/mobile/src/services/utils.ts index d14ebde..64db8f5 100644 --- a/apps/mobile/src/services/utils.ts +++ b/apps/mobile/src/services/utils.ts @@ -1,6 +1,11 @@ -import { DependencyList, EffectCallback, useEffect, useRef } from "react"; +import type { DependencyList, EffectCallback } from "react"; -export const useDidMountEffect = (func: EffectCallback, deps: DependencyList) => { +import { useEffect, useRef } from "react"; + +export const useDidMountEffect = ( + func: EffectCallback, + deps: DependencyList, +) => { const didMount = useRef(false); useEffect(() => { diff --git a/apps/mobile/src/store/reducers/dogs/index.ts b/apps/mobile/src/store/reducers/dogs/index.ts index fe41791..02a9ca1 100644 --- a/apps/mobile/src/store/reducers/dogs/index.ts +++ b/apps/mobile/src/store/reducers/dogs/index.ts @@ -1,26 +1,34 @@ +import type { AnyAction } from "redux"; +import type { Reducer } from "typesafe-actions"; + import reduceReducers from "reduce-reducers"; -import { Reducer } from "typesafe-actions"; -import * as list from "./list"; -import * as logout from "./logout"; -import * as swipe from "./swipe"; -import { initialState } from "./swipe"; +import listReducer, { Actions as listActions, ListAction } from "./list"; +import logoutReducer, { + Actions as logoutActions, + LogoutAction, +} from "./logout"; +import swipeReducer, { + Actions as swipeActions, + initialState, + SwipeAction, +} from "./swipe"; export const Types = { - ...list.ListAction, - ...swipe.SwipeAction, - ...logout.LogoutAction, + ...ListAction, + ...SwipeAction, + ...LogoutAction, }; export const Actions = { - swipe: swipe.Actions, - list: list.Actions, - logout: logout.Actions, + swipe: swipeActions, + list: listActions, + logout: logoutActions, }; export default reduceReducers( initialState, - swipe.default as Reducer, - list.default as Reducer, - logout.default as Reducer, + swipeReducer as Reducer, + listReducer as Reducer, + logoutReducer as Reducer, ); diff --git a/apps/mobile/src/store/reducers/dogs/list.ts b/apps/mobile/src/store/reducers/dogs/list.ts index b99dffd..3fc132c 100644 --- a/apps/mobile/src/store/reducers/dogs/list.ts +++ b/apps/mobile/src/store/reducers/dogs/list.ts @@ -1,7 +1,14 @@ +import type { SwipeDog } from "./swipe"; +import type { ActionType } from "typesafe-actions"; + import { produce } from "immer"; -import { ActionType, createAction, createAsyncAction, createReducer } from "typesafe-actions"; +import { + createAction, + createAsyncAction, + createReducer, +} from "typesafe-actions"; -import { initialState, SwipeDog } from "./swipe"; +import { initialState } from "./swipe"; export enum ListAction { FetchDogsRequest = "FETCH_DOGS_REQUEST", @@ -34,7 +41,10 @@ const refetchUsersRequest = (state = initialState) => return draft; }); -const fetchUsersSuccess = (state = initialState, { payload }: ActionType) => +const fetchUsersSuccess = ( + state: typeof initialState, + { payload }: ActionType, +) => produce(state, (draft) => { draft.request.loading = false; draft.request.error = undefined; @@ -50,7 +60,10 @@ const fetchUsersSuccess = (state = initialState, { payload }: ActionType) => +const fetchUsersFailure = ( + state: typeof initialState, + { payload }: ActionType, +) => produce(state, (draft) => { draft.request.loading = false; draft.request.error = payload.message; @@ -58,7 +71,9 @@ const fetchUsersFailure = (state = initialState, { payload }: ActionType>(initialState) +export default createReducer>( + initialState, +) .handleAction(Actions.request, fetchUsersRequest) .handleAction(Actions.success, fetchUsersSuccess) .handleAction(Actions.failure, fetchUsersFailure) diff --git a/apps/mobile/src/store/reducers/dogs/logout.ts b/apps/mobile/src/store/reducers/dogs/logout.ts index 1a89e1e..3f089f4 100644 --- a/apps/mobile/src/store/reducers/dogs/logout.ts +++ b/apps/mobile/src/store/reducers/dogs/logout.ts @@ -1,5 +1,7 @@ +import type { ActionType } from "typesafe-actions"; + import { produce } from "immer"; -import { ActionType, createAction, createReducer } from "typesafe-actions"; +import { createAction, createReducer } from "typesafe-actions"; import { initialState } from "@/store/reducers/dogs/swipe"; diff --git a/apps/mobile/src/store/reducers/dogs/swipe.ts b/apps/mobile/src/store/reducers/dogs/swipe.ts index 512f8cf..ce8fda6 100644 --- a/apps/mobile/src/store/reducers/dogs/swipe.ts +++ b/apps/mobile/src/store/reducers/dogs/swipe.ts @@ -1,9 +1,13 @@ -import { produce } from "immer"; -import { ActionType, createAction, createAsyncAction, createReducer } from "typesafe-actions"; - +import type { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; import type { RouterOutputs } from "@pegada/api"; +import type { ActionType } from "typesafe-actions"; -import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; +import { produce } from "immer"; +import { + createAction, + createAsyncAction, + createReducer, +} from "typesafe-actions"; export type SwipeDog = RouterOutputs["swipe"]["all"][number]; @@ -55,7 +59,10 @@ const clearLikeLimit = createAction(SwipeAction.ClearLikeLimit)(); export const Actions = { ...asyncActions, swipeBack, clearLikeLimit }; -const swipeUserRequest = (state = initialState, { payload }: ActionType) => +const swipeUserRequest = ( + state: typeof initialState, + { payload }: ActionType, +) => produce(state, (draft) => { const { lastCardId } = draft.config; const { data: dogs } = draft.request; @@ -64,7 +71,7 @@ const swipeUserRequest = (state = initialState, { payload }: ActionType -1) { + if (lastCardIndex !== -1) { draft.request.data.splice(lastCardIndex, 1); } @@ -81,7 +88,7 @@ const swipeUserSuccess = (state = initialState) => }); const swipeUserError = ( - state = initialState, + state: typeof initialState, { payload }: ActionType, ) => produce(state, (draft) => { @@ -107,7 +114,9 @@ const swipeBackHandler = (state = initialState) => return draft; }); -export default createReducer>(initialState) +export default createReducer>( + initialState, +) .handleAction(Actions.request, swipeUserRequest) .handleAction(Actions.swipeBack, swipeBackHandler) .handleAction(asyncActions.failure, swipeUserError) diff --git a/apps/mobile/src/store/reducers/index.ts b/apps/mobile/src/store/reducers/index.ts index 423d9b2..2080a13 100644 --- a/apps/mobile/src/store/reducers/index.ts +++ b/apps/mobile/src/store/reducers/index.ts @@ -1,22 +1,26 @@ +import type { initialState as swipeInitialState } from "./dogs/swipe"; + import { combineReducers } from "redux"; -import * as dogs from "./dogs"; -import * as swipe from "./dogs/swipe"; +import dogsReducer, { + Actions as dogsActions, + Types as dogsTypes, +} from "./dogs"; export const Types = { - ...dogs.Types, + ...dogsTypes, }; export const Actions = { - dogs: dogs.Actions, + dogs: dogsActions, }; const rootReducer = combineReducers({ - dogs: dogs.default, + dogs: dogsReducer, }); export interface RootReducer { - dogs: typeof swipe.initialState; + dogs: typeof swipeInitialState; } export default rootReducer; diff --git a/apps/mobile/src/store/sagas/dogs/index.ts b/apps/mobile/src/store/sagas/dogs/index.ts index f4f6e5e..b7ba760 100644 --- a/apps/mobile/src/store/sagas/dogs/index.ts +++ b/apps/mobile/src/store/sagas/dogs/index.ts @@ -1,6 +1,6 @@ import { all } from "redux-saga/effects"; -import fetchUsersRequest from "./list"; -import handleSwipeUserRequest from "./swipe"; +import listSaga from "./list"; +import swipeSaga from "./swipe"; -export default all([fetchUsersRequest, handleSwipeUserRequest]); +export default all([listSaga, swipeSaga]); diff --git a/apps/mobile/src/store/sagas/dogs/list.ts b/apps/mobile/src/store/sagas/dogs/list.ts index f31633c..bd00db6 100644 --- a/apps/mobile/src/store/sagas/dogs/list.ts +++ b/apps/mobile/src/store/sagas/dogs/list.ts @@ -1,14 +1,18 @@ +import type { RootReducer } from "@/store/reducers"; + import { all, call, put, select, takeLatest } from "redux-saga/effects"; import { getTrcpContext } from "@/contexts/trcp-context"; import i18n from "@/i18n"; import { sendError } from "@/services/error-tracking"; -import { Actions, RootReducer } from "@/store/reducers"; +import { Actions } from "@/store/reducers"; import { ListAction } from "@/store/reducers/dogs/list"; // Without marking as unknown, saga complains about the swipe all type inference export function* fetchUsersRequest(): unknown { - const dogs: RootReducer["dogs"] = yield select((state: RootReducer) => state.dogs); + const dogs: RootReducer["dogs"] = yield select( + (state: RootReducer) => state.dogs, + ); try { const response = yield call(getTrcpContext().client.swipe.all.query, { @@ -29,11 +33,11 @@ export function* fetchUsersRequest(): unknown { hasMore: response.length === dogs.config.limit, }), ); - } catch (err) { - sendError(err); + } catch (error) { + sendError(error); - const error = { message: i18n.t("common.somethingWrong") }; - yield put(Actions.dogs.list.failure(error)); + const failure = { message: i18n.t("common.somethingWrong") }; + yield put(Actions.dogs.list.failure(failure)); } } diff --git a/apps/mobile/src/store/sagas/dogs/swipe.ts b/apps/mobile/src/store/sagas/dogs/swipe.ts index 25a9206..7520f0b 100644 --- a/apps/mobile/src/store/sagas/dogs/swipe.ts +++ b/apps/mobile/src/store/sagas/dogs/swipe.ts @@ -1,41 +1,47 @@ +import type { RootReducer } from "@/store/reducers"; +import type { ActionType } from "typesafe-actions"; + import { router } from "expo-router"; + +import { LikeLimitReachedError } from "@pegada/shared/errors/errors"; import { isBefore } from "date-fns"; import { all, call, fork, put, select, takeLatest } from "redux-saga/effects"; -import { ActionType } from "typesafe-actions"; - -import { LikeLimitReached } from "@pegada/shared/errors/errors"; import { showLikeLimitReached } from "@/components/LikeLimitReached"; import { getTrcpContext } from "@/contexts/trcp-context"; import { getUnsafeIsPremium } from "@/hooks/use-payments"; import { sendError } from "@/services/error-tracking"; import { getError } from "@/services/get-error"; -import { Actions, RootReducer } from "@/store/reducers"; +import { Actions } from "@/store/reducers"; import { SwipeAction } from "@/store/reducers/dogs/swipe"; import { SceneName } from "@/types/scene-name"; import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; -function* swipeUserRequest({ payload }: ActionType): any { +const swipeUserRequest = function* ({ + payload, +}: ActionType): Generator { const { id, swipeType: _swipeType } = payload; try { - const isPremium = yield call(getUnsafeIsPremium); + // redux-saga's `yield` is `unknown` to TypeScript — the effect knows what it + // resolves to, the generator signature cannot. + const isPremium = (yield call(getUnsafeIsPremium)) as boolean; // If the user is not premium, check if the like limit has been reached if (!isPremium && _swipeType !== Swipe.Dislike) { - const { likeLimitResetAt }: RootReducer["dogs"]["config"] = yield select( + const { likeLimitResetAt } = (yield select( (state: RootReducer) => state.dogs.config, - ); + )) as RootReducer["dogs"]["config"]; if (likeLimitResetAt && isBefore(new Date(), likeLimitResetAt)) { - throw new LikeLimitReached({ likeLimitResetAt }); + throw new LikeLimitReachedError({ likeLimitResetAt }); } } - const response = yield call(getTrcpContext().client.swipe.swipe.mutate, { + const response = (yield call(getTrcpContext().client.swipe.swipe.mutate, { id, swipeType: _swipeType, - }); + })) as { match?: { id: string } } | undefined; if (response?.match) { router.push({ @@ -47,8 +53,8 @@ function* swipeUserRequest({ payload }: ActionType state.dogs); +const handleCardFetching = function* () { + const { request, config }: RootReducer["dogs"] = yield select( + (state: RootReducer) => state.dogs, + ); if ( request.data.length >= FETCH_THRESHOLD || @@ -76,9 +84,11 @@ function* handleCardFetching() { } yield put(Actions.dogs.list.request()); -} +}; -export function* handleSwipeUserRequest(props: ActionType) { +export function* handleSwipeUserRequest( + props: ActionType, +) { yield all([fork(() => swipeUserRequest(props)), fork(handleCardFetching)]); } diff --git a/apps/mobile/src/store/selectors.ts b/apps/mobile/src/store/selectors.ts index 1ac0837..03748d2 100644 --- a/apps/mobile/src/store/selectors.ts +++ b/apps/mobile/src/store/selectors.ts @@ -1,16 +1,22 @@ -import { createSelector } from "reselect"; +import type { RootReducer } from "@/store/reducers/index"; -import { RootReducer } from "@/store/reducers/index"; +import { createSelector } from "reselect"; export const getCards = createSelector( (state: RootReducer) => state.dogs.request, (request) => request.data, ); -export const getLastCardId = (state: RootReducer) => state.dogs.config.lastCardId; +export const getLastCardId = (state: RootReducer) => + state.dogs.config.lastCardId; -export const getActiveCards = createSelector(getCards, getLastCardId, (cards, lastCardId) => - cards.filter((card) => card.id !== lastCardId), +export const getActiveCards = createSelector( + getCards, + getLastCardId, + (cards, lastCardId) => cards.filter((card) => card.id !== lastCardId), ); -export const getCurrentCardId = createSelector(getActiveCards, (activeCards) => activeCards[0]?.id); +export const getCurrentCardId = createSelector( + getActiveCards, + (activeCards) => activeCards[0]?.id, +); diff --git a/apps/mobile/src/types/styled-components.d.ts b/apps/mobile/src/types/styled-components.d.ts index 5ae14a9..ece4e4a 100644 --- a/apps/mobile/src/types/styled-components.d.ts +++ b/apps/mobile/src/types/styled-components.d.ts @@ -1,15 +1,14 @@ import "styled-components"; - import { DefaultTheme as DefaultPegadaTheme } from "@pegada/shared/themes/themes"; type PegadaTheme = typeof DefaultPegadaTheme; declare module "styled-components" { - // eslint-disable-next-line @typescript-eslint/no-empty-object-type + // oxlint-disable-next-line typescript/no-empty-object-type -- styled-components' DefaultTheme is augmented by extension; an empty body is the whole point. export interface DefaultTheme extends PegadaTheme {} } declare module "styled-components/native" { - // eslint-disable-next-line @typescript-eslint/no-empty-object-type + // oxlint-disable-next-line typescript/no-empty-object-type -- styled-components' DefaultTheme is augmented by extension; an empty body is the whole point. export interface DefaultTheme extends PegadaTheme {} } diff --git a/apps/mobile/src/views/(auth)/AskForLocation/index.tsx b/apps/mobile/src/views/(auth)/AskForLocation/index.tsx index 47843bf..bc5956e 100644 --- a/apps/mobile/src/views/(auth)/AskForLocation/index.tsx +++ b/apps/mobile/src/views/(auth)/AskForLocation/index.tsx @@ -1,20 +1,31 @@ import { useState } from "react"; import * as React from "react"; import { Alert, Linking, ScrollView } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import * as Location from "expo-location"; import { useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components/native"; -import Information from "@/assets/images/Information.svg"; -import LocationIcon from "@/assets/images/Location.svg"; import { Button } from "@/components/Button"; import { Text } from "@/components/text"; import { getTrcpContext } from "@/contexts/trcp-context"; import { sendError } from "@/services/error-tracking"; import { SceneName } from "@/types/scene-name"; -import { BottomView, Container, InformationRow, LocationView } from "./styles"; + +import { + BottomView, + Container, + InformationIcon, + InformationRow, + LocationIcon, + LocationView, + Prompt, + scrollContent, + Title, +} from "./styles"; enum UpdateLocationError { PermissionNotGranted = "Location permission not granted", @@ -34,7 +45,10 @@ const getApproximatedPosition = async () => { return currentPostion.coords; }; -export const updateUserLocation = async (newLocation?: { longitude: number; latitude: number }) => { +export const updateUserLocation = async (newLocation?: { + longitude: number; + latitude: number; +}) => { const { status } = await Location.requestForegroundPermissionsAsync(); if (status !== "granted") { @@ -56,7 +70,8 @@ export const updateUserLocation = async (newLocation?: { longitude: number; lati country: geocode[0]?.country ?? null, }; - const newUserData = await getTrcpContext().client.user.update.mutate(location); + const newUserData = + await getTrcpContext().client.user.update.mutate(location); getTrcpContext().myDog.get.setData(undefined, (oldDogData) => { if (!oldDogData) return undefined; @@ -82,26 +97,14 @@ const AskForLocation: React.FC = () => { return ( - - + + {t("askForLocation.activateLocation")} - </Text> - <Text fontSize="xs" style={{ textAlign: "center" }}> - {t("askForLocation.permissionPrompt")} - </Text> + + {t("askForLocation.permissionPrompt")} { }} > - + {t("askForLocation.locationUsage")} @@ -152,7 +148,10 @@ const AskForLocation: React.FC = () => { sendError(error); - Alert.alert(t("common.somethingWrong"), t("common.tryAgainLater")); + Alert.alert( + t("common.somethingWrong"), + t("common.tryAgainLater"), + ); router.push(SceneName.Swipe); } finally { diff --git a/apps/mobile/src/views/(auth)/AskForLocation/styles.ts b/apps/mobile/src/views/(auth)/AskForLocation/styles.ts index 16c7106..35142b8 100644 --- a/apps/mobile/src/views/(auth)/AskForLocation/styles.ts +++ b/apps/mobile/src/views/(auth)/AskForLocation/styles.ts @@ -1,5 +1,23 @@ +import { StyleSheet } from "react-native"; + import styled from "styled-components/native"; +import Information from "@/assets/images/Information.svg"; +import Location from "@/assets/images/Location.svg"; +import { Text } from "@/components/text"; + +/** + * `contentContainerStyle` is a plain style prop, not a component, so it cannot + * be a styled component — the only way to keep it out of the JSX is a sheet. + */ +export const { scrollContent } = StyleSheet.create({ + scrollContent: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, +}); + export const Container = styled.View` background-color: ${({ theme }) => theme.colors.background}; flex: 1; @@ -23,3 +41,22 @@ export const InformationRow = styled.View` align-items: center; margin-bottom: 20px; `; + +export const LocationIcon = styled(Location)` + margin-bottom: 20px; +`; + +export const InformationIcon = styled(Information)` + width: 21px; + height: 21px; + margin-right: 10px; +`; + +export const Title = styled(Text)` + text-align: center; + margin-bottom: 4px; +`; + +export const Prompt = styled(Text)` + text-align: center; +`; diff --git a/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx b/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx index 9e83291..24f179c 100644 --- a/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx +++ b/apps/mobile/src/views/(auth)/CompleteProfile/index.tsx @@ -1,19 +1,22 @@ -import { KeyboardAvoidingView, Platform, View } from "react-native"; -import { magicToast } from "react-native-magic-toast"; +import type { DogCompleteClientSchema } from "@pegada/shared/schemas/dog-schema"; + +import { Platform } from "react-native"; + import { useLocalSearchParams, useRouter } from "expo-router"; + import { zodResolver } from "@hookform/resolvers/zod"; +import { dogCompleteClientSchema } from "@pegada/shared/schemas/dog-schema"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; import { useTheme } from "styled-components/native"; -import { DogCompleteClientSchema, dogCompleteClientSchema } from "@pegada/shared/schemas/dog-schema"; - import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import BreedPicker from "@/components/BreedPicker"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; +import { Fill, KeyboardScreen, Row } from "@/components/layout"; import { InputPicker } from "@/components/Picker"; -import { Text } from "@/components/text"; import { getTrcpContext } from "@/contexts/trcp-context"; import { api } from "@/contexts/trpc-provider"; import { useDelayedHeaderHeight } from "@/hooks/use-delayed-header-height"; @@ -22,7 +25,15 @@ import { colors, sizes } from "@/services/consts"; import { sendError } from "@/services/error-tracking"; import { maskDate } from "@/services/mask-date"; import { SceneName } from "@/types/scene-name"; -import { Container, ImageContainer, ProfileImage } from "./styles"; + +import { + Container, + Gap, + ImageContainer, + Note, + ProfileImage, + WideColumn, +} from "./styles"; const CompleteProfile = () => { const router = useRouter(); @@ -30,19 +41,20 @@ const CompleteProfile = () => { const { profileImageUrl } = useLocalSearchParams(); - const { control, handleSubmit, getValues, watch } = useForm({ - defaultValues: { - birthDate: "", - breedId: "", - }, - resolver: zodResolver(dogCompleteClientSchema), - }); + const { control, handleSubmit, getValues, watch } = + useForm({ + defaultValues: { + birthDate: "", + breedId: "", + }, + resolver: zodResolver(dogCompleteClientSchema), + }); const form = watch(); const headerHeight = useDelayedHeaderHeight(); - const hasChanged = Object.values(form).some((value) => Boolean(value)); + const hasChanged = Object.values(form).some(Boolean); const myDogUpdateMutation = api.myDog.update.useMutation({ onSuccess: (data) => { @@ -61,11 +73,12 @@ const CompleteProfile = () => { const saveUser = handleSubmit(async (data) => { if (hasChanged) { + const { birthDate, breedId, color, size } = data; const dogData = { - ...(data.birthDate && { birthDate: data.birthDate }), - ...(data.breedId && { breedId: data.breedId }), - ...(data.color && { color: data.color }), - ...(data.size && { size: data.size }), + ...(birthDate && { birthDate }), + ...(breedId && { breedId }), + ...(color && { color }), + ...(size && { size }), }; await myDogUpdateMutation.mutateAsync(dogData); @@ -80,21 +93,23 @@ const CompleteProfile = () => { const theme = useTheme(); const { scrollViewProps } = useBottomActionStyle(); - const continueText = hasChanged ? t("completeProfile.save") : t("common.skip"); + const continueText = hasChanged + ? t("completeProfile.save") + : t("common.skip"); return ( - - + @@ -102,8 +117,8 @@ const CompleteProfile = () => { - - + + { /> )} /> - + - + - + ( + render={({ + field: { onChange, onBlur, value, name }, + fieldState, + }) => ( { /> )} /> - - + + - + { )} /> - + { /> )} /> - + - - {t("completeProfile.additionalInfo")} - + {t("completeProfile.additionalInfo")} - - + + ); }; diff --git a/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts b/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts index 846711b..304b68b 100644 --- a/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts +++ b/apps/mobile/src/views/(auth)/CompleteProfile/styles.ts @@ -1,9 +1,24 @@ import styled from "styled-components/native"; import { Image } from "@/components/image"; +import { Text } from "@/components/text"; export const Container = styled.ScrollView` - flex-grow: 1; + flex: 1; +`; + +/** The wider half of the breed / birth-date row. */ +export const WideColumn = styled.View` + flex: 1.5; +`; + +/** The fixed gutter between two fields sharing a row. */ +export const Gap = styled.View` + width: ${({ theme }) => theme.spacing[3]}px; +`; + +export const Note = styled(Text)` + margin-top: ${({ theme }) => theme.spacing[6]}px; `; export const ImageContainer = styled.View` diff --git a/apps/mobile/src/views/(auth)/CreateProfile/index.tsx b/apps/mobile/src/views/(auth)/CreateProfile/index.tsx index 6c60a61..e618b2c 100644 --- a/apps/mobile/src/views/(auth)/CreateProfile/index.tsx +++ b/apps/mobile/src/views/(auth)/CreateProfile/index.tsx @@ -1,22 +1,25 @@ +import type { ProfileImagesUploaderProps } from "@/components/ProfileImageUploader"; +import type { Picture } from "@/components/ProfileImageUploader/utils"; +import type { DogQuickClientSchema } from "@pegada/shared/schemas/dog-schema"; + import { useState } from "react"; -import { KeyboardAvoidingView, Platform, View } from "react-native"; -import { magicToast } from "react-native-magic-toast"; +import { Platform } from "react-native"; + import { useRouter } from "expo-router"; + import { zodResolver } from "@hookform/resolvers/zod"; +import { dogQuickClientSchema } from "@pegada/shared/schemas/dog-schema"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; import { useTheme } from "styled-components/native"; -import { DogQuickClientSchema, dogQuickClientSchema } from "@pegada/shared/schemas/dog-schema"; - import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; -import { - ProfileImagesUploader, - ProfileImagesUploaderProps, -} from "@/components/ProfileImageUploader"; -import { Picture, pictures } from "@/components/ProfileImageUploader/utils"; +import { Fill, KeyboardScreen } from "@/components/layout"; +import { ProfileImagesUploader } from "@/components/ProfileImageUploader"; +import { pictures } from "@/components/ProfileImageUploader/utils"; import { RadioButtons } from "@/components/RadioButtons"; import { Text } from "@/components/text"; import { getTrcpContext } from "@/contexts/trcp-context"; @@ -25,7 +28,8 @@ import { useDelayedHeaderHeight } from "@/hooks/use-delayed-header-height"; import { analytics } from "@/services/analytics"; import { sendError } from "@/services/error-tracking"; import { SceneName } from "@/types/scene-name"; -import { Container } from "./styles"; + +import { Container, DragHint, MultilineInput, PhotoHint } from "./styles"; const DEFAULT_VALUES: DogQuickClientSchema = { name: "", @@ -100,18 +104,18 @@ const CreateProfile = () => { const { scrollViewProps } = useBottomActionStyle(); return ( - - + { {t("createProfile.profilePictures")} - + {t("createProfile.minimumOnePhoto")} - + [0]) => { + onChange={( + cb: Parameters[0], + ) => { // This getValues is needed to ensure the update happens // correctly even when adding images fast. onChange(cb(getValues("images") as Picture[])); }} error={fieldState.error?.message} /> - + {t("createProfile.clickAndHold")} - + )} /> @@ -167,7 +173,7 @@ const CreateProfile = () => { control={control} rules={{ required: true }} render={({ field: { onChange, onBlur, value }, fieldState }) => ( - { multiline optional error={fieldState.error?.message} - style={{ minHeight: 75 }} /> )} /> @@ -189,9 +194,15 @@ const CreateProfile = () => { { - onChange(value === t("completeProfile.male") ? "MALE" : "FEMALE"); + onChange( + value === t("completeProfile.male") ? "MALE" : "FEMALE", + ); }} /> )} @@ -206,8 +217,8 @@ const CreateProfile = () => { {t("createProfile.createProfile")} - - + + ); }; diff --git a/apps/mobile/src/views/(auth)/CreateProfile/styles.ts b/apps/mobile/src/views/(auth)/CreateProfile/styles.ts index 60201cf..2eb148f 100644 --- a/apps/mobile/src/views/(auth)/CreateProfile/styles.ts +++ b/apps/mobile/src/views/(auth)/CreateProfile/styles.ts @@ -1,5 +1,20 @@ import styled from "styled-components/native"; +import { Input } from "@/components/Input"; +import { Text } from "@/components/text"; + export const Container = styled.ScrollView` - flex-grow: 1; + flex: 1; +`; + +export const PhotoHint = styled(Text)` + margin-bottom: 10px; +`; + +export const DragHint = styled(Text)` + margin-top: 5px; +`; + +export const MultilineInput = styled(Input)` + min-height: 75px; `; diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/index.tsx b/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/index.tsx index c93c2e9..533b6c0 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/index.tsx +++ b/apps/mobile/src/views/(auth)/OneTimeCode/components/GoBack/index.tsx @@ -1,7 +1,9 @@ import * as React from "react"; + import { useTheme } from "styled-components/native"; import BackArrow from "@/assets/images/BackArrow.svg"; + import { Container } from "./styles"; const GoBack: React.FC> = (props) => { diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/index.tsx b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/index.tsx index 7ab2e90..62425f7 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/index.tsx +++ b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/index.tsx @@ -1,5 +1,7 @@ +import type { TextInput } from "react-native"; + import { forwardRef, useState } from "react"; -import { TextInput } from "react-native"; + import { useTheme } from "styled-components/native"; import * as S from "./styles"; @@ -8,7 +10,7 @@ export enum KeyboardKeys { Backspace = "Backspace", } -type OtpDigitProps = { +interface OtpDigitProps { children: string; length: number; index: number; @@ -16,70 +18,89 @@ type OtpDigitProps = { handleErase: (text: string, index: number) => void; pointerEvents?: "auto" | "none"; testID: string; -}; +} export const OTP_INPUT_HEIGHT = S.isSmallDevice ? 62 : 80; export const OTP_INPUT_MARGIN = 6; const OtpDigit = forwardRef< TextInput, - Omit, "children"> & OtpDigitProps ->(({ children, index, length, pointerEvents, handleChange, handleErase, testID }, ref) => { - const [selected, setSelected] = useState(false); + Omit, "children"> & + OtpDigitProps +>( + ( + { + children, + index, + length, + pointerEvents, + handleChange, + handleErase, + testID, + }, + ref, + ) => { + const [selected, setSelected] = useState(false); - const { colors } = useTheme(); + const { colors } = useTheme(); - const isFirst = index === 0; - const isLast = index === length - 1; + const isFirst = index === 0; + const isLast = index === length - 1; - const rightMargin = isLast ? 0 : OTP_INPUT_MARGIN; - const selectedBorderColor = colors.border; + const rightMargin = isLast ? 0 : OTP_INPUT_MARGIN; + const selectedBorderColor = colors.border; - const digit = isNaN(Number(children)) ? "" : children; + const digit = Number.isNaN(Number(children)) ? "" : children; - return ( - - setSelected(false)} - onFocus={() => setSelected(true)} - accessibilityLabel="Text input field" - accessibilityHint="Enter the verification code" - value={digit} - keyboardType="number-pad" - onChangeText={(text: string) => handleChange(text, index)} - numberOfLines={1} - maxLength={length} - returnKeyType="next" - pointerEvents={pointerEvents} - selectionColor="transparent" - autoFocus={isFirst} - importantForAutofill={isFirst ? "yes" : "no"} - textContentType={isFirst ? "oneTimeCode" : "none"} - autoComplete={isFirst ? "sms-otp" : "off"} - onKeyPress={({ nativeEvent: { key } }: { nativeEvent: { key: KeyboardKeys } }) => { - if (key === KeyboardKeys.Backspace) return handleErase(digit, index); + return ( + - - - + setSelected(false)} + onFocus={() => setSelected(true)} + accessibilityLabel="Text input field" + accessibilityHint="Enter the verification code" + value={digit} + keyboardType="number-pad" + onChangeText={(text: string) => handleChange(text, index)} + numberOfLines={1} + maxLength={length} + returnKeyType="next" + pointerEvents={pointerEvents} + selectionColor="transparent" + autoFocus={isFirst} + importantForAutofill={isFirst ? "yes" : "no"} + textContentType={isFirst ? "oneTimeCode" : "none"} + autoComplete={isFirst ? "sms-otp" : "off"} + onKeyPress={({ + nativeEvent: { key }, + }: { + nativeEvent: { key: KeyboardKeys }; + }) => { + if (key === KeyboardKeys.Backspace) + return handleErase(digit, index); }} - > - {digit || "0"} - - - - ); -}); + /> + + + + {digit || "0"} + + + + ); + }, +); export default OtpDigit; diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/styles.ts b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/styles.ts index fbbcc2b..815122d 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/styles.ts +++ b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpDigit/styles.ts @@ -1,4 +1,5 @@ import { Dimensions } from "react-native"; + import styled from "styled-components/native"; const deviceHeight = Dimensions.get("window").height; diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpInput/index.tsx b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpInput/index.tsx index 2bb360a..8663063 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpInput/index.tsx +++ b/apps/mobile/src/views/(auth)/OneTimeCode/components/OtpInput/index.tsx @@ -1,15 +1,16 @@ +import type { TextInput } from "react-native"; + import { forwardRef, useImperativeHandle, useRef } from "react"; import * as React from "react"; -import { TextInput } from "react-native"; import OtpDigit, { OTP_INPUT_HEIGHT, OTP_INPUT_MARGIN } from "../OtpDigit"; import { VerifyRowView } from "./styles"; const OTP_INPUT_MAX_WIDTH = OTP_INPUT_HEIGHT; -export type OtpInputRef = { +export interface OtpInputRef { focus: () => void; -}; +} interface OtpInputProps { value: string; @@ -17,70 +18,69 @@ interface OtpInputProps { onChangeText: React.Dispatch>; } -const OTPInput = forwardRef(({ length, value, onChangeText }, ref) => { - const inputRefs: { current: (TextInput | null | any)[] } = useRef([]); - - const handleFocus = () => { - inputRefs.current[0]?.focus(); - }; - - useImperativeHandle(ref, () => ({ - focus: handleFocus, - })); - - const changeDigit = (digit: string, index: number) => { - return onChangeText((previousValue) => { - const newValue = previousValue - .slice(0, index) - .concat(digit) - .concat(previousValue.slice(index + 1)); - - return newValue.slice(0, length); - }); - }; - - const handleChange = (digit: string, index: number) => { - if (!digit || digit.match(/[^0-9]/g)) return; - changeDigit(digit, index); - - const nextIndex = Math.min(index + digit.length - 1, length - 1); - - inputRefs.current?.[nextIndex]?.focus(); - }; - - const handleErase = (_digit: string, index: number) => { - changeDigit("", index); - - inputRefs.current?.[index - 1]?.focus(); - }; - - const otp_max_width = (OTP_INPUT_MAX_WIDTH + OTP_INPUT_MARGIN) * length; - - return ( - - {[...Array(length)].map((_, index) => { - const previousValue = value?.[index - 1]; - const isFirst = index === 0; - - return ( - { - inputRefs.current[index] = el; - }} - index={index} - length={length} - pointerEvents={previousValue || isFirst ? "auto" : "none"} - handleChange={handleChange} - handleErase={handleErase} - testID={`otp-digit-${index}`} - > - {value[index]} - - ); - })} - - ); -}); +const OTPInput = forwardRef( + ({ length, value, onChangeText }, ref) => { + const inputRefs = useRef<(TextInput | null)[]>([]); + + const handleFocus = () => { + inputRefs.current[0]?.focus(); + }; + + useImperativeHandle(ref, () => ({ + focus: handleFocus, + })); + + const changeDigit = (digit: string, index: number) => { + return onChangeText((previousValue) => { + const newValue = `${previousValue.slice(0, index)}${digit}${previousValue.slice(index + 1)}`; + + return newValue.slice(0, length); + }); + }; + + const handleChange = (digit: string, index: number) => { + if (!digit || digit.match(/[^0-9]/g)) return; + changeDigit(digit, index); + + const nextIndex = Math.min(index + digit.length - 1, length - 1); + + inputRefs.current?.[nextIndex]?.focus(); + }; + + const handleErase = (_digit: string, index: number) => { + changeDigit("", index); + + inputRefs.current?.[index - 1]?.focus(); + }; + + const otp_max_width = (OTP_INPUT_MAX_WIDTH + OTP_INPUT_MARGIN) * length; + + return ( + + {Array.from({ length }, (_, index) => { + const previousValue = value?.[index - 1]; + const isFirst = index === 0; + + return ( + { + inputRefs.current[index] = el; + }} + index={index} + length={length} + pointerEvents={previousValue || isFirst ? "auto" : "none"} + handleChange={handleChange} + handleErase={handleErase} + testID={`otp-digit-${index}`} + > + {value[index]} + + ); + })} + + ); + }, +); export default OTPInput; diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts b/apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts index ddda1eb..894d789 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts +++ b/apps/mobile/src/views/(auth)/OneTimeCode/hooks/use-timer.ts @@ -1,6 +1,10 @@ -import { Dispatch, SetStateAction, useEffect, useState } from "react"; +import type { Dispatch, SetStateAction } from "react"; -const useTimer = (seconds: number): [number, Dispatch>] => { +import { useEffect, useState } from "react"; + +const useTimer = ( + seconds: number, +): [number, Dispatch>] => { const [timer, setTimer] = useState(seconds); useEffect(() => { diff --git a/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx b/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx index 6c7208b..395bc51 100644 --- a/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx +++ b/apps/mobile/src/views/(auth)/OneTimeCode/index.tsx @@ -1,12 +1,18 @@ +import type { OtpInputRef } from "./components/OtpInput"; + import { useRef, useState } from "react"; import { ActivityIndicator, Platform } from "react-native"; -import { magicToast } from "react-native-magic-toast"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { useLocalSearchParams, useRouter } from "expo-router"; + +import { + InvalidOTPCodeError, + OTPRequiredError, +} from "@pegada/shared/errors/errors"; import { format, set } from "date-fns"; import { useTranslation } from "react-i18next"; - -import { InvalidOTPCodeError, OTPRequiredError } from "@pegada/shared/errors/errors"; +import { magicToast } from "react-native-magic-toast"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { Text } from "@/components/text"; import { api } from "@/contexts/trpc-provider"; @@ -16,9 +22,10 @@ import { getError } from "@/services/get-error"; import { getInitialRouteName } from "@/services/get-initial-route-name"; import { StorageKeys, storeData } from "@/services/storage"; import { useDidMountEffect } from "@/services/utils"; + import { Underline } from "../SignIn/components/HeroText"; import GoBack from "./components/GoBack"; -import OTPInput, { OtpInputRef } from "./components/OtpInput"; +import OTPInput from "./components/OtpInput"; import useTimer from "./hooks/use-timer"; import { Container, @@ -55,7 +62,7 @@ const OneTimeCode = () => { const loginMutation = api.authentication.login.useMutation({ onSuccess: async (data) => { try { - const token = data.token; + const { token } = data; await storeData(StorageKeys.Token, token); const initialRouteName = await getInitialRouteName(); @@ -101,7 +108,9 @@ const OneTimeCode = () => { }, [keyboardInput]); return ( - + { {formattedTime} - {t("oneTimeCode.insertCode")} {email} + {t("oneTimeCode.insertCode")}{" "} + {email} ({ - Container: "div", - FlexRowView: "div", - Line: "span", - RotatedRectangle: "span", - Title: "span", - UnderlineContainer: "span", - WhiteTitle: "span", -})); - -beforeAll(async () => { - await initI18n(use(initReactI18next)); -}); - -test.each(["en-US", "pt-BR"])("renders %s without React key warnings", async (language) => { - await changeLanguage(language); - - const consoleError = jest.spyOn(console, "error").mockImplementation(() => {}); - - try { - renderToStaticMarkup(); - expect(consoleError).not.toHaveBeenCalled(); - } finally { - consoleError.mockRestore(); - } -}); diff --git a/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.test.tsx b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.test.tsx new file mode 100644 index 0000000..2917654 --- /dev/null +++ b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.test.tsx @@ -0,0 +1,43 @@ +import * as React from "react"; +import { renderToStaticMarkup } from "react-dom/server"; + +import { initI18n } from "@pegada/shared/i18n/i18n"; +import { changeLanguage, use } from "i18next"; +import { initReactI18next } from "react-i18next"; + +import HeroText from "."; + +// Rendered through react-dom/server, so every styled-component is replaced by +// a plain host element. The cast is the mock's whole point: these are strings +// standing in for React Native styled components. +jest.mock>("./styles", () => ({ + Container: "div", + FlexRowView: "div", + Line: "span", + RotatedRectangle: "span", + Title: "span", + UnderlineContainer: "span", + WhiteTitle: "span", +})); + +beforeAll(async () => { + await initI18n(use(initReactI18next)); +}); + +test.each(["en-US", "pt-BR"])( + "renders %s without React key warnings", + async (language) => { + await changeLanguage(language); + + const consoleError = jest + .spyOn(console, "error") + .mockReturnValue(undefined); + + try { + renderToStaticMarkup(); + expect(consoleError).not.toHaveBeenCalled(); + } finally { + consoleError.mockRestore(); + } + }, +); diff --git a/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.tsx b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.tsx index 102cef8..d353c35 100644 --- a/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.tsx +++ b/apps/mobile/src/views/(auth)/SignIn/components/HeroText/index.tsx @@ -1,4 +1,5 @@ import * as React from "react"; + import { Trans } from "react-i18next"; import { diff --git a/apps/mobile/src/views/(auth)/SignIn/index.tsx b/apps/mobile/src/views/(auth)/SignIn/index.tsx index c22df62..9f149e5 100644 --- a/apps/mobile/src/views/(auth)/SignIn/index.tsx +++ b/apps/mobile/src/views/(auth)/SignIn/index.tsx @@ -1,12 +1,13 @@ import { useState } from "react"; import { Alert, Keyboard, Platform } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { useRouter } from "expo-router"; import { requestTrackingPermissionsAsync } from "expo-tracking-transparency"; -import { Trans, useTranslation } from "react-i18next"; -import { useTheme } from "styled-components/native"; import { OTPRequiredError } from "@pegada/shared/errors/errors"; +import { Trans, useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { useTheme } from "styled-components/native"; import { Button } from "@/components/Button"; import { api } from "@/contexts/trpc-provider"; @@ -14,6 +15,7 @@ import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe- import { sendError } from "@/services/error-tracking"; import { getError } from "@/services/get-error"; import { SceneName } from "@/types/scene-name"; + import EmailInput from "./components/EmailInput"; import HeroText from "./components/HeroText"; import { @@ -34,6 +36,14 @@ export const useCustomBottomInset = () => { return Math.max(theme.spacing[4], insets.bottom + theme.spacing[1]); }; +const requestTrackingPermissions = async () => { + try { + await requestTrackingPermissionsAsync(); + } catch (error) { + sendError(error); + } +}; + const InsertEmail = () => { const insets = useSafeAreaInsets(); const bottomInset = useCustomBottomInset(); @@ -49,7 +59,10 @@ const InsertEmail = () => { onError: (error) => { // Resend code if (getError(error, OTPRequiredError)) { - requestTrackingPermissionsAsync().catch(sendError); + // Fire-and-forget: the OTP screen must not wait on the ATT prompt. + // `void` rather than a chained catch, which `promise/no-promise-in-callback` + // (rightly) reads as a second error path inside a callback. + void requestTrackingPermissions(); return router.push({ pathname: SceneName.OneTimeCode, @@ -62,7 +75,7 @@ const InsertEmail = () => { }, }); - const handleLogin = async () => { + const handleLogin = () => { const isValidEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); if (!isValidEmail) { @@ -74,7 +87,9 @@ const InsertEmail = () => { return ( Keyboard.dismiss()}> - + { onChangeText={setEmail} error={error} /> - diff --git a/apps/mobile/src/views/(auth)/SignIn/styles.ts b/apps/mobile/src/views/(auth)/SignIn/styles.ts index 5c30097..4282964 100644 --- a/apps/mobile/src/views/(auth)/SignIn/styles.ts +++ b/apps/mobile/src/views/(auth)/SignIn/styles.ts @@ -1,4 +1,5 @@ import { KeyboardAvoidingView, Pressable } from "react-native"; + import { SafeAreaView } from "react-native-safe-area-context"; import styled from "styled-components/native"; @@ -18,7 +19,9 @@ export const Container = styled(SafeAreaView).attrs({ * whole SignIn screen (email input, submit button, all testIDs) becomes * one opaque node to XCUITest/VoiceOver. */ -export const PressableContainer = styled(Pressable).attrs({ accessible: false })` +export const PressableContainer = styled(Pressable).attrs({ + accessible: false, +})` flex-grow: 1; `; @@ -41,7 +44,8 @@ export const TopCard = styled.ImageBackground.attrs((props) => ({ background-color: ${(props) => props.theme.colors.background}; justify-content: center; align-items: center; - padding: ${(props) => props.theme.spacing[10]}px ${(props) => props.theme.spacing[4]}px; + padding: ${(props) => props.theme.spacing[10]}px + ${(props) => props.theme.spacing[4]}px; `; export const BottomCard = styled.View` diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Header/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/Header/index.tsx index 018bdd9..a919a59 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Header/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/Header/index.tsx @@ -1,10 +1,12 @@ +import type { Match } from "../.."; + import * as React from "react"; -import { FlatList, View } from "react-native"; +import { FlatList } from "react-native"; + import { useTheme } from "styled-components/native"; -import { Match } from "../.."; import { Preview } from "../Preview"; -import { Container } from "./styles"; +import { Container, PreviewSeparator } from "./styles"; interface HeaderProps { matches?: Match[]; @@ -25,7 +27,7 @@ export const Header: React.FC = ({ matches }) => { contentContainerStyle={{ paddingHorizontal: theme.spacing[4], }} - ItemSeparatorComponent={() => } + ItemSeparatorComponent={PreviewSeparator} showsHorizontalScrollIndicator={false} /> diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Header/styles.ts b/apps/mobile/src/views/(tabs)/Messages/components/Header/styles.ts index 4434c40..e4b6d1f 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Header/styles.ts +++ b/apps/mobile/src/views/(tabs)/Messages/components/Header/styles.ts @@ -3,3 +3,8 @@ import styled from "styled-components/native"; export const Container = styled.View` background-color: ${(props) => props.theme.colors.background}; `; + +/** The gutter between two match previews. */ +export const PreviewSeparator = styled.View` + width: ${({ theme }) => theme.spacing[3]}px; +`; diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx index 8e8a039..1d36a4a 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/Message/index.tsx @@ -1,14 +1,19 @@ +import type { Match } from "../.."; + import * as React from "react"; import { View } from "react-native"; + import { useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; +import { Fill } from "@/components/layout"; import { ThinkingEmoji } from "@/components/MatchActionBar/styles"; import { Text } from "@/components/text"; import { SceneName } from "@/types/scene-name"; import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; -import { Match } from "../.."; -import { Container, EmojiContainer, Picture } from "./styles"; + +import { Container, emojiSize, EmojiContainer, Picture } from "./styles"; const getEmojiBySwipeType = (swipeType?: Swipe) => { switch (swipeType) { @@ -51,18 +56,18 @@ export const Message: React.FC = ({ item }) => { /> {Emoji ? ( - + ) : null} - + {item.dog.name} {item.lastMessage?.content ?? t("matches.sendFirstMessage")} - + ); }; diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts b/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts index 017529d..b2bb9a5 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts +++ b/apps/mobile/src/views/(tabs)/Messages/components/Message/styles.ts @@ -1,3 +1,5 @@ +import { StyleSheet } from "react-native"; + import styled from "styled-components/native"; import { Image } from "@/components/image"; @@ -28,3 +30,11 @@ export const EmojiContainer = styled.View` border-width: ${(props) => props.theme.stroke.md}px; border-color: ${({ theme }) => theme.colors.border}; `; + +/** + * The emoji component is picked at runtime (or is null), so it cannot be a + * styled component — a sheet entry is the only way to keep the size out of JSX. + */ +export const { emojiSize } = StyleSheet.create({ + emojiSize: { width: 15, height: 15 }, +}); diff --git a/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx index f4c27d7..b25d371 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/Preview/index.tsx @@ -1,9 +1,12 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + import * as React from "react"; + import { useRouter } from "expo-router"; import { Text } from "@/components/text"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { SceneName } from "@/types/scene-name"; + import { Container, Content, Picture } from "./styles"; interface PreviewProps { diff --git a/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx b/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx index 375f81a..9445fda 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/SearchBar/index.tsx @@ -1,9 +1,12 @@ import * as React from "react"; import { Text } from "@/components/text"; + import { Container, SearchFieldContainer, TextField } from "./styles"; -export const SearchBar: React.FC> = (props) => { +export const SearchBar: React.FC> = ( + props, +) => { return ( diff --git a/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx b/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx index 71f2ab8..384a3fc 100644 --- a/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/components/empty-messages.tsx @@ -1,58 +1,41 @@ import * as React from "react"; import { View } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { router } from "expo-router"; + import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components/native"; import { Button } from "@/components/Button"; -import { Text } from "@/components/text"; import { SceneName } from "@/types/scene-name"; import { EmptyAnimation } from "@/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles"; +import { EmptyDescription, EmptyRoot, EmptyTitle } from "../styles"; + interface EmptyMessagesProps { search: string; setSearch: (value: string) => void; } -export const EmptyMessages: React.FC = ({ search, setSearch }) => { +export const EmptyMessages: React.FC = ({ + search, + setSearch, +}) => { const insets = useSafeAreaInsets(); const { t } = useTranslation(); const theme = useTheme(); return ( - + - + {t("messages.empty.title")} - - + + {t("messages.empty.description")} - + {search ? ( )} - + ); }; diff --git a/apps/mobile/src/views/(tabs)/Messages/index.tsx b/apps/mobile/src/views/(tabs)/Messages/index.tsx index fb080ff..2355f32 100644 --- a/apps/mobile/src/views/(tabs)/Messages/index.tsx +++ b/apps/mobile/src/views/(tabs)/Messages/index.tsx @@ -1,6 +1,10 @@ +import type { RouterOutputs } from "@/contexts/trpc-provider"; + import { useEffect, useRef, useState } from "react"; import { FlatList, Platform, View } from "react-native"; + import { usePathname } from "expo-router"; + import { useScrollToTop } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; @@ -9,13 +13,14 @@ import Divider from "@/components/divider"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { Text } from "@/components/text"; import { getTrcpContext } from "@/contexts/trcp-context"; -import { api, RouterOutputs } from "@/contexts/trpc-provider"; +import { api } from "@/contexts/trpc-provider"; import { handleRequestAppReview } from "@/services/app-review"; import { sendError } from "@/services/error-tracking"; import { syncMatchesWidget } from "@/services/matchesWidget"; import { SceneName } from "@/types/scene-name"; import { Header } from "@/views/(tabs)/Messages/components/Header"; import { Message } from "@/views/(tabs)/Messages/components/Message"; + import { EmptyMessages } from "./components/empty-messages"; import { SearchBar } from "./components/SearchBar"; import { Container, DividerContainer, Title } from "./styles"; @@ -28,7 +33,7 @@ const MemoizedDivider = () => ( ); -const getKeyMemoized = (item: Match) => item.id + "_message"; +const getKeyMemoized = (item: Match) => `${item.id}_message`; const Messages = () => { const pathname = usePathname(); @@ -47,10 +52,9 @@ const Messages = () => { handleRequestAppReview().catch(sendError); } - matches.forEach((match) => { - const dog = match.dog; + for (const { dog } of matches) { getTrcpContext().dog.get.setData({ id: dog.id }, dog); - }); + } // Refresh the home-screen widget whenever the matches query updates. void syncMatchesWidget(matches); @@ -63,14 +67,14 @@ const Messages = () => { if (!search) return matches; return matches.filter((match) => { - const dog = match.dog; + const { dog } = match; return dog.name.toLowerCase().includes(search.toLowerCase()); }); }; const filteredMatches = getFiltered(); - if (!filteredMatches.length) return []; + if (filteredMatches.length === 0) return []; // Most recent messages come first. Sort a copy: with no search term // getFiltered hands back the query's own array, and sorting in place @@ -120,11 +124,22 @@ const Messages = () => { ); - const MemoizedEmptyMessages = ; + const MemoizedEmptyMessages = ( + + ); + + // Grow the container only when the list is empty, so the empty state fills + // the screen. Doing it unconditionally breaks the populated list's layout. + const emptyListGrow = data?.length ? undefined : 1; return ( - - {Boolean(matches?.length) && } + + {Boolean(matches?.length) && ( + + )} { contentContainerStyle={{ paddingBottom: theme.spacing[4], paddingTop: theme.spacing[1], - // Increase size only if data is empty - // Otherwise it bugs stuff - flexGrow: data?.length ? undefined : 1, + flexGrow: emptyListGrow, }} /> ); }; -export default () => { +const MessagesScreen = () => { return ( ); }; + +export default MessagesScreen; diff --git a/apps/mobile/src/views/(tabs)/Messages/styles.ts b/apps/mobile/src/views/(tabs)/Messages/styles.ts index ea4942c..16a4dea 100644 --- a/apps/mobile/src/views/(tabs)/Messages/styles.ts +++ b/apps/mobile/src/views/(tabs)/Messages/styles.ts @@ -1,5 +1,7 @@ import styled from "styled-components/native"; +import { Text } from "@/components/text"; + import { PICTURE_SIZE } from "./components/Message/styles"; export const Container = styled.KeyboardAvoidingView` @@ -20,3 +22,23 @@ export const DividerContainer = styled.View` margin-right: ${(props) => props.theme.spacing[4]}px; margin-left: ${(props) => props.theme.spacing[4] * 2 + PICTURE_SIZE}px; `; + +export const EmptyRoot = styled.View` + align-items: center; + justify-content: center; + flex-grow: 1; + padding-horizontal: ${({ theme }) => theme.spacing[12]}px; + padding-bottom: ${({ theme }) => theme.spacing[12]}px; +`; + +export const EmptyTitle = styled(Text)` + margin-top: 12px; + margin-bottom: 10px; + text-align: center; +`; + +export const EmptyDescription = styled(Text)` + letter-spacing: 0.5px; + text-align: center; + margin-bottom: 30px; +`; diff --git a/apps/mobile/src/views/(tabs)/Profile/components/Config/index.tsx b/apps/mobile/src/views/(tabs)/Profile/components/Config/index.tsx index ecc3572..124f35a 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/Config/index.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/Config/index.tsx @@ -1,7 +1,15 @@ import { useTheme } from "styled-components/native"; import ArrowRight from "@/assets/images/ArrowRight.svg"; -import { ArrowContainer, Container, Description, Root, Title } from "./styles"; + +import { + ArrowContainer, + Container, + Description, + IconSlot, + Root, + Title, +} from "./styles"; const Arrow = () => { const theme = useTheme(); @@ -14,6 +22,7 @@ const Arrow = () => { }; export const Config = { Container, + IconSlot, Description, Root, Title, diff --git a/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts b/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts index 31d69a5..a5652cb 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts +++ b/apps/mobile/src/views/(tabs)/Profile/components/Config/styles.ts @@ -1,4 +1,5 @@ import { Pressable } from "react-native"; + import styled from "styled-components/native"; import { Text } from "@/components/text"; @@ -14,6 +15,12 @@ export const Container = styled.View` flex: 1; `; +/** Fixed-width slot so every row's icon lines up, whatever its own size. */ +export const IconSlot = styled.View` + width: 22px; + align-items: center; +`; + export const ArrowContainer = styled.View` align-items: flex-end; `; diff --git a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx index 17bdac6..b5af986 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/index.tsx @@ -1,20 +1,25 @@ import { ActivityIndicator, useWindowDimensions, View } from "react-native"; + import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { LinearGradient } from "expo-linear-gradient"; import { useTheme } from "styled-components/native"; import Premium from "@/assets/images/Premium.svg"; import { BIO_NUMBER_OF_LINES } from "@/components/MainCard/components/PersonalInfo"; import * as PersonalInfo from "@/components/MainCard/components/PersonalInfo/styles"; -import { Container, Picture } from "@/components/MainCard/styles"; +import { Picture } from "@/components/MainCard/styles"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { api } from "@/contexts/trpc-provider"; import { useCustomerPlan } from "@/hooks/use-payments"; import { UserPlan } from "@/services/payments"; import { useGetFormattedYears } from "@/services/use-get-formatted-years"; import { + HeaderCard, + InfoBlock, + NameRow, ProfileContainer, ProfileUnknownError, + Scrim, + Shade, } from "@/views/(tabs)/Profile/components/UserDogProfileHeader/styles"; export const useDogProfileHeight = () => { @@ -39,32 +44,32 @@ const UserDogProfileHeader = () => { } return ( - + - - - + + {dog.name} {dog.birthDate ? ( - + , {getFormattedYears(dog.birthDate)} ) : null} @@ -77,7 +82,7 @@ const UserDogProfileHeader = () => { height={22} /> ) : null} - + {dog.bio ? ( { {dog.bio} ) : null} - - - + + + ); }; @@ -114,17 +119,13 @@ const WrappedUserDogProfileHeader = () => { return ( - }> + } + > - diff --git a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/styles.ts b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/styles.ts index 6411e67..c72ca36 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/styles.ts +++ b/apps/mobile/src/views/(tabs)/Profile/components/UserDogProfileHeader/styles.ts @@ -1,6 +1,41 @@ +import { LinearGradient } from "expo-linear-gradient"; + import styled from "styled-components/native"; -import { OfflineComponent, UnknownErrorComponent } from "@/components/NetworkBoundary"; +import * as PersonalInfo from "@/components/MainCard/components/PersonalInfo/styles"; +import { Container } from "@/components/MainCard/styles"; +import { + OfflineComponent, + UnknownErrorComponent, +} from "@/components/NetworkBoundary"; + +/** The MainCard shell, squared off because it sits flush under the header. */ +export const HeaderCard = styled(Container)` + border-radius: 0; +`; + +/** Bottom-anchored gradient the name and bio sit on top of. */ +export const Shade = styled(LinearGradient)` + margin-top: auto; +`; + +/** Top-anchored gradient that darkens the status bar area. */ +export const Scrim = styled(LinearGradient)` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +`; + +export const InfoBlock = styled(PersonalInfo.Container)` + padding-bottom: 35px; +`; + +export const NameRow = styled.View` + flex-direction: row; + align-items: center; +`; export const ProfileContainer = styled.View` justify-content: center; diff --git a/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx b/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx index 93d4b8b..bafaf0e 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/current-plan-config.tsx @@ -1,6 +1,8 @@ import { Linking, Platform } from "react-native"; + import Constants from "expo-constants"; import { useRouter } from "expo-router"; + import { format } from "date-fns"; import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components/native"; @@ -10,6 +12,7 @@ import Loading from "@/components/loading"; import { useCustomerPlan } from "@/hooks/use-payments"; import { UserPlan } from "@/services/payments"; import { SceneName } from "@/types/scene-name"; + import { Config } from "./Config"; const PlanLoading = styled.View` @@ -56,10 +59,16 @@ export const CurrentPlanConfig = () => { // testID disambiguates the upgrade CTA vs the manage-subscription CTA // so Maestro can assert on the pre/post-purchase state of this row. const testID = - userPlan === UserPlan.Premium ? "profile-current-plan-premium" : "profile-current-plan-upgrade"; + userPlan === UserPlan.Premium + ? "profile-current-plan-premium" + : "profile-current-plan-upgrade"; return ( - + {t("profile.plan.currentPlan")} @@ -68,20 +77,23 @@ export const CurrentPlanConfig = () => { ) : null} - {userPlan ? {t(`plans.${userPlan}`)} : null} + {userPlan ? ( + {t(`plans.${userPlan}`)} + ) : null} {plan.isError ? ( {t("profile.plan.errorLoading")} ) : null} - {!plan.isLoading ? ( + {plan.isLoading ? null : ( {userPlan === UserPlan.Free && t("profile.plan.upgradeToPremium")} - {userPlan === UserPlan.Premium && t("profile.plan.until", { date: expirationDate })} + {userPlan === UserPlan.Premium && + t("profile.plan.until", { date: expirationDate })} {plan.isError ? t("profile.plan.clickToRetry") : null} - ) : null} + )} ); diff --git a/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx b/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx index d107d89..3d23d8e 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/language-config.tsx @@ -1,13 +1,15 @@ +import type { BottomSheetModal } from "@gorhom/bottom-sheet"; + import { useRef } from "react"; -import { BottomSheetModal } from "@gorhom/bottom-sheet"; -import { useTranslation } from "react-i18next"; -import { useTheme } from "styled-components/native"; import { Language } from "@pegada/shared/i18n/types/types"; +import { useTranslation } from "react-i18next"; +import { useTheme } from "styled-components/native"; import Translate from "@/assets/images/Translate.svg"; import { PickerSheet } from "@/components/Picker"; import { sendError } from "@/services/error-tracking"; + import { Config } from "./Config"; // Not translating languages for now, as it's useful to @@ -29,7 +31,9 @@ export const LanguageConfig = () => { const theme = useTheme(); - const value = languagesPickerData.find(({ id }) => id === currentLanguage) ?? { + const value = languagesPickerData.find( + ({ id }) => id === currentLanguage, + ) ?? { id: currentLanguage, name: LANGUAGES[Language.Default], }; @@ -37,7 +41,10 @@ export const LanguageConfig = () => { const pickerSheetRef = useRef(null); return ( - pickerSheetRef?.current?.present()}> + pickerSheetRef?.current?.present()} + > @@ -54,7 +61,9 @@ export const LanguageConfig = () => { data={languagesPickerData} itemTestIDPrefix="language-item-" onChange={(item) => { - i18n.changeLanguage(item.id as keyof typeof LANGUAGES).catch(sendError); + i18n + .changeLanguage(item.id as keyof typeof LANGUAGES) + .catch(sendError); }} ref={pickerSheetRef} /> diff --git a/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx b/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx index d022441..a6c1c82 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/location-config.tsx @@ -1,5 +1,7 @@ -import { ActivityIndicator, View } from "react-native"; +import { ActivityIndicator } from "react-native"; + import { useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; @@ -7,6 +9,7 @@ import Location from "@/assets/images/Location.svg"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { useCurrentCityText } from "@/hooks/use-current-city-text"; import { SceneName } from "@/types/scene-name"; + import { Config } from "./Config"; const CurrentLocation = () => { @@ -31,7 +34,10 @@ const CurrentLocationLoading = () => { const theme = useTheme(); return ( - + ); }; export const LocationConfig = () => { @@ -41,10 +47,13 @@ export const LocationConfig = () => { const theme = useTheme(); return ( - router.push(SceneName.LocationMap)}> - + router.push(SceneName.LocationMap)} + > + - + {t("profile.updateLocation")} diff --git a/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx b/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx index 9988081..8453ec6 100644 --- a/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/components/theme-config.tsx @@ -1,12 +1,16 @@ +import type { ActiveTheme } from "@/contexts/theme-provider"; +import type { BottomSheetModal } from "@gorhom/bottom-sheet"; + import { useRef } from "react"; -import { BottomSheetModal } from "@gorhom/bottom-sheet"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import LightMode from "@/assets/images/LightMode.svg"; import { PickerSheet } from "@/components/Picker"; -import { ActiveTheme, useActiveTheme } from "@/contexts/theme-provider"; +import { useActiveTheme } from "@/contexts/theme-provider"; import { sendError } from "@/services/error-tracking"; + import { Config } from "./Config"; export const ThemeConfig = () => { @@ -35,7 +39,10 @@ export const ThemeConfig = () => { const pickerSheetRef = useRef(null); return ( - pickerSheetRef?.current?.present()}> + pickerSheetRef?.current?.present()} + > diff --git a/apps/mobile/src/views/(tabs)/Profile/index.tsx b/apps/mobile/src/views/(tabs)/Profile/index.tsx index 91196cb..77f7cc7 100644 --- a/apps/mobile/src/views/(tabs)/Profile/index.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/index.tsx @@ -1,4 +1,11 @@ -import { View } from "react-native"; +import { useFocusEffect, useRouter } from "expo-router"; +import { StatusBar } from "expo-status-bar"; +import * as StoreReview from "expo-store-review"; + +import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; +import { useIsFocused, useScrollToTop } from "@react-navigation/native"; +import { t } from "i18next"; +import { useTranslation } from "react-i18next"; import Animated, { Extrapolation, interpolate, @@ -7,13 +14,6 @@ import Animated, { useScrollViewOffset, } from "react-native-reanimated"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { useFocusEffect, useRouter } from "expo-router"; -import { StatusBar } from "expo-status-bar"; -import * as StoreReview from "expo-store-review"; -import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs"; -import { useIsFocused, useScrollToTop } from "@react-navigation/native"; -import { t } from "i18next"; -import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import Dog from "@/assets/images/Dog.svg"; @@ -29,12 +29,15 @@ import { sendError } from "@/services/error-tracking"; import { openWebBrowser } from "@/services/open-web-browser"; import { StorageKeys, storeData } from "@/services/storage"; import { SceneName } from "@/types/scene-name"; + import { Config } from "./components/Config"; import { CurrentPlanConfig } from "./components/current-plan-config"; import { LanguageConfig } from "./components/language-config"; import { LocationConfig } from "./components/location-config"; import { ThemeConfig } from "./components/theme-config"; -import UserDogProfileHeader, { useDogProfileHeight } from "./components/UserDogProfileHeader"; +import UserDogProfileHeader, { + useDogProfileHeight, +} from "./components/UserDogProfileHeader"; import { BackgroundOverlay, BackgroundProfileContainer, @@ -42,6 +45,8 @@ import { Content, ScrollContainer, SettingsList, + SettingsBlock, + settingsScroll, } from "./styles"; import { deleteAccount } from "./utils/delete-account"; import { handleLogout } from "./utils/handle-logout"; @@ -84,7 +89,12 @@ const Profile = () => { const imgStyle = useAnimatedStyle(() => { "worklet"; // should scale down the image a little - const scale = interpolate(scrollY.value, [0, TRANSITION_POINT], [1, 0.97], Extrapolation.CLAMP); + const scale = interpolate( + scrollY.value, + [0, TRANSITION_POINT], + [1, 0.97], + Extrapolation.CLAMP, + ); return { transform: [{ scale }], @@ -129,18 +139,17 @@ const Profile = () => { { {t("profile.settings")} - @@ -171,7 +175,9 @@ const Profile = () => { {t("profile.matchPreferences")} - {t("profile.matchPreferencesDescription")} + + {t("profile.matchPreferencesDescription")} + @@ -184,7 +190,9 @@ const Profile = () => { {t("profile.editProfile")} - {t("profile.editProfileDescription")} + + {t("profile.editProfileDescription")} + @@ -199,17 +207,24 @@ const Profile = () => { {t("profile.termsOfUse")} - {t("profile.termsOfUseDescription")} + + {t("profile.termsOfUseDescription")} + - + {t("profile.privacyPolicy")} - {t("profile.privacyPolicyDescription")} + + {t("profile.privacyPolicyDescription")} + @@ -219,7 +234,9 @@ const Profile = () => { {t("profile.rateTheApp")} - {t("profile.rateTheAppDescription")} + + {t("profile.rateTheAppDescription")} + @@ -234,13 +251,18 @@ const Profile = () => { - + - {t("profile.deleteAccount")} + + {t("profile.deleteAccount")} + - + diff --git a/apps/mobile/src/views/(tabs)/Profile/styles.ts b/apps/mobile/src/views/(tabs)/Profile/styles.ts index 69d3ba3..d9003a9 100644 --- a/apps/mobile/src/views/(tabs)/Profile/styles.ts +++ b/apps/mobile/src/views/(tabs)/Profile/styles.ts @@ -1,5 +1,7 @@ -import Animated from "react-native-reanimated"; +import { StyleSheet } from "react-native"; + import Color from "color"; +import Animated from "react-native-reanimated"; import styled from "styled-components/native"; import { PressableArea } from "@/components/pressable-area"; @@ -8,9 +10,11 @@ export const PlanContainer = styled(PressableArea)` position: absolute; top: ${(props) => props.theme.spacing[4]}px; right: ${(props) => props.theme.spacing[4]}px; - padding: ${(props) => props.theme.spacing[2]}px ${(props) => props.theme.spacing[3]}px; + padding: ${(props) => props.theme.spacing[2]}px + ${(props) => props.theme.spacing[3]}px; border-radius: ${(props) => props.theme.radii.sm}px; - background-color: ${({ theme }) => Color(theme.colors.background).alpha(0.6).string()}; + background-color: ${({ theme }) => + new Color(theme.colors.background).alpha(0.6).string()}; z-index: 10; `; @@ -58,3 +62,18 @@ export const Content = styled.View` border-bottom-width: ${(props) => props.theme.stroke.sm}px; background-color: ${({ theme }) => theme.colors.background}; `; + +/** + * The opaque block the settings rows sit on. It owns the background below the + * photo header, so it has to grow to the bottom of the viewport. + */ +export const SettingsBlock = styled.View` + background-color: ${({ theme }) => theme.colors.background}; + padding-top: ${({ theme }) => theme.spacing[1]}px; + flex-grow: 1; +`; + +/** `contentContainerStyle` takes a style object, not a component. */ +export const { settingsScroll } = StyleSheet.create({ + settingsScroll: { flexGrow: 1, zIndex: 10 }, +}); diff --git a/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx b/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx index 4e5e00d..4af0c1c 100644 --- a/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx +++ b/apps/mobile/src/views/(tabs)/Profile/utils/delete-account.tsx @@ -1,4 +1,5 @@ import { Alert } from "react-native"; + import { t } from "i18next"; import { getTrcpContext } from "@/contexts/trcp-context"; @@ -12,32 +13,36 @@ export const deleteAccount = () => { event_type: "Delete Account Pressed", }); - Alert.alert(i18n.t("profile.deleteAccount"), i18n.t("profile.deleteAccountConfirmation"), [ - { - text: t("profile.cancel"), - style: "cancel", - onPress: () => { - analytics.track({ event_type: "Delete Account Canceled" }); + Alert.alert( + i18n.t("profile.deleteAccount"), + i18n.t("profile.deleteAccountConfirmation"), + [ + { + text: t("profile.cancel"), + style: "cancel", + onPress: () => { + analytics.track({ event_type: "Delete Account Canceled" }); + }, }, - }, - { - text: t("profile.delete"), - style: "destructive", - onPress: () => { - analytics.track({ event_type: "Delete Account Confirmed" }); - // App Store Guideline 5.1.1(v) requires actual account deletion, - // not just a dog soft-delete. user.deleteMe wipes the user row plus - // all dependent records (dogs, images, matches, interests, messages) - // in a single transaction server-side, then we clear the local - // session via logout(). - getTrcpContext() - .client.user.deleteMe.mutate() - .then(() => logout()) - .catch((error) => { - Alert.alert(t("common.oops"), t("common.tryAgainLater")); - sendError(error); - }); + { + text: t("profile.delete"), + style: "destructive", + onPress: () => { + analytics.track({ event_type: "Delete Account Confirmed" }); + // App Store Guideline 5.1.1(v) requires actual account deletion, + // not just a dog soft-delete. user.deleteMe wipes the user row plus + // all dependent records (dogs, images, matches, interests, messages) + // in a single transaction server-side, then we clear the local + // session via logout(). + getTrcpContext() + .client.user.deleteMe.mutate() + .then(() => logout()) + .catch((error) => { + Alert.alert(t("common.oops"), t("common.tryAgainLater")); + sendError(error); + }); + }, }, - }, - ]); + ], + ); }; diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx index 6bf73d2..5e973fa 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeBackButton/index.tsx @@ -1,5 +1,6 @@ -import { SlideInRight, SlideOutRight } from "react-native-reanimated"; import { useRouter } from "expo-router"; + +import { SlideInRight, SlideOutRight } from "react-native-reanimated"; import { useDispatch, useSelector } from "react-redux"; import { useTheme } from "styled-components/native"; @@ -9,6 +10,7 @@ import { analytics } from "@/services/analytics"; import { Actions } from "@/store/reducers"; import { getLastCardId } from "@/store/selectors"; import { SceneName } from "@/types/scene-name"; + import { Container, GoBack } from "./styles"; const SwipeBackButton = () => { diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts index 4ed7197..c6669f6 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture.ts @@ -1,12 +1,14 @@ -import { useState } from "react"; -import { - Gesture, +import type { GestureEventPayload, PanGestureHandlerEventPayload, } from "react-native-gesture-handler"; +import type { SharedValue } from "react-native-reanimated"; + +import { useState } from "react"; + +import { Gesture } from "react-native-gesture-handler"; import { runOnJS, - SharedValue, useSharedValue, withSpring, withTiming, @@ -54,13 +56,15 @@ const getSwipeType = ( "worklet"; const horizontalTrigger = - Math.abs(event.translationX) > ACTION_OFFSET || Math.abs(event.velocityX) > ACTION_VELOCITY; + Math.abs(event.translationX) > ACTION_OFFSET || + Math.abs(event.velocityX) > ACTION_VELOCITY; if (horizontalTrigger && event.translationX < 0) return Swipe.Dislike; if (horizontalTrigger && event.translationX > 0) return Swipe.Like; const verticalTrigger = - Math.abs(event.translationY) > ACTION_OFFSET || Math.abs(event.velocityY) > ACTION_VELOCITY; + Math.abs(event.translationY) > ACTION_OFFSET || + Math.abs(event.velocityY) > ACTION_VELOCITY; if (verticalTrigger && event.translationY < 0) return Swipe.Maybe; }; @@ -80,11 +84,19 @@ const gotoCoordinate = ( const callbackY = willMoveX ? undefined : callback; if (willMoveX) { - translation.x.value = withTiming(coordinates.x ?? 0, animationConfig, callback); + translation.x.value = withTiming( + coordinates.x ?? 0, + animationConfig, + callback, + ); } if (willMoveY) { - translation.y.value = withTiming(coordinates.y ?? 0, animationConfig, callbackY); + translation.y.value = withTiming( + coordinates.y ?? 0, + animationConfig, + callbackY, + ); } }; @@ -111,7 +123,10 @@ export const useSwipeGesture = ({ onSwipeComplete }: UseSwipeGestureProps) => { setTimeout(() => setEnabled(true), duration); }; - const gotoDirection = (swipeDirection: Swipe, animationConfig = { duration: 250 }) => { + const gotoDirection = ( + swipeDirection: Swipe, + animationConfig = { duration: 250 }, + ) => { "worklet"; // Avoid concurrency, should gotoDirection only once @@ -146,7 +161,7 @@ export const useSwipeGesture = ({ onSwipeComplete }: UseSwipeGestureProps) => { // Fire a tick exactly once per crossing of the decision threshold, // reusing the same rule `onEnd` uses to commit to a direction. - const crossedNow = !!getSwipeType(event); + const crossedNow = Boolean(getSwipeType(event)); if (crossedNow && !hasCrossedThreshold.value) { runOnJS(haptics.selection)(); } diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx index 66ffecd..5399aec 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeHandler/index.tsx @@ -1,6 +1,10 @@ +import type { Swipe } from "./hooks/use-swipe-gesture"; +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + import { useEffect } from "react"; import * as React from "react"; import { StyleSheet } from "react-native"; + import { GestureDetector } from "react-native-gesture-handler"; import Animated, { interpolate, @@ -14,9 +18,9 @@ import FeedbackCard from "@/components/FeedbackCard"; import { ACTION_OFFSET } from "@/constants"; import { useDidMountEffect } from "@/services/utils"; import { Actions } from "@/store/reducers"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { getCurrentCardId } from "@/store/selectors"; -import { Swipe, useSwipeGesture } from "./hooks/use-swipe-gesture"; + +import { useSwipeGesture } from "./hooks/use-swipe-gesture"; const ROTATION_DEG = 8; @@ -40,15 +44,22 @@ const SwipeHandler: React.FC = ({ card }) => { dispatch(Actions.dogs.swipe.request({ id: card.id, swipeType })); }; - const [translation, gestureHandler, gotoDirection, enabled] = useSwipeGesture({ - onSwipeComplete, - }); + const [translation, gestureHandler, gotoDirection, enabled] = useSwipeGesture( + { + onSwipeComplete, + }, + ); - const automaticSwipe = (swipeType: Swipe) => { - "worklet"; + // Memoised so the effect below doesn't reinstall the imperative handle on + // every render — a worklet is a new function object each time otherwise. + const automaticSwipe = React.useCallback( + (swipeType: Swipe) => { + "worklet"; - gotoDirection(swipeType, { duration: 500 }); - }; + gotoDirection(swipeType, { duration: 500 }); + }, + [gotoDirection], + ); // useImperativeHandle unloads the ref depending on component rendering order // This is a new behavior that caused bugs, and had to be replaced with useEffect @@ -62,7 +73,6 @@ const SwipeHandler: React.FC = ({ card }) => { useDidMountEffect(() => { if (isFirstCard) { - // eslint-disable-next-line react-compiler/react-compiler -- false positive translation.x.value = withSpring(0, { stiffness: 50 }); translation.y.value = withSpring(0, { stiffness: 50 }); } @@ -89,7 +99,11 @@ const SwipeHandler: React.FC = ({ card }) => { return ( - + ); diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx index a821ca4..76814d2 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/index.tsx @@ -1,7 +1,11 @@ +import type { RootReducer } from "@/store/reducers"; + import { View } from "react-native"; -import Animated, { FadeInDown, FadeOutDown } from "react-native-reanimated"; + import { router } from "expo-router"; + import { useTranslation } from "react-i18next"; +import Animated, { FadeInDown, FadeOutDown } from "react-native-reanimated"; import { useDispatch, useSelector } from "react-redux"; import { Button } from "@/components/Button"; @@ -11,8 +15,9 @@ import { useIsOffline, } from "@/components/NetworkBoundary"; import { Container, Content } from "@/components/NetworkBoundary/styles"; -import { Actions, RootReducer } from "@/store/reducers"; +import { Actions } from "@/store/reducers"; import { SceneName } from "@/types/scene-name"; + import { Description, EmptyAnimation, LogoLoading, Title } from "./styles"; export const EmptyComponent = () => { @@ -33,13 +38,16 @@ const EmptyState = () => { - + <Title fontWeight="bold"> {t("swipeRequestFeedback.emptyTitle")} - + {t("swipeRequestFeedback.emptyDescription")} - diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts index ef136d3..a81cee6 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts +++ b/apps/mobile/src/views/(tabs)/Swipe/components/SwipeRequestFeedback/styles.ts @@ -28,10 +28,12 @@ export const LogoLoading = styled(LottieView).attrs({ export const Title = styled(Text)` margin-bottom: ${(props) => props.theme.spacing[1]}px; + padding-bottom: 2px; text-align: center; `; export const Description = styled(Text)` + padding-bottom: 4px; text-align: center; margin-bottom: ${(props) => props.theme.spacing[4]}px; max-width: 274px; diff --git a/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx b/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx index 0509337..9c0c739 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/components/change-location.tsx @@ -1,15 +1,18 @@ import { ActivityIndicator } from "react-native"; + import { useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; import ArrowDown from "@/assets/images/ArrowDown.svg"; import Location from "@/assets/images/Location.svg"; import { NetworkBoundary } from "@/components/NetworkBoundary"; -import { PressableArea } from "@/components/pressable-area"; import { Text } from "@/components/text"; import { SceneName } from "@/types/scene-name"; + import { useCurrentCityText } from "../../../../hooks/use-current-city-text"; +import { LocationButton } from "../styles"; const CurrentLocation = () => { const currentCityText = useCurrentCityText(); @@ -49,17 +52,10 @@ export const ChangeLocation = () => { const router = useRouter(); return ( - { router.push(SceneName.LocationMap); }} - style={{ - padding: theme.spacing[2], - flexDirection: "row", - alignItems: "center", - alignSelf: "center", - marginBottom: theme.spacing[2], - }} > { }} fill={theme.colors.primary} /> - + ); }; diff --git a/apps/mobile/src/views/(tabs)/Swipe/index.tsx b/apps/mobile/src/views/(tabs)/Swipe/index.tsx index aa2c861..1cfd98c 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/index.tsx +++ b/apps/mobile/src/views/(tabs)/Swipe/index.tsx @@ -1,5 +1,6 @@ import { useEffect } from "react"; import * as React from "react"; + import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useDispatch, useSelector } from "react-redux"; @@ -14,6 +15,7 @@ import { import { processLinks } from "@/services/linking"; import { Actions } from "@/store/reducers/dogs"; import { getCards, getCurrentCardId } from "@/store/selectors"; + import { ChangeLocation } from "./components/change-location"; import SwipeBackButton from "./components/SwipeBackButton"; import SwipeHandler, { swipeHandlerRef } from "./components/SwipeHandler"; diff --git a/apps/mobile/src/views/(tabs)/Swipe/styles.ts b/apps/mobile/src/views/(tabs)/Swipe/styles.ts index 0d29cf7..0735537 100644 --- a/apps/mobile/src/views/(tabs)/Swipe/styles.ts +++ b/apps/mobile/src/views/(tabs)/Swipe/styles.ts @@ -1,9 +1,20 @@ import { SafeAreaView } from "react-native-safe-area-context"; import styled from "styled-components/native"; +import { PressableArea } from "@/components/pressable-area"; + export const Container = styled(SafeAreaView).attrs({ edges: ["left", "right"], })` flex: 1; background-color: ${(props) => props.theme.colors.background}; `; + +/** The "change location" pill above the card stack. */ +export const LocationButton = styled(PressableArea)` + padding: ${({ theme }) => theme.spacing[2]}px; + flex-direction: row; + align-items: center; + align-self: center; + margin-bottom: ${({ theme }) => theme.spacing[2]}px; +`; diff --git a/apps/mobile/src/views/Chat/components/Header/index.tsx b/apps/mobile/src/views/Chat/components/Header/index.tsx index 1422d7a..501758f 100644 --- a/apps/mobile/src/views/Chat/components/Header/index.tsx +++ b/apps/mobile/src/views/Chat/components/Header/index.tsx @@ -1,7 +1,9 @@ import { ActivityIndicator } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { useLocalSearchParams, useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components/native"; import BackArrow from "@/assets/images/BackArrow.svg"; @@ -9,12 +11,16 @@ import { NetworkBoundary } from "@/components/NetworkBoundary"; import { Text } from "@/components/text"; import { api } from "@/contexts/trpc-provider"; import { SceneName } from "@/types/scene-name"; + import * as S from "./styles"; export const HEADER_HEIGHT = 65; const DogProfileInfo = ({ dogId }: { dogId: string }) => { - const [dog] = api.dog.get.useSuspenseQuery({ id: dogId }, { refetchOnMount: false }); + const [dog] = api.dog.get.useSuspenseQuery( + { id: dogId }, + { refetchOnMount: false }, + ); return ( diff --git a/apps/mobile/src/views/Chat/components/Header/styles.tsx b/apps/mobile/src/views/Chat/components/Header/styles.tsx index 94125a4..9febd4d 100644 --- a/apps/mobile/src/views/Chat/components/Header/styles.tsx +++ b/apps/mobile/src/views/Chat/components/Header/styles.tsx @@ -14,7 +14,8 @@ export const Picture = styled(Image)` height: 38px; border-radius: ${(props) => props.theme.radii.round}px; margin-right: ${(props) => props.theme.spacing[3.5]}px; - background-color: ${(props) => Color(props.theme.colors.text).alpha(0.2).string()}; + background-color: ${(props) => + new Color(props.theme.colors.text).alpha(0.2).string()}; `; export const ProfileInfoContainer = styled.View` diff --git a/apps/mobile/src/views/Chat/components/Message/index.tsx b/apps/mobile/src/views/Chat/components/Message/index.tsx index 71de809..69c8083 100644 --- a/apps/mobile/src/views/Chat/components/Message/index.tsx +++ b/apps/mobile/src/views/Chat/components/Message/index.tsx @@ -1,8 +1,14 @@ import * as React from "react"; -import { SlideInLeft, SlideInRight, SlideOutRight } from "react-native-reanimated"; + import { format } from "date-fns"; +import { + SlideInLeft, + SlideInRight, + SlideOutRight, +} from "react-native-reanimated"; import { Text } from "@/components/text"; + import Feedback, { FeedbackStatus } from "../feedback"; import { Info, Message, Time } from "./styles"; @@ -20,7 +26,8 @@ export const MessageComponent: React.FC = (props) => { const incomingAnimation = newMessage ? SlideInLeft : undefined; - const outgoingAnimation = status === FeedbackStatus.Loading ? SlideInRight : undefined; + const outgoingAnimation = + status === FeedbackStatus.Loading ? SlideInRight : undefined; const enteringAnimation = self ? outgoingAnimation : incomingAnimation; diff --git a/apps/mobile/src/views/Chat/components/Message/styles.ts b/apps/mobile/src/views/Chat/components/Message/styles.ts index d81c527..014de0e 100644 --- a/apps/mobile/src/views/Chat/components/Message/styles.ts +++ b/apps/mobile/src/views/Chat/components/Message/styles.ts @@ -1,8 +1,9 @@ -import Animated from "react-native-reanimated"; import Color from "color"; +import Animated from "react-native-reanimated"; import styled, { css } from "styled-components/native"; import { Text } from "@/components/text"; + import { FeedbackStatus } from "../feedback"; interface MessageProps { @@ -10,7 +11,9 @@ interface MessageProps { status?: FeedbackStatus; } -export const Message = styled(Animated.View).attrs({ accessible: true })` +export const Message = styled(Animated.View).attrs({ + accessible: true, +})` padding: ${(props) => props.theme.spacing[2.5]}px; padding-top: ${(props) => props.theme.spacing[1.5]}px; padding-bottom: ${(props) => props.theme.spacing[2.5]}px; @@ -62,5 +65,5 @@ export const Info = styled.View` `; export const Time = styled(Text).attrs({ fontSize: "xxs" })` - color: ${(props) => Color(props.theme.colors.text).alpha(0.5).string()}; + color: ${(props) => new Color(props.theme.colors.text).alpha(0.5).string()}; `; diff --git a/apps/mobile/src/views/Chat/components/NextDay/index.tsx b/apps/mobile/src/views/Chat/components/NextDay/index.tsx index 08a2ba1..e431f75 100644 --- a/apps/mobile/src/views/Chat/components/NextDay/index.tsx +++ b/apps/mobile/src/views/Chat/components/NextDay/index.tsx @@ -1,9 +1,16 @@ -import { format, isSameDay, isThisWeek, isThisYear, isToday, isYesterday } from "date-fns"; -import { enUS, pt } from "date-fns/locale"; - import { Language } from "@pegada/shared/i18n/types/types"; +import { + format, + isSameDay, + isThisWeek, + isThisYear, + isToday, + isYesterday, +} from "date-fns"; +import { enUS, pt } from "date-fns/locale"; import i18n from "@/i18n"; + import { Container, DateText } from "./styles"; const formatDate = (date: Date) => { @@ -12,15 +19,17 @@ const formatDate = (date: Date) => { if (isToday(date)) { return i18n.t("chat.today"); - } else if (isYesterday(date)) { + } + if (isYesterday(date)) { return i18n.t("chat.yesterday"); - } else if (isThisWeek(date)) { + } + if (isThisWeek(date)) { return format(date, "eeee", { locale: isPtBr ? pt : enUS }); - } else if (isThisYear(date)) { + } + if (isThisYear(date)) { return format(date, "EEE., d MMM", { locale: isPtBr ? pt : enUS }); - } else { - return format(date, "d MMM, yyyy", { locale: isPtBr ? pt : enUS }); } + return format(date, "d MMM, yyyy", { locale: isPtBr ? pt : enUS }); }; const Component = ({ diff --git a/apps/mobile/src/views/Chat/components/NextDay/styles.ts b/apps/mobile/src/views/Chat/components/NextDay/styles.ts index 95d2aeb..e76de0e 100644 --- a/apps/mobile/src/views/Chat/components/NextDay/styles.ts +++ b/apps/mobile/src/views/Chat/components/NextDay/styles.ts @@ -4,10 +4,13 @@ import styled from "styled-components/native"; import { Text } from "@/components/text"; export const Container = styled.View` - margin: ${(props) => props.theme.spacing[4]}px auto ${(props) => props.theme.spacing[5]}px auto; + margin: ${(props) => props.theme.spacing[4]}px auto + ${(props) => props.theme.spacing[5]}px auto; - padding: ${(props) => props.theme.spacing[0.5]}px ${(props) => props.theme.spacing[2.5]}px - ${(props) => props.theme.spacing[1.5]}px ${(props) => props.theme.spacing[2.5]}px; + padding: ${(props) => props.theme.spacing[0.5]}px + ${(props) => props.theme.spacing[2.5]}px + ${(props) => props.theme.spacing[1.5]}px + ${(props) => props.theme.spacing[2.5]}px; border-radius: ${(props) => props.theme.radii.round}px; background-color: ${(props) => props.theme.colors.card}; @@ -22,5 +25,5 @@ export const Container = styled.View` `; export const DateText = styled(Text)` - color: ${(props) => Color(props.theme.colors.text).alpha(0.5).string()}; + color: ${(props) => new Color(props.theme.colors.text).alpha(0.5).string()}; `; diff --git a/apps/mobile/src/views/Chat/components/Send/index.tsx b/apps/mobile/src/views/Chat/components/Send/index.tsx index 6c02a50..b1a91e3 100644 --- a/apps/mobile/src/views/Chat/components/Send/index.tsx +++ b/apps/mobile/src/views/Chat/components/Send/index.tsx @@ -1,7 +1,9 @@ import { useState } from "react"; + import { useTranslation } from "react-i18next"; import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe-area-insets"; + import { useSendMessage } from "../../hooks/use-send-message"; import { Container, Input } from "./styles"; diff --git a/apps/mobile/src/views/Chat/components/Send/styles.ts b/apps/mobile/src/views/Chat/components/Send/styles.ts index 5b5cded..271c431 100644 --- a/apps/mobile/src/views/Chat/components/Send/styles.ts +++ b/apps/mobile/src/views/Chat/components/Send/styles.ts @@ -7,7 +7,8 @@ export const Input = styled.TextInput.attrs((props) => ({ selectionColor: props.theme.colors.primary, }))` border-radius: ${(props) => props.theme.radii.md}px; - padding: ${(props) => props.theme.spacing[2]}px ${(props) => props.theme.spacing[4]}px; + padding: ${(props) => props.theme.spacing[2]}px + ${(props) => props.theme.spacing[4]}px; background-color: ${(props) => props.theme.colors.card}; diff --git a/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts b/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts index 49244f7..930b405 100644 --- a/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts +++ b/apps/mobile/src/views/Chat/hooks/use-chat-pagination.ts @@ -1,9 +1,12 @@ +import type { FeedbackStatus } from "../components/feedback"; +import type { RouterOutputs } from "@/contexts/trpc-provider"; + import { useLocalSearchParams } from "expo-router"; + import { useSuspenseInfiniteQuery } from "@tanstack/react-query"; import { getTrcpContext } from "@/contexts/trcp-context"; -import { RouterOutputs } from "@/contexts/trpc-provider"; -import { FeedbackStatus } from "../components/feedback"; + import { useFetchNewMessages } from "./use-fetch-new-messages"; const PAGE_SIZE = 20; @@ -28,15 +31,16 @@ export const useChatPagination = () => { return response; }; - const { data, fetchNextPage, isFetchingNextPage, hasNextPage } = useSuspenseInfiniteQuery({ - queryKey: ["messages", matchId], - queryFn: fetchMessages, - initialPageParam: undefined, - getNextPageParam: (lastPage) => { - const morePagesExist = lastPage.length === PAGE_SIZE; - return morePagesExist ? lastPage[lastPage.length - 1]?.createdAt : undefined; - }, - }); + const { data, fetchNextPage, isFetchingNextPage, hasNextPage } = + useSuspenseInfiniteQuery({ + queryKey: ["messages", matchId], + queryFn: fetchMessages, + initialPageParam: undefined, + getNextPageParam: (lastPage) => { + const morePagesExist = lastPage.length === PAGE_SIZE; + return morePagesExist ? lastPage.at(-1)?.createdAt : undefined; + }, + }); const loadMore = () => { if (!hasNextPage || isFetchingNextPage) return; @@ -50,12 +54,7 @@ export const useChatPagination = () => { // FlashList v2 dropped the `inverted` prop, so the list renders top-down. // Reverse so the oldest message renders at the top and the newest renders // at the bottom — adjacent to the Send composer, matching chat UX. - const messages = data - ? data.pages - .flatMap((page) => page) - .slice() - .reverse() - : []; + const messages = data ? data.pages.flat().reverse() : []; return { messages, diff --git a/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts b/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts index 8af86af..7935611 100644 --- a/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts +++ b/apps/mobile/src/views/Chat/hooks/use-fetch-new-messages.ts @@ -1,10 +1,12 @@ +import type { MessageProps } from "./use-chat-pagination"; + import { useEffect, useRef } from "react"; + import { useLocalSearchParams } from "expo-router"; import { getTrcpContext } from "@/contexts/trcp-context"; import { sendError } from "@/services/error-tracking"; import { queryClient } from "@/services/query-client"; -import { MessageProps } from "./use-chat-pagination"; const REFRESH_INTERVAL = 5000; export const useFetchNewMessages = () => { @@ -19,7 +21,7 @@ export const useFetchNewMessages = () => { gt: latestPollTimestampRef.current, }); - if (!newMessages || !newMessages.length) return; + if (!newMessages || newMessages.length === 0) return; latestPollTimestampRef.current = new Date(); @@ -47,7 +49,7 @@ export const useFetchNewMessages = () => { return 0; }); - const lastMessage = updatedPages[0][0]; + const [[lastMessage]] = updatedPages; // Update last message for this match getTrcpContext().match.getAll.setData(undefined, (matches) => { @@ -58,7 +60,7 @@ export const useFetchNewMessages = () => { ...matches.filter((match) => match.id !== matchId), { ...match, - lastMessage: lastMessage, + lastMessage, }, ]; }); @@ -66,9 +68,9 @@ export const useFetchNewMessages = () => { return { ...oldData, pages: updatedPages }; }, ); - } catch (err) { + } catch (error) { // Deals with pooling errors silently - sendError(err); + sendError(error); } }; diff --git a/apps/mobile/src/views/Chat/hooks/use-send-message.ts b/apps/mobile/src/views/Chat/hooks/use-send-message.ts index ba2cb1a..9da2cb4 100644 --- a/apps/mobile/src/views/Chat/hooks/use-send-message.ts +++ b/apps/mobile/src/views/Chat/hooks/use-send-message.ts @@ -1,11 +1,14 @@ +import type { MessageProps } from "./use-chat-pagination"; + import { useLocalSearchParams } from "expo-router"; -import * as uuid from "uuid"; + +import { v4 as uuidV4 } from "uuid"; import { getTrcpContext } from "@/contexts/trcp-context"; import { sendError } from "@/services/error-tracking"; import { queryClient } from "@/services/query-client"; + import { FeedbackStatus } from "../components/feedback"; -import { MessageProps } from "./use-chat-pagination"; export const useSendMessage = () => { const { matchId } = useLocalSearchParams(); @@ -61,7 +64,8 @@ export const useSendMessage = () => { ["messages", matchId], (oldData: { pages: MessageProps[][] } | undefined) => { const updatedPages = [...(oldData?.pages ?? [[]])]; - updatedPages[0] = updatedPages[0]?.filter((message) => message.id !== id) ?? []; + updatedPages[0] = + updatedPages[0]?.filter((message) => message.id !== id) ?? []; return { ...oldData, pages: updatedPages }; }, ); @@ -99,7 +103,7 @@ export const useSendMessage = () => { }; const sendMessage = async (content: string) => { - const tempId = uuid.v4(); + const tempId = uuidV4(); try { // Add a fake 'sending' message to give an optimistic UI @@ -114,8 +118,8 @@ export const useSendMessage = () => { ...newMessage, newMessage: true, }); - } catch (err) { - sendError(err); + } catch (error) { + sendError(error); errorTemp(tempId); setTimeout(() => removeTemp(tempId), 1500); diff --git a/apps/mobile/src/views/Chat/index.tsx b/apps/mobile/src/views/Chat/index.tsx index 03f137f..bc3c031 100644 --- a/apps/mobile/src/views/Chat/index.tsx +++ b/apps/mobile/src/views/Chat/index.tsx @@ -1,5 +1,9 @@ +import type { MessageProps } from "./hooks/use-chat-pagination"; + import { ActivityIndicator, Platform } from "react-native"; + import { useLocalSearchParams } from "expo-router"; + import { FlashList } from "@shopify/flash-list"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components/native"; @@ -7,9 +11,10 @@ import { useTheme } from "styled-components/native"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { useKeyboardAwareSafeAreaInsets } from "@/hooks/use-keyboard-aware-safe-area-insets"; import { Header, Message, NextDay, Send } from "@/views/Chat/components"; + import { HEADER_HEIGHT } from "./components/Header"; import { SEND_HEIGHT } from "./components/Send"; -import { MessageProps, useChatPagination } from "./hooks/use-chat-pagination"; +import { useChatPagination } from "./hooks/use-chat-pagination"; import { Background, CenteredText, CenteredView, Container } from "./styles"; const Empty = () => { @@ -25,6 +30,10 @@ const Empty = () => { const keyExtractor = (message: MessageProps) => String(message.id); +// Hoisted: a component declared during render is a new type on every update, +// which remounts the empty state each time a message arrives. +const ListEmptyComponent = () => ; + const ChatMessageList = () => { const { dogId } = useLocalSearchParams(); const theme = useTheme(); @@ -33,7 +42,9 @@ const ChatMessageList = () => { const insets = useKeyboardAwareSafeAreaInsets(); - const MessageLoader = hasNextPage ? : null; + const MessageLoader = hasNextPage ? ( + + ) : null; const FooterComponent = messages ? MessageLoader : null; @@ -50,9 +61,13 @@ const ChatMessageList = () => { paddingBottom: bottomPadding, }; - const ListEmptyComponent = () => ; - - const renderItem = ({ item, index }: { item: MessageProps; index: number }) => { + const renderItem = ({ + item, + index, + }: { + item: MessageProps; + index: number; + }) => { // Show the date separator above this message when the previous (older) // message is on a different day. Hide it for the very first item when // older pages may still load — we don't yet know if it's truly first. @@ -61,7 +76,9 @@ const ChatMessageList = () => { return ( <> - {showNextDay ? : null} + {showNextDay ? ( + + ) : null} {item.content} @@ -84,7 +101,7 @@ const ChatMessageList = () => { }; return ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any -- FlashList v2's prop types reject the union this list builds; the props are checked where they are assembled. ); }; @@ -92,15 +109,22 @@ const ChatMessageList = () => { const Chat = () => { const theme = useTheme(); + // The tiled background is a texture, not a surface: it has to sit further + // back on dark than on light to read as the same weight. + const patternOpacity = theme.dark ? 0.06 : 0.03; + return ( - + diff --git a/apps/mobile/src/views/Chat/styles.ts b/apps/mobile/src/views/Chat/styles.ts index b1600a0..63adca6 100644 --- a/apps/mobile/src/views/Chat/styles.ts +++ b/apps/mobile/src/views/Chat/styles.ts @@ -19,7 +19,8 @@ export const CenteredView = styled(Animated.View).attrs(() => ({ flex: 1; align-items: center; justify-content: center; - padding: ${(props) => props.theme.spacing[6]}px ${(props) => props.theme.spacing[3]}px; + padding: ${(props) => props.theme.spacing[6]}px + ${(props) => props.theme.spacing[3]}px; `; export const CenteredText = styled(Text)` diff --git a/apps/mobile/src/views/DogProfile/components/GoBack/index.tsx b/apps/mobile/src/views/DogProfile/components/GoBack/index.tsx index 806a788..d611b6d 100644 --- a/apps/mobile/src/views/DogProfile/components/GoBack/index.tsx +++ b/apps/mobile/src/views/DogProfile/components/GoBack/index.tsx @@ -1,7 +1,9 @@ import * as React from "react"; + import { useTheme } from "styled-components/native"; import ArrowDown from "@/assets/images/ArrowDown.svg"; + import { Container, Content } from "./styles"; const GoBack = (props: React.ComponentProps) => { diff --git a/apps/mobile/src/views/DogProfile/components/breed-tag.tsx b/apps/mobile/src/views/DogProfile/components/breed-tag.tsx index 7b34e88..60e3392 100644 --- a/apps/mobile/src/views/DogProfile/components/breed-tag.tsx +++ b/apps/mobile/src/views/DogProfile/components/breed-tag.tsx @@ -1,13 +1,14 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; +import type { BreedSlug } from "@pegada/shared/i18n/i18n"; + import { View } from "react-native"; -import { useTranslation } from "react-i18next"; -import styled from "styled-components/native"; -import { BreedSlug } from "@pegada/shared/i18n/i18n"; import { Namespace } from "@pegada/shared/i18n/types/types"; +import { useTranslation } from "react-i18next"; +import styled from "styled-components/native"; -import { Text } from "@/components/text"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { TransparentGlassOrDarkBlurView } from "@/components/blur-view"; +import { Text } from "@/components/text"; const GlassmorphismStyled = styled(TransparentGlassOrDarkBlurView).attrs({ glassEffectStyle: "regular", @@ -20,7 +21,8 @@ const GlassmorphismStyled = styled(TransparentGlassOrDarkBlurView).attrs({ `; const ViewStyled = styled(View)` - padding: ${(props) => props.theme.spacing[2]}px ${(props) => props.theme.spacing[4]}px; + padding: ${(props) => props.theme.spacing[2]}px + ${(props) => props.theme.spacing[4]}px; padding-bottom: ${(props) => props.theme.spacing[2.5]}px; `; diff --git a/apps/mobile/src/views/DogProfile/index.tsx b/apps/mobile/src/views/DogProfile/index.tsx index ef45c26..d02f199 100644 --- a/apps/mobile/src/views/DogProfile/index.tsx +++ b/apps/mobile/src/views/DogProfile/index.tsx @@ -1,26 +1,31 @@ +import type { SwipeDog } from "@/store/reducers/dogs/swipe"; + import { useState } from "react"; import * as React from "react"; import { ActivityIndicator, Alert, Linking, Share, View } from "react-native"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { router, useLocalSearchParams, useRouter } from "expo-router"; import { StatusBar } from "expo-status-bar"; + import { Header, HeaderBackButton } from "@react-navigation/elements"; import i18n from "i18next"; import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useDispatch, useSelector } from "react-redux"; import { useTheme } from "styled-components/native"; import MainCard from "@/components/MainCard"; import { MatchActionBar } from "@/components/MatchActionBar"; -import { NetworkBoundary, UnknownErrorComponent } from "@/components/NetworkBoundary"; -import { Text } from "@/components/text"; +import { + NetworkBoundary, + UnknownErrorComponent, +} from "@/components/NetworkBoundary"; import { APP_SHARE_LINK_BASE } from "@/constants"; import { getTrcpContext } from "@/contexts/trcp-context"; import { api } from "@/contexts/trpc-provider"; import { sendError } from "@/services/error-tracking"; import { useGetFormattedYears } from "@/services/use-get-formatted-years"; import { Actions } from "@/store/reducers"; -import { SwipeDog } from "@/store/reducers/dogs/swipe"; import { getCurrentCardId } from "@/store/selectors"; import { SceneName } from "@/types/scene-name"; import { useCustomTopInset } from "@/views/(tabs)/Swipe"; @@ -28,12 +33,13 @@ import { swipeHandlerRef } from "@/views/(tabs)/Swipe/components/SwipeHandler"; import { Swipe } from "@/views/(tabs)/Swipe/components/SwipeHandler/hooks/use-swipe-gesture"; import { BreedTag } from "@/views/DogProfile/components/breed-tag"; import GoBack from "@/views/DogProfile/components/GoBack"; + import * as S from "./styles"; export const ShareButton: React.FC<{ dog: SwipeDog }> = ({ dog }) => { const { t } = useTranslation(); - const firstName = dog.name.split(" ")[0]; + const [firstName] = dog.name.split(" "); const handleShare = async () => { try { @@ -54,9 +60,9 @@ export const ShareButton: React.FC<{ dog: SwipeDog }> = ({ dog }) => { return ( - + {t("dogProfile.shareProfile", { name: firstName })} - + ); }; @@ -93,9 +99,9 @@ export const reportUser = (dog: SwipeDog) => { }); router.back(); - } catch (err) { + } catch (error) { // Silently fail - sendError(err); + sendError(error); } }, }, @@ -113,7 +119,7 @@ const useSwipeHandler = (id: string) => { return swipeHandlerRef.current.gotoDirection(swipeType); } - dispatch(Actions.dogs.swipe.request({ id: id, swipeType })); + dispatch(Actions.dogs.swipe.request({ id, swipeType })); }; }; @@ -154,18 +160,24 @@ const DogProfile = () => { }); router.push(SceneName.Messages); - } catch (err) { - sendError(err); + } catch (error) { + sendError(error); - Alert.alert(t("dogProfile.somethingWrong"), t("dogProfile.tryAgainLater")); + Alert.alert( + t("dogProfile.somethingWrong"), + t("dogProfile.tryAgainLater"), + ); } finally { setUnmatchLoading(false); } }; - const [dog] = api.dog.get.useSuspenseQuery({ id: id as string }, { refetchOnMount: false }); + const [dog] = api.dog.get.useSuspenseQuery( + { id: id as string }, + { refetchOnMount: false }, + ); - const firstName = dog.name.split(" ")[0]; + const [firstName] = dog.name.split(" "); const mainCardStyle = { paddingTop: Math.max(insets.top, theme.spacing[6]), @@ -200,7 +212,9 @@ const DogProfile = () => { {dog.name} - {dog.birthDate ? , {getFormattedYears(dog.birthDate)} : undefined} + {dog.birthDate ? ( + , {getFormattedYears(dog.birthDate)} + ) : undefined} {dog.bio} @@ -214,36 +228,34 @@ const DogProfile = () => { {unmatchLoading ? ( ) : ( - + {t("dogProfile.unmatch")} - + )} )} - reportUser(dog)} fontWeight="bold" - style={{ textAlign: "center" }} > {t("dogProfile.reportName", { name: firstName })} - + {__DEV__ && matchId ? ( - { router.push({ pathname: SceneName.NewMatch, - params: { matchDogId: dog.id, matchId: matchId }, + params: { matchDogId: dog.id, matchId }, }); }} fontWeight="bold" - style={{ textAlign: "center" }} > Fake Match Screen - + ) : null} @@ -253,7 +265,9 @@ const DogProfile = () => { {!matchId && ( <> - + swipeHandler(Swipe.Dislike)} @@ -266,41 +280,51 @@ const DogProfile = () => { ); }; +const ErrorHeaderBackButton = () => { + const theme = useTheme(); + + return ( + router.back()} + /> + ); +}; + const DogProfileErrorState = () => { const { t } = useTranslation(); const theme = useTheme(); return ( - +
( - router.back()} - /> - )} - headerRightContainerStyle={{ paddingRight: 16 }} - headerLeftContainerStyle={{ paddingLeft: 16 }} + headerLeft={ErrorHeaderBackButton} + headerRightContainerStyle={S.headerRight} + headerLeftContainerStyle={S.headerLeft} headerTintColor={theme.colors.text} - headerTitleStyle={{ - fontFamily: theme.typography.fontFamily.bold, - fontWeight: "bold", - fontSize: theme.typography.sizes.lg.size, - }} + headerTitleStyle={[ + S.headerTitle, + { + fontFamily: theme.typography.fontFamily.bold, + fontSize: theme.typography.sizes.lg.size, + }, + ]} headerStyle={{ backgroundColor: theme.colors.background, }} /> - + ); }; -export default () => ( +const DogProfileScreen = () => ( ); + +export default DogProfileScreen; diff --git a/apps/mobile/src/views/DogProfile/styles.ts b/apps/mobile/src/views/DogProfile/styles.ts index 71850f2..5294bff 100644 --- a/apps/mobile/src/views/DogProfile/styles.ts +++ b/apps/mobile/src/views/DogProfile/styles.ts @@ -1,4 +1,7 @@ +import { StyleSheet } from "react-native"; + import { LinearGradient } from "expo-linear-gradient"; + import Color from "color"; import { clamp } from "lodash"; import styled from "styled-components/native"; @@ -41,7 +44,7 @@ export const ReportButton = styled(PressableArea).attrs({ `; export const MatchActionBarGradient = styled(LinearGradient).attrs((props) => { - const gradientColor = Color(props.theme.colors.background); + const gradientColor = new Color(props.theme.colors.background); return { colors: [ @@ -82,3 +85,23 @@ export const Description = styled(Text)` margin-top: ${(props) => props.theme.spacing[2]}px; margin-bottom: ${(props) => props.theme.spacing[12]}px; `; + +/** Centred label shared by the share / unmatch / report actions. */ +export const ActionLabel = styled(Text)` + text-align: center; +`; + +export const ErrorScreen = styled.View` + flex-grow: 1; + background-color: ${({ theme }) => theme.colors.background}; +`; + +/** + * `@react-navigation` header slots take style props rather than components, so + * the static half of each one lives in a sheet and the themed half stays inline. + */ +export const { headerLeft, headerRight, headerTitle } = StyleSheet.create({ + headerLeft: { paddingLeft: 16 }, + headerRight: { paddingRight: 16 }, + headerTitle: { fontWeight: "bold" }, +}); diff --git a/apps/mobile/src/views/EditProfile/index.tsx b/apps/mobile/src/views/EditProfile/index.tsx index ce042da..2ceab2a 100644 --- a/apps/mobile/src/views/EditProfile/index.tsx +++ b/apps/mobile/src/views/EditProfile/index.tsx @@ -1,37 +1,43 @@ +import type { ProfileImagesUploaderProps } from "@/components/ProfileImageUploader"; +import type { Picture } from "@/components/ProfileImageUploader/utils"; +import type { RouterInputs } from "@/contexts/trpc-provider"; + +import type { ScrollView } from "react-native"; + import { useEffect, useRef, useState } from "react"; -import { KeyboardAvoidingView, Platform, ScrollView, View } from "react-native"; -import { magicToast } from "react-native-magic-toast"; +import { Platform } from "react-native"; + import { useRouter } from "expo-router"; + import { zodResolver } from "@hookform/resolvers/zod"; +import { dogClientSchema } from "@pegada/shared/schemas/dog-schema"; import { useHeaderHeight } from "@react-navigation/elements"; import { format } from "date-fns"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; import { useDispatch } from "react-redux"; import { useTheme } from "styled-components/native"; -import { dogClientSchema } from "@pegada/shared/schemas/dog-schema"; - import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; import BreedPicker from "@/components/BreedPicker"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; +import { Fill, KeyboardScreen, Row } from "@/components/layout"; import { NetworkBoundary } from "@/components/NetworkBoundary"; import { InputPicker } from "@/components/Picker"; -import { - ProfileImagesUploader, - ProfileImagesUploaderProps, -} from "@/components/ProfileImageUploader"; -import { Picture, pictures } from "@/components/ProfileImageUploader/utils"; +import { ProfileImagesUploader } from "@/components/ProfileImageUploader"; +import { pictures } from "@/components/ProfileImageUploader/utils"; import { RadioButtons } from "@/components/RadioButtons"; import { getTrcpContext } from "@/contexts/trcp-context"; -import { api, RouterInputs } from "@/contexts/trpc-provider"; +import { api } from "@/contexts/trpc-provider"; import { analytics } from "@/services/analytics"; import { colors, sizes } from "@/services/consts"; import { sendError } from "@/services/error-tracking"; import { maskDate } from "@/services/mask-date"; import { Actions } from "@/store/reducers"; -import { Container } from "./styles"; + +import { Container, Gap, MultilineInput, WideColumn } from "./styles"; type MyDogUpdateMutation = RouterInputs["myDog"]["update"]; type EditProfileForm = Partial; @@ -40,20 +46,21 @@ const EditProfile = () => { const router = useRouter(); const { t } = useTranslation(); - const { control, handleSubmit, setValue, getValues } = useForm({ - defaultValues: { - name: "", - bio: "", - gender: "MALE", - weight: undefined, - birthDate: "", - breedId: "", - color: undefined, - size: undefined, - images: pictures, - }, - resolver: zodResolver(dogClientSchema), - }); + const { control, handleSubmit, setValue, getValues } = + useForm({ + defaultValues: { + name: "", + bio: "", + gender: "MALE", + weight: undefined, + birthDate: "", + breedId: "", + color: undefined, + size: undefined, + images: pictures, + }, + resolver: zodResolver(dogClientSchema), + }); const [dog] = api.myDog.get.useSuspenseQuery(undefined, { refetchOnMount: false, @@ -140,7 +147,7 @@ const EditProfile = () => { birthDate: data.birthDate ? data.birthDate : null, breedId: data.breedId ? data.breedId : null, color: data.color ? data.color : null, - size: data.size ? data.size : null, + size: data.size ?? null, images: data.images?.map((image, index) => ({ id: image.id, url: image.url, @@ -152,18 +159,16 @@ const EditProfile = () => { }); return ( - - + + { return ( [0]) => { + onChange={( + cb: Parameters[0], + ) => { // This getValues is needed to ensure the update happens // correctly even when adding images fast. onChange(cb(getValues("images") as Picture[])); @@ -213,7 +220,7 @@ const EditProfile = () => { control={control} rules={{ required: true }} render={({ field: { onChange, onBlur, value }, fieldState }) => ( - { maxLength={500} multiline error={fieldState.error?.message} - style={{ minHeight: 75 }} /> )} /> - - + + ( + render={({ + field: { onChange, onBlur, value }, + fieldState, + }) => ( { onBlur={onBlur} onChangeText={(value: string) => // Only allow numbers - onChange(value.replace(/[^0-9]/g, "")) + onChange(value.replaceAll(/[^0-9]/g, "")) } maxLength={3} numberOfLines={1} @@ -250,14 +259,17 @@ const EditProfile = () => { /> )} /> - - - + + + ( + render={({ + field: { onChange, onBlur, value, name }, + fieldState, + }) => ( { onBlur={onBlur} onChangeText={(value: string) => { const oldValue = getValues()[name]; - const isErasing = value.length < (oldValue ? oldValue.length : 0); + const isErasing = + value.length < (oldValue ? oldValue.length : 0); if (isErasing) return onChange(value); @@ -278,8 +291,8 @@ const EditProfile = () => { /> )} /> - - + + { )} /> - + { )} /> - + { /> )} /> - + { { onChange(value === t("editProfile.male") ? "MALE" : "FEMALE"); }} @@ -353,13 +370,15 @@ const EditProfile = () => { {t("editProfile.saveProfile")} - - + + ); }; -export default () => ( +const EditProfileScreen = () => ( ); + +export default EditProfileScreen; diff --git a/apps/mobile/src/views/EditProfile/styles.ts b/apps/mobile/src/views/EditProfile/styles.ts index 60201cf..c45d663 100644 --- a/apps/mobile/src/views/EditProfile/styles.ts +++ b/apps/mobile/src/views/EditProfile/styles.ts @@ -1,5 +1,21 @@ import styled from "styled-components/native"; +import { Input } from "@/components/Input"; + export const Container = styled.ScrollView` - flex-grow: 1; + flex: 1; +`; + +/** The wider half of the weight / birth-date row. */ +export const WideColumn = styled.View` + flex: 1.5; +`; + +/** The fixed gutter between two fields sharing a row. */ +export const Gap = styled.View` + width: ${({ theme }) => theme.spacing[3]}px; +`; + +export const MultilineInput = styled(Input)` + min-height: 75px; `; diff --git a/apps/mobile/src/views/ForceUpdate/index.tsx b/apps/mobile/src/views/ForceUpdate/index.tsx index f15f7f2..5a8b832 100644 --- a/apps/mobile/src/views/ForceUpdate/index.tsx +++ b/apps/mobile/src/views/ForceUpdate/index.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import { Linking } from "react-native"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; @@ -8,6 +9,7 @@ import { BottomAction } from "@/components/BottomAction"; import { Button } from "@/components/Button"; import { APP_SHARE_LINK_BASE } from "@/constants"; import { sendError } from "@/services/error-tracking"; + import { CenterText, Container } from "./styles"; const ForceUpdate: React.FC = () => { diff --git a/apps/mobile/src/views/LocationMap/components/Bubble/index.tsx b/apps/mobile/src/views/LocationMap/components/Bubble/index.tsx index 87e8599..38ffa02 100644 --- a/apps/mobile/src/views/LocationMap/components/Bubble/index.tsx +++ b/apps/mobile/src/views/LocationMap/components/Bubble/index.tsx @@ -1,10 +1,22 @@ +import type Animated from "react-native-reanimated"; + import * as React from "react"; -import Animated from "react-native-reanimated"; + import { useTranslation } from "react-i18next"; -import { Container, Content, Description, Rect, Row, Swipe, Title } from "./styles"; +import { + Container, + Content, + Description, + Rect, + Row, + Swipe, + Title, +} from "./styles"; -export const Bubble: React.FC> = (props) => { +export const Bubble: React.FC> = ( + props, +) => { const { t } = useTranslation(); return ( diff --git a/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts b/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts index 9bb0d9e..2ccab0e 100644 --- a/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts +++ b/apps/mobile/src/views/LocationMap/components/Bubble/styles.ts @@ -1,5 +1,5 @@ -import Animated from "react-native-reanimated"; import LottieView from "lottie-react-native"; +import Animated from "react-native-reanimated"; import styled from "styled-components/native"; import { Text } from "@/components/text"; @@ -16,7 +16,8 @@ export const Swipe = styled(LottieView).attrs({ export const Container = styled(Animated.View)` position: absolute; - padding: ${(props) => props.theme.spacing[2.5]}px ${(props) => props.theme.spacing[4]}px; + padding: ${(props) => props.theme.spacing[2.5]}px + ${(props) => props.theme.spacing[4]}px; background: ${(props) => props.theme.colors.background}; border: 1px ${(props) => props.theme.colors.border}; align-items: center; diff --git a/apps/mobile/src/views/LocationMap/components/Marker/index.tsx b/apps/mobile/src/views/LocationMap/components/Marker/index.tsx index 4a783c7..4765d53 100644 --- a/apps/mobile/src/views/LocationMap/components/Marker/index.tsx +++ b/apps/mobile/src/views/LocationMap/components/Marker/index.tsx @@ -1,10 +1,12 @@ +import type { SharedValue } from "react-native-reanimated"; + import * as React from "react"; + import Animated, { Extrapolation, FadeInDown, FadeOutUp, interpolate, - SharedValue, useAnimatedStyle, } from "react-native-reanimated"; import Svg, { Path } from "react-native-svg"; @@ -33,7 +35,12 @@ export const Marker: React.FC<{ const markerViewStyle = useAnimatedStyle(() => { "worklet"; - const markerTop = interpolate(dragging.value, [1, 0], [-15, 0], Extrapolation.CLAMP); + const markerTop = interpolate( + dragging.value, + [1, 0], + [-15, 0], + Extrapolation.CLAMP, + ); return { top: markerTop, diff --git a/apps/mobile/src/views/LocationMap/components/Submit/index.tsx b/apps/mobile/src/views/LocationMap/components/Submit/index.tsx index e5c121c..677ec95 100644 --- a/apps/mobile/src/views/LocationMap/components/Submit/index.tsx +++ b/apps/mobile/src/views/LocationMap/components/Submit/index.tsx @@ -1,13 +1,16 @@ +import type { SharedValue } from "react-native-reanimated"; + import * as React from "react"; + +import { useTranslation } from "react-i18next"; import Animated, { Extrapolation, interpolate, - SharedValue, useAnimatedStyle, } from "react-native-reanimated"; -import { useTranslation } from "react-i18next"; import { BottomAction } from "@/components/BottomAction"; + import { StyledButton } from "./styles"; interface SubmitProps { @@ -16,7 +19,11 @@ interface SubmitProps { dragging: SharedValue; } -export const Submit: React.FC = ({ loading, onPress, dragging }) => { +export const Submit: React.FC = ({ + loading, + onPress, + dragging, +}) => { const { t } = useTranslation(); const buttonAnimatedStyle = useAnimatedStyle(() => { @@ -35,7 +42,11 @@ export const Submit: React.FC = ({ loading, onPress, dragging }) => return ( - + {t("locationMap.confirmLocation")} diff --git a/apps/mobile/src/views/LocationMap/index.tsx b/apps/mobile/src/views/LocationMap/index.tsx index de708a2..8874b7c 100644 --- a/apps/mobile/src/views/LocationMap/index.tsx +++ b/apps/mobile/src/views/LocationMap/index.tsx @@ -1,11 +1,13 @@ import { useRef, useState } from "react"; import { Alert, Platform } from "react-native"; -import { magicToast } from "react-native-magic-toast"; -import { Easing, useSharedValue, withTiming } from "react-native-reanimated"; + import { useRouter } from "expo-router"; + import { useHeaderHeight } from "@react-navigation/elements"; import { useMutation } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; +import { Easing, useSharedValue, withTiming } from "react-native-reanimated"; import { useDispatch } from "react-redux"; import { useTheme } from "styled-components/native"; @@ -14,6 +16,7 @@ import { NetworkBoundary } from "@/components/NetworkBoundary"; import { api } from "@/contexts/trpc-provider"; import { sendError } from "@/services/error-tracking"; import { Actions } from "@/store/reducers"; + import { updateUserLocation } from "../(auth)/AskForLocation"; import { Marker } from "./components/Marker"; import { Submit } from "./components/Submit"; @@ -93,7 +96,9 @@ const LocationMap = () => { mapPadding={mapPadding} // Android doesn't switch maps to dark mode like IOS does, // so we need to set the custom style manually - customMapStyle={theme.dark ? require("./assets/map-dark.json") : undefined} + customMapStyle={ + theme.dark ? require("./assets/map-dark.json") : undefined + } key={theme.dark ? "dark" : "light"} initialRegion={{ latitude: location?.latitude, @@ -104,13 +109,15 @@ const LocationMap = () => { onTouchStart={() => setTouchStarted(true)} onRegionChange={() => { if (!touchStarted) return; - // eslint-disable-next-line react-compiler/react-compiler -- false positive dragging.value = withTiming(1, { easing: Easing.in(Easing.ease), duration: 200, }); }} - onRegionChangeComplete={(newLocation: { latitude: number; longitude: number }) => { + onRegionChangeComplete={(newLocation: { + latitude: number; + longitude: number; + }) => { setLocation({ latitude: newLocation.latitude, longitude: newLocation.longitude, @@ -132,8 +139,10 @@ const LocationMap = () => { ); }; -export default () => ( +const LocationMapScreen = () => ( ); + +export default LocationMapScreen; diff --git a/apps/mobile/src/views/NewMatch/animated-cards.tsx b/apps/mobile/src/views/NewMatch/animated-cards.tsx index 27eac7c..7790e47 100644 --- a/apps/mobile/src/views/NewMatch/animated-cards.tsx +++ b/apps/mobile/src/views/NewMatch/animated-cards.tsx @@ -1,13 +1,31 @@ +import type { RouterOutputs } from "@/contexts/trpc-provider"; + import { useEffect } from "react"; import * as React from "react"; import { useWindowDimensions, View } from "react-native"; -import { useAnimatedStyle, useSharedValue, withDelay, withTiming } from "react-native-reanimated"; -import { useTheme } from "styled-components"; -import { Image } from "@/components/image"; -import { DefaultLoadingComponent, NetworkBoundary } from "@/components/NetworkBoundary"; -import { api, RouterOutputs } from "@/contexts/trpc-provider"; -import { HeartEyesContainer, RotatedImageLeft, RotatedImageRight } from "./styles"; +import { + useAnimatedStyle, + useSharedValue, + withDelay, + withTiming, +} from "react-native-reanimated"; + +import { + DefaultLoadingComponent, + NetworkBoundary, +} from "@/components/NetworkBoundary"; +import { api } from "@/contexts/trpc-provider"; + +import { + CardsColumn, + HeartEyesContainer, + HeartEyesEmoji, + HeartEyesEmojiStandalone, + LoadingBox, + RotatedImageLeft, + RotatedImageRight, +} from "./styles"; interface AnimatedCardsProps { matchDog?: RouterOutputs["dog"]["get"]; @@ -26,7 +44,6 @@ const AnimatedCards: React.FC = ({ matchDog }) => { const CARD_HEIGHT = windowDimensions.height < 800 ? 200 : 325; useEffect(() => { - // eslint-disable-next-line react-compiler/react-compiler -- false positive rotateZ.value = withDelay(500, withTiming(ROTATE_Z, { duration: 500 })); }, [rotateZ]); @@ -53,59 +70,51 @@ const AnimatedCards: React.FC = ({ matchDog }) => { }); return ( - + - - + ); }; -const AnimatedCardsErrorFallback = () => { - const theme = useTheme(); - return ( - - ); -}; +const AnimatedCardsErrorFallback = () => ( + +); -const AnimatedCardsLoading = () => { - return ( - - - - ); -}; +const AnimatedCardsLoading = () => ( + + + +); -export default ({ matchDog }: AnimatedCardsProps) => ( +const AnimatedCardsBoundary = ({ matchDog }: AnimatedCardsProps) => ( } errorFallback={AnimatedCardsErrorFallback} @@ -113,3 +122,5 @@ export default ({ matchDog }: AnimatedCardsProps) => ( ); + +export default AnimatedCardsBoundary; diff --git a/apps/mobile/src/views/NewMatch/confetti-animation.tsx b/apps/mobile/src/views/NewMatch/confetti-animation.tsx index 7783ea1..b34eac0 100644 --- a/apps/mobile/src/views/NewMatch/confetti-animation.tsx +++ b/apps/mobile/src/views/NewMatch/confetti-animation.tsx @@ -1,11 +1,10 @@ -import AnimatedLottieView from "lottie-react-native"; +import { Confetti } from "./styles"; export const ConfettiAnimation = () => ( - ); diff --git a/apps/mobile/src/views/NewMatch/index.tsx b/apps/mobile/src/views/NewMatch/index.tsx index da01555..9ae423e 100644 --- a/apps/mobile/src/views/NewMatch/index.tsx +++ b/apps/mobile/src/views/NewMatch/index.tsx @@ -1,9 +1,10 @@ import { useEffect } from "react"; import * as React from "react"; import { BackHandler, ScrollView, View } from "react-native"; -import { Image } from "expo-image"; + import { useFocusEffect, useLocalSearchParams, useRouter } from "expo-router"; import { StatusBar } from "expo-status-bar"; + import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; @@ -15,9 +16,16 @@ import { useForAdRequestTracked } from "@/services/advertisement/interstitial"; import { analytics } from "@/services/analytics"; import { haptics } from "@/services/haptics"; import { SceneName } from "@/types/scene-name"; + import AnimatedCards from "./animated-cards"; import { ConfettiAnimation } from "./confetti-animation"; -import { Container, Content } from "./styles"; +import { + Container, + Content, + matchScroll, + MatchCaption, + MatchWordmark, +} from "./styles"; const NewMatch: React.FC = () => { const { matchId, matchDogId } = useLocalSearchParams<{ @@ -73,10 +81,13 @@ const NewMatch: React.FC = () => { useFocusEffect(() => { // Assume 'skip' if the user presses the back button // This is pertinent to Android devices only. - const subscription = BackHandler.addEventListener("hardwareBackPress", () => { - void handleSkip(); - return false; - }); + const subscription = BackHandler.addEventListener( + "hardwareBackPress", + () => { + void handleSkip(); + return false; + }, + ); return () => subscription.remove(); }); @@ -91,49 +102,35 @@ const NewMatch: React.FC = () => { - + {t("newMatch.youGotA")} - - + {t("newMatch.youLikedEachOther", { replace: { name: matchDog.name }, })} - + - @@ -142,8 +139,10 @@ const NewMatch: React.FC = () => { ); }; -export default () => ( +const NewMatchScreen = () => ( ); + +export default NewMatchScreen; diff --git a/apps/mobile/src/views/NewMatch/styles.ts b/apps/mobile/src/views/NewMatch/styles.ts index f807d57..f57fd16 100644 --- a/apps/mobile/src/views/NewMatch/styles.ts +++ b/apps/mobile/src/views/NewMatch/styles.ts @@ -1,9 +1,13 @@ +import { StyleSheet } from "react-native"; + +import Color from "color"; +import AnimatedLottieView from "lottie-react-native"; import Animated from "react-native-reanimated"; import { SafeAreaView } from "react-native-safe-area-context"; -import Color from "color"; import styled from "styled-components/native"; import { Image } from "@/components/image"; +import { Text } from "@/components/text"; export const Container = styled.View` background-color: ${(props) => props.theme.colors.background}; @@ -29,8 +33,54 @@ export const RotatedImageRight = styled(RotatedImageLeft)` export const HeartEyesContainer = styled.View` border-radius: ${(props) => props.theme.radii.round}px; - background-color: ${(props) => Color(props.theme.colors.primary).alpha(0.5).rgb().string()}; + background-color: ${(props) => + new Color(props.theme.colors.primary).alpha(0.5).rgb().string()}; padding: ${(props) => props.theme.spacing[1.5]}px; margin-top: -35px; margin-bottom: ${(props) => props.theme.spacing[2]}px; `; + +export const CardsColumn = styled.View` + align-items: center; +`; + +export const HeartEyesEmoji = styled(Image)` + width: 70px; + height: 70px; +`; + +/** Same emoji, standing in for the whole card stack when it fails to load. */ +export const HeartEyesEmojiStandalone = styled(HeartEyesEmoji)` + margin-bottom: ${({ theme }) => theme.spacing[5]}px; +`; + +export const LoadingBox = styled.View` + height: 200px; +`; + +/** `contentContainerStyle` takes a style object, not a component. */ +export const { matchScroll } = StyleSheet.create({ + matchScroll: { + alignItems: "center", + justifyContent: "center", + flexGrow: 1, + }, +}); + +export const MatchWordmark = styled(Image)` + height: 50px; + width: 100%; +`; + +export const MatchCaption = styled(Text)` + text-align: center; + margin-top: 12px; + max-width: 200px; +`; + +export const Confetti = styled(AnimatedLottieView)` + position: absolute; + width: 100%; + height: 100%; + top: 0; +`; diff --git a/apps/mobile/src/views/Preferences/index.tsx b/apps/mobile/src/views/Preferences/index.tsx index c6f1942..dc13826 100644 --- a/apps/mobile/src/views/Preferences/index.tsx +++ b/apps/mobile/src/views/Preferences/index.tsx @@ -1,12 +1,17 @@ +import type { RouterInputs } from "@/contexts/trpc-provider"; +import type { Resolver } from "react-hook-form"; + import { useEffect } from "react"; import * as React from "react"; import { Dimensions } from "react-native"; -import { magicToast } from "react-native-magic-toast"; + import { useRouter } from "expo-router"; + import { zodResolver } from "@hookform/resolvers/zod"; import { useHeaderHeight } from "@react-navigation/elements"; import { t } from "i18next"; import { Controller, useForm } from "react-hook-form"; +import { magicToast } from "react-native-magic-toast"; import { useDispatch } from "react-redux"; import { useTheme } from "styled-components/native"; import { z } from "zod"; @@ -18,13 +23,20 @@ import { NetworkBoundary } from "@/components/NetworkBoundary"; import { InputPicker } from "@/components/Picker"; import { Slider } from "@/components/Slider"; import { getTrcpContext } from "@/contexts/trcp-context"; -import { api, RouterInputs } from "@/contexts/trpc-provider"; +import { api } from "@/contexts/trpc-provider"; import { analytics } from "@/services/analytics"; import { colors, sizes } from "@/services/consts"; import { sendError } from "@/services/error-tracking"; import { Actions } from "@/store/reducers"; import { SceneName } from "@/types/scene-name"; -import { Container, DistanceContainer, InputRow, InputSpace, SliderContainer } from "./styles"; + +import { + Container, + DistanceContainer, + InputRow, + InputSpace, + SliderContainer, +} from "./styles"; const { width } = Dimensions.get("window"); @@ -45,7 +57,10 @@ const schema = z preferredSize: z.string().nullable().optional(), preferredMaxDistance: z.array(z.number().nullable()).nullable().optional(), preferredBreedId: z.string().nullable().optional(), - preferredAgeRange: z.array(z.number().nullable().optional()).nullable().optional(), + preferredAgeRange: z + .array(z.number().nullable().optional()) + .nullable() + .optional(), }) .optional(); @@ -68,8 +83,9 @@ const Preferences: React.FC = () => { preferredBreedId: undefined, preferredAgeRange: [0, MAX_FILTER_AGE], }, - // Zod is breaking here, seems to be an issue with the library - resolver: zodResolver(schema as any), + // The zod/@hookform resolver types disagree about the refined schema's + // output; the form's own generic is what actually types the values. + resolver: zodResolver(schema) as Resolver, }); const dispatch = useDispatch(); @@ -101,7 +117,10 @@ const Preferences: React.FC = () => { }; // Unlimited - if (body.preferredMaxDistance && body.preferredMaxDistance >= MAX_FILTER_DISTANCE) { + if ( + body.preferredMaxDistance && + body.preferredMaxDistance >= MAX_FILTER_DISTANCE + ) { body.preferredMaxDistance = undefined; } @@ -131,7 +150,9 @@ const Preferences: React.FC = () => { setValue("preferredBreedId", dog.preferredBreedId); setValue("preferredColor", dog.preferredColor); setValue("preferredSize", dog.preferredSize); - setValue("preferredMaxDistance", [dog.preferredMaxDistance ?? MAX_FILTER_DISTANCE]); + setValue("preferredMaxDistance", [ + dog.preferredMaxDistance ?? MAX_FILTER_DISTANCE, + ]); setValue("preferredAgeRange", [ dog.preferredMinAge ?? 0, dog.preferredMaxAge ?? MAX_FILTER_AGE + 1, @@ -151,7 +172,9 @@ const Preferences: React.FC = () => { contentContainerStyle={{ paddingHorizontal: theme.spacing[4], paddingTop: headerHeight, - paddingBottom: scrollViewProps.contentContainerStyle.paddingBottom + theme.spacing[4], + paddingBottom: + scrollViewProps.contentContainerStyle.paddingBottom + + theme.spacing[4], }} > { itemTestIDPrefix="preferences-color-item-" title={t("preferences.color")} placeholder={t("preferences.anyColor")} - data={[{ id: null, name: t("preferences.anyColor") }, ...colors]} + data={[ + { id: null, name: t("preferences.anyColor") }, + ...colors, + ]} value={ colors.find((color) => color.id === value) ?? { id: null, @@ -276,8 +302,10 @@ const Preferences: React.FC = () => { ); }; -export default () => ( +const PreferencesScreen = () => ( ); + +export default PreferencesScreen; diff --git a/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx b/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx index 337415b..ed9b661 100644 --- a/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/Benefits/index.tsx @@ -1,4 +1,5 @@ import * as React from "react"; + import { useTranslation } from "react-i18next"; import SwipeBackArrow from "@/assets/images/SwipeBackArrow.svg"; diff --git a/apps/mobile/src/views/UpgradeWall/components/Benefits/styles.ts b/apps/mobile/src/views/UpgradeWall/components/Benefits/styles.ts index 692035c..fbfa57e 100644 --- a/apps/mobile/src/views/UpgradeWall/components/Benefits/styles.ts +++ b/apps/mobile/src/views/UpgradeWall/components/Benefits/styles.ts @@ -8,7 +8,7 @@ export const BenefitContainer = styled.View` border-radius: ${({ theme }) => theme.radii.md}px; padding: ${({ theme }) => theme.spacing[3.5]}px; background-color: ${({ theme }) => { - return Color(theme.colors.text) + return new Color(theme.colors.text) .alpha(theme.dark ? 0.05 : 0.02) .toString(); }}; @@ -25,9 +25,7 @@ export const BenefitIconContainer = styled.View` justify-content: center; border-radius: ${({ theme }) => theme.radii.sm}px; background-color: ${({ color, theme }) => - Color(color) - .alpha(theme.dark ? 0.2 : 0.1) - .toString()}; + new Color(color).alpha(theme.dark ? 0.2 : 0.1).toString()}; `; export const ContentContainer = styled.View` diff --git a/apps/mobile/src/views/UpgradeWall/components/Checkbox/index.tsx b/apps/mobile/src/views/UpgradeWall/components/Checkbox/index.tsx index 0cc1283..8407177 100644 --- a/apps/mobile/src/views/UpgradeWall/components/Checkbox/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/Checkbox/index.tsx @@ -1,6 +1,7 @@ import { useTheme } from "styled-components"; import Check from "@/assets/images/Check.svg"; + import { Container } from "./styles"; export const Checkbox = ({ selected }: { selected?: boolean }) => { diff --git a/apps/mobile/src/views/UpgradeWall/components/Checkbox/styles.ts b/apps/mobile/src/views/UpgradeWall/components/Checkbox/styles.ts index 9e282ad..859fbc3 100644 --- a/apps/mobile/src/views/UpgradeWall/components/Checkbox/styles.ts +++ b/apps/mobile/src/views/UpgradeWall/components/Checkbox/styles.ts @@ -20,7 +20,8 @@ export const Container = styled.View` ${(props) => props.selected && css` - background-color: ${({ theme }) => Color(theme.colors.primary).alpha(0.2).toString()}; + background-color: ${({ theme }) => + new Color(theme.colors.primary).alpha(0.2).toString()}; border-color: ${({ theme }) => theme.colors.primary}; `} `; diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx index 33c2966..3986091 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/index.tsx @@ -1,16 +1,22 @@ +import type { PurchasesPackage } from "react-native-purchases"; + import { useEffect } from "react"; import * as React from "react"; -import { magicToast } from "react-native-magic-toast"; -import { PurchasesPackage } from "react-native-purchases"; + import * as Device from "expo-device"; import { useRouter } from "expo-router"; + import { useTranslation } from "react-i18next"; +import { magicToast } from "react-native-magic-toast"; import { useOfferings } from "@/hooks/use-payments"; import { Container } from "@/views/UpgradeWall/components/PlanPackages/styles"; + import { PlanCard } from "./plan-card"; -const periodToDays = (period: string) => { +const periodToDays = (period: string | null | undefined) => { + if (!period) return 0; + const match = period.match(/P(\d+)(D|W|M|Y)/); if (!match) return 0; @@ -18,7 +24,7 @@ const periodToDays = (period: string) => { if (!num || !unit) throw new Error("Invalid period format"); - const numVal = parseInt(num, 10); + const numVal = Math.trunc(Number(num)); switch (unit) { case "D": @@ -39,7 +45,10 @@ interface OfferingsProps { setSelectedPackage: (pkg: PurchasesPackage) => void; } -const PlanPackages: React.FC = ({ selectedPackage, setSelectedPackage }) => { +const PlanPackages: React.FC = ({ + selectedPackage, + setSelectedPackage, +}) => { const router = useRouter(); const { data: offeringsData, isError } = useOfferings(); const { t } = useTranslation(); @@ -65,19 +74,25 @@ const PlanPackages: React.FC = ({ selectedPackage, setSelectedPa const packageWithLessRelativeValue = offeringsData ? Object.values(offeringsData.availablePackages).sort((a, b) => { - const relativeValueA = a.product.price / periodToDays(a.product.subscriptionPeriod!); - const relativeValueB = b.product.price / periodToDays(b.product.subscriptionPeriod!); + const relativeValueA = + a.product.price / periodToDays(a.product.subscriptionPeriod); + const relativeValueB = + b.product.price / periodToDays(b.product.subscriptionPeriod); return relativeValueB - relativeValueA; })[0] : undefined; + // `packageList` is rebuilt on every render, so depending on it would run + // this effect every render. The first package is the only part that matters. + const [defaultPackage] = packageList; + useEffect(() => { - if (packageList[0] && !selectedPackage) { + if (defaultPackage && !selectedPackage) { // Optionally set a default package, or leave it to user interaction - setSelectedPackage(packageList[0]); + setSelectedPackage(defaultPackage); } - }, [packageList, selectedPackage, setSelectedPackage]); + }, [defaultPackage, selectedPackage, setSelectedPackage]); return ( @@ -85,8 +100,10 @@ const PlanPackages: React.FC = ({ selectedPackage, setSelectedPa // Get old price comparing with the package with less relative value / period * this package period const oldPrice = packageWithLessRelativeValue ? (packageWithLessRelativeValue.product.price / - periodToDays(packageWithLessRelativeValue.product.subscriptionPeriod!)) * - periodToDays(planPackage.product.subscriptionPeriod!) + periodToDays( + packageWithLessRelativeValue.product.subscriptionPeriod, + )) * + periodToDays(planPackage.product.subscriptionPeriod) : undefined; return ( diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx index ada9d9f..32cbde7 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/plan-card.tsx @@ -1,5 +1,7 @@ +import type { PurchasesPackage } from "react-native-purchases"; + import * as React from "react"; -import { PurchasesPackage } from "react-native-purchases"; + import { useTranslation } from "react-i18next"; import { Text } from "@/components/text"; @@ -12,6 +14,28 @@ import { Price, } from "@/views/UpgradeWall/components/PlanPackages/styles"; +const formatPrice = (value: number, currency: string) => + new Intl.NumberFormat("default", { + style: "currency", + currency, + }).format(value); + +const getPeriodDetails = ( + period: string, +): { + periodUnit: "D" | "W" | "M" | "Y"; + periodValue: number; +} => { + const [, num, unit] = period.match(/P(\d+)(D|W|M|Y)/) ?? []; + + if (!num || !unit) throw new Error("Invalid period format"); + + return { + periodUnit: unit as "D" | "W" | "M" | "Y", + periodValue: Math.trunc(Number(num)), + }; +}; + interface PlanCardProps { selected: boolean; onPress: () => void; @@ -28,30 +52,12 @@ export const PlanCard: React.FC = ({ const { t } = useTranslation(); const { product } = pkg; - const { price: currentPrice, currencyCode, subscriptionPeriod: period, identifier } = product; - - const formatPrice = (value: number, currency: string) => - Intl.NumberFormat("default", { - style: "currency", - currency, - }).format(value); - - const getPeriodDetails = ( - period: string, - ): { - periodUnit: "D" | "W" | "M" | "Y"; - periodValue: number; - } => { - const periodMatch = period.match(/P(\d+)(D|W|M|Y)/); - const [, num, unit] = periodMatch!; - - if (!num || !unit) throw new Error("Invalid period format"); - - return { - periodUnit: unit as "D" | "W" | "M" | "Y", - periodValue: parseInt(num, 10), - }; - }; + const { + price: currentPrice, + currencyCode, + subscriptionPeriod: period, + identifier, + } = product; const formattedCurrentPrice = formatPrice(currentPrice, currencyCode); @@ -89,7 +95,11 @@ export const PlanCard: React.FC = ({ })(); return ( - + diff --git a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts index 2f8e23e..647b779 100644 --- a/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts +++ b/apps/mobile/src/views/UpgradeWall/components/PlanPackages/styles.ts @@ -16,7 +16,9 @@ export const Container = styled.View` gap: ${({ theme }) => theme.spacing[2.5]}px; `; -export const PlanContainer = styled(PressableArea).attrs({ accessible: true })` +export const PlanContainer = styled(PressableArea).attrs({ + accessible: true, +})` border-width: ${({ theme }) => theme.stroke.lg}px; border-color: ${({ theme }) => theme.colors.border}; border-radius: ${({ theme }) => theme.radii.md}px; @@ -29,7 +31,8 @@ export const PlanContainer = styled(PressableArea).attrs({ accessible: true }) props.selected && css` - background-color: ${({ theme }) => Color(theme.colors.primary).alpha(0.1).toString()}; + background-color: ${({ theme }) => + new Color(theme.colors.primary).alpha(0.1).toString()}; border-color: ${({ theme }) => theme.colors.primary}; `} `; @@ -39,7 +42,8 @@ export const PercentContainer = styled.View` top: ${({ theme }) => -theme.spacing[3]}px; right: ${({ theme }) => theme.spacing[3]}px; background-color: ${({ theme }) => theme.colors.primary}; - padding: ${({ theme }) => theme.spacing[1]}px ${({ theme }) => theme.spacing[2]}px; + padding: ${({ theme }) => theme.spacing[1]}px + ${({ theme }) => theme.spacing[2]}px; border-radius: ${({ theme }) => theme.radii.sm}px; `; diff --git a/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx b/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx index 4ad45dd..4ecbe88 100644 --- a/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/components/RestorePurchases/index.tsx @@ -1,7 +1,9 @@ import * as React from "react"; import { ActivityIndicator, Alert } from "react-native"; + import { isDevice } from "expo-device"; import { router } from "expo-router"; + import { useMutation } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; diff --git a/apps/mobile/src/views/UpgradeWall/index.tsx b/apps/mobile/src/views/UpgradeWall/index.tsx index 7c77a1a..6602b5f 100644 --- a/apps/mobile/src/views/UpgradeWall/index.tsx +++ b/apps/mobile/src/views/UpgradeWall/index.tsx @@ -1,12 +1,15 @@ +import type { PurchasesPackage } from "react-native-purchases"; + import { useState } from "react"; import * as React from "react"; import { Alert, Platform, View } from "react-native"; -import { PurchasesPackage } from "react-native-purchases"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; + import { isDevice } from "expo-device"; import { useRouter } from "expo-router"; + import { useMutation } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useTheme } from "styled-components"; import { BottomAction, useBottomActionStyle } from "@/components/BottomAction"; @@ -19,6 +22,7 @@ import { payments } from "@/services/payments"; import Benefits from "@/views/UpgradeWall/components/Benefits"; import PlanPackages from "@/views/UpgradeWall/components/PlanPackages"; import RestorePurchases from "@/views/UpgradeWall/components/RestorePurchases"; + import { CloseButton, CloseIcon, @@ -31,7 +35,9 @@ import { Title, } from "./styles"; -const useTranslatedTrialDuration = (offering: PurchasesPackage | null | undefined) => { +const useTranslatedTrialDuration = ( + offering: PurchasesPackage | null | undefined, +) => { const { t } = useTranslation(); const introPrice = offering?.product.introPrice; @@ -43,13 +49,21 @@ const useTranslatedTrialDuration = (offering: PurchasesPackage | null | undefine switch (introPrice.periodUnit) { case "DAY": - return quantity === 1 ? t("dateFormatting.day", props) : t("dateFormatting.days", props); + return quantity === 1 + ? t("dateFormatting.day", props) + : t("dateFormatting.days", props); case "WEEK": - return quantity === 1 ? t("dateFormatting.week", props) : t("dateFormatting.weeks", props); + return quantity === 1 + ? t("dateFormatting.week", props) + : t("dateFormatting.weeks", props); case "MONTH": - return quantity === 1 ? t("dateFormatting.month", props) : t("dateFormatting.months", props); + return quantity === 1 + ? t("dateFormatting.month", props) + : t("dateFormatting.months", props); case "YEAR": - return quantity === 1 ? t("dateFormatting.year", props) : t("dateFormatting.years", props); + return quantity === 1 + ? t("dateFormatting.year", props) + : t("dateFormatting.years", props); } }; @@ -59,7 +73,9 @@ const UpgradeWall: React.FC = () => { const router = useRouter(); const { t } = useTranslation(); - const [selectedOffering, setSelectedOffering] = useState(); + const [selectedOffering, setSelectedOffering] = useState< + PurchasesPackage | null | undefined + >(); const freeTrialDuration = useTranslatedTrialDuration(selectedOffering); @@ -127,7 +143,9 @@ const UpgradeWall: React.FC = () => { }); const title = t( - isEligibleForTrial ? "plans.upgradeWall.earnedFreeTrial" : "plans.upgradeWall.getPremium", + isEligibleForTrial + ? "plans.upgradeWall.earnedFreeTrial" + : "plans.upgradeWall.getPremium", ); const trialSubtitle = isEligibleForTrial @@ -135,10 +153,13 @@ const UpgradeWall: React.FC = () => { : t("plans.upgradeWall.enjoyFullAccess"); const buttonText = t( - isEligibleForTrial ? "plans.upgradeWall.startFreeTrial" : "plans.upgradeWall.getPremium", + isEligibleForTrial + ? "plans.upgradeWall.startFreeTrial" + : "plans.upgradeWall.getPremium", ); - const paddingTop = Platform.OS === "ios" ? theme.spacing[2] : insets.top + theme.spacing[2]; + const paddingTop = + Platform.OS === "ios" ? theme.spacing[2] : insets.top + theme.spacing[2]; const headerHeight = 40 + paddingTop; return ( @@ -149,8 +170,8 @@ const UpgradeWall: React.FC = () => { ...bottomActionStyle.scrollViewProps.contentContainerStyle, gap: theme.spacing[5], paddingBottom: - bottomActionStyle.scrollViewProps.contentContainerStyle.paddingBottom + - theme.spacing[8], + bottomActionStyle.scrollViewProps.contentContainerStyle + .paddingBottom + theme.spacing[8], paddingTop: theme.spacing[3] + headerHeight, }} > @@ -209,7 +230,7 @@ const UpgradeWall: React.FC = () => {