expo-updates 58.0.10 → 58.0.12

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.
Files changed (345) hide show
  1. package/CHANGELOG.md +18 -5
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/updates/UpdatesConfiguration.kt +29 -2
  4. package/android/src/main/java/expo/modules/updates/UpdatesPackage.kt +10 -2
  5. package/android/src/main/java/expo/modules/updates/codesigning/CodeSigningConfiguration.kt +5 -1
  6. package/android/src/main/java/expo/modules/updates/db/BuildData.kt +5 -1
  7. package/android/src/main/java/expo/modules/updates/db/Converters.kt +10 -2
  8. package/android/src/main/java/expo/modules/updates/db/dao/UpdateDao.kt +5 -1
  9. package/android/src/main/java/expo/modules/updates/launcher/DatabaseLauncher.kt +5 -1
  10. package/android/src/main/java/expo/modules/updates/loader/EmbeddedLoader.kt +5 -1
  11. package/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt +5 -1
  12. package/android/src/main/java/expo/modules/updates/loader/Loader.kt +5 -1
  13. package/android/src/main/java/expo/modules/updates/manifest/ManifestMetadata.kt +5 -1
  14. package/android/src/main/java/expo/modules/updates/selectionpolicy/ReaperSelectionPolicyFilterAware.kt +37 -21
  15. package/android/src/main/java/expo/modules/updates/selectionpolicy/SelectionPolicyFactory.kt +1 -1
  16. package/ios/EXUpdates/AppController.swift +5 -0
  17. package/ios/EXUpdates/DevLauncherAppController.swift +5 -0
  18. package/ios/EXUpdates/EnabledAppController.swift +2 -1
  19. package/ios/EXUpdates/SelectionPolicy/ReaperSelectionPolicyFilterAware.swift +50 -33
  20. package/ios/EXUpdates/SelectionPolicy/SelectionPolicyFactory.swift +5 -1
  21. package/ios/EXUpdates/UpdatesConfig.swift +45 -1
  22. package/package.json +9 -10
  23. package/utils/build/createManifestForBuildAsync.js +6 -4
  24. package/utils/build/createManifestForBuildAsync.js.map +1 -1
  25. package/utils/src/createManifestForBuildAsync.ts +6 -4
  26. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  27. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  28. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  29. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cache-v2-f7b3549f78edcf21e703.json +0 -1419
  30. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-e040f6d6310b1c8d7d75.json +0 -194
  31. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-4f817189b2f750253452.json +0 -69
  32. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  33. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/index-2026-09-25T10-21-58-0473.json +0 -92
  34. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
  35. package/android/.cxx/Debug/38204d1n/arm64-v8a/.cmake/api/v1/reply/target-expo-updates-Debug-835fe649d0020f4a216a.json +0 -235
  36. package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_deps +0 -0
  37. package/android/.cxx/Debug/38204d1n/arm64-v8a/.ninja_log +0 -17
  38. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeCache.txt +0 -422
  39. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  40. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  41. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  42. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  43. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  44. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  45. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  46. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  47. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  48. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
  49. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -4
  50. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  51. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  52. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  53. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  54. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  55. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  56. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  57. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
  58. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
  59. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  60. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  61. package/android/.cxx/Debug/38204d1n/arm64-v8a/CMakeFiles/rules.ninja +0 -93
  62. package/android/.cxx/Debug/38204d1n/arm64-v8a/additional_project_files.txt +0 -0
  63. package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build.json +0 -50
  64. package/android/.cxx/Debug/38204d1n/arm64-v8a/android_gradle_build_mini.json +0 -37
  65. package/android/.cxx/Debug/38204d1n/arm64-v8a/build.ninja +0 -245
  66. package/android/.cxx/Debug/38204d1n/arm64-v8a/build_file_index.txt +0 -3
  67. package/android/.cxx/Debug/38204d1n/arm64-v8a/cmake_install.cmake +0 -54
  68. package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json +0 -52
  69. package/android/.cxx/Debug/38204d1n/arm64-v8a/compile_commands.json.bin +0 -0
  70. package/android/.cxx/Debug/38204d1n/arm64-v8a/configure_fingerprint.bin +0 -39
  71. package/android/.cxx/Debug/38204d1n/arm64-v8a/libbzip2.a +0 -0
  72. package/android/.cxx/Debug/38204d1n/arm64-v8a/metadata_generation_command.txt +0 -22
  73. package/android/.cxx/Debug/38204d1n/arm64-v8a/prefab_config.json +0 -9
  74. package/android/.cxx/Debug/38204d1n/arm64-v8a/symbol_folder_index.txt +0 -1
  75. package/android/.cxx/Debug/38204d1n/hash_key.txt +0 -29
  76. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  77. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  78. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  79. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  80. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  81. package/android/.cxx/Debug/38204d1n/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  82. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  83. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  84. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  85. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  86. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  87. package/android/.cxx/Debug/38204d1n/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  88. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  89. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  90. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  91. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cache-v2-d7a10dd1f6d3df4d8ab3.json +0 -1419
  92. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/cmakeFiles-v1-6dee4bf659a7f2e2f5f6.json +0 -194
  93. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/codemodel-v2-ef8ae74f4588e27b4e41.json +0 -69
  94. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json +0 -14
  95. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/index-2026-09-25T10-21-07-0901.json +0 -92
  96. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-bzip2-Debug-61088dd3015f993d751a.json +0 -143
  97. package/android/.cxx/Debug/38204d1n/x86/.cmake/api/v1/reply/target-expo-updates-Debug-b94420e381eecc800d62.json +0 -235
  98. package/android/.cxx/Debug/38204d1n/x86/CMakeCache.txt +0 -422
  99. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  100. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  101. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  102. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  103. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  104. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  105. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  106. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  107. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  108. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/CMakeOutput.log +0 -256
  109. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/TargetDirectories.txt +0 -4
  110. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/cmake.check_cache +0 -1
  111. package/android/.cxx/Debug/38204d1n/x86/CMakeFiles/rules.ninja +0 -93
  112. package/android/.cxx/Debug/38204d1n/x86/additional_project_files.txt +0 -0
  113. package/android/.cxx/Debug/38204d1n/x86/android_gradle_build.json +0 -50
  114. package/android/.cxx/Debug/38204d1n/x86/android_gradle_build_mini.json +0 -37
  115. package/android/.cxx/Debug/38204d1n/x86/build.ninja +0 -245
  116. package/android/.cxx/Debug/38204d1n/x86/build_file_index.txt +0 -3
  117. package/android/.cxx/Debug/38204d1n/x86/cmake_install.cmake +0 -54
  118. package/android/.cxx/Debug/38204d1n/x86/compile_commands.json +0 -52
  119. package/android/.cxx/Debug/38204d1n/x86/compile_commands.json.bin +0 -0
  120. package/android/.cxx/Debug/38204d1n/x86/configure_fingerprint.bin +0 -39
  121. package/android/.cxx/Debug/38204d1n/x86/metadata_generation_command.txt +0 -22
  122. package/android/.cxx/Debug/38204d1n/x86/prefab_config.json +0 -9
  123. package/android/.cxx/Debug/38204d1n/x86/symbol_folder_index.txt +0 -1
  124. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  125. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  126. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  127. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/cache-v2-0a5b76266a87fc719ad6.json +0 -1451
  128. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-16b991e9c77739c110dc.json +0 -809
  129. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-ce3b144c9fe0157385a4.json +0 -69
  130. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json +0 -14
  131. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/index-2026-09-25T11-12-07-0643.json +0 -92
  132. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/target-bzip2-RelWithDebInfo-c2d8c9f552513540c358.json +0 -143
  133. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.cmake/api/v1/reply/target-expo-updates-RelWithDebInfo-247f9760dfa0d48c6494.json +0 -235
  134. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.ninja_deps +0 -0
  135. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/.ninja_log +0 -13
  136. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeCache.txt +0 -422
  137. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  138. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  139. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  140. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  141. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  142. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  143. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  144. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  145. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  146. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
  147. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -4
  148. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/blocksort.c.o +0 -0
  149. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/bzlib.c.o +0 -0
  150. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/compress.c.o +0 -0
  151. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/crctable.c.o +0 -0
  152. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/decompress.c.o +0 -0
  153. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/huffman.c.o +0 -0
  154. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/bzip2.dir/src/main/cpp/third-party/bzip2/randtable.c.o +0 -0
  155. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
  156. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/expo-updates.dir/Users/alanhughes/Work/expo/packages/expo-updates/vendor/bspatch/bspatch.c.o +0 -0
  157. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/BSPatchModule.cpp.o +0 -0
  158. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/expo-updates.dir/src/main/cpp/ExpoUpdatesMain.cpp.o +0 -0
  159. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/CMakeFiles/rules.ninja +0 -93
  160. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/additional_project_files.txt +0 -0
  161. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/android_gradle_build.json +0 -50
  162. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/android_gradle_build_mini.json +0 -37
  163. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/build.ninja +0 -267
  164. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/build_file_index.txt +0 -3
  165. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/cmake_install.cmake +0 -54
  166. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/compile_commands.json +0 -52
  167. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/compile_commands.json.bin +0 -0
  168. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/configure_fingerprint.bin +0 -35
  169. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/libbzip2.a +0 -0
  170. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/metadata_generation_command.txt +0 -22
  171. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/prefab_config.json +0 -9
  172. package/android/.cxx/RelWithDebInfo/p1f4o3dq/arm64-v8a/symbol_folder_index.txt +0 -1
  173. package/android/.cxx/RelWithDebInfo/p1f4o3dq/hash_key.txt +0 -29
  174. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -27
  175. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  176. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  177. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  178. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  179. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/arm64-v8a/prefab/lib/aarch64-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  180. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfig.cmake +0 -24
  181. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/ReactAndroid/ReactAndroidConfigVersion.cmake +0 -9
  182. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfig.cmake +0 -9
  183. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/fbjni/fbjniConfigVersion.cmake +0 -9
  184. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfig.cmake +0 -9
  185. package/android/.cxx/RelWithDebInfo/p1f4o3dq/prefab/x86/prefab/lib/i686-linux-android/cmake/kolibri-android/kolibri-androidConfigVersion.cmake +0 -9
  186. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  187. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  188. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  189. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/cache-v2-1ed2a91cbab21e042431.json +0 -1451
  190. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/cmakeFiles-v1-82110b9d17ea8fb1b09d.json +0 -809
  191. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/codemodel-v2-e2fc2ad309e6396487bf.json +0 -69
  192. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json +0 -14
  193. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/index-2026-09-25T11-11-00-0480.json +0 -92
  194. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/target-bzip2-RelWithDebInfo-c2d8c9f552513540c358.json +0 -143
  195. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/.cmake/api/v1/reply/target-expo-updates-RelWithDebInfo-3c50df3fcc0791719610.json +0 -235
  196. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeCache.txt +0 -422
  197. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake +0 -72
  198. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CMakeCXXCompiler.cmake +0 -83
  199. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin +0 -0
  200. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_CXX.bin +0 -0
  201. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake +0 -15
  202. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c +0 -803
  203. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o +0 -0
  204. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  205. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/3.22.1-g37088a8/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  206. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/CMakeOutput.log +0 -256
  207. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/TargetDirectories.txt +0 -4
  208. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/cmake.check_cache +0 -1
  209. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/CMakeFiles/rules.ninja +0 -93
  210. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/additional_project_files.txt +0 -0
  211. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/android_gradle_build.json +0 -50
  212. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/android_gradle_build_mini.json +0 -37
  213. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/build.ninja +0 -267
  214. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/build_file_index.txt +0 -3
  215. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/cmake_install.cmake +0 -54
  216. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/compile_commands.json +0 -52
  217. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/compile_commands.json.bin +0 -0
  218. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/configure_fingerprint.bin +0 -35
  219. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/metadata_generation_command.txt +0 -22
  220. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/prefab_config.json +0 -9
  221. package/android/.cxx/RelWithDebInfo/p1f4o3dq/x86/symbol_folder_index.txt +0 -1
  222. package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +0 -52
  223. package/android/.cxx/tools/debug/x86/compile_commands.json +0 -52
  224. package/android/.cxx/tools/release/arm64-v8a/compile_commands.json +0 -52
  225. package/android/.cxx/tools/release/x86/compile_commands.json +0 -52
  226. package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.bin +0 -0
  227. package/expo-updates-gradle-plugin/.gradle/8.14.3/executionHistory/executionHistory.lock +0 -0
  228. package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.bin +0 -0
  229. package/expo-updates-gradle-plugin/.gradle/9.0.0/executionHistory/executionHistory.lock +0 -0
  230. package/expo-updates-gradle-plugin/.gradle/9.3.0/checksums/checksums.lock +0 -0
  231. package/expo-updates-gradle-plugin/.gradle/9.3.0/executionHistory/executionHistory.lock +0 -0
  232. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileChanges/last-build.bin +0 -0
  233. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.bin +0 -0
  234. package/expo-updates-gradle-plugin/.gradle/9.3.0/fileHashes/fileHashes.lock +0 -0
  235. package/expo-updates-gradle-plugin/.gradle/9.3.0/gc.properties +0 -0
  236. package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.bin +0 -0
  237. package/expo-updates-gradle-plugin/.gradle/9.3.1/executionHistory/executionHistory.lock +0 -0
  238. package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.bin +0 -0
  239. package/expo-updates-gradle-plugin/.gradle/9.4.1/executionHistory/executionHistory.lock +0 -0
  240. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  241. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/cache.properties +0 -2
  242. package/expo-updates-gradle-plugin/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  243. package/expo-updates-gradle-plugin/.gradle/file-system.probe +0 -0
  244. package/expo-updates-gradle-plugin/.gradle/vcs-1/gc.properties +0 -0
  245. package/expo-updates-gradle-plugin/build/classes/kotlin/main/META-INF/expo-updates-gradle-plugin.kotlin_module +0 -0
  246. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$Companion.class +0 -0
  247. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$CreateUpdatesResourcesTask$exec$1.class +0 -0
  248. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$CreateUpdatesResourcesTask$getExpoUpdatesPackageDir$1.class +0 -0
  249. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$CreateUpdatesResourcesTask.class +0 -0
  250. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$apply$1$1.class +0 -0
  251. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$apply$1$createUpdatesResourcesTask$1.class +0 -0
  252. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin$apply$1.class +0 -0
  253. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPlugin.class +0 -0
  254. package/expo-updates-gradle-plugin/build/classes/kotlin/main/expo/modules/updates/ExpoUpdatesPluginKt.class +0 -0
  255. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  256. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  257. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  258. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  259. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  260. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  261. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  262. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  263. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  264. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  265. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  266. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  267. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  268. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  269. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  270. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  271. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  272. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  273. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  274. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  275. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  276. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  277. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  278. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  279. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  280. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  281. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  282. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  283. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
  284. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
  285. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
  286. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
  287. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
  288. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
  289. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
  290. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  291. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  292. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  293. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  294. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  295. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  296. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  297. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  298. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  299. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  300. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  301. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  302. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  303. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  304. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  305. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  306. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  307. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  308. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  309. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  310. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  311. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  312. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  313. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  314. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  315. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  316. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  317. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  318. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  319. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  320. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  321. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  322. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  323. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  324. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  325. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  326. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  327. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  328. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  329. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  330. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  331. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  332. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  333. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  334. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  335. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  336. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  337. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  338. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  339. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/cacheable/last-build.bin +0 -0
  340. package/expo-updates-gradle-plugin/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  341. package/expo-updates-gradle-plugin/build/libs/expo-updates-gradle-plugin.jar +0 -0
  342. package/expo-updates-gradle-plugin/build/pluginDescriptors/expo-updates-gradle-plugin.properties +0 -1
  343. package/expo-updates-gradle-plugin/build/resources/main/META-INF/gradle-plugins/expo-updates-gradle-plugin.properties +0 -1
  344. package/expo-updates-gradle-plugin/build/tmp/jar/MANIFEST.MF +0 -2
  345. package/ios/EXUpdates/BSPatch/bspatch.c +0 -420
