From 64e12acfc01e45ed94f0a5a001c7195c3c987c6e Mon Sep 17 00:00:00 2001
From: Wiktor Smaga
Date: Mon, 4 May 2026 12:24:24 +0200
Subject: [PATCH 01/20] [iOS][calendar][next] Add `presentPicker()` (#44965)
# Why
This is the first PR from the stack aiming to improve the limited-permissions flow in calendar@next.
This PR adds the `presentPicker()` function, which allows selecting a calendar without requiring full access permissions.
# How
Implements the `presentPicker` function on iOS using `EKCalendarChooser`
# Test Plan
Tested on BareExpo - added a button to NCL
https://github.com/user-attachments/assets/60966fee-047d-487c-b8b6-e535ec2712c9
---
.../src/screens/CalendarsNextScreen.tsx | 17 +++++++++--
packages/expo-calendar/CHANGELOG.md | 1 +
.../expo-calendar/build/next/Calendar.d.ts | 6 ++++
.../build/next/Calendar.d.ts.map | 2 +-
packages/expo-calendar/build/next/Calendar.js | 15 ++++++++++
.../expo-calendar/build/next/Calendar.js.map | 2 +-
.../build/next/ExpoCalendar.d.ts | 1 +
.../build/next/ExpoCalendar.d.ts.map | 2 +-
.../build/next/ExpoCalendar.js.map | 2 +-
.../build/next/ExpoCalendar.web.d.ts | 1 +
.../build/next/ExpoCalendar.web.d.ts.map | 2 +-
.../build/next/ExpoCalendar.web.js | 3 ++
.../build/next/ExpoCalendar.web.js.map | 2 +-
.../build/next/ExpoGoCalendarNextStub.d.ts | 1 +
.../next/ExpoGoCalendarNextStub.d.ts.map | 2 +-
.../build/next/ExpoGoCalendarNextStub.js | 3 ++
.../build/next/ExpoGoCalendarNextStub.js.map | 2 +-
.../ios/Next/CalendarNextExceptions.swift | 7 +++++
.../ios/Next/CalendarNextModule.swift | 28 +++++++++++++++++--
.../ios/Next/CalendarPickerDelegate.swift | 26 +++++++++++++++++
packages/expo-calendar/src/next/Calendar.ts | 16 +++++++++++
.../expo-calendar/src/next/ExpoCalendar.ts | 1 +
.../src/next/ExpoCalendar.web.ts | 4 +++
.../src/next/ExpoGoCalendarNextStub.ts | 4 +++
24 files changed, 138 insertions(+), 12 deletions(-)
create mode 100644 packages/expo-calendar/ios/Next/CalendarNextExceptions.swift
create mode 100644 packages/expo-calendar/ios/Next/CalendarPickerDelegate.swift
diff --git a/apps/native-component-list/src/screens/CalendarsNextScreen.tsx b/apps/native-component-list/src/screens/CalendarsNextScreen.tsx
index 479127a8c1db27..0f6fc48e1a8437 100644
--- a/apps/native-component-list/src/screens/CalendarsNextScreen.tsx
+++ b/apps/native-component-list/src/screens/CalendarsNextScreen.tsx
@@ -1,6 +1,6 @@
import type { StackNavigationProp } from '@react-navigation/stack';
import * as Calendar from 'expo-calendar';
-import { createCalendar, ExpoCalendar, getCalendars } from 'expo-calendar/next';
+import { createCalendar, ExpoCalendar, getCalendars, presentPicker } from 'expo-calendar/next';
import { useState } from 'react';
import { Alert, Platform, ScrollView, StyleSheet, View } from 'react-native';
@@ -163,7 +163,17 @@ export default function CalendarsNextScreen({ navigation }: { navigation: StackN
if (calendars.length) {
return (
-
+
+ {Platform.OS === 'ios' && (
+
@@ -40,10 +40,10 @@
---
-The `@expo/codemod` package is a CLI binary provided to help you upgrade between Expo SDK versions.
+The `expo-codemod` package is a CLI binary provided to help you upgrade between Expo SDK versions.
```
-npx @expo/codemod
+npx expo-codemod
```
## Usage
@@ -51,7 +51,7 @@ npx @expo/codemod
Run a transform against one or more paths or globs:
```sh
-npx @expo/codemod
+npx expo-codemod
```
```
@@ -66,13 +66,13 @@ Options:
For example, to run a transform over everything under `src`:
```sh
-npx @expo/codemod sdk-56-expo-router-react-navigation-replace src
+npx expo-codemod sdk-56-expo-router-react-navigation-replace src
```
Globs work too (wrap them in quotes so the shell doesn't expand them):
```sh
-npx @expo/codemod sdk-56-expo-router-react-navigation-replace '**/*.{ts,tsx,js,jsx}'
+npx expo-codemod sdk-56-expo-router-react-navigation-replace '**/*.{ts,tsx,js,jsx}'
```
## Transforms
diff --git a/packages/@expo/codemod/bin/expo-codemod.js b/packages/expo-codemod/bin/expo-codemod.js
similarity index 100%
rename from packages/@expo/codemod/bin/expo-codemod.js
rename to packages/expo-codemod/bin/expo-codemod.js
diff --git a/packages/@expo/codemod/build/index.d.ts b/packages/expo-codemod/build/index.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/index.d.ts
rename to packages/expo-codemod/build/index.d.ts
diff --git a/packages/@expo/codemod/build/index.js b/packages/expo-codemod/build/index.js
similarity index 100%
rename from packages/@expo/codemod/build/index.js
rename to packages/expo-codemod/build/index.js
diff --git a/packages/@expo/codemod/build/index.js.map b/packages/expo-codemod/build/index.js.map
similarity index 100%
rename from packages/@expo/codemod/build/index.js.map
rename to packages/expo-codemod/build/index.js.map
diff --git a/packages/@expo/codemod/build/log.d.ts b/packages/expo-codemod/build/log.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/log.d.ts
rename to packages/expo-codemod/build/log.d.ts
diff --git a/packages/@expo/codemod/build/log.js b/packages/expo-codemod/build/log.js
similarity index 100%
rename from packages/@expo/codemod/build/log.js
rename to packages/expo-codemod/build/log.js
diff --git a/packages/@expo/codemod/build/log.js.map b/packages/expo-codemod/build/log.js.map
similarity index 100%
rename from packages/@expo/codemod/build/log.js.map
rename to packages/expo-codemod/build/log.js.map
diff --git a/packages/@expo/codemod/build/run/index.d.ts b/packages/expo-codemod/build/run/index.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/run/index.d.ts
rename to packages/expo-codemod/build/run/index.d.ts
diff --git a/packages/@expo/codemod/build/run/index.js b/packages/expo-codemod/build/run/index.js
similarity index 98%
rename from packages/@expo/codemod/build/run/index.js
rename to packages/expo-codemod/build/run/index.js
index 17aaf4e15bf794..5dfad6a12cacb6 100644
--- a/packages/@expo/codemod/build/run/index.js
+++ b/packages/expo-codemod/build/run/index.js
@@ -64,7 +64,7 @@ async function parseAndValidateArgs(argv) {
const transforms = await (0, transforms_1.listTransformsAsync)();
const [transform, ...paths] = positionals;
if (values.help || !transform || paths.length === 0) {
- (0, args_1.printHelp)('Run a codemod transform against the given paths.', 'npx @expo/codemod ', [
+ (0, args_1.printHelp)('Run a codemod transform against the given paths.', 'npx expo-codemod ', [
' (required) name of transform to apply to files',
' (see a list of transforms available below)',
' one or more paths or globs (e.g. src/**/*.tsx)',
diff --git a/packages/@expo/codemod/build/run/index.js.map b/packages/expo-codemod/build/run/index.js.map
similarity index 98%
rename from packages/@expo/codemod/build/run/index.js.map
rename to packages/expo-codemod/build/run/index.js.map
index 66bd2feb12285b..ebd5e495df3936 100644
--- a/packages/@expo/codemod/build/run/index.js.map
+++ b/packages/expo-codemod/build/run/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/@expo/codemod/build/transforms/index.d.ts b/packages/expo-codemod/build/transforms/index.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/transforms/index.d.ts
rename to packages/expo-codemod/build/transforms/index.d.ts
diff --git a/packages/@expo/codemod/build/transforms/index.js b/packages/expo-codemod/build/transforms/index.js
similarity index 100%
rename from packages/@expo/codemod/build/transforms/index.js
rename to packages/expo-codemod/build/transforms/index.js
diff --git a/packages/@expo/codemod/build/transforms/index.js.map b/packages/expo-codemod/build/transforms/index.js.map
similarity index 100%
rename from packages/@expo/codemod/build/transforms/index.js.map
rename to packages/expo-codemod/build/transforms/index.js.map
diff --git a/packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.d.ts b/packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.d.ts
rename to packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.d.ts
diff --git a/packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js b/packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js
similarity index 100%
rename from packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js
rename to packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js
diff --git a/packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js.map b/packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js.map
similarity index 100%
rename from packages/@expo/codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js.map
rename to packages/expo-codemod/build/transforms/sdk-56-expo-router-react-navigation-replace.js.map
diff --git a/packages/@expo/codemod/build/utils/args.d.ts b/packages/expo-codemod/build/utils/args.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/utils/args.d.ts
rename to packages/expo-codemod/build/utils/args.d.ts
diff --git a/packages/@expo/codemod/build/utils/args.js b/packages/expo-codemod/build/utils/args.js
similarity index 100%
rename from packages/@expo/codemod/build/utils/args.js
rename to packages/expo-codemod/build/utils/args.js
diff --git a/packages/@expo/codemod/build/utils/args.js.map b/packages/expo-codemod/build/utils/args.js.map
similarity index 100%
rename from packages/@expo/codemod/build/utils/args.js.map
rename to packages/expo-codemod/build/utils/args.js.map
diff --git a/packages/@expo/codemod/build/utils/runner.d.ts b/packages/expo-codemod/build/utils/runner.d.ts
similarity index 100%
rename from packages/@expo/codemod/build/utils/runner.d.ts
rename to packages/expo-codemod/build/utils/runner.d.ts
diff --git a/packages/@expo/codemod/build/utils/runner.js b/packages/expo-codemod/build/utils/runner.js
similarity index 100%
rename from packages/@expo/codemod/build/utils/runner.js
rename to packages/expo-codemod/build/utils/runner.js
diff --git a/packages/@expo/codemod/build/utils/runner.js.map b/packages/expo-codemod/build/utils/runner.js.map
similarity index 100%
rename from packages/@expo/codemod/build/utils/runner.js.map
rename to packages/expo-codemod/build/utils/runner.js.map
diff --git a/packages/@expo/codemod/jest.config.js b/packages/expo-codemod/jest.config.js
similarity index 100%
rename from packages/@expo/codemod/jest.config.js
rename to packages/expo-codemod/jest.config.js
diff --git a/packages/@expo/codemod/package.json b/packages/expo-codemod/package.json
similarity index 84%
rename from packages/@expo/codemod/package.json
rename to packages/expo-codemod/package.json
index 78222dd84f8b47..d9b2b7c74f5e99 100644
--- a/packages/@expo/codemod/package.json
+++ b/packages/expo-codemod/package.json
@@ -1,7 +1,6 @@
{
- "name": "@expo/codemod",
- "private": true,
- "version": "0.1.0",
+ "name": "expo-codemod",
+ "version": "55.0.0",
"description": "Codemods for migrating Expo apps between SDK versions",
"license": "MIT",
"keywords": [
@@ -10,11 +9,11 @@
"expo-router",
"react-navigation"
],
- "homepage": "https://github.com/expo/expo/tree/main/packages/@expo/codemod",
+ "homepage": "https://github.com/expo/expo/tree/main/packages/expo-codemod",
"repository": {
"type": "git",
"url": "https://github.com/expo/expo.git",
- "directory": "packages/@expo/codemod"
+ "directory": "packages/expo-codemod"
},
"bugs": {
"url": "https://github.com/expo/expo/issues"
diff --git a/packages/@expo/codemod/src/index.ts b/packages/expo-codemod/src/index.ts
similarity index 100%
rename from packages/@expo/codemod/src/index.ts
rename to packages/expo-codemod/src/index.ts
diff --git a/packages/@expo/codemod/src/log.ts b/packages/expo-codemod/src/log.ts
similarity index 100%
rename from packages/@expo/codemod/src/log.ts
rename to packages/expo-codemod/src/log.ts
diff --git a/packages/@expo/codemod/src/run/__tests__/index-test.ts b/packages/expo-codemod/src/run/__tests__/index-test.ts
similarity index 100%
rename from packages/@expo/codemod/src/run/__tests__/index-test.ts
rename to packages/expo-codemod/src/run/__tests__/index-test.ts
diff --git a/packages/@expo/codemod/src/run/index.ts b/packages/expo-codemod/src/run/index.ts
similarity index 98%
rename from packages/@expo/codemod/src/run/index.ts
rename to packages/expo-codemod/src/run/index.ts
index 8d7bc89f6c4aa7..37bac8f79e35d2 100644
--- a/packages/@expo/codemod/src/run/index.ts
+++ b/packages/expo-codemod/src/run/index.ts
@@ -39,7 +39,7 @@ export async function parseAndValidateArgs(argv: string[] | undefined): Promise<
if (values.help || !transform || paths.length === 0) {
printHelp(
'Run a codemod transform against the given paths.',
- 'npx @expo/codemod ',
+ 'npx expo-codemod ',
[
' (required) name of transform to apply to files',
' (see a list of transforms available below)',
diff --git a/packages/@expo/codemod/src/transforms/__tests__/sdk-56-expo-router-react-navigation-replace-test.ts b/packages/expo-codemod/src/transforms/__tests__/sdk-56-expo-router-react-navigation-replace-test.ts
similarity index 100%
rename from packages/@expo/codemod/src/transforms/__tests__/sdk-56-expo-router-react-navigation-replace-test.ts
rename to packages/expo-codemod/src/transforms/__tests__/sdk-56-expo-router-react-navigation-replace-test.ts
diff --git a/packages/@expo/codemod/src/transforms/index.ts b/packages/expo-codemod/src/transforms/index.ts
similarity index 100%
rename from packages/@expo/codemod/src/transforms/index.ts
rename to packages/expo-codemod/src/transforms/index.ts
diff --git a/packages/@expo/codemod/src/transforms/sdk-56-expo-router-react-navigation-replace.ts b/packages/expo-codemod/src/transforms/sdk-56-expo-router-react-navigation-replace.ts
similarity index 100%
rename from packages/@expo/codemod/src/transforms/sdk-56-expo-router-react-navigation-replace.ts
rename to packages/expo-codemod/src/transforms/sdk-56-expo-router-react-navigation-replace.ts
diff --git a/packages/@expo/codemod/src/utils/args.ts b/packages/expo-codemod/src/utils/args.ts
similarity index 100%
rename from packages/@expo/codemod/src/utils/args.ts
rename to packages/expo-codemod/src/utils/args.ts
diff --git a/packages/@expo/codemod/src/utils/runner.ts b/packages/expo-codemod/src/utils/runner.ts
similarity index 100%
rename from packages/@expo/codemod/src/utils/runner.ts
rename to packages/expo-codemod/src/utils/runner.ts
diff --git a/packages/@expo/codemod/ts-declarations/jscodeshift-testUtils.d.ts b/packages/expo-codemod/ts-declarations/jscodeshift-testUtils.d.ts
similarity index 100%
rename from packages/@expo/codemod/ts-declarations/jscodeshift-testUtils.d.ts
rename to packages/expo-codemod/ts-declarations/jscodeshift-testUtils.d.ts
diff --git a/packages/@expo/codemod/tsconfig.json b/packages/expo-codemod/tsconfig.json
similarity index 100%
rename from packages/@expo/codemod/tsconfig.json
rename to packages/expo-codemod/tsconfig.json
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 50dd3b5ff2d95c..ba37a4b60e848e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2093,28 +2093,6 @@ importers:
specifier: ^1.2.2
version: 1.2.2
- packages/@expo/codemod:
- dependencies:
- chalk:
- specifier: ^4.1.2
- version: 4.1.2
- jscodeshift:
- specifier: ^17.1.2
- version: 17.3.0(@babel/preset-env@7.29.2(@babel/core@7.29.0))
- tinyglobby:
- specifier: ^0.2.15
- version: 0.2.15
- devDependencies:
- '@types/jscodeshift':
- specifier: ^17.0.0
- version: 17.3.0
- '@types/node':
- specifier: ^22.14.0
- version: 22.19.15
- expo-module-scripts:
- specifier: workspace:*
- version: link:../../expo-module-scripts
-
packages/@expo/config:
dependencies:
'@expo/config-plugins':
@@ -3930,6 +3908,28 @@ importers:
specifier: workspace:*
version: link:../expo-module-scripts
+ packages/expo-codemod:
+ dependencies:
+ chalk:
+ specifier: ^4.1.2
+ version: 4.1.2
+ jscodeshift:
+ specifier: ^17.1.2
+ version: 17.3.0(@babel/preset-env@7.29.2(@babel/core@7.29.0))
+ tinyglobby:
+ specifier: ^0.2.15
+ version: 0.2.15
+ devDependencies:
+ '@types/jscodeshift':
+ specifier: ^17.0.0
+ version: 17.3.0
+ '@types/node':
+ specifier: ^22.14.0
+ version: 22.19.15
+ expo-module-scripts:
+ specifier: workspace:*
+ version: link:../expo-module-scripts
+
packages/expo-constants:
dependencies:
'@expo/env':
From 0f0d289ea66d596353c66146a6b6204d3b3f8d04 Mon Sep 17 00:00:00 2001
From: Gabriel Donadel Dall'Agnol
Date: Mon, 4 May 2026 08:33:24 -0300
Subject: [PATCH 05/20] [docs] Add SPM instructions to brownfield isolated
guide (#45300)
# Why
We should document how to export SPM artifacts with expo-brownfield
# How
Add SPM instructions to brownfield isolated guide
# Test Plan
N / A
# Checklist
- [ ] 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)
---
docs/pages/brownfield/isolated-approach.mdx | 36 ++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/docs/pages/brownfield/isolated-approach.mdx b/docs/pages/brownfield/isolated-approach.mdx
index 0c1435765bc592..77df1bffd247ce 100644
--- a/docs/pages/brownfield/isolated-approach.mdx
+++ b/docs/pages/brownfield/isolated-approach.mdx
@@ -8,6 +8,7 @@ import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon';
import { BoxLink } from '~/ui/components/BoxLink';
import { Collapsible } from '~/ui/components/Collapsible';
+import { FileTree } from '~/ui/components/FileTree';
import { Prerequisites, Requirement } from '~/ui/components/Prerequisites';
import { Terminal } from '~/ui/components/Snippet';
import { Step } from '~/ui/components/Step';
@@ -130,6 +131,24 @@ When the build process is completed, the output is placed in the **./artifacts**
See the [`expo-brownfield` API reference](/versions/v55.0.0/sdk/brownfield/) for more details on build options, such as building only debug or release, specifying a custom output directory, and more.
+### Ship the artifacts as a Swift Package
+
+Pass the `--package [name]` flag to bundle the build output as a self-contained Swift Package instead of separate **.xcframework** directories. You can then add it to your host app as a local dependency in Xcode rather than manually dragging frameworks into the project.
+
+
+
+The flag accepts an optional name. If omitted, the package defaults to **\{TargetName\}Artifacts**. The resulting directory is a complete Swift Package with this layout:
+
+
+
@@ -220,7 +239,12 @@ startActivity(Intent(this, ExpoActivity::class.java))
-#### Add XCFrameworks to your project
+#### Add the artifacts to your project
+
+The integration steps depend on whether you built XCFrameworks or a Swift Package.
+
+
+
Drag both XCFramework files (\{TargetName\}**.xcframework** and **hermesvm.xcframework**) into your Xcode project navigator. In the dialog that appears:
@@ -233,6 +257,16 @@ Then, in your target's **General** tab under **Frameworks, Libraries, and Embedd
{/* vale on */}
+
+
+
+When `build:ios` produces a Swift Package (for example, **./artifacts/MyAppPackage-release**), add it to your host app as a local dependency in Xcode and select the package directory. Xcode automatically links the bundled **.xcframework** files through the aggregate library product.
+
+To support both `--debug` and `--release`, point your host app at the matching package for each build configuration.
+
+
+
+
From de80cd13f3f6ea95e1cf41ba1a010e357f89b002 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Kosmaty?=
Date: Mon, 4 May 2026 13:34:18 +0200
Subject: [PATCH 06/20] [core][Android] Use java reflection to convert enums to
strings (#45330)
---
.../expo/modules/kotlin/EnumExtensions.kt | 24 ------------
.../modules/kotlin/EnumToStringConverter.kt | 38 +++++++++++++++++++
.../kotlin/objects/ObjectDefinitionBuilder.kt | 30 ++++-----------
3 files changed, 46 insertions(+), 46 deletions(-)
delete mode 100644 packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumExtensions.kt
create mode 100644 packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumToStringConverter.kt
diff --git a/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumExtensions.kt b/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumExtensions.kt
deleted file mode 100644
index b34055d9b4d071..00000000000000
--- a/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumExtensions.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package expo.modules.kotlin
-
-import expo.modules.kotlin.types.Enumerable
-import kotlin.reflect.KProperty1
-import kotlin.reflect.full.declaredMemberProperties
-
-fun T.convertToString(): String where T : Enum, T : Enumerable {
- val enumClass = this::class
- val primaryConstructor = enumClass.fastPrimaryConstructor
- if (primaryConstructor?.parameters?.size == 1) {
- val parameterName = primaryConstructor.parameters.first().name
- val parameterProperty = enumClass
- .declaredMemberProperties
- .find { it.name == parameterName }
-
- requireNotNull(parameterProperty) { "Cannot find a property for $parameterName parameter" }
- require(parameterProperty.returnType.classifier == String::class) { "The enum parameter has to be a string." }
-
- @Suppress("UNCHECKED_CAST")
- return (parameterProperty as KProperty1).get(this)
- }
-
- return this.name
-}
diff --git a/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumToStringConverter.kt b/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumToStringConverter.kt
new file mode 100644
index 00000000000000..328b4161baf976
--- /dev/null
+++ b/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/EnumToStringConverter.kt
@@ -0,0 +1,38 @@
+package expo.modules.kotlin
+
+import expo.modules.kotlin.types.Enumerable
+import java.lang.reflect.Modifier
+
+fun T.convertToString(): String where T : Enum, T : Enumerable {
+ val enumClass = this::class.java
+ return EnumToStringConverter(enumClass).convert(this)
+}
+
+@PublishedApi
+internal class EnumToStringConverter>(
+ val enumClass: Class
+) {
+ val fields = enumClass
+ .declaredFields
+ .filter { !Modifier.isStatic(it.modifiers) && !it.isSynthetic }
+
+ fun convert(enumValue: T): String {
+ if (fields.isEmpty()) {
+ return enumValue.name
+ }
+
+ if (fields.size != 1) {
+ error("Can't convert $enumClass to string")
+ }
+
+ val field = fields.first()
+ field.isAccessible = true
+ val rawValue = field.get(enumValue) as? String
+
+ requireNotNull(rawValue) {
+ "The enum parameter has to be a string."
+ }
+
+ return rawValue
+ }
+}
diff --git a/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt b/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt
index c0171e15ca8abe..dd19761b1873c8 100644
--- a/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt
+++ b/packages/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt
@@ -3,15 +3,15 @@
package expo.modules.kotlin.objects
import com.facebook.react.bridge.Arguments
+import expo.modules.kotlin.EnumToStringConverter
import expo.modules.kotlin.Promise
import expo.modules.kotlin.component6
import expo.modules.kotlin.component7
import expo.modules.kotlin.component8
import expo.modules.kotlin.convertToString
import expo.modules.kotlin.events.EventsDefinition
-import expo.modules.kotlin.fastPrimaryConstructor
-import expo.modules.kotlin.functions.AsyncFunctionComponent
import expo.modules.kotlin.functions.AsyncFunctionBuilder
+import expo.modules.kotlin.functions.AsyncFunctionComponent
import expo.modules.kotlin.functions.AsyncFunctionWithPromiseComponent
import expo.modules.kotlin.functions.FunctionBuilder
import expo.modules.kotlin.functions.SyncFunctionComponent
@@ -25,7 +25,6 @@ import expo.modules.kotlin.types.TypeConverterProvider
import expo.modules.kotlin.types.enforceType
import expo.modules.kotlin.types.toArgsArray
import expo.modules.kotlin.types.toReturnType
-import kotlin.reflect.full.declaredMemberProperties
/**
* Base class for other definitions representing an object, such as `ModuleDefinition`.
@@ -448,27 +447,14 @@ open class ObjectDefinitionBuilder(
eventsDefinition = EventsDefinition(events)
}
- @Deprecated("Use Events(vararg String) or Events(Array) instead. This version can cause app startup performance issues.")
inline fun Events() where T : Enumerable, T : Enum {
- val primaryConstructor = T::class.fastPrimaryConstructor
- val events = if (primaryConstructor?.parameters?.size == 1) {
- val parameterName = primaryConstructor.parameters.first().name
-
- val parameterProperty = T::class
- .declaredMemberProperties
- .find { it.name == parameterName }
- requireNotNull(parameterProperty) { "Cannot find a property for $parameterName parameter" }
- require(parameterProperty.returnType.classifier == String::class) { "The enum parameter has to be a string." }
- enumValues().map {
- parameterProperty.get(it) as String
- }
- } else {
- enumValues().map {
- it.name
- }
- }
+ val enumClass = T::class.java
+ val converter = EnumToStringConverter(enumClass)
+ val events = enumValues()
+ .map { converter.convert(it) }
+ .toTypedArray()
- eventsDefinition = EventsDefinition(events.toTypedArray())
+ eventsDefinition = EventsDefinition(events)
}
/**
From b54e6e460dc4f24b4e89dd30f0e7ff0866960d60 Mon Sep 17 00:00:00 2001
From: Hassan Khan
Date: Mon, 4 May 2026 13:00:20 +0100
Subject: [PATCH 07/20] chore: bump `@typescript-eslint/*` (#45092)
# Why
After merging https://github.com/expo/expo/pull/44791, running ESLint
results in the following warning being displayed:
```
=============
WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.
* @typescript-eslint/typescript-estree version: 8.57.1
* Supported TypeScript versions: >=4.8.4 <6.0.0
* Your TypeScript version: 6.0.2
Please only submit bug reports when using the officially supported version.
=============
```
# How
Bumped all `@typescript-eslint/*` packages to the latest available.
# Test Plan
- CI
# Checklist
- [ ] 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)
- [x] 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)
---
packages/eslint-config-expo/package.json | 4 +-
packages/eslint-config-universe/package.json | 4 +-
packages/eslint-plugin-expo/package.json | 6 +-
pnpm-lock.yaml | 192 +++++++++----------
4 files changed, 103 insertions(+), 103 deletions(-)
diff --git a/packages/eslint-config-expo/package.json b/packages/eslint-config-expo/package.json
index cf492fcccf72dd..07e9ae8cf7d6ca 100644
--- a/packages/eslint-config-expo/package.json
+++ b/packages/eslint-config-expo/package.json
@@ -36,8 +36,8 @@
},
"homepage": "https://github.com/expo/expo/tree/main/packages/eslint-config-expo",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "^8.18.2",
- "@typescript-eslint/parser": "^8.18.2",
+ "@typescript-eslint/eslint-plugin": "^8.59.0",
+ "@typescript-eslint/parser": "^8.59.0",
"eslint-import-resolver-typescript": "^3.6.3",
"eslint-plugin-expo": "workspace:^1.0.0",
"eslint-plugin-import": "^2.30.0",
diff --git a/packages/eslint-config-universe/package.json b/packages/eslint-config-universe/package.json
index 5621e85d0a0b28..3c900c9a6d5b8d 100644
--- a/packages/eslint-config-universe/package.json
+++ b/packages/eslint-config-universe/package.json
@@ -39,8 +39,8 @@
},
"homepage": "https://github.com/expo/expo/tree/main/packages/eslint-config-universe",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "^8.29.1",
- "@typescript-eslint/parser": "^8.29.1",
+ "@typescript-eslint/eslint-plugin": "^8.59.0",
+ "@typescript-eslint/parser": "^8.59.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-n": "^17.17.0",
diff --git a/packages/eslint-plugin-expo/package.json b/packages/eslint-plugin-expo/package.json
index 76bbec14acbb38..912d23da90ac18 100644
--- a/packages/eslint-plugin-expo/package.json
+++ b/packages/eslint-plugin-expo/package.json
@@ -24,14 +24,14 @@
"build": "tsc"
},
"dependencies": {
- "@typescript-eslint/types": "^8.29.1",
- "@typescript-eslint/utils": "^8.29.1",
+ "@typescript-eslint/types": "^8.59.0",
+ "@typescript-eslint/utils": "^8.59.0",
"eslint": "^9.24.0"
},
"devDependencies": {
"@types/eslint": "^8.56.12",
"@types/jest": "^29.5.12",
- "@typescript-eslint/rule-tester": "^8.29.1",
+ "@typescript-eslint/rule-tester": "^8.59.0",
"eslint-config-universe": "workspace:*",
"eslint-plugin-eslint-plugin": "^6.2.0",
"jest": "^29.7.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ba37a4b60e848e..40073844d092f6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3190,11 +3190,11 @@ importers:
packages/eslint-config-expo:
dependencies:
'@typescript-eslint/eslint-plugin':
- specifier: ^8.18.2
- version: 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: ^8.18.2
- version: 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
eslint-import-resolver-typescript:
specifier: ^3.6.3
version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7))
@@ -3203,7 +3203,7 @@ importers:
version: link:../eslint-plugin-expo
eslint-plugin-import:
specifier: ^2.30.0
- version: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
+ version: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
eslint-plugin-react:
specifier: ^7.37.3
version: 7.37.5(eslint@9.39.4(jiti@1.21.7))
@@ -3236,17 +3236,17 @@ importers:
packages/eslint-config-universe:
dependencies:
'@typescript-eslint/eslint-plugin':
- specifier: ^8.29.1
- version: 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: ^8.29.1
- version: 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
eslint-config-prettier:
specifier: ^9.1.0
version: 9.1.2(eslint@9.39.4(jiti@1.21.7))
eslint-plugin-import:
specifier: ^2.31.0
- version: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
+ version: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
eslint-plugin-n:
specifier: ^17.17.0
version: 17.24.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
@@ -3288,11 +3288,11 @@ importers:
packages/eslint-plugin-expo:
dependencies:
'@typescript-eslint/types':
- specifier: ^8.29.1
- version: 8.57.1
+ specifier: ^8.59.0
+ version: 8.59.0
'@typescript-eslint/utils':
- specifier: ^8.29.1
- version: 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
eslint:
specifier: ^9.24.0
version: 9.39.4(jiti@1.21.7)
@@ -3304,8 +3304,8 @@ importers:
specifier: ^29.5.12
version: 29.5.14
'@typescript-eslint/rule-tester':
- specifier: ^8.29.1
- version: 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ specifier: ^8.59.0
+ version: 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
eslint-config-universe:
specifier: workspace:*
version: link:../eslint-config-universe
@@ -9372,69 +9372,69 @@ packages:
'@types/yargs@17.0.35':
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
- '@typescript-eslint/eslint-plugin@8.57.1':
- resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==}
+ '@typescript-eslint/eslint-plugin@8.59.0':
+ resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.57.1
+ '@typescript-eslint/parser': ^8.59.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.57.1':
- resolution: {integrity: sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==}
+ '@typescript-eslint/parser@8.59.0':
+ resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.57.1':
- resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==}
+ '@typescript-eslint/project-service@8.59.0':
+ resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/rule-tester@8.57.1':
- resolution: {integrity: sha512-gk0q0rLa7a1uEB0iD2t1GZELK1z6HfudiKYeSVhjQ5gW5FdL0OcZ+8f09Lg7NbmHSBF3V+S9BDuw0qoCFkHR+w==}
+ '@typescript-eslint/rule-tester@8.59.0':
+ resolution: {integrity: sha512-2Ej6W28DqObFuEUQ+puEpDZFWFXAW7jIZ4TsgfLUCTNz1FID0NMfp1sXc+fQq8m5ysfPdhXAPjti6jYEu1oRcg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- '@typescript-eslint/scope-manager@8.57.1':
- resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==}
+ '@typescript-eslint/scope-manager@8.59.0':
+ resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.57.1':
- resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==}
+ '@typescript-eslint/tsconfig-utils@8.59.0':
+ resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.57.1':
- resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==}
+ '@typescript-eslint/type-utils@8.59.0':
+ resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.57.1':
- resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==}
+ '@typescript-eslint/types@8.59.0':
+ resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.57.1':
- resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==}
+ '@typescript-eslint/typescript-estree@8.59.0':
+ resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.57.1':
- resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==}
+ '@typescript-eslint/utils@8.59.0':
+ resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.57.1':
- resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==}
+ '@typescript-eslint/visitor-keys@8.59.0':
+ resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.3.0':
@@ -15215,8 +15215,8 @@ packages:
resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
engines: {node: '>=8'}
- ts-api-utils@2.4.0:
- resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@@ -19753,48 +19753,48 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
+ '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.57.1
- '@typescript-eslint/type-utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.57.1
+ '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.0
eslint: 9.39.4(jiti@1.21.7)
ignore: 7.0.5
natural-compare: 1.4.0
- ts-api-utils: 2.4.0(typescript@6.0.3)
+ ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
+ '@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.57.1
- '@typescript-eslint/types': 8.57.1
- '@typescript-eslint/typescript-estree': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.57.1
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.0
debug: 4.4.3
eslint: 9.39.4(jiti@1.21.7)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.57.1(typescript@6.0.3)':
+ '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/types': 8.57.1
+ '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
debug: 4.4.3
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/rule-tester@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
+ '@typescript-eslint/rule-tester@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
- '@typescript-eslint/typescript-estree': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
ajv: 6.14.0
eslint: 9.39.4(jiti@1.21.7)
json-stable-stringify-without-jsonify: 1.0.1
@@ -19804,58 +19804,58 @@ snapshots:
- supports-color
- typescript
- '@typescript-eslint/scope-manager@8.57.1':
+ '@typescript-eslint/scope-manager@8.59.0':
dependencies:
- '@typescript-eslint/types': 8.57.1
- '@typescript-eslint/visitor-keys': 8.57.1
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/visitor-keys': 8.59.0
- '@typescript-eslint/tsconfig-utils@8.57.1(typescript@6.0.3)':
+ '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
- '@typescript-eslint/type-utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
+ '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.57.1
- '@typescript-eslint/typescript-estree': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
debug: 4.4.3
eslint: 9.39.4(jiti@1.21.7)
- ts-api-utils: 2.4.0(typescript@6.0.3)
+ ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.57.1': {}
+ '@typescript-eslint/types@8.59.0': {}
- '@typescript-eslint/typescript-estree@8.57.1(typescript@6.0.3)':
+ '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/project-service': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@6.0.3)
- '@typescript-eslint/types': 8.57.1
- '@typescript-eslint/visitor-keys': 8.57.1
+ '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/visitor-keys': 8.59.0
debug: 4.4.3
minimatch: 10.2.4
semver: 7.7.4
tinyglobby: 0.2.15
- ts-api-utils: 2.4.0(typescript@6.0.3)
+ ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
+ '@typescript-eslint/utils@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7))
- '@typescript-eslint/scope-manager': 8.57.1
- '@typescript-eslint/types': 8.57.1
- '@typescript-eslint/typescript-estree': 8.57.1(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
eslint: 9.39.4(jiti@1.21.7)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.57.1':
+ '@typescript-eslint/visitor-keys@8.59.0':
dependencies:
- '@typescript-eslint/types': 8.57.1
+ '@typescript-eslint/types': 8.59.0
eslint-visitor-keys: 5.0.1
'@ungap/structured-clone@1.3.0': {}
@@ -21573,15 +21573,15 @@ snapshots:
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)):
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
eslint: 9.39.4(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7))
@@ -21607,7 +21607,7 @@ snapshots:
eslint: 9.39.4(jiti@1.21.7)
estraverse: 5.3.0
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -21618,7 +21618,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.39.4(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -21630,7 +21630,7 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -26854,7 +26854,7 @@ snapshots:
trim-newlines@3.0.1: {}
- ts-api-utils@2.4.0(typescript@6.0.3):
+ ts-api-utils@2.5.0(typescript@6.0.3):
dependencies:
typescript: 6.0.3
From a33bc0287e8ad7ac30339c373a9d2eaefa1ba841 Mon Sep 17 00:00:00 2001
From: Vojtech Novak
Date: Mon, 4 May 2026 14:26:27 +0200
Subject: [PATCH 08/20] [config-plugins] bump google services gradle plugin
version (#45320)
---
packages/@expo/config-plugins/CHANGELOG.md | 2 ++
packages/@expo/config-plugins/build/android/GoogleServices.js | 2 +-
.../@expo/config-plugins/build/android/GoogleServices.js.map | 2 +-
packages/@expo/config-plugins/src/android/GoogleServices.ts | 2 +-
.../config-plugins/src/android/__tests__/GoogleServices-test.ts | 2 +-
5 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/packages/@expo/config-plugins/CHANGELOG.md b/packages/@expo/config-plugins/CHANGELOG.md
index 43751c158ffecc..e528df02c4a80a 100644
--- a/packages/@expo/config-plugins/CHANGELOG.md
+++ b/packages/@expo/config-plugins/CHANGELOG.md
@@ -16,6 +16,8 @@
### 💡 Others
+- [Android] Bump `com.google.gms:google-services` Gradle plugin version to `4.4.4`. (by [@vonovak](https://github.com/vonovak)) ([#45320](https://github.com/expo/expo/pull/45320) by [@vonovak](https://github.com/vonovak))
+
## 55.0.6 — 2026-02-25
### 💡 Others
diff --git a/packages/@expo/config-plugins/build/android/GoogleServices.js b/packages/@expo/config-plugins/build/android/GoogleServices.js
index 24bf8d2f8e3fe5..a702ab518783e2 100644
--- a/packages/@expo/config-plugins/build/android/GoogleServices.js
+++ b/packages/@expo/config-plugins/build/android/GoogleServices.js
@@ -49,7 +49,7 @@ const googleServicesClassPath = 'com.google.gms:google-services';
const googleServicesPlugin = 'com.google.gms.google-services';
// NOTE(brentvatne): This may be annoying to keep up to date...
-const googleServicesVersion = '4.4.1';
+const googleServicesVersion = '4.4.4';
const withClassPath = config => {
return (0, _androidPlugins().withProjectBuildGradle)(config, config => {
if (config.modResults.language === 'groovy') {
diff --git a/packages/@expo/config-plugins/build/android/GoogleServices.js.map b/packages/@expo/config-plugins/build/android/GoogleServices.js.map
index f7562ee246f5eb..ffcd6b995a2555 100644
--- a/packages/@expo/config-plugins/build/android/GoogleServices.js.map
+++ b/packages/@expo/config-plugins/build/android/GoogleServices.js.map
@@ -1 +1 @@
-{"version":3,"file":"GoogleServices.js","names":["_path","data","_interopRequireDefault","require","_androidPlugins","_withDangerousMod","_fs","_warnings","e","__esModule","default","DEFAULT_TARGET_PATH","googleServicesClassPath","googleServicesPlugin","googleServicesVersion","withClassPath","config","withProjectBuildGradle","modResults","language","contents","setClassPath","addWarningAndroid","exports","withApplyPlugin","withAppBuildGradle","applyPlugin","withGoogleServicesFile","withDangerousMod","setGoogleServicesFile","modRequest","projectRoot","getGoogleServicesFilePath","android","googleServicesFile","targetPath","partialSourcePath","completeSourcePath","path","resolve","destinationPath","copyFilePathToPathAsync","console","log","Error","buildGradle","includes","replace","appBuildGradle","pattern","RegExp","match"],"sources":["../../src/android/GoogleServices.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport path from 'path';\n\nimport type { ConfigPlugin } from '../Plugin.types';\nimport { withAppBuildGradle, withProjectBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { copyFilePathToPathAsync } from '../utils/fs';\nimport { addWarningAndroid } from '../utils/warnings';\n\nconst DEFAULT_TARGET_PATH = './android/app/google-services.json';\n\nconst googleServicesClassPath = 'com.google.gms:google-services';\nconst googleServicesPlugin = 'com.google.gms.google-services';\n\n// NOTE(brentvatne): This may be annoying to keep up to date...\nconst googleServicesVersion = '4.4.1';\n\nexport const withClassPath: ConfigPlugin = (config) => {\n return withProjectBuildGradle(config, (config) => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setClassPath(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.googleServicesFile',\n `Cannot automatically configure project build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withApplyPlugin: ConfigPlugin = (config) => {\n return withAppBuildGradle(config, (config) => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = applyPlugin(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.googleServicesFile',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\n/**\n * Add `google-services.json` to project\n */\nexport const withGoogleServicesFile: ConfigPlugin = (config) => {\n return withDangerousMod(config, [\n 'android',\n async (config) => {\n await setGoogleServicesFile(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getGoogleServicesFilePath(config: Pick) {\n return config.android?.googleServicesFile ?? null;\n}\n\nexport async function setGoogleServicesFile(\n config: Pick,\n projectRoot: string,\n targetPath: string = DEFAULT_TARGET_PATH\n) {\n const partialSourcePath = getGoogleServicesFilePath(config);\n if (!partialSourcePath) {\n return false;\n }\n\n const completeSourcePath = path.resolve(projectRoot, partialSourcePath);\n const destinationPath = path.resolve(projectRoot, targetPath);\n\n try {\n await copyFilePathToPathAsync(completeSourcePath, destinationPath);\n } catch (e) {\n console.log(e);\n throw new Error(\n `Cannot copy google-services.json from ${completeSourcePath} to ${destinationPath}. Ensure the source and destination paths exist.`\n );\n }\n return true;\n}\n\n/**\n * Adding the Google Services plugin\n * NOTE(brentvatne): string replacement is a fragile approach! we need a\n * better solution than this.\n */\nexport function setClassPath(config: Pick, buildGradle: string) {\n const googleServicesFile = getGoogleServicesFilePath(config);\n if (!googleServicesFile) {\n return buildGradle;\n }\n\n if (buildGradle.includes(googleServicesClassPath)) {\n return buildGradle;\n }\n\n //\n return buildGradle.replace(\n /dependencies\\s?{/,\n `dependencies {\n classpath '${googleServicesClassPath}:${googleServicesVersion}'`\n );\n}\n\nexport function applyPlugin(config: Pick, appBuildGradle: string) {\n const googleServicesFile = getGoogleServicesFilePath(config);\n if (!googleServicesFile) {\n return appBuildGradle;\n }\n\n // Make sure the project does not have the plugin already\n const pattern = new RegExp(`apply\\\\s+plugin:\\\\s+['\"]${googleServicesPlugin}['\"]`);\n if (appBuildGradle.match(pattern)) {\n return appBuildGradle;\n }\n\n // Add it to the end of the file\n return appBuildGradle + `\\napply plugin: '${googleServicesPlugin}'`;\n}\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"GoogleServices.js","names":["_path","data","_interopRequireDefault","require","_androidPlugins","_withDangerousMod","_fs","_warnings","e","__esModule","default","DEFAULT_TARGET_PATH","googleServicesClassPath","googleServicesPlugin","googleServicesVersion","withClassPath","config","withProjectBuildGradle","modResults","language","contents","setClassPath","addWarningAndroid","exports","withApplyPlugin","withAppBuildGradle","applyPlugin","withGoogleServicesFile","withDangerousMod","setGoogleServicesFile","modRequest","projectRoot","getGoogleServicesFilePath","android","googleServicesFile","targetPath","partialSourcePath","completeSourcePath","path","resolve","destinationPath","copyFilePathToPathAsync","console","log","Error","buildGradle","includes","replace","appBuildGradle","pattern","RegExp","match"],"sources":["../../src/android/GoogleServices.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config-types';\nimport path from 'path';\n\nimport type { ConfigPlugin } from '../Plugin.types';\nimport { withAppBuildGradle, withProjectBuildGradle } from '../plugins/android-plugins';\nimport { withDangerousMod } from '../plugins/withDangerousMod';\nimport { copyFilePathToPathAsync } from '../utils/fs';\nimport { addWarningAndroid } from '../utils/warnings';\n\nconst DEFAULT_TARGET_PATH = './android/app/google-services.json';\n\nconst googleServicesClassPath = 'com.google.gms:google-services';\nconst googleServicesPlugin = 'com.google.gms.google-services';\n\n// NOTE(brentvatne): This may be annoying to keep up to date...\nconst googleServicesVersion = '4.4.4';\n\nexport const withClassPath: ConfigPlugin = (config) => {\n return withProjectBuildGradle(config, (config) => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = setClassPath(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.googleServicesFile',\n `Cannot automatically configure project build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\nexport const withApplyPlugin: ConfigPlugin = (config) => {\n return withAppBuildGradle(config, (config) => {\n if (config.modResults.language === 'groovy') {\n config.modResults.contents = applyPlugin(config, config.modResults.contents);\n } else {\n addWarningAndroid(\n 'android.googleServicesFile',\n `Cannot automatically configure app build.gradle if it's not groovy`\n );\n }\n return config;\n });\n};\n\n/**\n * Add `google-services.json` to project\n */\nexport const withGoogleServicesFile: ConfigPlugin = (config) => {\n return withDangerousMod(config, [\n 'android',\n async (config) => {\n await setGoogleServicesFile(config, config.modRequest.projectRoot);\n return config;\n },\n ]);\n};\n\nexport function getGoogleServicesFilePath(config: Pick) {\n return config.android?.googleServicesFile ?? null;\n}\n\nexport async function setGoogleServicesFile(\n config: Pick,\n projectRoot: string,\n targetPath: string = DEFAULT_TARGET_PATH\n) {\n const partialSourcePath = getGoogleServicesFilePath(config);\n if (!partialSourcePath) {\n return false;\n }\n\n const completeSourcePath = path.resolve(projectRoot, partialSourcePath);\n const destinationPath = path.resolve(projectRoot, targetPath);\n\n try {\n await copyFilePathToPathAsync(completeSourcePath, destinationPath);\n } catch (e) {\n console.log(e);\n throw new Error(\n `Cannot copy google-services.json from ${completeSourcePath} to ${destinationPath}. Ensure the source and destination paths exist.`\n );\n }\n return true;\n}\n\n/**\n * Adding the Google Services plugin\n * NOTE(brentvatne): string replacement is a fragile approach! we need a\n * better solution than this.\n */\nexport function setClassPath(config: Pick, buildGradle: string) {\n const googleServicesFile = getGoogleServicesFilePath(config);\n if (!googleServicesFile) {\n return buildGradle;\n }\n\n if (buildGradle.includes(googleServicesClassPath)) {\n return buildGradle;\n }\n\n //\n return buildGradle.replace(\n /dependencies\\s?{/,\n `dependencies {\n classpath '${googleServicesClassPath}:${googleServicesVersion}'`\n );\n}\n\nexport function applyPlugin(config: Pick, appBuildGradle: string) {\n const googleServicesFile = getGoogleServicesFilePath(config);\n if (!googleServicesFile) {\n return appBuildGradle;\n }\n\n // Make sure the project does not have the plugin already\n const pattern = new RegExp(`apply\\\\s+plugin:\\\\s+['\"]${googleServicesPlugin}['\"]`);\n if (appBuildGradle.match(pattern)) {\n return appBuildGradle;\n }\n\n // Add it to the end of the file\n return appBuildGradle + `\\napply plugin: '${googleServicesPlugin}'`;\n}\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/packages/@expo/config-plugins/src/android/GoogleServices.ts b/packages/@expo/config-plugins/src/android/GoogleServices.ts
index 3761e4d6be03b8..9eaa564126886b 100644
--- a/packages/@expo/config-plugins/src/android/GoogleServices.ts
+++ b/packages/@expo/config-plugins/src/android/GoogleServices.ts
@@ -13,7 +13,7 @@ const googleServicesClassPath = 'com.google.gms:google-services';
const googleServicesPlugin = 'com.google.gms.google-services';
// NOTE(brentvatne): This may be annoying to keep up to date...
-const googleServicesVersion = '4.4.1';
+const googleServicesVersion = '4.4.4';
export const withClassPath: ConfigPlugin = (config) => {
return withProjectBuildGradle(config, (config) => {
diff --git a/packages/@expo/config-plugins/src/android/__tests__/GoogleServices-test.ts b/packages/@expo/config-plugins/src/android/__tests__/GoogleServices-test.ts
index c26d77f5ef07c6..e0c2bf16ccbfcc 100644
--- a/packages/@expo/config-plugins/src/android/__tests__/GoogleServices-test.ts
+++ b/packages/@expo/config-plugins/src/android/__tests__/GoogleServices-test.ts
@@ -112,7 +112,7 @@ buildscript {
google()
}
dependencies {
- classpath 'com.google.gms:google-services:4.4.1'
+ classpath 'com.google.gms:google-services:4.4.4'
classpath 'com.android.tools.build:gradle:3.5.3'
}
From 2f5c06e9d813289ffba9aedf13f9707e465d037c Mon Sep 17 00:00:00 2001
From: Hassan Khan
Date: Mon, 4 May 2026 14:09:06 +0100
Subject: [PATCH 09/20] refactor(expo-router,@expo/router-server): replace
`TransformStream` with `ServerDocument` for injecting metadata and assets
(#44827)
# Why
The streaming SSR pipeline currently uses a
[`TransformStream`](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream)
to post-process the HTML byte stream and inject metadata and assets.
This was a temporary approach while we landed changes to other parts of
the pipeline so we could support [React 19's hoisting
mechanisms](https://react.dev/blog/2024/12/05/react-19#support-for-metadata-tags)
instead.
# How
- Added a new `ServerDocument` context, which is populated with any
relevant metadata/assets and consumed by `+html.tsx` via a
`useServerDocumentContext()` hook
- `getStreamingContent()` has been split out into its own file, and
re-exported (temporarily) from `renderStaticContent.tsx`
- Renamed HTML helper functions for assets
- Added `serializeMetadataToReact()` that returns `ReactNode[]`
- Updated the `+html.tsx` template to use the new
`useServerDocumentContext()` hook
# Test Plan
- CI
- Run the E2E fixture with `pnpm --filter @expo/router-e2e run
export:server-rendering && pnpm --filter @expo/router-e2e exec expo
serve`
# 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)
- [x] 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)
---
.../__e2e__/server-loader/app/meta.tsx | 19 ++-
.../__e2e__/static-rendering/app/+html.tsx | 12 +-
packages/@expo/cli/CHANGELOG.md | 1 +
.../server-rendering.test.ts.snap | 24 +--
.../__tests__/export/server-loader.test.ts | 3 +-
.../__tests__/export/server-rendering.test.ts | 24 +--
.../src/start/server/metro/serializeHtml.ts | 12 +-
packages/@expo/cli/static/template/+html.tsx | 19 ++-
packages/@expo/router-server/CHANGELOG.md | 1 +
.../router-server/build/server/metadata.d.ts | 2 +
.../build/server/metadata.d.ts.map | 2 +-
.../router-server/build/server/metadata.js | 1 +
.../build/server/metadata.js.map | 2 +-
.../build/server/renderStreamingContent.d.ts | 30 ++++
.../server/renderStreamingContent.d.ts.map | 1 +
.../build/server/renderStreamingContent.js | 129 +++++++++++++++
.../server/renderStreamingContent.js.map | 1 +
.../router-server/build/static/html.d.ts.map | 2 +-
.../@expo/router-server/build/static/html.js | 3 +-
.../router-server/build/static/html.js.map | 2 +-
.../build/static/renderStaticContent.d.ts | 20 +--
.../build/static/renderStaticContent.d.ts.map | 2 +-
.../build/static/renderStaticContent.js | 61 ++------
.../build/static/renderStaticContent.js.map | 2 +-
.../@expo/router-server/build/utils/html.d.ts | 22 ++-
.../router-server/build/utils/html.d.ts.map | 2 +-
.../@expo/router-server/build/utils/html.js | 42 +++--
.../router-server/build/utils/html.js.map | 2 +-
.../build/utils/metadata/serialize.d.ts | 2 +
.../build/utils/metadata/serialize.d.ts.map | 2 +-
.../build/utils/metadata/serialize.js | 11 ++
.../build/utils/metadata/serialize.js.map | 2 +-
.../build/utils/metadata/tag.d.ts | 2 +-
.../build/utils/metadata/tag.d.ts.map | 2 +-
.../router-server/build/utils/metadata/tag.js | 7 +-
.../build/utils/metadata/tag.js.map | 2 +-
.../build/utils/metadata/types.d.ts | 18 ++-
.../build/utils/metadata/types.d.ts.map | 2 +-
.../build/utils/metadata/types.js | 12 ++
.../build/utils/metadata/types.js.map | 2 +-
.../router-server/build/utils/react.d.ts | 15 ++
.../router-server/build/utils/react.d.ts.map | 1 +
.../@expo/router-server/build/utils/react.js | 45 ++++++
.../router-server/build/utils/react.js.map | 1 +
.../{metadata.test.ts => metadata.test.tsx} | 1 +
.../router-server/src/server/metadata.ts | 5 +-
.../src/server/renderStreamingContent.tsx | 147 ++++++++++++++++++
.../@expo/router-server/src/static/html.tsx | 12 +-
.../src/static/renderStaticContent.tsx | 78 +---------
.../src/utils/__tests__/html.test.ts | 34 ++--
.../@expo/router-server/src/utils/html.ts | 34 +++-
.../metadata/{serialize.ts => serialize.tsx} | 12 ++
.../router-server/src/utils/metadata/tag.ts | 10 +-
.../router-server/src/utils/metadata/types.ts | 30 +++-
.../@expo/router-server/src/utils/react.tsx | 76 +++++++++
packages/expo-router/CHANGELOG.md | 1 +
.../expo-router/build/internal/server.d.ts | 2 +
.../build/internal/server.d.ts.map | 1 +
packages/expo-router/build/internal/server.js | 18 +++
.../expo-router/build/internal/server.js.map | 1 +
.../build/server/ServerDocument.d.ts | 36 +++++
.../build/server/ServerDocument.d.ts.map | 1 +
.../build/server/ServerDocument.js | 36 +++++
.../build/server/ServerDocument.js.map | 1 +
packages/expo-router/html.d.ts | 1 +
packages/expo-router/html.js | 3 +-
packages/expo-router/internal/server.d.ts | 1 +
packages/expo-router/internal/server.js | 1 +
packages/expo-router/src/internal/server.ts | 1 +
.../expo-router/src/server/ServerDocument.tsx | 53 +++++++
packages/expo-server/CHANGELOG.md | 2 +
packages/expo-server/build/cjs/manifest.d.ts | 14 +-
packages/expo-server/build/cjs/rendering.d.ts | 11 +-
packages/expo-server/build/mjs/manifest.d.ts | 14 +-
packages/expo-server/build/mjs/rendering.d.ts | 11 +-
packages/expo-server/package.json | 1 +
packages/expo-server/src/manifest.ts | 15 +-
packages/expo-server/src/rendering.ts | 12 +-
pnpm-lock.yaml | 3 +
79 files changed, 968 insertions(+), 280 deletions(-)
create mode 100644 packages/@expo/router-server/build/server/renderStreamingContent.d.ts
create mode 100644 packages/@expo/router-server/build/server/renderStreamingContent.d.ts.map
create mode 100644 packages/@expo/router-server/build/server/renderStreamingContent.js
create mode 100644 packages/@expo/router-server/build/server/renderStreamingContent.js.map
create mode 100644 packages/@expo/router-server/build/utils/react.d.ts
create mode 100644 packages/@expo/router-server/build/utils/react.d.ts.map
create mode 100644 packages/@expo/router-server/build/utils/react.js
create mode 100644 packages/@expo/router-server/build/utils/react.js.map
rename packages/@expo/router-server/src/server/__tests__/{metadata.test.ts => metadata.test.tsx} (97%)
create mode 100644 packages/@expo/router-server/src/server/renderStreamingContent.tsx
rename packages/@expo/router-server/src/utils/metadata/{serialize.ts => serialize.tsx} (50%)
create mode 100644 packages/@expo/router-server/src/utils/react.tsx
create mode 100644 packages/expo-router/build/internal/server.d.ts
create mode 100644 packages/expo-router/build/internal/server.d.ts.map
create mode 100644 packages/expo-router/build/internal/server.js
create mode 100644 packages/expo-router/build/internal/server.js.map
create mode 100644 packages/expo-router/build/server/ServerDocument.d.ts
create mode 100644 packages/expo-router/build/server/ServerDocument.d.ts.map
create mode 100644 packages/expo-router/build/server/ServerDocument.js
create mode 100644 packages/expo-router/build/server/ServerDocument.js.map
create mode 100644 packages/expo-router/internal/server.d.ts
create mode 100644 packages/expo-router/internal/server.js
create mode 100644 packages/expo-router/src/internal/server.ts
create mode 100644 packages/expo-router/src/server/ServerDocument.tsx
diff --git a/apps/router-e2e/__e2e__/server-loader/app/meta.tsx b/apps/router-e2e/__e2e__/server-loader/app/meta.tsx
index b04a096ec44c62..16dda88bb9f09f 100644
--- a/apps/router-e2e/__e2e__/server-loader/app/meta.tsx
+++ b/apps/router-e2e/__e2e__/server-loader/app/meta.tsx
@@ -1,18 +1,30 @@
import { useLoaderData, useLocalSearchParams, usePathname } from 'expo-router';
import Head from 'expo-router/head';
+import type { Metadata } from 'expo-router/server';
import { Suspense } from 'react';
-import { Container } from '../components/Container';
import { Loading } from '../components/Loading';
import { Table, TableRow } from '../components/Table';
import { SiteLinks, SiteLink } from '../components/SiteLink';
+// Tests metadata when using streaming SSR
+export function generateMetadata() {
+ return {
+ title: 'Meta page',
+ description: 'Meta tag testing',
+ keywords: 'expo-router,loaders,meta',
+ authors: {
+ name: 'Expo',
+ },
+ } satisfies Metadata;
+}
+
export async function loader() {
return {
title: 'Meta page',
description: 'Meta tag testing',
keywords: 'expo-router,loaders,meta',
- author: 'Expo'
+ author: 'Expo',
};
}
@@ -31,6 +43,7 @@ const MetaScreen = () => {
return (
<>
+ {/* Tests metadata when using SSG */}
{data.title}
@@ -50,4 +63,4 @@ const MetaScreen = () => {
>
);
-}
+};
diff --git a/apps/router-e2e/__e2e__/static-rendering/app/+html.tsx b/apps/router-e2e/__e2e__/static-rendering/app/+html.tsx
index 30cc9f768d864b..6a5513d6b36904 100644
--- a/apps/router-e2e/__e2e__/static-rendering/app/+html.tsx
+++ b/apps/router-e2e/__e2e__/static-rendering/app/+html.tsx
@@ -1,14 +1,15 @@
// Test the custom HTML component is rendered during SSR.
import { usePathname } from 'expo-router';
-import { ScrollViewStyleReset } from 'expo-router/html';
+import { ScrollViewStyleReset, useServerDocumentContext } from 'expo-router/html';
export default function Html({ children }) {
+ const { bodyAttributes, bodyNodes, htmlAttributes, headNodes } = useServerDocumentContext();
// Test that this is defined and works during SSR.
const pathname = usePathname();
return (
-
+
@@ -21,8 +22,13 @@ export default function Html({ children }) {
{/* Test that server-only env vars are exposed as this file is a server file. */}
+
+ {headNodes}
- {children}
+
+ {children}
+ {bodyNodes}
+
);
}
diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md
index 0c50068cd59ce6..169550025be906 100644
--- a/packages/@expo/cli/CHANGELOG.md
+++ b/packages/@expo/cli/CHANGELOG.md
@@ -59,6 +59,7 @@
- Update to `dnssd-advertise@^1.1.4` ([#44589](https://github.com/expo/expo/pull/44589) by [@kitten](https://github.com/kitten))
- Update to `multitars@^1.0.0` ([#44774](https://github.com/expo/expo/pull/44774) by [@kitten](https://github.com/kitten))
- [Internal] Improve performance of internal debug logging ([#44706](https://github.com/expo/expo/pull/44706) by [@kitten](https://github.com/kitten))
+- Replace `TransformStream`-based HTML injection with `ServerDocumentContext` for SSR metadata and assets ([#44827](https://github.com/expo/expo/pull/44827) by [@hassankhan](https://github.com/hassankhan))
## 55.0.12 — 2026-02-25
diff --git a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
index 441214f607ac52..484ccfc7be78bd 100644
--- a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
+++ b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
@@ -16,16 +16,11 @@ exports[`exports server expo serve requests injects \`generateMetadata()\` resul
"",
"",
"",
- "",
- "",
- "",
- "",
- "",
]
`;
exports[`exports server expo serve requests supports usePathname in +html files 1`] = `
-"
-
-
-"
+@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}"
`;
exports[`exports server workerd requests injects \`generateMetadata()\` result into the initial server HTML 1`] = `
@@ -362,16 +354,11 @@ exports[`exports server workerd requests injects \`generateMetadata()\` result i
"",
"",
"",
- "",
- "",
- "",
- "",
- "",
]
`;
exports[`exports server workerd requests supports usePathname in +html files 1`] = `
-"
-
-
-"
+@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}