Skip to content

[pull] main from expo:main#814

Merged
pull[bot] merged 14 commits into
code:mainfrom
expo:main
Apr 29, 2026
Merged

[pull] main from expo:main#814
pull[bot] merged 14 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Apr 29, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

alanjhughes and others added 14 commits April 29, 2026 12:01
…form (#45121)

# Why

To make the migration off react-navigation easier for our users, we'll
release a codemod script which will transform direct `@react-navigation`
imports into `expo-router` ones.

# How

1. Using jscodeshift, create a transform which will change the import
paths
2. Add cli for using the codemod

# Test Plan

1. Manually publish the package and test on codebase
2. Unit tests

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

`File.createUploadTask()` is verbose for simple fire-and-forget uploads.
This adds a `File.upload()` convenience method for callers who don't
need pause/resume or manual task control.

# How

- Add `File.prototype.upload(url, options?)` that creates an
`UploadTask` and immediately calls `uploadAsync()`, matching the
existing `createDownloadTask` / `download` pattern.
- Declare the method type in `ExpoFileSystem.types.ts`.

# Test Plan

- expo-file-system Jest tests

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

The CDP target was evaluated by connecting to it and evaluating JS
properties to detect and exclude the dev menu. This is now obsolete, and
the missing `Origin` header on this request was causing issues.

# How

- Drop evaluation filter for CDP apps/targets

# Test Plan

- Run an app (e.g. `apps/bare-expo`) and try to open the debugger

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Fixes check-packages workflow
https://github.com/expo/expo/actions/runs/25097696967/job/73538527981

# How

`pnpm test -u`

# Test Plan

Check packages should be green

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…ent instance (#40172)

# Summary

Fixes a bug where `deleteEventAsync` with `instanceStartDate` parameter
always deleted the first/master instance of a recurring event instead of
the specified instance.

  # Motivation

When users try to delete a specific occurrence of a recurring event
(e.g., delete the 3rd occurrence of a weekly event), the first
occurrence gets deleted instead. This makes it impossible to delete
individual instances of
  recurring events.

  **Reproduction:**
  1. Create a weekly recurring event starting Oct 6
2. Call `deleteEventAsync` with the Oct 13 instance's `startDate` as
`instanceStartDate`
  3. **Bug:** Oct 6 instance gets deleted instead of Oct 13

  # Changes

  ## Root Cause
In `packages/expo-calendar/ios/CalendarModule.swift`, the `getEvent`
function had inverted logic:

  ```swift
  // Before (buggy):
guard let firstEventStart = firstEvent.startDate,
firstEventStart.compare(startDate) == .orderedSame else {
return firstEvent // ❌ Returns master event when dates DON'T match
  }
  ```

The guard statement would return the master event when dates didn't
match, preventing the search loop below from executing to find the
correct instance.

  ### Fix

Changed from guard to if statement to only return early when dates do
match:
  
  ```
  // After (fixed):
if let firstEventStart = firstEvent.startDate,
firstEventStart.compare(startDate) == .orderedSame {
      return firstEvent  // ✅ Only returns when dates match
  }
  // Falls through to search loop for correct instance
```
### Test Plan

  Automated Test

  Added test in apps/test-suite/tests/Calendar.js that:
  1. Creates a recurring event with 3 weekly occurrences
  2. Deletes the 2nd instance using instanceStartDate
  3. Verifies only the 2nd instance was deleted (1st and 3rd remain)

  Before fix: Test would fail - 1st instance deleted instead of 2ndAfter fix: Test passes - correct instance deleted

  To run:
```
  cd apps/bare-expo
  yarn test:ios
```

  Manual Testing

  Tested manually in native-component-list on iPhone with iOS 18:

  1. Navigate to the native-component-list app:
  ```
  cd apps/native-component-list
  ```
  2. Build and run on device:
  ```
  npx expo run:ios --device
  ```

  5. Test the fix:
    - Navigate to Calendars section
    - Select any calendar → View Events
    - Tap Add New Recurring Event (creates a weekly recurring event)
    - Select a recurring event instance (not the first one)
    - Tap Delete Event on the specific instance
    - Expected: Only that specific instance is deleted
    - Before fix: The first/master instance would be deleted instead
    - After fix: ✅ The correct instance is deleted

---------

Co-authored-by: Claude <noreply@anthropic.com>
@pull pull Bot locked and limited conversation to collaborators Apr 29, 2026
@pull pull Bot added the ⤵️ pull label Apr 29, 2026
@pull pull Bot merged commit 0ec9445 into code:main Apr 29, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants