Skip to content

[ios][jsi] Make JavaScriptUnownedValue @frozen - #51499

Merged
tsapeta merged 3 commits into
mainfrom
tsapeta/jsi-frozen-unowned-value
Oct 14, 2026
Merged

tsapeta merged 3 commits into
mainfrom
tsapeta/jsi-frozen-unowned-value

Conversation

@tsapeta

@tsapeta tsapeta commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Why

ExpoModulesJSI is built with library evolution, so JavaScriptUnownedValue was a resilient struct. Code in client modules (expo-modules-core, and the code that the macros generate for @JS functions) could not see its layout. For each argument it decodes, the client called the type's metadata accessor to get the size of the value and to destroy it.

Part of ENG-28057.

How

  • JavaScriptUnownedValue is now @frozen. Clients know that it is two pointers and that it is trivial to destroy.
  • A frozen layout can contain only public types, and jsi::Value and jsi::IRuntime come from an internal import. So both fields are now raw pointers, and the module rebuilds the C++ views on access, as JavaScriptValuesBuffer does.
  • The runtime is rebuilt with unsafeBitCast. Unmanaged.takeUnretainedValue() on the immortal IRuntime reference crashes the SIL optimizer (Swift 6.4, Xcode 27) in Release builds.
  • Two new host function benchmarks take eight arguments: eight Ints decoded in a loop, and eight mixed arguments (String, Int, Double, Bool, String?, Int?, Double, Bool) decoded one per statement, like the code the @JS macro generates.

The layout is now part of the ABI, so a later field change needs a bump of the precompiled artifacts.

Test Plan

pnpm test:integration passes (806 + 97 tests).

pnpm benchmark (Release, Mac Catalyst, coverage off), five interleaved rounds against main. The table shows the median of the five per-round medians.

Benchmark Before After Change
host function: eight mixed arguments 212.0 ns 186.0 ns -12.3%
host function: sum eight Ints 189.0 ns 173.9 ns -8.0%
host function: add two Ints 87.4 ns 81.8 ns -6.4%
host function: add two optional Ints 91.0 ns 84.5 ns -7.1%
host function: concat two strings unowned-this 166.8 ns 158.2 ns -5.2%
host function: concat two long strings unowned-this 282.9 ns 272.3 ns -3.7%
Date.decode(unowned): number 5.0 ns 4.3 ns -14.0%
String.decode(unowned) 46.2 ns 45.1 ns -2.4%
host function: noop unowned-this 53.9 ns 51.8 ns -3.9%

The first five rows and the Date row are faster in every round. That is about 2 to 3 ns per decoded argument.

Rows that do not decode arguments in a client module move by about -2% on average, in both directions, which is the noise level of these runs. A few of them are slower in every round by 1 to 5% (JavaScriptValue(runtime, Double): 16.9 to 17.7 ns, JavaScriptPropNameID.utf8() ASCII: 19.0 to 19.7 ns, [Int].decode of 10 elements: 724.7 to 734.6 ns). Those do not use JavaScriptUnownedValue from a client module, so they are most likely code placement.

@linear-code

linear-code Bot commented Oct 13, 2026

Copy link
Copy Markdown

ENG-28057

@expo-bot expo-bot added contributor: internal PR author is a member, owner, or collaborator of the expo org bot: passed checks ExpoBot has nothing to complain about labels Oct 13, 2026
@expo-bot

expo-bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

The Pull Request introduced fingerprint changes against the base commit: 4cc6d2d

Fingerprint diff
[
  {
    "op": "changed",
    "beforeSource": {
      "type": "dir",
      "filePath": "../../packages/expo",
      "reasons": [
        "expoAutolinkingIos",
        "expoAutolinkingAndroid",
        "expoConfigPlugins",
        "expoConfigPlugins",
        "rncoreAutolinkingAndroid",
        "rncoreAutolinkingIos"
      ],
      "hash": "3d39abaf417f057eebed8d017eb90d3e4ed5b78c"
    },
    "afterSource": {
      "type": "dir",
      "filePath": "../../packages/expo",
      "reasons": [
        "expoAutolinkingIos",
        "expoAutolinkingAndroid",
        "expoConfigPlugins",
        "expoConfigPlugins",
        "rncoreAutolinkingAndroid",
        "rncoreAutolinkingIos"
      ],
      "hash": "15ddab2e25b61d2e9b21f8ef0b5b5c4d9cc90965"
    }
  },
  {
    "op": "changed",
    "beforeSource": {
      "type": "dir",
      "filePath": "../../packages/expo-gl",
      "reasons": [
        "expoAutolinkingIos",
        "expoAutolinkingAndroid"
      ],
      "hash": "6149c25a40c81fd38dabefdb71b7129034814aed"
    },
    "afterSource": {
      "type": "dir",
      "filePath": "../../packages/expo-gl",
      "reasons": [
        "expoAutolinkingIos",
        "expoAutolinkingAndroid"
      ],
      "hash": "02f28cc7bf1f66a2a306d9817869bd89305fce88"
    }
  },
  {
    "op": "changed",
    "beforeSource": {
      "type": "dir",
      "filePath": "../../packages/expo-modules-jsi/apple",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "b82bdb095a31fb42e01f2a240f7d01ef3da80c4e"
    },
    "afterSource": {
      "type": "dir",
      "filePath": "../../packages/expo-modules-jsi/apple",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "781dace3b0fe83f223a0fdfb7e01b4c53cfc404a"
    }
  }
]

