Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
1a1d138
[go][Android] Add `ContactsNextModule` (#42272)
lukmccall Jan 19, 2026
553d220
[tools] Bump tar from 7.4.3 to 7.5.3 (#42252)
dependabot[bot] Jan 19, 2026
eeabc06
fix(@expo/cli): correctly show output mode in CLI log when exporting …
hassankhan Jan 19, 2026
7f2bbeb
chore(router-e2e): tidy up environment variables in package scripts (…
hassankhan Jan 19, 2026
d499fc5
[expo-router][ios] fix shadow color in native tabs (#42125)
Ubax Jan 19, 2026
290a431
feat(cli,metro-config): Add env variable to allow external tools to u…
kitten Jan 19, 2026
7f79165
[android][media-library][next] Fix `Failed To Build Unique File` exce…
Wenszel Jan 19, 2026
3291a69
[docs][contacts][next] Add ExpoGo tag (#42275)
Wenszel Jan 19, 2026
071317c
[docs] add codex support to mcp guide (#42256)
benschac Jan 19, 2026
ab72261
[expo-router] unify <Toolbar> and <Stack.Header> into <Stack.Toolbar>…
Ubax Jan 19, 2026
7d82030
[core][iOS] Add `installOnUIRuntime` function (#42108)
lukmccall Jan 19, 2026
70f7c28
[max-sdk-override-plugin][Android] Fix plugin not working with custom…
peterlazar1993 Jan 19, 2026
63839a9
patch(schema-utils): Add generic to `JSONSchema` to shadow type a sch…
kitten Jan 19, 2026
4bf3ebd
refactor(cli,create-expo): Move auto-adding of missing android/ios sc…
kitten Jan 19, 2026
232ac21
refactor(dev-launcher/plugin): Switch from `ajv` to `@expo/schema-uti…
kitten Jan 19, 2026
b695c3b
[updates] - Fix `downloadProgress` for update fetch on app startup (#…
intergalacticspacehighway Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/bare-expo/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNWorklets
- Yoga
- ExpoModulesCore/Tests (3.0.16):
- ExpoModulesJSI
Expand All @@ -501,6 +502,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNWorklets
- Yoga
- ExpoModulesJSI (3.0.16):
- hermes-engine
Expand Down Expand Up @@ -3796,7 +3798,7 @@ SPEC CHECKSUMS:
ExpoMaps: ac5024fd6b3db82da997bdc4074bda5c3e2e7764
ExpoMediaLibrary: 648cee3f5dcba13410ec9cc8ac9a426e89a61a31
ExpoMeshGradient: 763087d3b1e6e9a0974e9700ea24cb598816d93c
ExpoModulesCore: 22f2efcefda2486b06a0b9f0dcaab8eccdfaf0b4
ExpoModulesCore: 75234558d61ae2c7b81d21526a9a37a0ec957c0f
ExpoModulesJSI: c470ea2ed825fce73bdc4ef060c8a22e3f664092
ExpoModulesTestCore: e65555b75a4ed7dd3bcf421ad01d7748bd372c88
ExpoNetwork: 97073786edfe405aba5d0987a544617ed0671ad1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import expo.modules.clipboard.ClipboardModule
import expo.modules.constants.ConstantsModule
import expo.modules.constants.ConstantsService
import expo.modules.contacts.ContactsModule
import expo.modules.contacts.next.ContactsNextModule
import expo.modules.core.interfaces.Package
import expo.modules.crypto.CryptoModule
import expo.modules.crypto.aes.AesCryptoModule
Expand Down Expand Up @@ -146,6 +147,7 @@ object ExperiencePackagePicker : ModulesProvider {
CryptoModule::class.java to null,
ConstantsModule::class.java to null,
ContactsModule::class.java to null,
ContactsNextModule::class.java to null,
DeviceModule::class.java to null,
DocumentPickerModule::class.java to null,
EASClientModule::class.java to null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { CryptoScreens } from '../screens/Crypto/CryptoScreen';
import ExpoApis from '../screens/ExpoApisScreen';
import { MediaLibraryScreens } from '../screens/MediaLibrary@Next/MediaLibraryScreens';
import { ModulesCoreScreens } from '../screens/ModulesCore/ModulesCoreScreen';
import { WorkletsScreens } from '../screens/Worklets/WorkletsScreen';
import { type ScreenConfig } from '../types/ScreenConfig';

const Stack = createNativeStackNavigator();
Expand Down Expand Up @@ -446,6 +447,13 @@ export const ScreensList: ScreenConfig[] = [
},
name: 'Updates Reload Screen',
},
{
getComponent() {
return optionalRequire(() => require('../screens/Worklets/WorkletsScreen'));
},
name: 'Worklets integration',
route: 'worklets',
},
{
getComponent() {
return optionalRequire(() => require('../screens/WebBrowser/WebBrowserScreen'));
Expand Down Expand Up @@ -476,6 +484,7 @@ export const Screens: ScreenConfig[] = [
...CalendarsScreens,
...CalendarsNextScreens,
...CryptoScreens,
...WorkletsScreens,
];

export const screenApiItems = apiScreensToListElements(ScreensList);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import { installOnUIRuntime } from 'expo';
import React, { useEffect, useState } from 'react';
import { View, StyleSheet, Text } from 'react-native';
import { runOnJS, runOnUI } from 'react-native-worklets';
import 'react-native-reanimated';

installOnUIRuntime();

export default function WorkletsInitScreen() {
const [isExpoObjectAvailable, setIsExpoObjectAvailable] = useState(false);
const [isEventEmitterAvailable, setIsEventEmitterAvailable] = useState(false);
const [isNativeModuleAvailable, setIsNativeModuleAvailable] = useState(false);

useEffect(() => {
runOnUI(() => {
runOnJS(setIsExpoObjectAvailable)(!!globalThis.expo);
runOnJS(setIsEventEmitterAvailable)(!!globalThis.expo?.EventEmitter);
runOnJS(setIsNativeModuleAvailable)(!!globalThis.expo?.NativeModule);
})();
}, []);

return (
<View style={styles.container}>
<View style={styles.section}>
<Text style={styles.title}>Worklets UI Runtime Status</Text>
</View>

<StatusRow label="Expo object" available={isExpoObjectAvailable} />
<StatusRow label="EventEmitter" available={isEventEmitterAvailable} />
<StatusRow label="NativeModule" available={isNativeModuleAvailable} />
</View>
);
}

function StatusRow({ label, available }: { label: string; available: boolean }) {
return (
<View style={styles.row}>
<Text style={styles.label}>{label}:</Text>
<View style={[styles.status, available ? styles.statusAvailable : styles.statusUnavailable]}>
<Text style={styles.statusText}>{available ? '✓ Available' : '✗ Unavailable'}</Text>
</View>
</View>
);
}

const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16,
backgroundColor: '#f5f5f5',
},
section: {
marginBottom: 20,
},
title: {
fontSize: 20,
fontWeight: '600',
color: '#333',
},
row: {
flexDirection: 'row',
alignItems: 'center',
paddingVertical: 12,
paddingHorizontal: 16,
backgroundColor: '#fff',
borderRadius: 8,
marginBottom: 8,
shadowColor: '#000',
shadowOffset: { width: 0, height: 1 },
shadowOpacity: 0.1,
shadowRadius: 2,
elevation: 2,
},
label: {
fontSize: 16,
fontWeight: '500',
color: '#333',
flex: 1,
},
status: {
paddingHorizontal: 12,
paddingVertical: 6,
borderRadius: 6,
},
statusAvailable: {
backgroundColor: '#d4edda',
},
statusUnavailable: {
backgroundColor: '#f8d7da',
},
statusText: {
fontSize: 14,
fontWeight: '500',
},
});
17 changes: 17 additions & 0 deletions apps/native-component-list/src/screens/Worklets/WorkletsScreen.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { optionalRequire } from '../../navigation/routeBuilder';
import ComponentListScreen, { apiScreensToListElements } from '../ComponentListScreen';

export const WorkletsScreens = [
{
name: 'Worklets Initialization',
route: 'worklets/init',
getComponent() {
return optionalRequire(() => require('./WorkletsInitScreen'));
},
},
];

export default function WorkletsScreen() {
const apis = apiScreensToListElements(WorkletsScreens);
return <ComponentListScreen apis={apis} sort={false} />;
}
Loading
Loading