Skip to content

Conversation

@google-labs-jules
Copy link
Contributor

@google-labs-jules google-labs-jules bot commented Jan 11, 2026

Implemented pull-to-refresh functionality with haptic feedback on the mobile app's main list screens (HomeScreen and GroupDetailsScreen). This improves the user experience by allowing users to easily refresh data without losing context, and provides tactile feedback for the action. I also separated the initial loading state from the refreshing state to prevent the list from disappearing during a refresh.


PR created automatically by Jules for task 12130360773097016983 started by @Devasy23

Summary by CodeRabbit

  • New Features

    • Pull-to-refresh with light haptic feedback added to Home, Group Details, and Friends screens on mobile.
  • Documentation

    • New guidance on separating initial list loading vs. pull-to-refresh, with examples and best practices for mobile patterns.

✏️ Tip: You can customize this high-level summary in your review settings.

- Added `expo-haptics` dependency to mobile app.
- Implemented pull-to-refresh on `HomeScreen` (groups list).
- Implemented pull-to-refresh on `GroupDetailsScreen` (expenses list).
- Separated `isLoading` (initial) and `isRefreshing` (update) states to prevent UI flickering.
- Added light haptic feedback on refresh trigger.
- Updated tracking files (`todo.md`, `knowledge.md`, `changelog.md`).
@google-labs-jules
Copy link
Contributor Author

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 11, 2026

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

Adds pull-to-refresh with haptic feedback to mobile screens, adds the expo-haptics dependency, documents "List Loading vs. Refreshing" patterns, and updates changelog/todo tracking entries.

Changes