Generated by PR labeler 🤖

@tsapeta
tsapeta marked this pull request as ready for review October 14, 2026 09:41
@tsapeta
tsapeta requested a review from alanjhughes October 14, 2026 09:42
@tsapeta
tsapeta merged commit 01d7e77 into main Oct 14, 2026
16 checks passed
@tsapeta
tsapeta deleted the tsapeta/jsi-frozen-unowned-value branch October 14, 2026 13:46
alanjhughes pushed a commit that referenced this pull request Oct 14, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and publish to npm
yourself or [setup this action to publish
automatically](https://github.com/changesets/action#with-publishing). If
you're not ready to do a release yet, that's fine, whenever you add more
changesets to main, this PR will be updated.


# Releases
## expo-modules-cli@0.3.0

### Minor Changes

- Scan with the `expo-modules-macros` version that `expo-modules-core`
depends on, found through the `expo` package of the scanned package,
instead of a copy of its own. `expo` is now a peer dependency. The CLI
reads the `scan-exports` schema of `expo-modules-macros` 0.20.0, and
declares enums, records, and unions nested in other types under their
own names. ([#51548](#51548) by
[@tsapeta](https://github.com/tsapeta))
## @expo/cli@58.1.8

### Patch Changes

- Update minimum required Expo Atlas version to `0.5.0`
([#51546](#51546) by
[@byCedric](https://github.com/byCedric))
- Notify about changes to `metro.config.{cjs,mjs,ts,cts,mts}` and
`.config/metro.*`, not just `metro.config.js` and `metro.config.json`.
([#50406](#50406) by
[@AlexErrant](https://github.com/AlexErrant))
- Update to `@expo/metro@~58.0.0` (promoted to stable for SDK 58).
([#51549](#51549) by
[@kitten](https://github.com/kitten))
- [iOS] Added a preview `experiments.swiftPackageManager` app config
setting; when enabled, `expo prebuild` sets up iOS with Swift Package
Manager instead of CocoaPods, and `expo run:ios` no longer runs `pod
install`. ([#51023](#51023) by
[@chrfalch](https://github.com/chrfalch))
- Improve error and log coverage in event logs and fix bundle progress,
completion, and server lifecycle reporting.
([#51347](#51347) by
[@kitten](https://github.com/kitten))
- Bump to `2g@1.0.0` and provide process metadata, such as `port` for
commands like `expo start`.
([#51338](#51338) by
[@kitten](https://github.com/kitten))
- Update to `2g@^1.0.1`
([#51517](#51517) by
[@kitten](https://github.com/kitten))
- Add `expo command:events` and `expo command:ps` sub-commands and
updated related help texts to reference these commands.
([#51344](#51344) by
[@kitten](https://github.com/kitten))
- Updated dependencies.
([#51549](#51549),
[#51536](#51536),
[#51526](#51526),
[#51338](#51338),
[#51517](#51517),
[#51535](#51535))
  - @expo/metro-config@58.0.13
  - @expo/metro-file-map@58.0.5
  - @expo/require-utils@58.0.4
  - @expo/prebuild-config@58.0.13
  - @expo/config@58.0.6
  - @expo/config-plugins@58.0.9
  - @expo/image-utils@0.12.5
  - @expo/inline-modules@0.2.6
  - @expo/router-server@58.0.13
## @expo/config@58.0.6

### Patch Changes

- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
  - @expo/config-plugins@58.0.9
## @expo/config-plugins@58.0.9

### Patch Changes

- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
## @expo/image-utils@0.12.5

### Patch Changes

- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
## @expo/inline-modules@0.2.6

### Patch Changes

- Updated dependencies.
  - @expo/config-plugins@58.0.9
## @expo/local-build-cache-provider@58.0.6

### Patch Changes

- Updated dependencies.
  - @expo/config@58.0.6
## @expo/metro-config@58.0.13

### Patch Changes

- Update to `@expo/metro@~58.0.0` (promoted to stable for SDK 58).
([#51549](#51549) by
[@kitten](https://github.com/kitten))
- Fix edge-cases in root dependency resolution for `expo-router`,
`react-native/setup-env`, and `expo/build/winter` runtime resolution.
([#51536](#51536) by
[@kitten](https://github.com/kitten))
- Refactor package version cache key resolution and resolve
`react-native-worklets` version optionally through
`react-native-reanimated`.
([#51526](#51526) by
[@kitten](https://github.com/kitten))
- Bump to `2g@1.0.0` and provide process metadata, such as `port` for
commands like `expo start`.
([#51338](#51338) by
[@kitten](https://github.com/kitten))
- Update to `2g@^1.0.1`
([#51517](#51517) by
[@kitten](https://github.com/kitten))
- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
  - @expo/config@58.0.6
## @expo/metro-file-map@58.0.5

### Patch Changes

- Bump to `2g@1.0.0` and provide process metadata, such as `port` for
commands like `expo start`.
([#51338](#51338) by
[@kitten](https://github.com/kitten))
- Update to `2g@^1.0.1`
([#51517](#51517) by
[@kitten](https://github.com/kitten))
## @expo/prebuild-config@58.0.13

### Patch Changes

- Updated dependencies.
([#51477](#51477))
  - expo-modules-autolinking@58.0.13
  - @expo/config@58.0.6
  - @expo/config-plugins@58.0.9
  - @expo/image-utils@0.12.5
## @expo/require-utils@58.0.4

### Patch Changes

- Fix missing `followSymlinks` case for direct-file Node candidate
resolution, which would previously ignore a `followSymlinks: true`
option. ([#51535](#51535) by
[@kitten](https://github.com/kitten))
## babel-preset-expo@58.0.14

### Patch Changes

- Update to `@expo/metro@~58.0.0` (promoted to stable for SDK 58).
([#51549](#51549) by
[@kitten](https://github.com/kitten))
## create-expo@5.1.5

### Patch Changes

- [iOS] Added a preview `--swiftpm` flag that enables
`experiments.swiftPackageManager` in app.json and sets up iOS with Swift
Package Manager instead of CocoaPods.
([#51038](#51038) by
[@chrfalch](https://github.com/chrfalch))
## create-expo-module@58.0.3

### Patch Changes

- Fixed the example app bundling a second copy of `react-native` and
`expo` from the module's dependencies, which crashed it with `TypeError:
property is not writable` when the module was created with pnpm. The
example app now enables `experiments.autolinkingModuleResolution`.
([#51267](#51267) by
[@behenate](https://github.com/behenate))
- Fix creating a standalone module with pnpm 11 and later failing with
`ERR_PNPM_IGNORED_BUILDS`. When pnpm 11 or later is used and the module
isn't a project of an existing pnpm workspace, the module and its
example app now get their own `pnpm-workspace.yaml`, which skips the
unneeded install scripts of Jest's dependencies. Inside an existing pnpm
workspace that doesn't allow these scripts, `create-expo-module` now
explains how to allow them. The example app's dependencies are now
installed once, after the template files are in place.
([#51249](#51249) by
[@behenate](https://github.com/behenate))
## expo@58.0.10

### Patch Changes

- Upgrade `react-native-screens` to 4.30.0.
([#51489](#51489) by
[@Ubax](https://github.com/Ubax))
- Update to `@expo/metro@~58.0.0` (promoted to stable for SDK 58).
([#51549](#51549) by
[@kitten](https://github.com/kitten))
- Add missing `expo/build/winter` exports entry.
([#51536](#51536) by
[@kitten](https://github.com/kitten))
- Updated dependencies.
([#51477](#51477),
[#51481](#51481),
[#51548](#51548),
[#51546](#51546),
[#50406](#50406),
[#51553](#51553),
[#51549](#51549),
[#51536](#51536),
[#51526](#51526),
[#51023](#51023),
[#51347](#51347),
[#51338](#51338),
[#51517](#51517),
[#51344](#51344))
  - expo-modules-autolinking@58.0.13
  - expo-modules-core@58.0.18
  - @expo/cli@58.1.8
  - @expo/metro-config@58.0.13
  - babel-preset-expo@58.0.14
  - @expo/config@58.0.6
  - @expo/config-plugins@58.0.9
  - expo-constants@58.0.12
  - @expo/local-build-cache-provider@58.0.6
  - expo-asset@58.0.15
## expo-app-intents@0.5.6

### Patch Changes

- Updated dependencies.
([#51480](#51480),
[#51426](#51426))
  - @expo/ui@58.0.17
## expo-app-metrics@58.0.12

### Patch Changes

- [Android] Fix startup metrics recorded after the first save (for
example TTI after an update download) never being persisted.
([#51538](#51538) by
[@Ubax](https://github.com/Ubax))
## expo-asset@58.0.15

### Patch Changes

- Updated dependencies.
  - @expo/image-utils@0.12.5
  - expo-constants@58.0.12
## expo-auth-session@58.0.12

### Patch Changes

- Updated dependencies.
  - expo-constants@58.0.12
  - expo-linking@58.0.13
## expo-constants@58.0.12

### Patch Changes

- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
## expo-linking@58.0.13

### Patch Changes

- Updated dependencies.
  - expo-constants@58.0.12
## expo-location@58.0.16

### Patch Changes

- [Android] Don't crash when the foreground service of a location task
can't be started, for example when the location permission was revoked
while the task stayed registered. The task now keeps running without the
service instead of crashing the app on every launch.
([#51216](#51216) by
[@krisoft20](https://github.com/krisoft20))
- [Android] Add the TypeScript interface for the location foreground
service: `ensureBackgroundSessionStarted`, `stopBackgroundSession` and
`getBackgroundSessionStatus`.

Add `getNotificationPermissions`, `requestNotificationPermissions` and
the `useNotificationPermissions` hook for the service's notification.

Add `LocationUpdatesHandle.status()`, and the `canDeliverUpdates` and
`areUpdatesAllowed` fields on `PositionWatchStatus`.

([#51320](#51320) by
[@HubertBer](https://github.com/HubertBer))

- Updated dependencies.
  - @expo/image-utils@0.12.5
## expo-module-template@58.0.7

### Patch Changes

- [Android] Fix the Jetpack Compose view and modifier examples failing
to compile with SDK 58: pass the converter context to `recordFromMap`
and add the `react-android` dependency required by `ModifierList`.
([#51248](#51248) by
[@behenate](https://github.com/behenate))
- Fixed the example app bundling a second copy of `react-native` and
`expo` from the module's dependencies, which crashed it with `TypeError:
property is not writable` when the module was created with pnpm. The
example app now enables `experiments.autolinkingModuleResolution`.
([#51267](#51267) by
[@behenate](https://github.com/behenate))
- Fix creating a standalone module with pnpm 11 and later failing with
`ERR_PNPM_IGNORED_BUILDS`. When pnpm 11 or later is used and the module
isn't a project of an existing pnpm workspace, the module and its
example app now get their own `pnpm-workspace.yaml`, which skips the
unneeded install scripts of Jest's dependencies. Inside an existing pnpm
workspace that doesn't allow these scripts, `create-expo-module` now
explains how to allow them. The example app's dependencies are now
installed once, after the template files are in place.
([#51249](#51249) by
[@behenate](https://github.com/behenate))
- Fix the `build` and `test` scripts exiting successfully when
TypeScript or Jest can't be started. The scripts now print why the tool
couldn't start and how to fix it.
([#51252](#51252) by
[@behenate](https://github.com/behenate))
- Update the template's development dependencies to match SDK 58:
`babel-preset-expo`, `jest-expo`, `@expo/ui`, `react-native`,
`@types/react`, `jest`, `@types/jest`, `typescript` and
`eslint-config-universe`. Add `react` and `@react-native/jest-preset`,
which are required peer dependencies of `react-native` and `jest-expo`.
([#51250](#51250) by
[@behenate](https://github.com/behenate))
- [Android] Bump Jetpack Compose UI and Foundation to 1.12.1 and
Material3 to 1.5.0-beta01. Add `preferredItemWidth` to
`HorizontalCenteredHeroCarousel` and deprecate `maxItemWidth`, matching
the Material3 rename. Add `TimePickerElementColors` props without the
`Unselected` infix (for example `clockDialContentColor`) and deprecate
the old names. ([#51426](#51426) by
[@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
## expo-modules-autolinking@58.0.13

### Patch Changes

- Fix autolinking choosing a different copy of a duplicated native
module between runs when it is reachable at more than one dependency
depth, which also made the `@expo/fingerprint` hash unstable. A resolved
module no longer lists its own path among its duplicates.
([#51477](#51477) by
[@jszumski](https://github.com/jszumski))
- Updated dependencies.
([#51535](#51535))
  - @expo/require-utils@58.0.4
## expo-modules-core@58.0.18

### Patch Changes

- [iOS] Fix slow cold launches in brownfield apps where the
`ExpoModulesProvider` lookup scanned `Bundle.allFrameworks` inside
`+load`. The lookup now tries the framework that contains
ExpoModulesCore before falling back to the scan.
([#51481](#51481) by
[@expo-bot](https://github.com/expo-bot))
- [iOS] Update `expo-modules-macros` to 0.20.0, which binds `@JS`
functions and setters that return nothing through the `Void` overload,
so they no longer build an `undefined` value on each call.
([#51548](#51548) by
[@tsapeta](https://github.com/tsapeta))
- [iOS] Reduced the overhead of emitting module events.
([#51553](#51553) by
[@tsapeta](https://github.com/tsapeta))
- Updated dependencies.
([#51496](#51496),
[#51499](#51499),
[#51498](#51498),
[#51371](#51371))
  - expo-modules-jsi@58.0.13
## expo-modules-jsi@58.0.13

### Patch Changes

- [iOS] Encode Swift arrays to JS arrays about 35% faster, and Swift
sets to JS sets about 25% faster.
([#51496](#51496) by
[@tsapeta](https://github.com/tsapeta))
- [iOS] Make `JavaScriptUnownedValue` `@frozen`, so modules that decode
`@JS` function arguments know its layout and no longer ask its type
metadata for it. Host functions with arguments are faster, by about 8 to
12% with eight arguments. This changes the ABI of `ExpoModulesJSI`.
([#51499](#51499) by
[@tsapeta](https://github.com/tsapeta))
- [iOS] Add `createFunction` and `setProperty(_:function:)` overloads
taking a `VoidFunctionClosure`, for host functions that return nothing
to JavaScript. They make such calls faster because they skip creating
and writing the result value.
([#51498](#51498) by
[@tsapeta](https://github.com/tsapeta))
- [iOS] Fix the `ExpoModulesJSI` xcframework slice staying built against
another Xcode's SDK. The slice cache now includes the Xcode build, so
switching between Xcode releases that share a Swift compiler (such as
Xcode 27.0 and 27.1) rebuilds it, and the rebuild uses the app build's
`DEVELOPER_DIR` and `TOOLCHAINS` instead of the Xcode selected with
`xcode-select` and the default toolchain.
([#51371](#51371) by
[@mwolson](https://github.com/mwolson))
## expo-notifications@58.1.4

### Patch Changes

- Updated dependencies.
  - @expo/image-utils@0.12.5
  - expo-constants@58.0.12
## expo-observe@58.0.14

### Patch Changes

- Adjust router integration to use `unstable_PerformanceObserver`
instead of `unstable_navigationEvents`
([#51068](#51068) by
[@Ubax](https://github.com/Ubax))
- Measure Expo Router navigation TTR and TTI from when the navigation
action is queued. ([#51485](#51485) by
[@Ubax](https://github.com/Ubax))
- Updated dependencies.
([#51538](#51538))
  - expo-app-metrics@58.0.12
## expo-router@58.0.19

### Patch Changes

- Upgrade `react-native-screens` to 4.30.0.
([#51489](#51489) by
[@Ubax](https://github.com/Ubax))
- Add the `expo-router:action-enqueued` performance mark, recorded when
a navigation action is queued.
([#51485](#51485) by
[@Ubax](https://github.com/Ubax))
- Fixed the first push to a screen being reported as `pagePreloaded`.
([#51446](#51446) by
[@Ubax](https://github.com/Ubax))
- [Internal] Return platform-tagged icons from the NativeTabs icon
converter so tab icons type-check with `react-native-screens` 4.30.0.
([#51508](#51508) by
[@Ubax](https://github.com/Ubax))
- Replace the experimental `unstable_navigationEvents` API with
`unstable_performance` and `unstable_PerformanceObserver`.
([#51068](#51068) by
[@Ubax](https://github.com/Ubax))
- Added a development warning when `navigation.isFocused()` is called
during render. ([#51464](#51464) by
[@Ubax](https://github.com/Ubax))
## expo-sharing@58.0.18

### Patch Changes

- Updated dependencies.
  - @expo/config-plugins@58.0.9
## expo-splash-screen@58.0.9

### Patch Changes

- Updated dependencies.
  - @expo/config-plugins@58.0.9
  - @expo/image-utils@0.12.5
## expo-sqlite@58.0.13

### Patch Changes

- Fixed `getFirstSync()` and sync `for...of` so they mark the cursor as
moved. A later `getFirstSync()` or `getAllSync()` throws until
`resetSync()`, matching the async APIs.
([#47989](#47989) by
[@tsushanth](https://github.com/tsushanth))
## @expo/ui@58.0.17

### Patch Changes

- [Android] Fix the universal `ListItem` ignoring `testID`. The prop was
never passed to Compose, so end-to-end tools such as Maestro could not
find list rows on Android. It is now applied as the `testID` modifier,
like the universal `Button` and `Checkbox` do.
([#51480](#51480) by
[@devonik](https://github.com/devonik))
- [Android] Bump Jetpack Compose UI and Foundation to 1.12.1 and
Material3 to 1.5.0-beta01. Add `preferredItemWidth` to
`HorizontalCenteredHeroCarousel` and deprecate `maxItemWidth`, matching
the Material3 rename. Add `TimePickerElementColors` props without the
`Unselected` infix (for example `clockDialContentColor`) and deprecate
the old names. ([#51426](#51426) by
[@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
## expo-widgets@58.0.17

### Patch Changes

- [Android] Add custom notifications.
([#51461](#51461) by
[@jakex7](https://github.com/jakex7))
- [iOS] Rebuild the widgets JS bundle on every Xcode build so JS changes
are picked up without a clean build.
([#50200](#50200) by
[@jakex7](https://github.com/jakex7))
- Updated dependencies.
([#51480](#51480),
[#51426](#51426))
  - @expo/ui@58.0.17
## jest-expo@58.0.10

### Patch Changes

- Accept `jest@^29` again as a peer dependency.
([#51462](#51462) by
[@hassankhan](https://github.com/hassankhan))
## patch-project@58.0.15

### Patch Changes

- Updated dependencies.
  - @expo/config@58.0.6
  - @expo/config-plugins@58.0.9
## expo-template-bare-minimum@58.0.19

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
## expo-template-blank@58.0.19

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
## expo-template-blank-typescript@58.0.19

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
## expo-template-default@58.0.19

### Patch Changes

- Upgrade `react-native-screens` to 4.30.0.
([#51489](#51489) by
[@Ubax](https://github.com/Ubax))
- Update `react-native-reanimated` to 4.7.1,
`react-native-safe-area-context` to ~5.10.1, and
`react-native-gesture-handler` to ~3.3.0 to match
`bundledNativeModules.json`.
([#51488](#51488) by
[@Kudo](https://github.com/Kudo))
- Updated dependencies.
([#51480](#51480),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464),
[#51426](#51426))
  - @expo/ui@58.0.17
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-constants@58.0.12
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
## expo-template-tabs@58.0.19

### Patch Changes

- Upgrade `react-native-screens` to 4.30.0.
([#51489](#51489) by
[@Ubax](https://github.com/Ubax))
- Update `react-native-reanimated` to 4.7.1,
`react-native-safe-area-context` to ~5.10.1, and
`react-native-gesture-handler` to ~3.3.0 to match
`bundledNativeModules.json`.
([#51488](#51488) by
[@Kudo](https://github.com/Kudo))
- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-constants@58.0.12
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
## @expo/router-server@58.0.13

No changes in this release.
## bare-expo@0.0.5

### Patch Changes

- Updated dependencies.
([#51406](#51406),
[#51480](#51480),
[#51538](#51538),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51216](#51216),
[#51068](#51068),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51464](#51464),
[#51320](#51320),
[#51426](#51426))
  - expo-ai@0.1.1
  - @expo/ui@58.0.17
  - expo-app-metrics@58.0.12
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-location@58.0.16
  - expo-observe@58.0.14
  - native-component-list@0.0.4
  - test-suite@1.0.4
  - expo-app-intents@0.5.6
  - expo-image@58.0.14
  - expo-brownfield@58.0.13
  - expo-updates@58.0.16
  - expo-dev-menu@58.0.11
  - expo-video@58.0.10
  - @expo/dom-webview@58.0.2
  - expo-audio@58.0.9
  - expo-background-fetch@58.0.10
  - expo-build-properties@58.0.10
  - expo-camera@58.0.10
  - expo-dev-client@58.0.13
  - expo-font@58.0.8
  - expo-insights@58.0.11
  - expo-linking@58.0.13
  - expo-media-library@58.0.8
  - expo-navigation-bar@58.0.4
  - expo-network-addons@58.0.2
  - expo-notifications@58.1.4
  - expo-secure-store@58.0.2
  - expo-splash-screen@58.0.9
  - expo-status-bar@58.0.3
  - expo-tracking-transparency@58.0.2
  - expo-web-browser@58.0.6
## expo-brownfield-tester@0.0.5

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
## expo-app@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-image@58.0.14
  - expo-brownfield@58.0.13
  - expo-dev-menu@58.0.11
  - expo-constants@58.0.12
  - expo-device@58.0.5
  - expo-font@58.0.8
  - expo-glass-effect@58.0.3
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
  - expo-status-bar@58.0.3
  - expo-symbols@58.0.4
  - expo-system-ui@58.0.5
  - expo-web-browser@58.0.6
## expo-apps-common@0.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464))
  - expo-router@58.0.19
## eas-expo-go@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
## @expo/home@0.0.5

### Patch Changes

- Updated dependencies.
([#51480](#51480),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51216](#51216),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464),
[#47989](#47989),
[#51320](#51320),
[#51426](#51426))
  - @expo/ui@58.0.17
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-location@58.0.16
  - expo-sqlite@58.0.13
  - expo-application@58.1.1
  - expo-crypto@58.0.6
  - expo-haptics@58.0.6
  - expo-updates@58.0.16
  - expo-dev-menu@58.0.11
  - expo-video@58.0.10
  - expo-constants@58.0.12
  - expo-age-range@58.0.2
  - expo-apple-authentication@58.0.2
  - expo-asset@58.0.15
  - expo-audio@58.0.9
  - expo-background-fetch@58.0.10
  - expo-background-task@58.0.10
  - expo-battery@58.0.3
  - expo-blob@58.0.3
  - expo-blur@58.0.3
  - expo-brightness@58.0.2
  - expo-calendar@58.0.6
  - expo-camera@58.0.10
  - expo-cellular@58.0.3
  - expo-clipboard@58.0.3
  - expo-contacts@58.0.7
  - expo-device@58.0.5
  - expo-document-picker@58.0.4
  - expo-font@58.0.8
  - expo-gl@58.0.3
  - expo-hinge@58.0.1
  - expo-image-manipulator@58.0.14
  - expo-image-picker@58.0.10
  - expo-intent-launcher@58.0.3
  - expo-linear-gradient@58.0.3
  - expo-linking@58.0.13
  - expo-live-photo@58.0.5
  - expo-local-authentication@58.0.2
  - expo-localization@58.0.4
  - expo-mail-composer@58.0.3
  - expo-media-library@58.0.8
  - expo-mesh-gradient@58.0.3
  - expo-navigation-bar@58.0.4
  - expo-network@58.0.3
  - expo-notifications@58.1.4
  - expo-print@58.0.6
  - expo-screen-capture@58.0.5
  - expo-screen-orientation@58.0.3
  - expo-secure-store@58.0.2
  - expo-sensors@58.0.4
  - expo-sharing@58.0.18
  - expo-sms@58.0.2
  - expo-speech@58.0.3
  - expo-splash-screen@58.0.9
  - expo-store-review@58.0.2
  - expo-system-ui@58.0.5
  - expo-task-manager@58.0.11
  - expo-tracking-transparency@58.0.2
  - expo-video-thumbnails@58.0.2
  - expo-web-browser@58.0.6
## minimal-swiftpm@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
  - expo-image@58.0.14
  - expo-crypto@58.0.6
  - expo-constants@58.0.12
## minimal-tester@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536))
  - expo@58.0.10
  - expo-image@58.0.14
  - expo-brownfield@58.0.13
  - expo-updates@58.0.16
  - expo-video@58.0.10
  - expo-apple-authentication@58.0.2
  - expo-blur@58.0.3
  - expo-build-properties@58.0.10
  - expo-camera@58.0.10
  - expo-dev-client@58.0.13
  - expo-linear-gradient@58.0.3
  - expo-splash-screen@58.0.9
  - expo-status-bar@58.0.3
## native-component-list@0.0.4

### Patch Changes

- Updated dependencies.
([#51406](#51406),
[#51480](#51480),
[#51538](#51538),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51216](#51216),
[#51068](#51068),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51464](#51464),
[#47989](#47989),
[#51320](#51320),
[#51426](#51426))
  - expo-ai@0.1.1
  - @expo/ui@58.0.17
  - expo-app-metrics@58.0.12
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-location@58.0.16
  - expo-observe@58.0.14
  - expo-sqlite@58.0.13
  - test-suite@1.0.4
  - expo-app-intents@0.5.6
  - expo-image@58.0.14
  - expo-application@58.1.1
  - expo-crypto@58.0.6
  - expo-haptics@58.0.6
  - expo-updates@58.0.16
  - expo-file-system@58.0.9
  - expo-video@58.0.10
  - expo-constants@58.0.12
  - expo-age-range@58.0.2
  - @expo/app-integrity@58.0.2
  - expo-apple-authentication@58.0.2
  - expo-asset@58.0.15
  - expo-audio@58.0.9
  - expo-auth-session@58.0.12
  - expo-background-fetch@58.0.10
  - expo-background-task@58.0.10
  - expo-battery@58.0.3
  - expo-blob@58.0.3
  - expo-blur@58.0.3
  - expo-brightness@58.0.2
  - expo-calendar@58.0.6
  - expo-camera@58.0.10
  - expo-cellular@58.0.3
  - expo-checkbox@58.0.2
  - expo-clipboard@58.0.3
  - expo-contacts@58.0.7
  - expo-device@58.0.5
  - expo-document-picker@58.0.4
  - expo-font@58.0.8
  - expo-gl@58.0.3
  - expo-glass-effect@58.0.3
  - expo-hinge@58.0.1
  - expo-image-manipulator@58.0.14
  - expo-image-picker@58.0.10
  - expo-intent-launcher@58.0.3
  - expo-keep-awake@58.0.3
  - expo-linear-gradient@58.0.3
  - expo-linking@58.0.13
  - expo-live-photo@58.0.5
  - expo-local-authentication@58.0.2
  - expo-localization@58.0.4
  - expo-mail-composer@58.0.3
  - expo-maps@58.0.9
  - expo-media-library@58.0.8
  - expo-mesh-gradient@58.0.3
  - expo-modules-test-core@58.0.4
  - expo-navigation-bar@58.0.4
  - expo-network@58.0.3
  - expo-notifications@58.1.4
  - expo-print@58.0.6
  - expo-screen-capture@58.0.5
  - expo-screen-orientation@58.0.3
  - expo-secure-store@58.0.2
  - expo-sensors@58.0.4
  - expo-sharing@58.0.18
  - expo-sms@58.0.2
  - expo-speech@58.0.3
  - expo-splash-screen@58.0.9
  - expo-standard-web-crypto@58.0.4
  - expo-status-bar@58.0.3
  - expo-store-review@58.0.2
  - expo-symbols@58.0.4
  - expo-system-ui@58.0.5
  - expo-task-manager@58.0.11
  - expo-tracking-transparency@58.0.2
  - expo-video-thumbnails@58.0.2
  - expo-web-browser@58.0.6
  - @expo/html-elements@58.0.3
## native-tests@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51068](#51068),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51464](#51464))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-observe@58.0.14
  - expo-image@58.0.14
  - expo-updates@58.0.16
  - expo-background-task@58.0.10
  - expo-clipboard@58.0.3
  - expo-dev-client@58.0.13
  - expo-image-manipulator@58.0.14
  - expo-media-library@58.0.8
  - expo-notifications@58.1.4
  - expo-splash-screen@58.0.9
## notification-tester@1.0.4

### Patch Changes

- Updated dependencies.
([#51480](#51480),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464),
[#47989](#47989),
[#51426](#51426))
  - @expo/ui@58.0.17
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-sqlite@58.0.13
  - native-component-list@0.0.4
  - test-suite@1.0.4
  - expo-updates@58.0.16
  - expo-constants@58.0.12
  - expo-dev-client@58.0.13
  - expo-device@58.0.5
  - expo-font@58.0.8
  - expo-linking@58.0.13
  - expo-localization@58.0.4
  - expo-notifications@58.1.4
  - expo-status-bar@58.0.3
  - expo-task-manager@58.0.11
## observe-tester@1.0.4

### Patch Changes

- Updated dependencies.
([#51480](#51480),
[#51538](#51538),
[#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51068](#51068),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51464](#51464),
[#51426](#51426))
  - @expo/ui@58.0.17
  - expo-app-metrics@58.0.12
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-observe@58.0.14
  - expo-image@58.0.14
  - expo-haptics@58.0.6
  - expo-updates@58.0.16
  - expo-constants@58.0.12
  - expo-build-properties@58.0.10
  - expo-clipboard@58.0.3
  - expo-dev-client@58.0.13
  - expo-eas-client@58.0.2
  - expo-font@58.0.8
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
  - expo-status-bar@58.0.3
  - expo-symbols@58.0.4
  - expo-system-ui@58.0.5
  - expo-web-browser@58.0.6
  - @expo/html-elements@58.0.3
## @expo/router-e2e@0.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464),
[#47989](#47989))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-sqlite@58.0.13
  - expo-image@58.0.14
  - expo-haptics@58.0.6
  - @expo/dom-webview@58.0.2
  - expo-build-properties@58.0.10
  - expo-linking@58.0.13
  - expo-speech@58.0.3
  - expo-splash-screen@58.0.9
## router-tester@1.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-image@58.0.14
  - expo-constants@58.0.12
  - expo-dev-client@58.0.13
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
  - expo-status-bar@58.0.3
  - expo-symbols@58.0.4
  - expo-system-ui@58.0.5
## @expo/sandbox@0.0.4

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-dev-client@58.0.13
  - expo-linking@58.0.13
  - expo-splash-screen@58.0.9
## test-suite@1.0.4

### Patch Changes

- Updated dependencies.
([#51480](#51480),
[#51538](#51538),
[#51481](#51481),
[#51548](#51548),
[#51489](#51489),
[#51553](#51553),
[#51549](#51549),
[#51536](#51536),
[#51216](#51216),
[#51068](#51068),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51464](#51464),
[#47989](#47989),
[#51320](#51320),
[#51426](#51426))
  - @expo/ui@58.0.17
  - expo-app-metrics@58.0.12
  - expo-modules-core@58.0.18
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-location@58.0.16
  - expo-observe@58.0.14
  - expo-sqlite@58.0.13
  - expo-image@58.0.14
  - expo-application@58.1.1
  - expo-crypto@58.0.6
  - expo-haptics@58.0.6
  - expo-file-system@58.0.9
  - expo-video@58.0.10
  - expo-constants@58.0.12
  - expo-asset@58.0.15
  - expo-audio@58.0.9
  - expo-auth-session@58.0.12
  - expo-background-fetch@58.0.10
  - expo-battery@58.0.3
  - expo-blob@58.0.3
  - expo-blur@58.0.3
  - expo-brightness@58.0.2
  - expo-calendar@58.0.6
  - expo-camera@58.0.10
  - expo-cellular@58.0.3
  - expo-checkbox@58.0.2
  - expo-clipboard@58.0.3
  - expo-contacts@58.0.7
  - expo-device@58.0.5
  - expo-eas-client@58.0.2
  - expo-font@58.0.8
  - expo-gl@58.0.3
  - expo-glass-effect@58.0.3
  - expo-image-manipulator@58.0.14
  - expo-image-picker@58.0.10
  - expo-keep-awake@58.0.3
  - expo-linear-gradient@58.0.3
  - expo-linking@58.0.13
  - expo-localization@58.0.4
  - expo-media-library@58.0.8
  - expo-navigation-bar@58.0.4
  - expo-network@58.0.3
  - expo-notifications@58.1.4
  - expo-screen-orientation@58.0.3
  - expo-secure-store@58.0.2
  - expo-sms@58.0.2
  - expo-speech@58.0.3
  - expo-store-review@58.0.2
  - expo-system-ui@58.0.5
  - expo-task-manager@58.0.11
  - expo-web-browser@58.0.6
  - @expo/html-elements@58.0.3
## @expo/internal-scripts@58.0.2

### Patch Changes

- Updated dependencies.
([#51462](#51462))
  - jest-expo@58.0.10
## expo-ai@0.1.1

### Patch Changes

- Fix structured output and categorize failing with
`ERR_VALIDATION_RETRIES_EXHAUSTED` on web and Android. Replies wrapped
in Markdown code fences are now accepted, and schemas whose top level is
not an object, such as the string enum that categorize uses, now work.
On web, schemas with `minimum` or `maximum` now go to the browser Prompt
API as a response constraint.
([#51406](#51406) by
[@chrfalch](https://github.com/chrfalch))
## sqlite-inspector-webui@0.0.5

### Patch Changes

- Updated dependencies.
([#51489](#51489),
[#51549](#51549),
[#51536](#51536),
[#51485](#51485),
[#51446](#51446),
[#51508](#51508),
[#51068](#51068),
[#51464](#51464),
[#47989](#47989))
  - expo@58.0.10
  - expo-router@58.0.19
  - expo-sqlite@58.0.13
  - expo-linking@58.0.13

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot: fingerprint changed bot: passed checks ExpoBot has nothing to complain about contributor: internal PR author is a member, owner, or collaborator of the expo org

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants