expo-modules-autolinking 56.0.12 → 56.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,13 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 56.0.13 — 2026-05-26
14
+
15
+ ### 🐛 Bug fixes
16
+
17
+ - [iOS] Align precompile feature flags for `react-native-worklets@0.8.3` and `react-native-reanimated@4.3.1` with upstream defaults. ([#46221](https://github.com/expo/expo/pull/46221) by [@chrfalch](https://github.com/chrfalch))
18
+ - [iOS] Raise every autolinked Expo module's deployment target to at least `ExpoModulesCore`'s during `pod install`, so adapters whose podspecs declare a lower platform value no longer fail. ([#46175](https://github.com/expo/expo/pull/46175) by [@vonovak](https://github.com/vonovak))
19
+
13
20
  ## 56.0.12 — 2026-05-23
14
21
 
15
22
  _This version does not introduce any user-facing changes._
@@ -50,13 +50,13 @@
50
50
  "c": [
51
51
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
52
52
  "-DREANIMATED_VERSION=${PACKAGE_VERSION}",
53
- "-DREANIMATED_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:false][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:false][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:false]\""
53
+ "-DREANIMATED_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:true][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:true][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:true]\""
54
54
  ],
55
55
  "cxx": [
56
56
  "-fno-cxx-modules",
57
57
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
58
58
  "-DREANIMATED_VERSION=${PACKAGE_VERSION}",
59
- "-DREANIMATED_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:false][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:false][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:false]\""
59
+ "-DREANIMATED_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:true][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:true][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:true]\""
60
60
  ]
61
61
  },
62
62
  "debug": [ "-DHERMES_ENABLE_DEBUGGER=1" ]
@@ -123,7 +123,7 @@
123
123
  "-include", "QuartzCore/QuartzCore.h",
124
124
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
125
125
  "-DREANIMATED_VERSION=${PACKAGE_VERSION}",
126
- "-DREANIMATED_FEATURE_FLAGS=\\\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:false][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:false][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:false]\\\""
126
+ "-DREANIMATED_FEATURE_FLAGS=\\\"[RUNTIME_TEST_FLAG:false][DISABLE_COMMIT_PAUSING_MECHANISM:false][ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS:false][EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTS:false][USE_SYNCHRONIZABLE_FOR_MUTABLES:true][USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS:true][ENABLE_SHARED_ELEMENT_TRANSITIONS:false][FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS:true]\\\""
127
127
  ],
128
128
  "fileMapping": [
129
129
  { "from": "*.h", "to": "reanimated/apple/{filename}", "type": "header" },
@@ -47,7 +47,7 @@
47
47
  "compilerFlags": {
48
48
  "common": {
49
49
  "c": [
50
- "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
50
+ "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][FETCH_PREVIEW_ENABLED:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
51
51
  "-DWORKLETS_VERSION=${PACKAGE_VERSION}",
52
52
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
53
53
  "-DHERMES_V1_ENABLED",
@@ -55,7 +55,7 @@
55
55
  ],
56
56
  "cxx": [
57
57
  "-fno-cxx-modules",
58
- "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
58
+ "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][FETCH_PREVIEW_ENABLED:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
59
59
  "-DWORKLETS_VERSION=${PACKAGE_VERSION}",
60
60
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
61
61
  "-DHERMES_V1_ENABLED",
@@ -100,7 +100,7 @@
100
100
  "common": [
101
101
  "-include", "Foundation/Foundation.h",
102
102
  "-include", "UIKit/UIKit.h",
103
- "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
103
+ "-DWORKLETS_FEATURE_FLAGS=\"[RUNTIME_TEST_FLAG:false][FETCH_PREVIEW_ENABLED:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true]\"",
104
104
  "-DWORKLETS_VERSION=${PACKAGE_VERSION}",
105
105
  "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
106
106
  "-DHERMES_V1_ENABLED",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-modules-autolinking",
3
- "version": "56.0.12",
3
+ "version": "56.0.13",
4
4
  "description": "Scripts that autolink Expo modules.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -49,7 +49,7 @@
49
49
  "chalk": "^4.1.0",
50
50
  "commander": "^7.2.0"
51
51
  },
52
- "gitHead": "6dfb0e4c958a1ea1d66d3f7952494ac58430ad45",
52
+ "gitHead": "f67a101bcbe56114e982184834b93da7bbed00af",
53
53
  "scripts": {
54
54
  "build": "expo-module build",
55
55
  "clean": "expo-module clean",
@@ -108,6 +108,7 @@ module Expo
108
108
 
109
109
  # Install the pod.
110
110
  @podfile.pod(pod.pod_name, pod_options)
111
+ @podfile.expo_autolinked_pod_names << pod.pod_name
111
112
 
112
113
  # TODO: Can remove this once we move all the interfaces into the core.
113
114
  next if pod.pod_name.end_with?('Interface')
@@ -19,6 +19,14 @@ module Pod
19
19
  def expo_add_modules_to_patch(modules)
20
20
  framework_modules_to_patch.concat(modules)
21
21
  end
22
+
23
+ # Pod names of Expo modules registered by `use_expo_modules!`.
24
+ # Used at post-install time to reconcile their deployment targets
25
+ # with ExpoModulesCore's, so an adapter declaring a lower platform
26
+ # value in its podspec doesn't fail the Swift module-import check.
27
+ def expo_autolinked_pod_names
28
+ @expo_autolinked_pod_names ||= []
29
+ end
22
30
  end
23
31
 
24
32
  class Installer
@@ -50,6 +58,14 @@ module Pod
50
58
 
51
59
  # Run all precompiled module post-install configuration
52
60
  Expo::PrecompiledModules.perform_post_install(self)
61
+
62
+ # Raise every autolinked Expo module's deployment target to at least
63
+ # ExpoModulesCore's. CocoaPods + react_native_post_install only raise
64
+ # pods to RN's iOS floor, which can leave Expo adapters declaring a
65
+ # lower platform value below ExpoModulesCore's requirement, leading to
66
+ # "Compiling for iOS 15.1, but module 'ExpoModulesCore' has a minimum deployment target of iOS 16.4"
67
+ # type of message
68
+ reconcile_expo_module_deployment_targets()
53
69
  end
54
70
 
55
71
  define_method(:run_podfile_pre_install_hooks) do
@@ -84,6 +100,67 @@ module Pod
84
100
 
85
101
  private
86
102
 
103
+ # See call site in perform_post_install_actions for rationale.
104
+ # This runs AFTER the user's `post_install` hook, so it will overwrite any
105
+ # deployment target a consumer set there for an Expo module. That is
106
+ # intentional — the bumped pod list is logged so the override is visible.
107
+ def reconcile_expo_module_deployment_targets
108
+ # Mapping from Pod::Platform symbol to the Xcode build setting key
109
+ # that stores its deployment target and a human-readable label.
110
+ deployment_targets = {
111
+ ios: { key: 'IPHONEOS_DEPLOYMENT_TARGET', label: 'iOS' },
112
+ osx: { key: 'MACOSX_DEPLOYMENT_TARGET', label: 'macOS' },
113
+ tvos: { key: 'TVOS_DEPLOYMENT_TARGET', label: 'tvOS' },
114
+ }
115
+
116
+ expo_pod_names = @podfile.expo_autolinked_pod_names.to_set
117
+ return if expo_pod_names.empty?
118
+
119
+ core_target = self.pod_targets.find { |t| t.pod_name == 'ExpoModulesCore' }
120
+ core_spec = core_target&.root_spec
121
+ return if core_spec.nil?
122
+
123
+ required = deployment_targets
124
+ .map { |platform, info| [info[:key], { label: info[:label], version: core_spec.deployment_target(platform) }] }
125
+ .reject { |_, info| info[:version].nil? || info[:version].empty? }
126
+ .to_h
127
+ return if required.empty?
128
+
129
+ bumped = {} # pod_name => Array of bumped platform labels
130
+ self.target_installation_results.pod_target_installation_results.each_value do |result|
131
+ # Keys in pod_target_installation_results are target names, which can
132
+ # differ from pod names under scoped targets — use pod_name explicitly.
133
+ pod_name = result.target.pod_name
134
+ next unless expo_pod_names.include?(pod_name)
135
+ next if pod_name == 'ExpoModulesCore'
136
+
137
+ bumped_platforms = []
138
+ result.native_target.build_configurations.each do |config|
139
+ required.each do |key, info|
140
+ current = config.build_settings[key]
141
+ # nil means the pod doesn't target this platform — don't create a setting for it.
142
+ # Empty string or an xcconfig reference (e.g. `$(inherited)`) means we can't
143
+ # compare versions, so leave it alone.
144
+ next if current.nil? || current.empty? || current.start_with?('$')
145
+ next unless Gem::Version.new(current) < Gem::Version.new(info[:version])
146
+ config.build_settings[key] = info[:version]
147
+ bumped_platforms << info[:label] unless bumped_platforms.include?(info[:label])
148
+ end
149
+ end
150
+ bumped[pod_name] = bumped_platforms unless bumped_platforms.empty?
151
+ end
152
+
153
+ unless bumped.empty?
154
+ versions_by_label = required.values.map { |info| [info[:label], info[:version]] }.to_h
155
+ Pod::UI.puts "[Expo] ".blue + "Raised deployment target for Expo modules matching ExpoModulesCore:".yellow
156
+ bumped.each do |pod_name, platforms|
157
+ summary = platforms.map { |label| "#{label}=#{versions_by_label[label]}" }.join(' ')
158
+ Pod::UI.puts " #{pod_name} (#{summary})".yellow
159
+ end
160
+ self.pods_project.save
161
+ end
162
+ end
163
+
87
164
  # Ensures every slice declared by ExpoModulesJSI's podspec exists in
88
165
  # `Products/ExpoModulesJSI.xcframework`. CocoaPods only runs
89
166
  # prepare_command when a pod is freshly downloaded or its podspec