Cohort / File(s) Summary
Documentation & tracking
.Jules/changelog.md, .Jules/knowledge.md, .Jules/todo.md`
Added changelog entry and todo completion for pull-to-refresh; added "List Loading vs. Refreshing" doc subsection with examples and terminated a code fence.
Mobile dependencies
mobile/package.json
Added expo-haptics (~15.0.8) and bumped Expo-related package versions (expo, expo-image-picker, expo-status-bar).
Mobile screens — Home & Group
mobile/screens/HomeScreen.js, mobile/screens/GroupDetailsScreen.js
Introduced isRefreshing state; split initial loading vs. refresh flows; added fetch... (refresh) branches, onRefresh handlers, and wired FlatList onRefresh/refreshing; trigger light haptic feedback on refresh.
Mobile screens — Friends
mobile/screens/FriendsScreen.js
Added isRefreshing, refresh-aware fetchData(refresh) and onRefresh; wired FlatList onRefresh/refreshing; added haptic feedback on refresh.

Suggested reviewers

  • vrajpatelll
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding pull-to-refresh with haptics to mobile list screens, which is the core objective of the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@netlify
Copy link

netlify bot commented Jan 11, 2026

Deploy Preview for split-but-wiser canceled.

Name Link
🔨 Latest commit 0af8602
🔍 Latest deploy log https://app.netlify.com/projects/split-but-wiser/deploys/69653c025516bc000839b08e

@Devasy
Copy link
Owner

Devasy commented Jan 12, 2026

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 12, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Fix all issues with AI agents
In @.Jules/knowledge.md:
- Around line 185-214: Add blank lines before and after each fenced code block
in the "Bad Pattern" and "Good Pattern" examples to satisfy MD031; specifically
ensure there is an empty line immediately preceding each ```javascript fence and
an empty line immediately following each closing ``` fence so the
FlatList/Spinner example and the fetchData example render correctly and have
proper spacing around the fenced code blocks.

In @.Jules/todo.md:
- Around line 46-49: Update the completion date for the Pull-to-refresh task in
.Jules/todo.md from "Completed: 2026-01-01" to "Completed: 2026-01-11" so it
matches the PR (commit 91c5194); locate the checklist item text "- [x] **[ux]**
Pull-to-refresh with haptic feedback on all list screens" and change the date on
its "Completed:" line accordingly.
- Around line 46-49: The comment notes FriendsScreen.js lacks pull-to-refresh
with haptic feedback; either implement it or update the task note. To implement:
in FriendsScreen.js add a refreshing state (useState), pass refreshing and
onRefresh props to the FlatList, implement an onRefresh handler that triggers
data reload and calls Haptics (or the existing haptics helper) when refresh
begins/ends, and ensure you reuse the same data-fetch function used by
HomeScreen/GroupDetailsScreen; alternatively, if you choose not to implement,
update the TODO entry text to remove "all list screens" or list only
HomeScreen.js and GroupDetailsScreen.js so documentation matches actual
implementation.

In @mobile/package.json:
- Line 19: The dependency "expo-haptics": "~15.0.8" in package.json is
incompatible with Expo SDK 54; replace it with the SDK-54-compatible version by
running the recommended command (npx expo install expo-haptics) or update the
"expo-haptics" entry in package.json to the version that npx expo install
selects, then reinstall dependencies and rebuild the native app to ensure no
runtime/native mismatch.
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8432ff and 91c5194.

⛔ Files ignored due to path filters (1)
  • mobile/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (6)
  • .Jules/changelog.md
  • .Jules/knowledge.md
  • .Jules/todo.md
  • mobile/package.json
  • mobile/screens/GroupDetailsScreen.js
  • mobile/screens/HomeScreen.js
🧰 Additional context used
📓 Path-based instructions (1)
mobile/screens/**/*.js

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Mobile screens should be created as components in mobile/screens/ and registered in the navigation structure

Files:

  • mobile/screens/GroupDetailsScreen.js
  • mobile/screens/HomeScreen.js
🧬 Code graph analysis (2)
mobile/screens/GroupDetailsScreen.js (1)
mobile/screens/HomeScreen.js (2)
  • isRefreshing (23-23)
  • onRefresh (113-115)
mobile/screens/HomeScreen.js (4)
mobile/screens/GroupDetailsScreen.js (2)
  • isRefreshing (26-26)
  • onRefresh (62-64)
mobile/api/client.js (1)
  • isRefreshing (7-7)
mobile/api/auth.js (2)
  • refresh (13-15)
  • refresh (13-15)
mobile/context/AuthContext.js (1)
  • refresh (15-15)
🪛 markdownlint-cli2 (0.18.1)
.Jules/knowledge.md

186-186: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


195-195: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

🔇 Additional comments (5)
.Jules/changelog.md (1)

13-13: LGTM!

The changelog entry accurately documents the new pull-to-refresh feature with haptic feedback for both screens.

mobile/screens/GroupDetailsScreen.js (2)

34-60: LGTM! Clean separation of loading states.

The implementation correctly separates initial loading (isLoading) from pull-to-refresh (isRefreshing). The fire-and-forget pattern for Haptics.impactAsync is acceptable since haptic feedback is non-critical and shouldn't block data fetching. The finally block properly resets both states.


62-64: LGTM!

The onRefresh handler and FlatList integration follow the documented pattern correctly. The refresh indicator will display during the refresh operation without hiding the existing list content.

Also applies to: 218-219

mobile/screens/HomeScreen.js (2)

71-105: LGTM! Well-structured refresh logic.

The fetchGroups function correctly handles both initial load and refresh scenarios. The settlement status fetching is appropriately included in both paths, ensuring data consistency after refresh. The implementation is consistent with GroupDetailsScreen.js.


113-115: LGTM!

The refresh integration follows the documented best practice. Since the FlatList only renders when !isLoading, the pull-to-refresh indicator will work correctly without causing the list to disappear during refresh operations.

Also applies to: 262-263

"@react-navigation/native-stack": "^7.3.23",
"axios": "^1.11.0",
"expo": "^54.0.25",
"expo-haptics": "~15.0.8",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

expo-haptics 15.0.8 compatibility Expo SDK 54

💡 Result:

Short answer: Probably not — use npx expo install to get the SDK-compatible build.

  • Expo SDK 54 expects the set of Expo package versions published for SDK 54; Expo’s docs recommend installing Expo SDK packages via npx expo install so you get the version that matches your SDK. [1][2]
  • expo-haptics has v15.x releases (e.g. 15.0.8 is published on registries), which are part of the newer 15.x package line — those releases typically target newer SDKs. Using a 15.x package with SDK 54 may cause native/runtime mismatches. [3][4]
  • Recommendation: run npx expo install expo-haptics in a project that has expo@~54.x. That command will install the expo-haptics version that is compatible with SDK 54. If you already manually set expo-haptics to 15.0.8 and see build/runtime errors, change it to the version npx expo install picks or downgrade to the SDK-54-compatible version. [1][2]

Sources:

  1. Expo SDK 54 docs / upgrade & package guidance. [docs.expo.dev versions v54]. [1]
  2. Expo workflow: “npx expo install” picks compatible package versions. [docs.expo.dev]. [2]
  3. expo-haptics package listing showing 15.0.8 exists. [jsdelivr / npm listings]. [3]
  4. Release history showing expo-haptics 15.x releases. [release listing]. [4]

expo-haptics 15.0.8 is incompatible with Expo SDK 54.

This version targets newer SDKs and will cause native/runtime mismatches. Use npx expo install expo-haptics to install the SDK-54-compatible version.

🤖 Prompt for AI Agents
In @mobile/package.json at line 19, The dependency "expo-haptics": "~15.0.8" in
package.json is incompatible with Expo SDK 54; replace it with the
SDK-54-compatible version by running the recommended command (npx expo install
expo-haptics) or update the "expo-haptics" entry in package.json to the version
that npx expo install selects, then reinstall dependencies and rebuild the
native app to ensure no runtime/native mismatch.

@Devasy
Copy link
Owner

Devasy commented Jan 12, 2026

@jules In @.Jules/knowledge.md: - Around line 185-214: Add blank lines before and after each fenced code block in the "Bad Pattern" and "Good Pattern" examples to satisfy MD031; specifically ensure there is an empty line immediately preceding each javascript fence and an empty line immediately following each closing fence so the FlatList/Spinner example and the fetchData example render correctly and have proper spacing around the fenced code blocks. In @.Jules/todo.md: - Around line 46-49: Update the completion date for the Pull-to-refresh task in .Jules/todo.md from "Completed: 2026-01-01" to "Completed: 2026-01-11" so it matches the PR (commit 91c5194); locate the checklist item text "- [x] [ux] Pull-to-refresh with haptic feedback on all list screens" and change the date on its "Completed:" line accordingly. - Around line 46-49: The comment notes FriendsScreen.js lacks pull-to-refresh with haptic feedback; either implement it or update the task note. To implement: in FriendsScreen.js add a refreshing state (useState), pass refreshing and onRefresh props to the FlatList, implement an onRefresh handler that triggers data reload and calls Haptics (or the existing haptics helper) when refresh begins/ends, and ensure you reuse the same data-fetch function used by HomeScreen/GroupDetailsScreen; alternatively, if you choose not to implement, update the TODO entry text to remove "all list screens" or list only HomeScreen.js and GroupDetailsScreen.js so documentation matches actual implementation. In @mobile/package.json: - Line 19: The dependency "expo-haptics": "~15.0.8" in package.json is incompatible with Expo SDK 54; replace it with the SDK-54-compatible version by running the recommended command (npx expo install expo-haptics) or update the "expo-haptics" entry in package.json to the version that npx expo install selects, then reinstall dependencies and rebuild the native app to ensure no runtime/native mismatch.

@google-labs-jules
Copy link
Contributor Author

@jules In @.Jules/knowledge.md: - Around line 185-214: Add blank lines before and after each fenced code block in the "Bad Pattern" and "Good Pattern" examples to satisfy MD031; specifically ensure there is an empty line immediately preceding each javascript fence and an empty line immediately following each closing fence so the FlatList/Spinner example and the fetchData example render correctly and have proper spacing around the fenced code blocks. In @.Jules/todo.md: - Around line 46-49: Update the completion date for the Pull-to-refresh task in .Jules/todo.md from "Completed: 2026-01-01" to "Completed: 2026-01-11" so it matches the PR (commit 91c5194); locate the checklist item text "- [x] [ux] Pull-to-refresh with haptic feedback on all list screens" and change the date on its "Completed:" line accordingly. - Around line 46-49: The comment notes FriendsScreen.js lacks pull-to-refresh with haptic feedback; either implement it or update the task note. To implement: in FriendsScreen.js add a refreshing state (useState), pass refreshing and onRefresh props to the FlatList, implement an onRefresh handler that triggers data reload and calls Haptics (or the existing haptics helper) when refresh begins/ends, and ensure you reuse the same data-fetch function used by HomeScreen/GroupDetailsScreen; alternatively, if you choose not to implement, update the TODO entry text to remove "all list screens" or list only HomeScreen.js and GroupDetailsScreen.js so documentation matches actual implementation. In @mobile/package.json: - Line 19: The dependency "expo-haptics": "~15.0.8" in package.json is incompatible with Expo SDK 54; replace it with the SDK-54-compatible version by running the recommended command (npx expo install expo-haptics) or update the "expo-haptics" entry in package.json to the version that npx expo install selects, then reinstall dependencies and rebuild the native app to ensure no runtime/native mismatch.

Thank you for the detailed review. I have addressed all points:

  1. Documentation Formatting: Added blank lines around fenced code blocks in .Jules/knowledge.md to satisfy MD031.
  2. Task Completion Date: Updated .Jules/todo.md completion date to 2026-01-11.
  3. Scope Clarification & Implementation: I implemented pull-to-refresh on FriendsScreen.js as well, so the 'all list screens' description remains accurate. I also updated the file list in todo.md to include it.
  4. Dependency Fix: Ran npx expo install --fix in mobile/ to align expo-haptics and other dependencies with SDK 54.

- Fixed `expo-haptics` version incompatibility in `mobile/package.json`.
- Implemented pull-to-refresh on `FriendsScreen.js` to complete "all list screens" task.
- Fixed markdown formatting in `.Jules/knowledge.md`.
- Updated completion date and file list in `.Jules/todo.md`.
@Devasy
Copy link
Owner

Devasy commented Jan 12, 2026

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 12, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai bot requested a review from vrajpatelll January 12, 2026 06:55
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
mobile/screens/FriendsScreen.js (1)

25-64: Indentation inconsistency in fetchData.

Lines 37-54 have inconsistent indentation compared to the surrounding code (appears to have extra indentation). This should be aligned with the rest of the function body for consistency.

🔧 Suggested fix
   const fetchData = async (refresh = false) => {
     if (refresh) {
       setIsRefreshing(true);
       Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
     } else {
       setIsLoading(true);
     }
 
     try {
       // Fetch friends balance + groups concurrently for group icons
       const friendsResponse = await getFriendsBalance();
       const friendsData = friendsResponse.data.friendsBalance || [];
-        const groupsResponse = await getGroups();
-        const groups = groupsResponse?.data?.groups || [];
-        const groupMeta = new Map(
-          groups.map((g) => [g._id, { name: g.name, imageUrl: g.imageUrl }])
-        );
-
-        const transformedFriends = friendsData.map((friend) => ({
-          id: friend.userId,
-          name: friend.userName,
-          imageUrl: friend.userImageUrl || null,
-          netBalance: friend.netBalance,
-          groups: (friend.breakdown || []).map((group) => ({
-            id: group.groupId,
-            name: group.groupName,
-            balance: group.balance,
-            imageUrl: groupMeta.get(group.groupId)?.imageUrl || null,
-          })),
-        }));
+      const groupsResponse = await getGroups();
+      const groups = groupsResponse?.data?.groups || [];
+      const groupMeta = new Map(
+        groups.map((g) => [g._id, { name: g.name, imageUrl: g.imageUrl }])
+      );
+
+      const transformedFriends = friendsData.map((friend) => ({
+        id: friend.userId,
+        name: friend.userName,
+        imageUrl: friend.userImageUrl || null,
+        netBalance: friend.netBalance,
+        groups: (friend.breakdown || []).map((group) => ({
+          id: group.groupId,
+          name: group.groupName,
+          balance: group.balance,
+          imageUrl: groupMeta.get(group.groupId)?.imageUrl || null,
+        })),
+      }));
 
       setFriends(transformedFriends);
     } catch (error) {
🤖 Fix all issues with AI agents
In @.Jules/todo.md:
- Around line 154-157: The "Pull-to-refresh with haptic feedback on all list
screens" entry in the Completed Tasks section has inconsistent metadata: update
its completion date to 2026-01-11 to match the Mobile section and add the
missing file `FriendsScreen.js` to the "Files modified" list so it reads the
same as the Mobile section (include `HomeScreen.js`, `GroupDetailsScreen.js`,
`FriendsScreen.js`); ensure the task title and checklist mark remain unchanged.
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 91c5194 and 7b7371b.

⛔ Files ignored due to path filters (1)
  • mobile/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (4)
  • .Jules/knowledge.md
  • .Jules/todo.md
  • mobile/package.json
  • mobile/screens/FriendsScreen.js
🧰 Additional context used
📓 Path-based instructions (1)
mobile/screens/**/*.js

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Mobile screens should be created as components in mobile/screens/ and registered in the navigation structure

Files:

  • mobile/screens/FriendsScreen.js
🧬 Code graph analysis (1)
mobile/screens/FriendsScreen.js (4)
mobile/screens/GroupDetailsScreen.js (3)
  • isRefreshing (26-26)
  • fetchData (34-60)
  • onRefresh (62-64)
mobile/screens/HomeScreen.js (2)
  • isRefreshing (23-23)
  • onRefresh (113-115)
web/services/api.ts (1)
  • getFriendsBalance (49-49)
mobile/api/groups.js (2)
  • getFriendsBalance (29-30)
  • getFriendsBalance (29-30)
🔇 Additional comments (3)
.Jules/knowledge.md (1)

178-219: Good documentation of the pull-to-refresh pattern.

The separation of isLoading vs isRefreshing states is well documented with clear bad/good pattern examples. The recommendation to use expo-haptics aligns with the implementation.

Minor: The date at line 180 shows "2026-01-01" but this content was added in the current PR (2026-01-11). Consider updating for accuracy.

mobile/screens/FriendsScreen.js (2)

66-68: LGTM!

The onRefresh handler correctly delegates to fetchData(true), consistent with the pattern used in HomeScreen.js and GroupDetailsScreen.js.


251-252: LGTM!

The FlatList is correctly wired with onRefresh and refreshing={isRefreshing}, following the documented "Good Pattern" and matching the implementation in other screens. As per coding guidelines, this screen component is properly located in mobile/screens/.

@Devasy Devasy marked this pull request as ready for review January 12, 2026 06:59
Devasy and others added 2 commits January 12, 2026 23:38
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@Devasy
Copy link
Owner

Devasy commented Jan 12, 2026

@jules the preview is failing

here's the traceback

  > npx expo install expo-updates
  [expo-cli] › Installing 1 SDK 54.0.0 compatible native module using npm
  [expo-cli] > npm install
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@isaacs/balanced-match@4.0.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@isaacs/brace-expansion@5.0.0',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/assets-registry@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/babel-plugin-codegen@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/babel-preset@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/codegen@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/community-cli-plugin@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/debugger-frontend@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/dev-middleware@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/gradle-plugin@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/js-polyfills@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'expo-server@1.0.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.16.0' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'glob@13.0.0',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'minimatch@10.1.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-babel-transformer@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-cache@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-cache-key@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-config@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-core@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-file-map@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-minify-terser@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-resolver@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-runtime@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-source-map@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-symbolicate@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-transform-plugins@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-transform-worker@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'ob1@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'path-scurry@2.0.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'lru-cache@11.2.4',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'react-native@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/virtualized-lists@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] added 7 packages, and audited 708 packages in 4s
  [expo-cli] 63 packages are looking for funding
  [expo-cli]   run `npm fund` for details
  [expo-cli] 2 vulnerabilities (1 moderate, 1 high)
  [expo-cli] 
  [expo-cli] To address all issues, run:
  [expo-cli]   npm audit fix
  [expo-cli] 
  [expo-cli] Run `npm audit` for details.
  ✔ Installed expo-updates
  ✔ Configured updates.url to "https://u.expo.dev/afe97159-52c4-425a-9ce3-c56d4f2cb568"
  ✔ Configured runtimeVersion for Android and iOS with "{"policy":"appVersion"}"
  
  All builds of your app going forward will be eligible to receive updates published with EAS Update.
  
  - Exporting...
  [expo-cli] --non-interactive is not supported, use $CI=1 instead
  [expo-cli] TypeError: configs.toReversed is not a function
  [expo-cli] TypeError: configs.toReversed is not a function
  [expo-cli]     at mergeConfig (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/metro-config/src/loadConfig.js:179:35)
  [expo-cli]     at getDefaultConfig (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/@expo/metro-config/src/ExpoMetroConfig.ts:427:23)
  [expo-cli]     at loadMetroConfigAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/instantiateMetro.ts:102:41)
  [expo-cli]     at instantiateMetroAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/instantiateMetro.ts:225:13)
  [expo-cli]     at MetroBundlerDevServer.startImplementationAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts:1062:96)
  [expo-cli]     at MetroBundlerDevServer.startAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/BundlerDevServer.ts:160:18)
  [expo-cli]     at DevServerManager.startAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/DevServerManager.ts:184:7)
  [expo-cli]     at Function.startMetroAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/DevServerManager.ts:40:5)
  [expo-cli]     at exportAppAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/export/exportApp.ts:128:28)
  [expo-cli]     at exportAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/export/exportAsync.ts:28:3)
  ✖ Export failed
  /home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/bin/cli export --output-dir dist --experimental-bundle --non-interactive --dump-sourcemap --dump-assetmap --platform=all exited with non-zero code: 1
      Error: update command failed.
Error: Could not create a new EAS Update```