package/CHANGELOG.md CHANGED
@@ -1,14 +1,27 @@
1
1
  # Changelog
2
2
 
3
- ## Unpublished
3
+ ## 58.0.12
4
4
 
5
- ### 🛠 Breaking changes
5
+ ### Patch Changes
6
6
 
7
- ### 🎉 New features
7
+ - Updated dependencies. ([#50734](https://github.com/expo/expo/pull/50734))
8
+ - expo-eas-client@58.0.2
8
9
 
9
- ### 🐛 Bug fixes
10
+ ## 58.0.11
10
11
 
11
- ### 💡 Others
12
+ ### Patch Changes
13
+
14
+ - Force-bump all packages, due to migration to changesets. ([#50762](https://github.com/expo/expo/pull/50762) by [@kitten](https://github.com/kitten))
15
+ - [iOS] Add configurable update cache retention with `EXUpdatesMaxUpdatesToKeep`. ([#50459](https://github.com/expo/expo/pull/50459) by [@expo-tuft](https://github.com/apps/expo-tuft))
16
+ - [Android] Add configurable update cache retention with `expo.modules.updates.EXPO_UPDATES_MAX_UPDATES_TO_KEEP`. ([#50460](https://github.com/expo/expo/pull/50460) by [@expo-tuft](https://github.com/apps/expo-tuft))
17
+ - Cover configurable update cache retention in E2E tests. ([#50463](https://github.com/expo/expo/pull/50463) by [@expo-tuft](https://github.com/apps/expo-tuft))
18
+ - Fix the embedded manifest giving every duplicate asset scale the same `packagerHash`, which made updates download assets already in the binary. ([#50757](https://github.com/expo/expo/pull/50757) by [@alanjhughes](https://github.com/alanjhughes))
19
+ - Updated dependencies. ([#50762](https://github.com/expo/expo/pull/50762))
20
+ - @expo/plist@0.10.1
21
+ - expo-eas-client@58.0.1
22
+ - expo-manifests@58.0.1
23
+ - expo-structured-headers@58.0.1
24
+ - expo-updates-interface@58.0.1
12
25
 
13
26
  ## 58.0.10 — 2026-09-28
14
27
 
@@ -42,7 +42,7 @@ expoModule {
42
42
  }
43
43
 
44
44
  group = 'host.exp.exponent'
45
- version = '58.0.10'
45
+ version = '58.0.12'
46
46
 
47
47
  // Utility method to derive boolean values from the environment or from Java properties,
48
48
  // and return them as strings to be used in BuildConfig fields
@@ -103,7 +103,7 @@ android {
103
103
  namespace "expo.modules.updates"
104
104
  defaultConfig {
105
105
  versionCode 31
106
- versionName '58.0.10'
106
+ versionName '58.0.12'
107
107
  consumerProguardFiles("proguard-rules.pro")
108
108
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
109
109
 
@@ -43,10 +43,19 @@ data class UpdatesConfiguration(
43
43
  val enableExpoUpdatesProtocolV0CompatibilityMode: Boolean, // used only in Expo Go to prevent loading rollbacks and other directives, which don't make much sense in the context of Expo Go
44
44
  val enableBsdiffPatchSupport: Boolean,
45
45
  val disableAntiBrickingMeasures: Boolean,
46
+ val maxUpdatesToKeep: Int = UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_DEFAULT_VALUE,
46
47
  val hasUpdatesOverride: Boolean,
47
48
 
48
49
  private val cachedOverrideMap: Map<String, Any>?
49
50
  ) {
51
+ init {
52
+ if (maxUpdatesToKeep < UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_MIN_VALUE) {
53
+ throw AssertionError(
54
+ "UpdatesConfiguration failed to initialize: maxUpdatesToKeep must be >= $UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_MIN_VALUE"
55
+ )
56
+ }
57
+ }
58
+
50
59
  enum class CheckAutomaticallyConfiguration {
51
60
  NEVER {
52
61
  override fun toJSString() = "NEVER"
@@ -128,6 +137,7 @@ data class UpdatesConfiguration(
128
137
  ?: context?.getMetadataValue("expo.modules.updates.ENABLE_BSDIFF_PATCH_SUPPORT")
129
138
  ?: true,
130
139
  disableAntiBrickingMeasures = getDisableAntiBrickingMeasures(context, overrideMap),
140
+ maxUpdatesToKeep = getMaxUpdatesToKeep(context, overrideMap),
131
141
  hasUpdatesOverride = configOverride != null
132
142
  )
133
143
 
@@ -159,6 +169,7 @@ data class UpdatesConfiguration(
159
169
  const val UPDATES_CONFIGURATION_ENABLE_EXPO_UPDATES_PROTOCOL_V0_COMPATIBILITY_MODE = "enableExpoUpdatesProtocolCompatibilityMode"
160
170
  const val UPDATES_CONFIGURATION_DISABLE_ANTI_BRICKING_MEASURES = "disableAntiBrickingMeasures"
161
171
  const val UPDATES_CONFIGURATION_ENABLE_BSDIFF_PATCH_SUPPORT = "enableBsdiffPatchSupport"
172
+ const val UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_KEY = "maxUpdatesToKeep"
162
173
 
163
174
  const val UPDATES_CONFIGURATION_CODE_SIGNING_CERTIFICATE = "codeSigningCertificate"
164
175
  const val UPDATES_CONFIGURATION_CODE_SIGNING_METADATA = "codeSigningMetadata"
@@ -166,6 +177,8 @@ data class UpdatesConfiguration(
166
177
  const val UPDATES_CONFIGURATION_CODE_SIGNING_ALLOW_UNSIGNED_MANIFESTS = "codeSigningAllowUnsignedManifests"
167
178
 
168
179
  private const val UPDATES_CONFIGURATION_LAUNCH_WAIT_MS_DEFAULT_VALUE = 0
180
+ private const val UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_DEFAULT_VALUE = 2
181
+ private const val UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_MIN_VALUE = 2
169
182
 
170
183
  const val UPDATES_CONFIGURATION_RUNTIME_VERSION_READ_FINGERPRINT_FILE_SENTINEL = "file:fingerprint"
171
184
  private const val FINGERPRINT_FILE_NAME = "fingerprint"
@@ -174,6 +187,12 @@ data class UpdatesConfiguration(
174
187
  return overrideMap?.readValueCheckingType<Boolean>(UPDATES_CONFIGURATION_DISABLE_ANTI_BRICKING_MEASURES) ?: context?.getMetadataValue("expo.modules.updates.DISABLE_ANTI_BRICKING_MEASURES") ?: false
175
188
  }
176
189
 
190
+ private fun getMaxUpdatesToKeep(context: Context?, overrideMap: Map<String, Any>?): Int {
191
+ return overrideMap?.readValueCheckingType<Int>(UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_KEY)
192
+ ?: context?.getMetadataValue("expo.modules.updates.EXPO_UPDATES_MAX_UPDATES_TO_KEEP")
193
+ ?: UPDATES_CONFIGURATION_MAX_UPDATES_TO_KEEP_DEFAULT_VALUE
194
+ }
195
+
177
196
  private fun getHasEmbeddedUpdate(
178
197
  context: Context?,
179
198
  overrideMap: Map<String, Any>?,
@@ -281,7 +300,11 @@ data class UpdatesConfiguration(
281
300
  return UpdatesConfigurationValidationResult.INVALID_NOT_ENABLED
282
301
  }
283
302
  val disableAntiBrickingMeasures = getDisableAntiBrickingMeasures(context, overrideMap)
284
- val configOverride = if (context != null) UpdatesConfigurationOverride.load(context) else null
303
+ val configOverride = if (context != null) {
304
+ UpdatesConfigurationOverride.load(context)
305
+ } else {
306
+ null
307
+ }
285
308
  getUpdateUrl(context, overrideMap, disableAntiBrickingMeasures, configOverride) ?: return UpdatesConfigurationValidationResult.INVALID_MISSING_URL
286
309
 
287
310
  if (getRuntimeVersion(context, overrideMap).isNullOrEmpty()) {
@@ -350,7 +373,11 @@ internal fun getNormalizedUrlOrigin(url: Uri): String {
350
373
  if (port == getDefaultPortForScheme(scheme)) {
351
374
  port = -1
352
375
  }
353
- return if (port > -1) "$scheme://${url.host}:$port" else "$scheme://${url.host}"
376
+ return if (port > -1) {
377
+ "$scheme://${url.host}:$port"
378
+ } else {
379
+ "$scheme://${url.host}"
380
+ }
354
381
  }
355
382
 
356
383
  private fun maybeGetDefaultScopeKey(scopeKey: String?, updateUrl: Uri): String {
@@ -28,11 +28,19 @@ class UpdatesPackage : Package {
28
28
  val handler: ReactNativeHostHandler = object : ReactNativeHostHandler {
29
29
 
30
30
  override fun getJSBundleFile(useDeveloperSupport: Boolean): String? {
31
- return if (UpdatesController.instance.isActiveController) UpdatesController.instance.launchAssetFile else null
31
+ return if (UpdatesController.instance.isActiveController) {
32
+ UpdatesController.instance.launchAssetFile
33
+ } else {
34
+ null
35
+ }
32
36
  }
33
37
 
34
38
  override fun getBundleAssetName(useDeveloperSupport: Boolean): String? {
35
- return if (UpdatesController.instance.isActiveController) UpdatesController.instance.bundleAssetName else null
39
+ return if (UpdatesController.instance.isActiveController) {
40
+ UpdatesController.instance.bundleAssetName
41
+ } else {
42
+ null
43
+ }
36
44
  }
37
45
 
38
46
  override fun onWillCreateReactInstance(useDeveloperSupport: Boolean) {
@@ -96,7 +96,11 @@ class CodeSigningConfiguration(
96
96
  }.verify(Base64.decode(info.signature, Base64.DEFAULT))
97
97
 
98
98
  return SignatureValidationResult(
99
- if (isValid) ValidationResult.VALID else ValidationResult.INVALID,
99
+ if (isValid) {
100
+ ValidationResult.VALID
101
+ } else {
102
+ ValidationResult.INVALID
103
+ },
100
104
  certificateChain.codeSigningCertificate.expoProjectInformation()
101
105
  )
102
106
  }
@@ -75,7 +75,11 @@ object BuildData {
75
75
 
76
76
  fun getBuildDataFromDatabase(database: UpdatesDatabase, scopeKey: String): JSONObject? {
77
77
  val buildJSONString = database.jsonDataDao()?.loadJSONStringForKey(JSONDataDao.JSONDataKey.STATIC_BUILD_DATA, scopeKey)
78
- return if (buildJSONString == null) null else JSONObject(buildJSONString)
78
+ return if (buildJSONString == null) {
79
+ null
80
+ } else {
81
+ JSONObject(buildJSONString)
82
+ }
79
83
  }
80
84
 
81
85
  private fun getBuildDataFromConfig(updatesConfiguration: UpdatesConfiguration): JSONObject {
@@ -15,7 +15,11 @@ class Converters {
15
15
 
16
16
  @TypeConverter
17
17
  fun longToDate(value: Long?): Date? {
18
- return if (value == null) null else Date(value)
18
+ return if (value == null) {
19
+ null
20
+ } else {
21
+ Date(value)
22
+ }
19
23
  }
20
24
 
21
25
  @TypeConverter
@@ -25,7 +29,11 @@ class Converters {
25
29
 
26
30
  @TypeConverter
27
31
  fun stringToUri(string: String?): Uri? {
28
- return if (string == null) null else Uri.parse(string)
32
+ return if (string == null) {
33
+ null
34
+ } else {
35
+ Uri.parse(string)
36
+ }
29
37
  }
30
38
 
31
39
  @TypeConverter
@@ -58,7 +58,11 @@ abstract class UpdateDao {
58
58
 
59
59
  fun loadUpdateWithId(id: UUID): UpdateEntity? {
60
60
  val updateEntities = loadUpdatesWithId(id)
61
- return if (updateEntities.isNotEmpty()) updateEntities[0] else null
61
+ return if (updateEntities.isNotEmpty()) {
62
+ updateEntities[0]
63
+ } else {
64
+ null
65
+ }
62
66
  }
63
67
 
64
68
  fun loadLaunchAssetForUpdate(updateId: UUID): AssetEntity? {
@@ -265,7 +265,11 @@ class DatabaseLauncher(
265
265
 
266
266
  database.assetDao().updateAsset(result.assetEntity)
267
267
  val assetFileLocal = File(updatesDirectory, result.assetEntity.relativePath!!)
268
- if (assetFileLocal.exists()) assetFileLocal else null
268
+ if (assetFileLocal.exists()) {
269
+ assetFileLocal
270
+ } else {
271
+ null
272
+ }
269
273
  } catch (e: Exception) {
270
274
  logger.error("Failed to load asset from disk or network", e, UpdatesErrorCode.AssetsFailedToLoad)
271
275
  if (asset.isLaunchAsset) {
@@ -102,7 +102,11 @@ class EmbeddedLoader internal constructor(
102
102
  } catch (e: FileNotFoundException) {
103
103
  throw AssertionError(
104
104
  "APK bundle must contain the expected embedded asset " +
105
- if (assetEntity.embeddedAssetFilename != null) assetEntity.embeddedAssetFilename else assetEntity.resourcesFilename
105
+ if (assetEntity.embeddedAssetFilename != null) {
106
+ assetEntity.embeddedAssetFilename
107
+ } else {
108
+ assetEntity.resourcesFilename
109
+ }
106
110
  )
107
111
  }
108
112
  }
@@ -1095,7 +1095,11 @@ private class FileDownloadProgressResponseBody(
1095
1095
 
1096
1096
  override fun read(sink: Buffer, byteCount: Long): Long {
1097
1097
  val bytesRead = super.read(sink, byteCount)
1098
- totalBytesRead += if (bytesRead != -1L) bytesRead else 0
1098
+ totalBytesRead += if (bytesRead != -1L) {
1099
+ bytesRead
1100
+ } else {
1101
+ 0
1102
+ }
1099
1103
  progressListener.update(totalBytesRead, responseBody.contentLength())
1100
1104
  return bytesRead
1101
1105
  }
@@ -238,7 +238,11 @@ abstract class Loader protected constructor(
238
238
 
239
239
  handleAssetDownloadCompleted(
240
240
  result.assetEntity,
241
- if (result.isNew) AssetLoadResult.FINISHED else AssetLoadResult.ALREADY_EXISTS
241
+ if (result.isNew) {
242
+ AssetLoadResult.FINISHED
243
+ } else {
244
+ AssetLoadResult.ALREADY_EXISTS
245
+ }
242
246
  )
243
247
  }
244
248
  assetDownloadJobs.add(job)
@@ -24,7 +24,11 @@ object ManifestMetadata {
24
24
  return try {
25
25
  val jsonString = database.jsonDataDao()!!
26
26
  .loadJSONStringForKey(key, configuration.scopeKey)
27
- if (jsonString != null) JSONObject(jsonString) else null
27
+ if (jsonString != null) {
28
+ JSONObject(jsonString)
29
+ } else {
30
+ null
31
+ }
28
32
  } catch (e: Exception) {
29
33
  Log.e(TAG, "Error retrieving $key from database", e)
30
34
  null
@@ -4,17 +4,22 @@ import expo.modules.updates.db.entity.UpdateEntity
4
4
  import expo.modules.updates.db.enums.UpdateStatus
5
5
  import org.json.JSONObject
6
6
 
7
+ private const val DEFAULT_MAX_UPDATES_TO_KEEP = 2
8
+ private const val MIN_MAX_UPDATES_TO_KEEP = 2
9
+
7
10
  /**
8
11
  * ReaperSelectionPolicy which chooses which updates to delete taking into account manifest filters
9
- * originating from the server. If an older update is available, it will choose to keep one older
10
- * update in addition to the one currently running, preferring updates that match the same filters
11
- * if available.
12
+ * originating from the server. If older updates are available, it will choose to keep up to
13
+ * `maxUpdatesToKeep - 1` older updates in addition to the one currently running, preferring
14
+ * updates that match the same filters if available.
12
15
  *
13
16
  * Uses `commitTime` to determine ordering of updates.
14
17
  *
15
18
  * Chooses only to delete updates whose scope matches that of `launchedUpdate`.
16
19
  */
17
- class ReaperSelectionPolicyFilterAware : ReaperSelectionPolicy {
20
+ class ReaperSelectionPolicyFilterAware @JvmOverloads constructor(
21
+ private val maxUpdatesToKeep: Int = DEFAULT_MAX_UPDATES_TO_KEEP
22
+ ) : ReaperSelectionPolicy {
18
23
  override fun selectUpdatesToDelete(
19
24
  updates: List<UpdateEntity>,
20
25
  launchedUpdate: UpdateEntity?,
@@ -24,11 +29,8 @@ class ReaperSelectionPolicyFilterAware : ReaperSelectionPolicy {
24
29
  return listOf()
25
30
  }
26
31
  val updatesToDelete = mutableListOf<UpdateEntity>()
27
- // keep the launched update and one other, to be safe and make roll backs faster
28
- // keep the next newest update that matches all the manifest filters, unless no other updates do
29
- // in which case, keep the next newest across all updates
30
- var nextNewestUpdate: UpdateEntity? = null
31
- var nextNewestUpdateMatchingFilters: UpdateEntity? = null
32
+ val olderUpdates = mutableListOf<UpdateEntity>()
33
+
32
34
  for (update in updates) {
33
35
  // ignore any updates whose scopeKey doesn't match that of the launched update
34
36
  if (update.scopeKey != launchedUpdate.scopeKey) {
@@ -36,23 +38,37 @@ class ReaperSelectionPolicyFilterAware : ReaperSelectionPolicy {
36
38
  }
37
39
  if (update.commitTime.before(launchedUpdate.commitTime)) {
38
40
  updatesToDelete.add(update)
39
- if (nextNewestUpdate == null || nextNewestUpdate.commitTime.before(update.commitTime)) {
40
- nextNewestUpdate = update
41
- }
42
- if (SelectionPolicies.matchesFilters(update, filters) &&
43
- (nextNewestUpdateMatchingFilters == null || nextNewestUpdateMatchingFilters.commitTime.before(update.commitTime))
44
- ) {
45
- nextNewestUpdateMatchingFilters = update
46
- }
41
+ olderUpdates.add(update)
47
42
  }
48
43
  }
49
- if (nextNewestUpdateMatchingFilters != null) {
50
- updatesToDelete.remove(nextNewestUpdateMatchingFilters)
51
- } else if (nextNewestUpdate != null) {
52
- updatesToDelete.remove(nextNewestUpdate)
44
+
45
+ val maxOlderUpdatesToKeep = maxUpdatesToKeep - 1
46
+ // Use a set so fallback selection and deletion do not scan all retained updates per candidate.
47
+ val olderUpdatesToKeep = olderUpdates
48
+ .filter { SelectionPolicies.matchesFilters(it, filters) }
49
+ .sortedByDescending { it.commitTime }
50
+ .take(maxOlderUpdatesToKeep)
51
+ .toMutableSet()
52
+
53
+ if (olderUpdatesToKeep.size < maxOlderUpdatesToKeep) {
54
+ olderUpdatesToKeep.addAll(
55
+ olderUpdates
56
+ .filter { !olderUpdatesToKeep.contains(it) }
57
+ .sortedByDescending { it.commitTime }
58
+ .take(maxOlderUpdatesToKeep - olderUpdatesToKeep.size)
59
+ )
53
60
  }
61
+ updatesToDelete.removeAll(olderUpdatesToKeep)
54
62
 
55
63
  // don't delete embedded update
56
64
  return updatesToDelete.filter { it.status != UpdateStatus.EMBEDDED }
57
65
  }
66
+
67
+ init {
68
+ if (maxUpdatesToKeep < MIN_MAX_UPDATES_TO_KEEP) {
69
+ throw AssertionError(
70
+ "Cannot initialize ReaperSelectionPolicyFilterAware with maxUpdatesToKeep < $MIN_MAX_UPDATES_TO_KEEP"
71
+ )
72
+ }
73
+ }
58
74
  }
@@ -11,7 +11,7 @@ object SelectionPolicyFactory {
11
11
  return SelectionPolicy(
12
12
  LauncherSelectionPolicyFilterAware(runtimeVersion, config),
13
13
  LoaderSelectionPolicyFilterAware(config),
14
- ReaperSelectionPolicyFilterAware()
14
+ ReaperSelectionPolicyFilterAware(config.maxUpdatesToKeep)
15
15
  )
16
16
  }
17
17
  }
@@ -259,6 +259,11 @@ public class AppController: NSObject {
259
259
  message: "The expo-updates system is disabled due to an invalid configuration. Ensure a valid URL is supplied.",
260
260
  code: .initializationError
261
261
  )
262
+ case .InvalidMaxUpdatesToKeep:
263
+ logger.warn(
264
+ message: "The expo-updates system is disabled due to an invalid configuration. Ensure EXUpdatesMaxUpdatesToKeep is an integer of at least 2.",
265
+ code: .initializationError
266
+ )
262
267
  case .InvalidMissingRuntimeVersion:
263
268
  logger.warn(
264
269
  message: "The expo-updates system is disabled due to an invalid configuration. Ensure a runtime version is supplied.",
@@ -14,6 +14,7 @@ enum DevLauncherAppControllerError: Int, Error, LocalizedError {
14
14
  case invalidRuntimeVersion
15
15
  case updateLaunchFailed
16
16
  case configFailed
17
+ case invalidMaxUpdatesToKeep
17
18
 
18
19
  var errorDescription: String? {
19
20
  switch self {
@@ -27,6 +28,8 @@ enum DevLauncherAppControllerError: Int, Error, LocalizedError {
27
28
  return "Failed to read stored updates: configuration object must include a valid runtime version"
28
29
  case .updateLaunchFailed:
29
30
  return "Failed to launch update with an unknown error"
31
+ case .invalidMaxUpdatesToKeep:
32
+ return "Failed to read stored updates: EXUpdatesMaxUpdatesToKeep must be an integer of at least 2"
30
33
  case .configFailed:
31
34
  return "Cannot load configuration from Expo.plist. Please ensure you've followed the setup and installation instructions for expo-updates to create Expo.plist and add it to your Xcode project."
32
35
  }
@@ -251,6 +254,8 @@ public final class DevLauncherAppController: NSObject, InternalAppControllerInte
251
254
  throw DevLauncherAppControllerError.invalidPlist
252
255
  case .InvalidMissingURL:
253
256
  throw DevLauncherAppControllerError.invalidUpdateURL
257
+ case .InvalidMaxUpdatesToKeep:
258
+ throw DevLauncherAppControllerError.invalidMaxUpdatesToKeep
254
259
  case .InvalidMissingRuntimeVersion:
255
260
  throw DevLauncherAppControllerError.invalidRuntimeVersion
256
261
  }
@@ -56,7 +56,8 @@ public class EnabledAppController: InternalAppControllerInterface, UpdatesInterf
56
56
  private var selectionPolicy: SelectionPolicy {
57
57
  return SelectionPolicyFactory.filterAwarePolicy(
58
58
  withRuntimeVersion: config.runtimeVersion,
59
- config: config
59
+ config: config,
60
+ embeddedUpdateId: getEmbeddedUpdate()?.updateId
60
61
  )
61
62
  }
62
63
 
@@ -4,25 +4,44 @@
4
4
 
5
5
  /**
6
6
  * A ReaperSelectionPolicy which chooses which updates to delete taking into account manifest filters
7
- * originating from the server. If an older update is available, it will choose to keep one older
8
- * update in addition to the one currently running, preferring updates that match the same filters
9
- * if available.
7
+ * originating from the server. If older updates are available, it will choose to keep up to
8
+ * `maxUpdatesToKeep - 1` older updates in addition to the one currently running, preferring
9
+ * updates that match the same filters if available.
10
10
  *
11
11
  * Uses `commitTime` to determine ordering of updates.
12
12
  *
13
- * Chooses only to delete updates who scope matches that of `launchedUpdate`.
13
+ * Chooses only to delete updates whose scope matches that of `launchedUpdate`.
14
14
  */
15
15
  @objc(EXUpdatesReaperSelectionPolicyFilterAware)
16
16
  @objcMembers
17
17
  public final class ReaperSelectionPolicyFilterAware: NSObject, ReaperSelectionPolicy {
18
- public func updatesToDelete(withLaunchedUpdate launchedUpdate: Update, updates: [Update], filters: [String: Any]?) -> [Update] {
19
- var updatesToDelete: [Update] = []
18
+ private let maxUpdatesToKeep: Int
19
+ private let embeddedUpdateId: UUID?
20
+
21
+ public override init() {
22
+ self.maxUpdatesToKeep = 2
23
+ self.embeddedUpdateId = nil
24
+ }
25
+
26
+ public convenience init(maxUpdatesToKeep: Int) {
27
+ self.init(maxUpdatesToKeep: maxUpdatesToKeep, embeddedUpdateId: nil)
28
+ }
29
+
30
+ public init(maxUpdatesToKeep: Int, embeddedUpdateId: UUID?) {
31
+ self.maxUpdatesToKeep = maxUpdatesToKeep
32
+ self.embeddedUpdateId = embeddedUpdateId
20
33
 
21
- // keep the launched update and one other, the next newest, to be safe and make rollbacks faster
22
- // keep the next newest update that matches all the manifest filters, unless no other updates do
23
- // in which case, keep the next newest across all updates
24
- var nextNewestUpdate: Update?
25
- var nextNewestUpdateMatchingFilters: Update?
34
+ if maxUpdatesToKeep < 2 {
35
+ NSException.init(
36
+ name: .invalidArgumentException,
37
+ reason: "Cannot initialize ReaperSelectionPolicyFilterAware with maxUpdatesToKeep < 2"
38
+ )
39
+ .raise()
40
+ }
41
+ }
42
+
43
+ public func updatesToDelete(withLaunchedUpdate launchedUpdate: Update, updates: [Update], filters: [String: Any]?) -> [Update] {
44
+ var olderUpdates: [Update] = []
26
45
 
27
46
  for update in updates {
28
47
  guard let launchedUpdateScopeKey = launchedUpdate.scopeKey,
@@ -36,32 +55,30 @@ public final class ReaperSelectionPolicyFilterAware: NSObject, ReaperSelectionPo
36
55
  }
37
56
 
38
57
  if launchedUpdate.commitTime.compare(update.commitTime) == .orderedDescending {
39
- updatesToDelete.append(update)
40
-
41
- if let nextNewestUpdateInner = nextNewestUpdate,
42
- update.commitTime.compare(nextNewestUpdateInner.commitTime) == .orderedDescending {
43
- nextNewestUpdate = update
44
- } else {
45
- nextNewestUpdate = update
46
- }
47
-
48
- if SelectionPolicies.doesUpdate(update, matchFilters: filters) {
49
- if let nextNewestUpdateMatchingFiltersInner = nextNewestUpdateMatchingFilters,
50
- update.commitTime.compare(nextNewestUpdateMatchingFiltersInner.commitTime) == .orderedDescending {
51
- nextNewestUpdateMatchingFilters = update
52
- } else {
53
- nextNewestUpdateMatchingFilters = update
54
- }
55
- }
58
+ olderUpdates.append(update)
56
59
  }
57
60
  }
58
61
 
59
- if let nextNewestUpdateMatchingFilters = nextNewestUpdateMatchingFilters {
60
- updatesToDelete.remove(nextNewestUpdateMatchingFilters)
61
- } else if let nextNewestUpdate = nextNewestUpdate {
62
- updatesToDelete.remove(nextNewestUpdate)
62
+ // Embedded rows from previous binaries cannot be launched and must not occupy fallback slots.
63
+ let launchableOlderUpdates = olderUpdates.filter {
64
+ $0.status != .StatusEmbedded || $0.updateId == embeddedUpdateId
63
65
  }
64
- return updatesToDelete
66
+ let maxOlderUpdatesToKeep = maxUpdatesToKeep - 1
67
+ let matchingUpdatesToKeep = launchableOlderUpdates
68
+ .filter { SelectionPolicies.doesUpdate($0, matchFilters: filters) }
69
+ .sorted { $0.commitTime.compare($1.commitTime) == .orderedDescending }
70
+ .prefix(maxOlderUpdatesToKeep)
71
+ var olderUpdatesToKeep = Set(matchingUpdatesToKeep)
72
+
73
+ if matchingUpdatesToKeep.count < maxOlderUpdatesToKeep {
74
+ let remainingUpdatesToKeep = launchableOlderUpdates
75
+ .filter { !olderUpdatesToKeep.contains($0) }
76
+ .sorted { $0.commitTime.compare($1.commitTime) == .orderedDescending }
77
+ .prefix(maxOlderUpdatesToKeep - matchingUpdatesToKeep.count)
78
+ olderUpdatesToKeep.formUnion(remainingUpdatesToKeep)
79
+ }
80
+
81
+ return olderUpdates.filter { !olderUpdatesToKeep.contains($0) && $0.updateId != embeddedUpdateId }
65
82
  }
66
83
  }
67
84
 
@@ -10,10 +10,14 @@ import Foundation
10
10
  @objcMembers
11
11
  public final class SelectionPolicyFactory: NSObject {
12
12
  public static func filterAwarePolicy(withRuntimeVersion runtimeVersion: String, config: UpdatesConfig) -> SelectionPolicy {
13
+ return filterAwarePolicy(withRuntimeVersion: runtimeVersion, config: config, embeddedUpdateId: nil)
14
+ }
15
+
16
+ public static func filterAwarePolicy(withRuntimeVersion runtimeVersion: String, config: UpdatesConfig, embeddedUpdateId: UUID?) -> SelectionPolicy {
13
17
  return SelectionPolicy.init(
14
18
  launcherSelectionPolicy: LauncherSelectionPolicyFilterAware.init(runtimeVersion: runtimeVersion, config: config),
15
19
  loaderSelectionPolicy: LoaderSelectionPolicyFilterAware(config: config),
16
- reaperSelectionPolicy: ReaperSelectionPolicyFilterAware()
20
+ reaperSelectionPolicy: ReaperSelectionPolicyFilterAware(maxUpdatesToKeep: config.maxUpdatesToKeep, embeddedUpdateId: embeddedUpdateId)
17
21
  )
18
22
  }
19
23
  }