@google-labs-jules
Copy link
Contributor Author

@jules the preview is failing

here's the traceback

  > npx expo install expo-updates
  [expo-cli] › Installing 1 SDK 54.0.0 compatible native module using npm
  [expo-cli] > npm install
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@isaacs/balanced-match@4.0.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@isaacs/brace-expansion@5.0.0',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/assets-registry@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/babel-plugin-codegen@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/babel-preset@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/codegen@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/community-cli-plugin@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/debugger-frontend@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/dev-middleware@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/gradle-plugin@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/js-polyfills@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'expo-server@1.0.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.16.0' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'glob@13.0.0',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'minimatch@10.1.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-babel-transformer@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-cache@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-cache-key@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-config@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-core@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-file-map@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-minify-terser@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-resolver@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-runtime@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-source-map@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-symbolicate@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-transform-plugins@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'metro-transform-worker@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'ob1@0.83.3',
  [expo-cli] npm warn EBADENGINE   required: { node: '>=20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'path-scurry@2.0.1',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'lru-cache@11.2.4',
  [expo-cli] npm warn EBADENGINE   required: { node: '20 || >=22' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: 'react-native@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] npm warn EBADENGINE Unsupported engine {
  [expo-cli] npm warn EBADENGINE   package: '@react-native/virtualized-lists@0.81.5',
  [expo-cli] npm warn EBADENGINE   required: { node: '>= 20.19.4' },
  [expo-cli] npm warn EBADENGINE   current: { node: 'v18.20.8', npm: '10.8.2' }
  [expo-cli] npm warn EBADENGINE }
  [expo-cli] added 7 packages, and audited 708 packages in 4s
  [expo-cli] 63 packages are looking for funding
  [expo-cli]   run `npm fund` for details
  [expo-cli] 2 vulnerabilities (1 moderate, 1 high)
  [expo-cli] 
  [expo-cli] To address all issues, run:
  [expo-cli]   npm audit fix
  [expo-cli] 
  [expo-cli] Run `npm audit` for details.
  ✔ Installed expo-updates
  ✔ Configured updates.url to "https://u.expo.dev/afe97159-52c4-425a-9ce3-c56d4f2cb568"
  ✔ Configured runtimeVersion for Android and iOS with "{"policy":"appVersion"}"
  
  All builds of your app going forward will be eligible to receive updates published with EAS Update.
  
  - Exporting...
  [expo-cli] --non-interactive is not supported, use $CI=1 instead
  [expo-cli] TypeError: configs.toReversed is not a function
  [expo-cli] TypeError: configs.toReversed is not a function
  [expo-cli]     at mergeConfig (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/metro-config/src/loadConfig.js:179:35)
  [expo-cli]     at getDefaultConfig (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/@expo/metro-config/src/ExpoMetroConfig.ts:427:23)
  [expo-cli]     at loadMetroConfigAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/instantiateMetro.ts:102:41)
  [expo-cli]     at instantiateMetroAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/instantiateMetro.ts:225:13)
  [expo-cli]     at MetroBundlerDevServer.startImplementationAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts:1062:96)
  [expo-cli]     at MetroBundlerDevServer.startAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/BundlerDevServer.ts:160:18)
  [expo-cli]     at DevServerManager.startAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/DevServerManager.ts:184:7)
  [expo-cli]     at Function.startMetroAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/start/server/DevServerManager.ts:40:5)
  [expo-cli]     at exportAppAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/export/exportApp.ts:128:28)
  [expo-cli]     at exportAsync (/home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/node_modules/@expo/cli/src/export/exportAsync.ts:28:3)
  ✖ Export failed
  /home/runner/work/splitwiser/splitwiser/mobile/node_modules/expo/bin/cli export --output-dir dist --experimental-bundle --non-interactive --dump-sourcemap --dump-assetmap --platform=all exited with non-zero code: 1
      Error: update command failed.
Error: Could not create a new EAS Update```

I have updated the GitHub Actions workflows to use Node.js 22. This should resolve the EBADENGINE warnings and the toReversed error, as the dependencies (Expo SDK 54, Metro, etc.) now require Node.js 20 or higher.

- Updated `.github/workflows/preview.yml`, `rn-bundle-analysis.yml`, `bundle-analysis.yml`, and `publish.yml` to use Node.js 22.
- This fixes build failures caused by `expo-updates` and other dependencies requiring Node 20+.
Devasy
Devasy previously approved these changes Jan 12, 2026
Copy link
Owner

@Devasy Devasy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Devasy Devasy closed this Jan 12, 2026
@Devasy Devasy deleted the jules/mobile-pull-to-refresh-12130360773097016983 branch January 12, 2026 18:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants