From 518239088f097e240aa84bd36c835c1e7743a581 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Mon, 5 Oct 2026 11:18:10 +0200 Subject: [PATCH 1/2] chore(expo): bump sample to Expo 57.0.26 Raise the range floor from `^57.0.0` to `^57.0.26` (the latest 57.x patch) and advance the lockfile accordingly. 57.0.26 is the first SDK 57 release bundled in the sample that ships Expo's `ExpoAppSceneDelegate`, so the floor now reflects the real minimum while keeping the caret for future 57.x patches. Co-Authored-By: Claude Opus 4.8 --- samples/expo/package.json | 2 +- yarn.lock | 645 +++++++++++++++++++++++--------------- 2 files changed, 398 insertions(+), 249 deletions(-) diff --git a/samples/expo/package.json b/samples/expo/package.json index 570adb2984..6adda1a6ae 100644 --- a/samples/expo/package.json +++ b/samples/expo/package.json @@ -26,7 +26,7 @@ "@sentry/core": "10.75.2", "@sentry/react-native": "8.29.0", "@types/react": "~19.2.10", - "expo": "^57.0.0", + "expo": "^57.0.26", "expo-constants": "~57.0.2", "expo-dev-client": "~57.0.3", "expo-image-picker": "~57.0.1", diff --git a/yarn.lock b/yarn.lock index f1683c290d..c1ebb978b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2163,34 +2163,35 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:^57.0.3": - version: 57.0.3 - resolution: "@expo/cli@npm:57.0.3" +"@expo/cli@npm:^57.0.27": + version: 57.0.27 + resolution: "@expo/cli@npm:57.0.27" dependencies: "@expo/code-signing-certificates": "npm:^0.0.6" - "@expo/config": "npm:~57.0.1" - "@expo/config-plugins": "npm:~57.0.1" + "@expo/config": "npm:~57.0.9" + "@expo/config-plugins": "npm:~57.0.9" "@expo/devcert": "npm:^1.2.1" - "@expo/env": "npm:~2.4.0" - "@expo/image-utils": "npm:^0.11.0" - "@expo/inline-modules": "npm:^0.1.1" - "@expo/json-file": "npm:^11.0.0" - "@expo/log-box": "npm:^57.0.0" - "@expo/metro": "npm:~56.0.0" - "@expo/metro-config": "npm:~57.0.2" - "@expo/metro-file-map": "npm:^57.0.0" - "@expo/osascript": "npm:^2.7.0" - "@expo/package-manager": "npm:^1.13.0" - "@expo/plist": "npm:^0.8.0" - "@expo/prebuild-config": "npm:^57.0.3" - "@expo/require-utils": "npm:^57.0.0" - "@expo/router-server": "npm:^57.0.1" - "@expo/schema-utils": "npm:^57.0.0" + "@expo/env": "npm:~2.4.3" + "@expo/image-utils": "npm:^0.11.5" + "@expo/inline-modules": "npm:^0.1.7" + "@expo/json-file": "npm:^11.0.1" + "@expo/log-box": "npm:^57.0.4" + "@expo/metro": "npm:~56.0.2" + "@expo/metro-config": "npm:~57.0.12" + "@expo/metro-file-map": "npm:^57.0.3" + "@expo/osascript": "npm:^2.7.1" + "@expo/package-manager": "npm:^1.13.1" + "@expo/plist": "npm:^0.8.1" + "@expo/prebuild-config": "npm:^57.0.16" + "@expo/require-utils": "npm:^57.0.5" + "@expo/router-server": "npm:^57.0.11" + "@expo/schema-utils": "npm:^57.0.2" "@expo/spawn-async": "npm:^1.8.0" "@expo/ws-tunnel": "npm:^2.0.0" "@expo/xcpretty": "npm:^4.4.4" - "@react-native/dev-middleware": "npm:0.86.0" + "@react-native/dev-middleware": "npm:0.86.3" accepts: "npm:^1.3.8" + agent-cli-detector: "npm:0.1.7" arg: "npm:^5.0.2" bplist-creator: "npm:0.1.0" bplist-parser: "npm:^0.3.1" @@ -2200,12 +2201,12 @@ __metadata: connect: "npm:^3.7.0" debug: "npm:^4.3.4" dnssd-advertise: "npm:^1.1.4" - expo-server: "npm:^57.0.0" + expo-server: "npm:^57.0.3" fetch-nodeshim: "npm:^0.4.10" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" lan-network: "npm:^0.2.1" - multitars: "npm:^1.0.0" + multitars: "npm:^1.0.2" node-forge: "npm:^1.3.3" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" @@ -2214,6 +2215,7 @@ __metadata: progress: "npm:^2.0.3" prompts: "npm:^2.3.2" resolve-from: "npm:^5.0.0" + sandbox-cli-detector: "npm:^0.2.0" semver: "npm:^7.6.0" send: "npm:^0.19.0" slugify: "npm:^1.3.4" @@ -2235,7 +2237,7 @@ __metadata: optional: true bin: expo-internal: main.js - checksum: 10c0/0c04398d196acd510d0bbb598c89a76b0eeedf2f972af7a0cbb82052dbbbfc0b62ef71f5471b492f3cfe101db8db2a6e26118a3f502c9be6a0ce991efb8cca4e + checksum: 10c0/e781f5d38850f8dd1fa93ec0d80783759a256bf22783b59828111925ad38776beff901178a7003494293258152bffc442ff091398324a540c941006fdf94d8e9 languageName: node linkType: hard @@ -2302,14 +2304,14 @@ __metadata: languageName: node linkType: hard -"@expo/config-plugins@npm:~57.0.1": - version: 57.0.1 - resolution: "@expo/config-plugins@npm:57.0.1" +"@expo/config-plugins@npm:~57.0.9": + version: 57.0.9 + resolution: "@expo/config-plugins@npm:57.0.9" dependencies: - "@expo/config-types": "npm:^57.0.1" - "@expo/json-file": "npm:~11.0.0" - "@expo/plist": "npm:^0.8.0" - "@expo/require-utils": "npm:^57.0.0" + "@expo/config-types": "npm:^57.0.2" + "@expo/json-file": "npm:~11.0.1" + "@expo/plist": "npm:^0.8.1" + "@expo/require-utils": "npm:^57.0.5" "@expo/sdk-runtime-versions": "npm:^1.0.0" chalk: "npm:^4.1.2" debug: "npm:^4.3.5" @@ -2319,7 +2321,7 @@ __metadata: slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10c0/3a5b0fea0e7a28f8abfcd699de263872efaa0890367441d46a41be4e5548df58090cdfd80cf101d59f788c46902813c28f81f3f0e7ac038b0a5b6ffd39bd7ac5 + checksum: 10c0/a980ceea445860797dd8d5f446b9dd1710b4101a0d9ac362157c9af2f5777ed7365c09c13f2fd42c00252060105e92e44a390841c294d52dbcb0362cac21c5c0 languageName: node linkType: hard @@ -2369,10 +2371,10 @@ __metadata: languageName: node linkType: hard -"@expo/config-types@npm:^57.0.1": - version: 57.0.1 - resolution: "@expo/config-types@npm:57.0.1" - checksum: 10c0/b2de5fa84a808aa5757ec2671aca6530fdbe861406b1f6b8a9319ca7deee46d8db16b160fde53e7894b996e3ec73df72111375f3d18ba95e1d5a37fa2ae6ec54 +"@expo/config-types@npm:^57.0.2": + version: 57.0.2 + resolution: "@expo/config-types@npm:57.0.2" + checksum: 10c0/3e3a8abcab03791dfccc758bde5ce85f0fa4b14c22df072e6cc72c670945fc65433239bf2ce39f86bbda422b338d19323612d61eabb2442f988713214837a6dc languageName: node linkType: hard @@ -2418,21 +2420,21 @@ __metadata: languageName: node linkType: hard -"@expo/config@npm:~57.0.1": - version: 57.0.1 - resolution: "@expo/config@npm:57.0.1" +"@expo/config@npm:~57.0.9": + version: 57.0.9 + resolution: "@expo/config@npm:57.0.9" dependencies: - "@expo/config-plugins": "npm:~57.0.1" - "@expo/config-types": "npm:^57.0.1" - "@expo/json-file": "npm:^11.0.0" - "@expo/require-utils": "npm:^57.0.0" + "@expo/config-plugins": "npm:~57.0.9" + "@expo/config-types": "npm:^57.0.2" + "@expo/json-file": "npm:^11.0.1" + "@expo/require-utils": "npm:^57.0.5" deepmerge: "npm:^4.3.1" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" resolve-workspace-root: "npm:^2.0.0" semver: "npm:^7.6.0" slugify: "npm:^1.3.4" - checksum: 10c0/3c3201a67cf9b6ba5d4280625f03269734243196b0156af136998c2d2c6ef53e58c84a18db9cc73a95d3f4e8aacd437df9e5bdd857e7420fbf0992ea2aac3f14 + checksum: 10c0/b70700a5bdf405c7b71878f5c4549f034a0080ba427069089326017e5b777cbdddaf9abf094aa0de83c80202fea479078fe452ae3ac11c3b75ca7922376ac409 languageName: node linkType: hard @@ -2465,9 +2467,9 @@ __metadata: languageName: node linkType: hard -"@expo/devtools@npm:~57.0.0": - version: 57.0.0 - resolution: "@expo/devtools@npm:57.0.0" +"@expo/devtools@npm:~57.0.1": + version: 57.0.1 + resolution: "@expo/devtools@npm:57.0.1" dependencies: chalk: "npm:^4.1.2" peerDependencies: @@ -2478,11 +2480,11 @@ __metadata: optional: true react-native: optional: true - checksum: 10c0/16df2a594ce8e7e51f549973488d897ef4be5395ba152167df87af9d872568422428b9343c3f7ac8714931ea0c6b66a1c73669061cc9341a0b6058fcad91c488 + checksum: 10c0/bf3a24db47725ebeb79adbb95c3cddb71ea26e0040e80ef9aeb50b538417581765617a8fa6c5c63b78cb1d633548da8fc926d892331515e8fb180e99831f0156 languageName: node linkType: hard -"@expo/dom-webview@npm:^57.0.0, @expo/dom-webview@npm:~57.0.0": +"@expo/dom-webview@npm:^57.0.0": version: 57.0.0 resolution: "@expo/dom-webview@npm:57.0.0" peerDependencies: @@ -2493,14 +2495,25 @@ __metadata: languageName: node linkType: hard -"@expo/env@npm:^2.4.0, @expo/env@npm:~2.4.0": - version: 2.4.0 - resolution: "@expo/env@npm:2.4.0" +"@expo/dom-webview@npm:^57.0.1, @expo/dom-webview@npm:~57.0.1": + version: 57.0.1 + resolution: "@expo/dom-webview@npm:57.0.1" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10c0/22c2868e9c6c2eea2f607b1f9b4afc966b4fba3a03a6b05cabe9c8c51540fae4252f60ff171ce406ebcccca8b3e5931d07d0dd04c777020669a1dd11d5cca8a6 + languageName: node + linkType: hard + +"@expo/env@npm:^2.4.3": + version: 2.5.1 + resolution: "@expo/env@npm:2.5.1" dependencies: chalk: "npm:^4.0.0" debug: "npm:^4.3.4" getenv: "npm:^2.0.0" - checksum: 10c0/fff6b4eccd03c77508fc57b0d80b77736e272de147346a38bead900f5b8580874568b8ad536af1b56efdc42f0f3a9d505fe738346b9ac2f1beb5e974cd2d67f5 + checksum: 10c0/1ca2010411fe5aaf2d14e0ead0039b83e92a4ce96316ce2584293d290493d6530a7eefaf648455cadd38d739a2068f6a26a132387891a64b35608fb5e9b534bb languageName: node linkType: hard @@ -2517,10 +2530,32 @@ __metadata: languageName: node linkType: hard -"@expo/expo-modules-macros-plugin@npm:0.3.0": - version: 0.3.0 - resolution: "@expo/expo-modules-macros-plugin@npm:0.3.0" - checksum: 10c0/616e327d7f1f97dc46467f3166ced4349d11309ef1eaf07fc3364f3465a123163d1dfd8820cef7f3f9470d810e22511e39f6853b734318d06a6344dc313593fc +"@expo/env@npm:~2.4.0": + version: 2.4.0 + resolution: "@expo/env@npm:2.4.0" + dependencies: + chalk: "npm:^4.0.0" + debug: "npm:^4.3.4" + getenv: "npm:^2.0.0" + checksum: 10c0/fff6b4eccd03c77508fc57b0d80b77736e272de147346a38bead900f5b8580874568b8ad536af1b56efdc42f0f3a9d505fe738346b9ac2f1beb5e974cd2d67f5 + languageName: node + linkType: hard + +"@expo/env@npm:~2.4.3": + version: 2.4.3 + resolution: "@expo/env@npm:2.4.3" + dependencies: + chalk: "npm:^4.0.0" + debug: "npm:^4.3.4" + getenv: "npm:^2.0.0" + checksum: 10c0/36eb2dacda0765eca69b3df7aaa3e5a74fb05561f5e223ca19a376a70ed18934edb1782345299fb9b026f0d1e4773f047835f1c16035151c1a76a1e373b29412 + languageName: node + linkType: hard + +"@expo/expo-modules-macros-plugin@npm:0.6.1": + version: 0.6.1 + resolution: "@expo/expo-modules-macros-plugin@npm:0.6.1" + checksum: 10c0/1cad524b3468650f1504c09f300b2be2f469b2e997788d7d6a443a1d13944bae679f6976fc1d13d4ffa485ccc5ddb562919dca79aa1d3b46e6adaa78cb787842 languageName: node linkType: hard @@ -2544,11 +2579,11 @@ __metadata: languageName: node linkType: hard -"@expo/fingerprint@npm:^0.20.1": - version: 0.20.1 - resolution: "@expo/fingerprint@npm:0.20.1" +"@expo/fingerprint@npm:^0.20.13": + version: 0.20.13 + resolution: "@expo/fingerprint@npm:0.20.13" dependencies: - "@expo/env": "npm:^2.4.0" + "@expo/env": "npm:^2.4.3" "@expo/spawn-async": "npm:^1.8.0" arg: "npm:^5.0.2" chalk: "npm:^4.1.2" @@ -2561,7 +2596,7 @@ __metadata: semver: "npm:^7.6.0" bin: fingerprint: bin/cli.js - checksum: 10c0/cff1ff80f3425abaf4c5afa5a246dfbf4eb1ac47bea6cff738d21269695dc9bf012fad5162bfe1f421291be3ac34d65edf0704614b4aec7e3fabe978cafa4793 + checksum: 10c0/0fc278d17080b5855db1d0afd3b6d5d4c8eaccbe53542c9d8fc5c7e385b43b03c4445ba11d085fc8c86308347efb774d75a9c0201973e7b0d8a6823af36e1159 languageName: node linkType: hard @@ -2582,18 +2617,18 @@ __metadata: languageName: node linkType: hard -"@expo/image-utils@npm:^0.11.0": - version: 0.11.0 - resolution: "@expo/image-utils@npm:0.11.0" +"@expo/image-utils@npm:^0.11.5": + version: 0.11.5 + resolution: "@expo/image-utils@npm:0.11.5" dependencies: - "@expo/require-utils": "npm:^57.0.0" + "@expo/require-utils": "npm:^57.0.5" "@expo/spawn-async": "npm:^1.8.0" chalk: "npm:^4.0.0" getenv: "npm:^2.0.0" jimp-compact: "npm:0.16.1" parse-png: "npm:^2.1.0" semver: "npm:^7.6.0" - checksum: 10c0/b177b5f33d80e81c8cf63fb23adcf79c38887edb7f47958f9b704ec7cf36b1886a5bbed46097ba8457955ce5f2f0bf436477b1a1b4e8ebd36795984a5754e9ed + checksum: 10c0/bca05d61164c88eafcbb01e82eea92679b9fcbc435ad50f0b8f7b0c74259ea50a7e7535d5403ea747be241c9560b04be66df8f3e0f926a6da1e5a1954a41a45d languageName: node linkType: hard @@ -2614,16 +2649,16 @@ __metadata: languageName: node linkType: hard -"@expo/inline-modules@npm:^0.1.1": - version: 0.1.1 - resolution: "@expo/inline-modules@npm:0.1.1" +"@expo/inline-modules@npm:^0.1.7": + version: 0.1.7 + resolution: "@expo/inline-modules@npm:0.1.7" dependencies: - "@expo/config-plugins": "npm:~57.0.1" - checksum: 10c0/fde016157163bc251089a304c2e5a008164e5605c2783377b747ff524ee0bc8ab5c8040c310cd9141062dc3c0a378e85b141c43716d434c144369a3e4dd2479b + "@expo/config-plugins": "npm:~57.0.9" + checksum: 10c0/3dff95ce7d61915a20687cf4d3112acfa1c5865d2ca6fa814783355fb4220f074344718c81ec319849f3d9a8e2b942ca540ba7ed1a4377af844b7e6637da2191 languageName: node linkType: hard -"@expo/json-file@npm:^11.0.0, @expo/json-file@npm:~11.0.0": +"@expo/json-file@npm:^11.0.0": version: 11.0.0 resolution: "@expo/json-file@npm:11.0.0" dependencies: @@ -2633,6 +2668,16 @@ __metadata: languageName: node linkType: hard +"@expo/json-file@npm:^11.0.1, @expo/json-file@npm:^11.2.1": + version: 11.2.1 + resolution: "@expo/json-file@npm:11.2.1" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + json5: "npm:^2.2.3" + checksum: 10c0/45cc14ea1b4f4bc124d6ee2d5412e3f7d23832c82bd21180558c2a070df425d700c1e84d49de57ec946b06e1287ecb63eda15addc2bf5c582bad916ae8ab7b46 + languageName: node + linkType: hard + "@expo/json-file@npm:^8.2.37, @expo/json-file@npm:~8.3.0": version: 8.3.3 resolution: "@expo/json-file@npm:8.3.3" @@ -2664,13 +2709,23 @@ __metadata: languageName: node linkType: hard -"@expo/local-build-cache-provider@npm:^57.0.1": - version: 57.0.1 - resolution: "@expo/local-build-cache-provider@npm:57.0.1" +"@expo/json-file@npm:~11.0.1": + version: 11.0.1 + resolution: "@expo/json-file@npm:11.0.1" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + json5: "npm:^2.2.3" + checksum: 10c0/b93e8bf0654c7d417bf00a418932a3f676bc24bed75ff63a8c683229e2d1f3b7a48206fc3af7db307ed93a776adab51cb62ebb6a0ed77f86067c7ae85cc2f74d + languageName: node + linkType: hard + +"@expo/local-build-cache-provider@npm:^57.0.8": + version: 57.0.8 + resolution: "@expo/local-build-cache-provider@npm:57.0.8" dependencies: - "@expo/config": "npm:~57.0.1" + "@expo/config": "npm:~57.0.9" chalk: "npm:^4.1.2" - checksum: 10c0/1662962ca39e3ac3b134b95309356b91af273ef282c1388837167cd9f58606ca0487b583b5d3b573102d2ebbc5ee7be4ccfc01bd647302410b54956a1f8b8593 + checksum: 10c0/9750ae6dbf91a0fc5eb3ffef7f2974c1193a9c212e5cbf80fee78d777c1545cf0445544ea7bc61f0f77767dea7c40b263643caf0d75e54dc84aa9139eaa40795 languageName: node linkType: hard @@ -2690,6 +2745,22 @@ __metadata: languageName: node linkType: hard +"@expo/log-box@npm:^57.0.4": + version: 57.0.4 + resolution: "@expo/log-box@npm:57.0.4" + dependencies: + "@expo/dom-webview": "npm:^57.0.1" + anser: "npm:^1.4.9" + stacktrace-parser: "npm:^0.1.10" + peerDependencies: + "@expo/dom-webview": ^57.0.1 + expo: "*" + react: "*" + react-native: "*" + checksum: 10c0/750b3482d657f450d545130ffe8c3b4e8f860561ad55f75f3058d1e08e0b37c16d512470a52d33cac1d459bbfb695784b199acd15134ec4309bc67287d88709f + languageName: node + linkType: hard + "@expo/metro-config@npm:0.20.13, @expo/metro-config@npm:~0.20.0, @expo/metro-config@npm:~0.20.13": version: 0.20.13 resolution: "@expo/metro-config@npm:0.20.13" @@ -2717,18 +2788,18 @@ __metadata: languageName: node linkType: hard -"@expo/metro-config@npm:~57.0.2": - version: 57.0.2 - resolution: "@expo/metro-config@npm:57.0.2" +"@expo/metro-config@npm:~57.0.12": + version: 57.0.12 + resolution: "@expo/metro-config@npm:57.0.12" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.5" - "@expo/config": "npm:~57.0.1" - "@expo/env": "npm:~2.4.0" - "@expo/json-file": "npm:~11.0.0" - "@expo/metro": "npm:~56.0.0" - "@expo/require-utils": "npm:^57.0.0" + "@expo/config": "npm:~57.0.9" + "@expo/env": "npm:~2.4.3" + "@expo/json-file": "npm:~11.0.1" + "@expo/metro": "npm:~56.0.2" + "@expo/require-utils": "npm:^57.0.5" "@expo/spawn-async": "npm:^1.8.0" "@jridgewell/gen-mapping": "npm:^0.3.13" "@jridgewell/remapping": "npm:^2.3.5" @@ -2749,13 +2820,13 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 10c0/a8722a6c11b30f0d5bdc47722d44dfce34e5fae3e991bef828f713f22a793207bb2561fcfa9bcb332303257b83e2a7ae6460d4c9e37cab4abd729bf06e184497 + checksum: 10c0/eeb34426026d7b1188ba528c4e2c3c1f1023d9a2b0af192b120c6bcf0c89aa9d2c9c6af1086a02a05444a21a5eac4b2bdd89e11288abceacd7debd380edd864a languageName: node linkType: hard -"@expo/metro-file-map@npm:^57.0.0": - version: 57.0.0 - resolution: "@expo/metro-file-map@npm:57.0.0" +"@expo/metro-file-map@npm:^57.0.3": + version: 57.0.3 + resolution: "@expo/metro-file-map@npm:57.0.3" dependencies: debug: "npm:^4.3.4" fb-watchman: "npm:^2.0.2" @@ -2763,7 +2834,7 @@ __metadata: jest-worker: "npm:^29.7.0" micromatch: "npm:^4.0.4" walker: "npm:^1.0.8" - checksum: 10c0/fe66f5fc957acf504d85959253195ee0ef7afc3f90302095443bbcfcc46ecf43bd275409cbae86bbbfdb10676841e8db6d5c8a5edb1c8a76b3815e5cbad3b0ef + checksum: 10c0/57770deb2f83b21418ef86a9484521d27a66c20156a7aed33fc72a035d2b445b81bc9a10f464fb691a934cecf95da1fd30b759b09eee1bb6818f244d7d92d453 languageName: node linkType: hard @@ -2789,25 +2860,25 @@ __metadata: languageName: node linkType: hard -"@expo/metro@npm:~56.0.0": - version: 56.0.0 - resolution: "@expo/metro@npm:56.0.0" +"@expo/metro@npm:~56.0.2": + version: 56.0.2 + resolution: "@expo/metro@npm:56.0.2" dependencies: - metro: "npm:0.84.4" - metro-babel-transformer: "npm:0.84.4" - metro-cache: "npm:0.84.4" - metro-cache-key: "npm:0.84.4" - metro-config: "npm:0.84.4" - metro-core: "npm:0.84.4" - metro-file-map: "npm:0.84.4" - metro-minify-terser: "npm:0.84.4" - metro-resolver: "npm:0.84.4" - metro-runtime: "npm:0.84.4" - metro-source-map: "npm:0.84.4" - metro-symbolicate: "npm:0.84.4" - metro-transform-plugins: "npm:0.84.4" - metro-transform-worker: "npm:0.84.4" - checksum: 10c0/51f647dfce71a45ac0092ae06826be91ed05000eb96390c79499c407678121ee9fed1d807d00356e4636020801a42395ef32d316c997fad34806207145d9e9d1 + metro: "npm:0.84.5" + metro-babel-transformer: "npm:0.84.5" + metro-cache: "npm:0.84.5" + metro-cache-key: "npm:0.84.5" + metro-config: "npm:0.84.5" + metro-core: "npm:0.84.5" + metro-file-map: "npm:0.84.5" + metro-minify-terser: "npm:0.84.5" + metro-resolver: "npm:0.84.5" + metro-runtime: "npm:0.84.5" + metro-source-map: "npm:0.84.5" + metro-symbolicate: "npm:0.84.5" + metro-transform-plugins: "npm:0.84.5" + metro-transform-worker: "npm:0.84.5" + checksum: 10c0/5cf6b2ffe125d6d54138757e8fada0d88515ee0ec2113595ca224babf8baf95b866e12eba51cdb1d89aae4476a7982a653e46ea2091b22e1433984ae608cc380 languageName: node linkType: hard @@ -2822,7 +2893,7 @@ __metadata: languageName: node linkType: hard -"@expo/osascript@npm:^2.2.4, @expo/osascript@npm:^2.7.0": +"@expo/osascript@npm:^2.2.4": version: 2.7.0 resolution: "@expo/osascript@npm:2.7.0" dependencies: @@ -2831,7 +2902,30 @@ __metadata: languageName: node linkType: hard -"@expo/package-manager@npm:^1.13.0, @expo/package-manager@npm:^1.8.4": +"@expo/osascript@npm:^2.7.1": + version: 2.8.1 + resolution: "@expo/osascript@npm:2.8.1" + dependencies: + "@expo/spawn-async": "npm:^1.8.0" + checksum: 10c0/e9237ea4524108a4d99d271da0cbd7eb1a7a001597fe574e463e784ad7c564e597ca6a0a9d0fedeab718bf251e2374a522a6d20d7441ffd60d1bc897b2761721 + languageName: node + linkType: hard + +"@expo/package-manager@npm:^1.13.1": + version: 1.14.1 + resolution: "@expo/package-manager@npm:1.14.1" + dependencies: + "@expo/json-file": "npm:^11.2.1" + "@expo/spawn-async": "npm:^1.8.0" + chalk: "npm:^4.0.0" + npm-package-arg: "npm:^11.0.0" + ora: "npm:^3.4.0" + resolve-workspace-root: "npm:^2.0.0" + checksum: 10c0/095567e0296475dbd1edfc53ee8e4ff4ddea1b7032e02d9505c2e8dc373f676335682b19c8ab5eb119bd06035f990b741eb8defa79ce5fceb2d6abb3e3a5229e + languageName: node + linkType: hard + +"@expo/package-manager@npm:^1.8.4": version: 1.13.0 resolution: "@expo/package-manager@npm:1.13.0" dependencies: @@ -2889,21 +2983,32 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:^57.0.3": - version: 57.0.3 - resolution: "@expo/prebuild-config@npm:57.0.3" +"@expo/plist@npm:^0.8.1": + version: 0.8.1 + resolution: "@expo/plist@npm:0.8.1" dependencies: - "@expo/config": "npm:~57.0.1" - "@expo/config-plugins": "npm:~57.0.1" - "@expo/config-types": "npm:^57.0.1" - "@expo/image-utils": "npm:^0.11.0" - "@expo/json-file": "npm:^11.0.0" - "@react-native/normalize-colors": "npm:0.86.0" + "@xmldom/xmldom": "npm:^0.8.8" + base64-js: "npm:^1.5.1" + xmlbuilder: "npm:^15.1.1" + checksum: 10c0/45f130f3d5155d46dc415ab61b97449d5cc7bf47e41ed37965f12e50cc9728aa7c4da83fc958a8d7113e31e4342baebc1b2517de7e20186f3e64d53be378a9ce + languageName: node + linkType: hard + +"@expo/prebuild-config@npm:^57.0.16": + version: 57.0.16 + resolution: "@expo/prebuild-config@npm:57.0.16" + dependencies: + "@expo/config": "npm:~57.0.9" + "@expo/config-plugins": "npm:~57.0.9" + "@expo/config-types": "npm:^57.0.2" + "@expo/image-utils": "npm:^0.11.5" + "@expo/json-file": "npm:^11.0.1" + "@react-native/normalize-colors": "npm:0.86.3" debug: "npm:^4.3.1" - expo-modules-autolinking: "npm:~57.0.3" + expo-modules-autolinking: "npm:~57.0.13" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" - checksum: 10c0/190a9c6b2c53df0ab4a355e37a53b6ba43431ce15516602451c34264635ed77e6ba18a099b12dc6f80dc5e085595b90333da8bd071c8678b4d2b1eccda0f29ab + checksum: 10c0/3c57618fcde5bc7cbbb55b20ff130e7b64f098668a904434b17d9471c69a7df26c73429cbd51e504961d658882da82db41e03631ccbd5df1d538584c0e079a99 languageName: node linkType: hard @@ -2925,34 +3030,34 @@ __metadata: languageName: node linkType: hard -"@expo/require-utils@npm:^57.0.0": - version: 57.0.0 - resolution: "@expo/require-utils@npm:57.0.0" +"@expo/require-utils@npm:^57.0.5": + version: 57.0.5 + resolution: "@expo/require-utils@npm:57.0.5" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.25.2" "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" peerDependencies: - typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 + typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/e4dafa26fd697c43663b73d5958226a8f3866b625d5f72c1078a95810afbb13679c539c7a7ccde667b9080e45a93fb6123f2c166840757f39d2e1e03fdfbe989 + checksum: 10c0/42841b76d6540098b664bee633e6ef9825ac84041e7c91045bd15a84d6aed4f2ad1f5027da263755a1e2dc2190283e7b7d6c4fb9ec3335c7a87016606b443754 languageName: node linkType: hard -"@expo/router-server@npm:^57.0.1": - version: 57.0.1 - resolution: "@expo/router-server@npm:57.0.1" +"@expo/router-server@npm:^57.0.11": + version: 57.0.11 + resolution: "@expo/router-server@npm:57.0.11" dependencies: debug: "npm:^4.3.4" peerDependencies: - "@expo/metro-runtime": ^57.0.2 + "@expo/metro-runtime": ^57.0.16 expo: "*" - expo-constants: ^57.0.2 - expo-font: ^57.0.0 + expo-constants: ^57.0.19 + expo-font: ^57.0.4 expo-router: "*" - expo-server: ^57.0.0 + expo-server: ^57.0.3 react: "*" react-dom: "*" react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 @@ -2965,7 +3070,7 @@ __metadata: optional: true react-server-dom-webpack: optional: true - checksum: 10c0/989a7f6c08bd25cb521e78af041de2bf820b62f42586bbbbcd2a3895fcfd96a0dfb1387dd9f31e5ef65e923a24dc6a00b6aab4a735a1723b42fd6118f5df91a0 + checksum: 10c0/1b5d19bff610db858d2921a39b3e94cc9699ed66bbdc2147f9268faa7f26921bab51efd6e7c2ffe50a86b8a191780fff2e55f00690e76b0616bce3d647c2cae4 languageName: node linkType: hard @@ -2976,6 +3081,13 @@ __metadata: languageName: node linkType: hard +"@expo/schema-utils@npm:^57.0.2": + version: 57.0.2 + resolution: "@expo/schema-utils@npm:57.0.2" + checksum: 10c0/5438d6dd1cb58c35c1202cefd7bb44f38eb7078da08b706849154bd6d97f0a9db7a41862110e34d7e111edf50ac44ffe132b0af64ebfdcce8203eb8e5ecd51b9 + languageName: node + linkType: hard + "@expo/sdk-runtime-versions@npm:^1.0.0": version: 1.0.0 resolution: "@expo/sdk-runtime-versions@npm:1.0.0" @@ -6007,13 +6119,13 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/babel-plugin-codegen@npm:0.86.0" +"@react-native/babel-plugin-codegen@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/babel-plugin-codegen@npm:0.86.3" dependencies: "@babel/traverse": "npm:^7.29.0" - "@react-native/codegen": "npm:0.86.0" - checksum: 10c0/b9263b7fd6a40411639e2343e17454fa9e988e651f44ec9149bd0c3a7945166863713b01d21249b81e62bd9ec67e356fbbee860e7b7f8479df26310b90d2bd4e + "@react-native/codegen": "npm:0.86.3" + checksum: 10c0/e381c2769e05308d85a5705e803387de5a61726c9dd36c48e84e916e790489f65fb8cb0024b257fca54146a03ef62ee96ef14391ea3370f8db77d59b204cb8d2 languageName: node linkType: hard @@ -6284,9 +6396,9 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/codegen@npm:0.86.0" +"@react-native/codegen@npm:0.86.2": + version: 0.86.2 + resolution: "@react-native/codegen@npm:0.86.2" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.29.0" @@ -6297,13 +6409,13 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10c0/22ca5657595438f5e464223a65b25567b3e7106995c8ae59c5853d8cdb3df59065db54c4cb74e958bbe2930b0aded8cd518c2fc1ef13a4740a05fb1faa3ae160 + checksum: 10c0/3b36b5d99a525195e61c1197d88118c774654de6e644a677b29461bd2b28718a751f1c45ee25efa6b274f27d36efb096a3ec816c5fba1cda1a5f5843e4239a0a languageName: node linkType: hard -"@react-native/codegen@npm:0.86.2": - version: 0.86.2 - resolution: "@react-native/codegen@npm:0.86.2" +"@react-native/codegen@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/codegen@npm:0.86.3" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.29.0" @@ -6314,7 +6426,7 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10c0/3b36b5d99a525195e61c1197d88118c774654de6e644a677b29461bd2b28718a751f1c45ee25efa6b274f27d36efb096a3ec816c5fba1cda1a5f5843e4239a0a + checksum: 10c0/2dc1f49b342d009c2efd56d6d2839fdffac4afefba2e0f2159c8491ce48aef9eb60a0cec2fa88569f956eabd6915f47a5b27ad1cf43463a55e67b213edb84fe7 languageName: node linkType: hard @@ -6445,13 +6557,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/debugger-frontend@npm:0.86.0" - checksum: 10c0/bc86a765dfbcaae35f501244d5a52aa0723196fe34ba177c2e3398491df6af1aa084ace044fde668e05bfec3daf15f735c20c79a8b98bd578b38891913e337e2 - languageName: node - linkType: hard - "@react-native/debugger-frontend@npm:0.86.2": version: 0.86.2 resolution: "@react-native/debugger-frontend@npm:0.86.2" @@ -6459,6 +6564,13 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-frontend@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/debugger-frontend@npm:0.86.3" + checksum: 10c0/377e3cb20097d6f298513f2ab4a98581c212cf7b54e50df85384bc5e6ae73a70f97d4e27047658abe60f39d3ab533e8904033678be732aff52a66355c7c8101d + languageName: node + linkType: hard + "@react-native/debugger-frontend@npm:0.87.1": version: 0.87.1 resolution: "@react-native/debugger-frontend@npm:0.87.1" @@ -6466,25 +6578,25 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/debugger-shell@npm:0.86.0" +"@react-native/debugger-shell@npm:0.86.2": + version: 0.86.2 + resolution: "@react-native/debugger-shell@npm:0.86.2" dependencies: cross-spawn: "npm:^7.0.6" debug: "npm:^4.4.0" fb-dotslash: "npm:0.5.8" - checksum: 10c0/4cc7626b826195403c9b9ac8ad1ed9938ad83858424aa59b980882349966aa0fa6b509066006bc7c7be2c0d20767fbc7d75c8df0007f853b57646c9157fcb3e7 + checksum: 10c0/8aec11d0ccf8c30d968173d5ff024be1b854f600acc48c3f96f1743bfaad708e3da1a49ed672c63fed21c58017dcc4c442b5c456e7e212149295be33bfcf6e9b languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.86.2": - version: 0.86.2 - resolution: "@react-native/debugger-shell@npm:0.86.2" +"@react-native/debugger-shell@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/debugger-shell@npm:0.86.3" dependencies: cross-spawn: "npm:^7.0.6" debug: "npm:^4.4.0" fb-dotslash: "npm:0.5.8" - checksum: 10c0/8aec11d0ccf8c30d968173d5ff024be1b854f600acc48c3f96f1743bfaad708e3da1a49ed672c63fed21c58017dcc4c442b5c456e7e212149295be33bfcf6e9b + checksum: 10c0/f6c0c7f15e9f9aed247d96be3bca5768f94a65cace549b62bf899c72e0aaff5a564b7898f3f63dc5e987728d4b73db2f786c4373e64272b029a43fef64153395 languageName: node linkType: hard @@ -6556,13 +6668,13 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/dev-middleware@npm:0.86.0" +"@react-native/dev-middleware@npm:0.86.2": + version: 0.86.2 + resolution: "@react-native/dev-middleware@npm:0.86.2" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.86.0" - "@react-native/debugger-shell": "npm:0.86.0" + "@react-native/debugger-frontend": "npm:0.86.2" + "@react-native/debugger-shell": "npm:0.86.2" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.3.0" connect: "npm:^3.6.5" @@ -6572,17 +6684,17 @@ __metadata: open: "npm:^7.0.3" serve-static: "npm:^1.16.2" ws: "npm:^7.5.10" - checksum: 10c0/14e704d723d7c3eaae94552251b50b31b3769dbfbc2b48f6cabe422b1bfc640dae20751997d8fd8bbe26a22c6865a46083e4d3621d7b200b19c79e515ef54bb9 + checksum: 10c0/4e61e17f1cf581b15d570a82401b0c324e6e93ae26661e5dba40579353af122d22dd6d9b4bffefeb5ac4858866bf6a1974b4322f6a560129a6bffb55377bf6c1 languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.86.2": - version: 0.86.2 - resolution: "@react-native/dev-middleware@npm:0.86.2" +"@react-native/dev-middleware@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/dev-middleware@npm:0.86.3" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.86.2" - "@react-native/debugger-shell": "npm:0.86.2" + "@react-native/debugger-frontend": "npm:0.86.3" + "@react-native/debugger-shell": "npm:0.86.3" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.3.0" connect: "npm:^3.6.5" @@ -6592,7 +6704,7 @@ __metadata: open: "npm:^7.0.3" serve-static: "npm:^1.16.2" ws: "npm:^7.5.10" - checksum: 10c0/4e61e17f1cf581b15d570a82401b0c324e6e93ae26661e5dba40579353af122d22dd6d9b4bffefeb5ac4858866bf6a1974b4322f6a560129a6bffb55377bf6c1 + checksum: 10c0/d313ed01d6e8e7ddff84fee8285a23138863486af02466fb7431891928cab3c51d90859ac883f64cd25051b90bba609990224e9f8d31e8be474f8355deec631d languageName: node linkType: hard @@ -6807,13 +6919,6 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.86.0": - version: 0.86.0 - resolution: "@react-native/normalize-colors@npm:0.86.0" - checksum: 10c0/d836506a642e1c636015fca23c84ca372b10fb1457df98f95e8bc5716399292d5740b94efe13f9be08c21323ddc3c2c45205d316f0f5440f24e5919b5075f69a - languageName: node - linkType: hard - "@react-native/normalize-colors@npm:0.86.2": version: 0.86.2 resolution: "@react-native/normalize-colors@npm:0.86.2" @@ -6821,6 +6926,13 @@ __metadata: languageName: node linkType: hard +"@react-native/normalize-colors@npm:0.86.3": + version: 0.86.3 + resolution: "@react-native/normalize-colors@npm:0.86.3" + checksum: 10c0/33893681bdb3235d35dcb9f2fff5e1b2b0996be08c3cef24afed32c3a931298349ad5cbd33c3bb7fbf506f735d3e37995684d26ba9241795bbd3e709bd8d3165 + languageName: node + linkType: hard + "@react-native/normalize-colors@npm:0.87.1": version: 0.87.1 resolution: "@react-native/normalize-colors@npm:0.87.1" @@ -8964,6 +9076,15 @@ __metadata: languageName: node linkType: hard +"agent-cli-detector@npm:0.1.7": + version: 0.1.7 + resolution: "agent-cli-detector@npm:0.1.7" + bin: + agent-cli-detector: dist/cli.js + checksum: 10c0/4ff016e5fad2d96a0c53db9fd75c2359bb005a672969e8e6e7bce5c910e94107c226cbcba1303409d1da3a1cdf8f22290e63049705bb530823cce4699d39fc1d + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -10046,9 +10167,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~57.0.1": - version: 57.0.1 - resolution: "babel-preset-expo@npm:57.0.1" +"babel-preset-expo@npm:~57.0.13": + version: 57.0.13 + resolution: "babel-preset-expo@npm:57.0.13" dependencies: "@babel/generator": "npm:^7.20.5" "@babel/helper-module-imports": "npm:^7.25.9" @@ -10086,7 +10207,7 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/preset-typescript": "npm:^7.23.0" - "@react-native/babel-plugin-codegen": "npm:0.86.0" + "@react-native/babel-plugin-codegen": "npm:0.86.3" babel-plugin-react-compiler: "npm:^1.0.0" babel-plugin-react-native-web: "npm:~0.21.0" babel-plugin-syntax-hermes-parser: "npm:^0.36.0" @@ -10095,7 +10216,7 @@ __metadata: peerDependencies: "@babel/runtime": ^7.20.0 expo: "*" - expo-widgets: ^57.0.1 + expo-widgets: ^57.0.21 react-refresh: ">=0.14.0 <1.0.0" peerDependenciesMeta: "@babel/runtime": @@ -10104,7 +10225,7 @@ __metadata: optional: true expo-widgets: optional: true - checksum: 10c0/9a24a39686ce6f302ce3de4c587fd97b811a55e7c52205d85bb12ebc17829c4907ab1ee9c665e3041658a394369ecdbfa16ba069f21237ac32c97dd791d4374e + checksum: 10c0/a667996292102735876d8b0c6b0e8a3990a9c895415fbf0cc689daba7dbe1f688de6ad8ac54bb935e83350da3f23a663350d4c796ab4c5d6e7ba2c2db5188524 languageName: node linkType: hard @@ -13442,17 +13563,17 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~57.0.2": - version: 57.0.2 - resolution: "expo-asset@npm:57.0.2" +"expo-asset@npm:~57.0.18": + version: 57.0.18 + resolution: "expo-asset@npm:57.0.18" dependencies: - "@expo/image-utils": "npm:^0.11.0" - expo-constants: "npm:~57.0.2" + "@expo/image-utils": "npm:^0.11.5" + expo-constants: "npm:~57.0.19" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10c0/12093260458b4a110a5608f1b8e9c4dc1a435a293ee8714c0cc25232f5c347c21af3824937e80a54468dda1b68ac09ffd11d8c01c2d128532bc0129f46da3376 + checksum: 10c0/b4c944ad85c5c0bc0bbd2888712ba30a3e582ff9c0d9a47dc4189bfac53beafdad1c5b0e10a8fd39aee587948fcf83a5ec31aa42b99263756a00a750e7c318a2 languageName: node linkType: hard @@ -13469,6 +13590,18 @@ __metadata: languageName: node linkType: hard +"expo-constants@npm:~57.0.19, expo-constants@npm:~57.0.20": + version: 57.0.20 + resolution: "expo-constants@npm:57.0.20" + dependencies: + "@expo/env": "npm:~2.4.3" + peerDependencies: + expo: "*" + react-native: "*" + checksum: 10c0/5d719dd67b92e30f7ba67917cd83010438572e5475037f9a98f7aadec40a514f1417ce3b2c8ec8a4d9c01991fb98cac656eaf068cd598d49de1b9ef5ce834523 + languageName: node + linkType: hard + "expo-constants@npm:~57.0.2": version: 57.0.2 resolution: "expo-constants@npm:57.0.2" @@ -13548,13 +13681,13 @@ __metadata: languageName: node linkType: hard -"expo-file-system@npm:~57.0.0": - version: 57.0.0 - resolution: "expo-file-system@npm:57.0.0" +"expo-file-system@npm:~57.0.7": + version: 57.0.7 + resolution: "expo-file-system@npm:57.0.7" peerDependencies: expo: "*" react-native: "*" - checksum: 10c0/b6eb3d7cb8b0d12f696962d821b24dfe281b5b8a809a6de1f1157c5f16020adc0d414349b3b807ed475062b93f03df25107b409cd01d58f869e6a0b396ba1569 + checksum: 10c0/ca02903e7b918f2b73f9f009d13e2f3f2eda46b04d479af770385c463631feb843f6a742c34a75ad7e892862dfb4b4311fa0520d7599a9f01e478014b105d3b0 languageName: node linkType: hard @@ -13570,16 +13703,16 @@ __metadata: languageName: node linkType: hard -"expo-font@npm:~57.0.0": - version: 57.0.0 - resolution: "expo-font@npm:57.0.0" +"expo-font@npm:~57.0.4": + version: 57.0.4 + resolution: "expo-font@npm:57.0.4" dependencies: fontfaceobserver: "npm:^2.1.0" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10c0/ecb62ecbdbfe03c44141dcc5001e3d1e1d57e340c50b74a2d8e014e4c4435a1ceb8c2612a0a096fe2cc2b628423d4bf7c05d19320986ca2a8e85fc09ff1f7e99 + checksum: 10c0/b9e13197971c3a3b354e498315033e11d4a834de695637914273225a24fd7c88172b23ab7eb1dde88620dbe093b6958d361751d839b87d4bf09d9ad5ca2b0117 languageName: node linkType: hard @@ -13631,13 +13764,13 @@ __metadata: languageName: node linkType: hard -"expo-keep-awake@npm:~57.0.0": - version: 57.0.0 - resolution: "expo-keep-awake@npm:57.0.0" +"expo-keep-awake@npm:~57.0.2": + version: 57.0.2 + resolution: "expo-keep-awake@npm:57.0.2" peerDependencies: expo: "*" react: "*" - checksum: 10c0/d02bd9f75b74dde9a4ed42b2ecc5b3947f54135bb1f01461d442e9fc06dc96d995b4ae74bcab1fbe21931ee9d0ec2f9b364bc4a045ebbf729ade0b88c3f6bf5f + checksum: 10c0/2e7cd81adea1c62f49f4e9ba76b606960969779222626abc90c6b4cd872c0e47c062eebb5e1688550676f55300677348252d9fe8a7c95d03e1320496a2c136ca languageName: node linkType: hard @@ -13706,17 +13839,17 @@ __metadata: languageName: node linkType: hard -"expo-modules-autolinking@npm:~57.0.3": - version: 57.0.3 - resolution: "expo-modules-autolinking@npm:57.0.3" +"expo-modules-autolinking@npm:~57.0.13": + version: 57.0.13 + resolution: "expo-modules-autolinking@npm:57.0.13" dependencies: - "@expo/require-utils": "npm:^57.0.0" + "@expo/require-utils": "npm:^57.0.5" "@expo/spawn-async": "npm:^1.8.0" chalk: "npm:^4.1.0" commander: "npm:^7.2.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10c0/2c0fe80495fc8ac3a7896798489fb5ed1d57b6e8e3595df459f2728ece07c2302c87752118a558a7fe58139c10fdcb1bfddaae9e202ee0b51f4093f63d166d27 + checksum: 10c0/cf6105f72c4f5545d8d8791aeda3210ad0281919bf67ea2efa8956a6191a377e1d87885b11969bd18c79d1200ed695b1e27f96743c564ebb3a2d0a0ac5de7bcb languageName: node linkType: hard @@ -13729,12 +13862,12 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:~57.0.1": - version: 57.0.1 - resolution: "expo-modules-core@npm:57.0.1" +"expo-modules-core@npm:~57.0.20": + version: 57.0.20 + resolution: "expo-modules-core@npm:57.0.20" dependencies: - "@expo/expo-modules-macros-plugin": "npm:0.3.0" - expo-modules-jsi: "npm:~57.0.0" + "@expo/expo-modules-macros-plugin": "npm:0.6.1" + expo-modules-jsi: "npm:~57.1.1" invariant: "npm:^2.2.4" peerDependencies: react: "*" @@ -13743,16 +13876,16 @@ __metadata: peerDependenciesMeta: react-native-worklets: optional: true - checksum: 10c0/6a166e48b9651016d0135577fc59719993e530d16fd797bc1ac9373c94e41c0ab7ca67274130fc85fbeedafd56ad929bc5ed66cdfc27465d18a5c783cbe4a32f + checksum: 10c0/cb630d9db9a5d1f7d4f2c229a54238e3e52c52849ed2c064ac61f7d617d22d692ac1d61270f37e3c8c834dd628a56dd432ccb0edb73cf0c37c5b55aae379ef73 languageName: node linkType: hard -"expo-modules-jsi@npm:~57.0.0": - version: 57.0.0 - resolution: "expo-modules-jsi@npm:57.0.0" +"expo-modules-jsi@npm:~57.1.1": + version: 57.1.1 + resolution: "expo-modules-jsi@npm:57.1.1" peerDependencies: react-native: "*" - checksum: 10c0/d8776ae62e698bbbefa7eb9ff13133eb0bfc78dce02498c24bc4c6ebaa3844eb4d5960dc3254b856e35372170f846bc19c7024e46e06939d161be3317fbe8bf7 + checksum: 10c0/48ba18200a38dd27c2035e2234ff182a03730764fa20c1be4957156b7d49f950beeb394dab52527c5951a3ea6669d6ce1adb40e384f9b18803e8bb00039b172a languageName: node linkType: hard @@ -13829,6 +13962,13 @@ __metadata: languageName: node linkType: hard +"expo-server@npm:^57.0.3": + version: 57.0.3 + resolution: "expo-server@npm:57.0.3" + checksum: 10c0/541d9b319ba513df718868c87a8d57e30161c3879b7d5b43f308923290ce5ee349a1b3469901c2f382984b6595f4cf6beaee9d870f5eb874c45ddc0a42a13e56 + languageName: node + linkType: hard + "expo-status-bar@npm:~57.0.0": version: 57.0.0 resolution: "expo-status-bar@npm:57.0.0" @@ -13956,30 +14096,30 @@ __metadata: languageName: node linkType: hard -"expo@npm:^57.0.0": - version: 57.0.1 - resolution: "expo@npm:57.0.1" +"expo@npm:^57.0.26": + version: 57.0.26 + resolution: "expo@npm:57.0.26" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:^57.0.3" - "@expo/config": "npm:~57.0.1" - "@expo/config-plugins": "npm:~57.0.1" - "@expo/devtools": "npm:~57.0.0" - "@expo/dom-webview": "npm:~57.0.0" - "@expo/fingerprint": "npm:^0.20.1" - "@expo/local-build-cache-provider": "npm:^57.0.1" - "@expo/log-box": "npm:^57.0.0" - "@expo/metro": "npm:~56.0.0" - "@expo/metro-config": "npm:~57.0.2" + "@expo/cli": "npm:^57.0.27" + "@expo/config": "npm:~57.0.9" + "@expo/config-plugins": "npm:~57.0.9" + "@expo/devtools": "npm:~57.0.1" + "@expo/dom-webview": "npm:~57.0.1" + "@expo/fingerprint": "npm:^0.20.13" + "@expo/local-build-cache-provider": "npm:^57.0.8" + "@expo/log-box": "npm:^57.0.4" + "@expo/metro": "npm:~56.0.2" + "@expo/metro-config": "npm:~57.0.12" "@ungap/structured-clone": "npm:^1.3.0" - babel-preset-expo: "npm:~57.0.1" - expo-asset: "npm:~57.0.2" - expo-constants: "npm:~57.0.2" - expo-file-system: "npm:~57.0.0" - expo-font: "npm:~57.0.0" - expo-keep-awake: "npm:~57.0.0" - expo-modules-autolinking: "npm:~57.0.3" - expo-modules-core: "npm:~57.0.1" + babel-preset-expo: "npm:~57.0.13" + expo-asset: "npm:~57.0.18" + expo-constants: "npm:~57.0.20" + expo-file-system: "npm:~57.0.7" + expo-font: "npm:~57.0.4" + expo-keep-awake: "npm:~57.0.2" + expo-modules-autolinking: "npm:~57.0.13" + expo-modules-core: "npm:~57.0.20" pretty-format: "npm:^29.7.0" react-refresh: "npm:^0.14.2" whatwg-url-minimum: "npm:^0.1.2" @@ -14006,7 +14146,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10c0/3f4453f6224609830f1c51f12e1099c925cb792d30babd1befedfb633fe4f429e91700199036a700292af4d7d7fd8f1e6679cac412dd7b12870f4bc48ff4f72f + checksum: 10c0/8dbd41fe0d74b50b1238f642f9b3a6ef7725f031d2df524a92636dd473140448ab6751a4dfc1b3a75eb6806e8d36f37149c81c2c6dd8c0092b871d5f4a04f2ae languageName: node linkType: hard @@ -20185,10 +20325,10 @@ __metadata: languageName: node linkType: hard -"multitars@npm:^1.0.0": - version: 1.0.0 - resolution: "multitars@npm:1.0.0" - checksum: 10c0/c3c432ae6c76f802270bfaff63de66ba740d8599503e78cca7c489d43968869509330f68329abd5d3dfc495790c47598fd3994a2cccb68b738d76eba66ae4b04 +"multitars@npm:^1.0.2": + version: 1.0.2 + resolution: "multitars@npm:1.0.2" + checksum: 10c0/3ba8805a66bcdb95a9841e13b59370bd737777a0435fed661e321af89e6f235ef286ca5b5d7992c4f079795826e8734e9aa7db368e389bc7a008550b50d928d2 languageName: node linkType: hard @@ -24352,6 +24492,15 @@ __metadata: languageName: node linkType: hard +"sandbox-cli-detector@npm:^0.2.0": + version: 0.2.0 + resolution: "sandbox-cli-detector@npm:0.2.0" + bin: + sandbox-cli-detector: dist/cli.js + checksum: 10c0/e70964918150079a3183948a8adadcde736823da2ad1135b4ccead2baa8d24d6487ddd222c030f94c9ef54e84bc41aa525a5452ef4cb9239f6f64b2ac03337bc + languageName: node + linkType: hard + "sanitize-filename@npm:1.6.3, sanitize-filename@npm:^1.6.1": version: 1.6.3 resolution: "sanitize-filename@npm:1.6.3" @@ -24598,7 +24747,7 @@ __metadata: "@sentry/react-native": "npm:8.29.0" "@types/node": "npm:20.10.4" "@types/react": "npm:~19.2.10" - expo: "npm:^57.0.0" + expo: "npm:^57.0.26" expo-constants: "npm:~57.0.2" expo-dev-client: "npm:~57.0.3" expo-image-picker: "npm:~57.0.1" From 5f49f5967e75176f8f986d240e12eb13b1c7ff33 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Mon, 5 Oct 2026 11:18:21 +0200 Subject: [PATCH 2/2] test(e2e): add iOS crash-handler screenshot no-freeze regression check Reproduces getsentry/sentry-cocoa#9281 in the Expo sample and asserts the crash-time screenshot path does not hang the crash handler: - `samples/expo/plugins/withIosSceneLifecycle.js` makes the sample adopt the iOS UIScene lifecycle with Expo's `EXExpoAppSceneDelegate` (a Swift, MainActor-isolated `UIWindowSceneDelegate`) and injects an off-main `abort()` test hook gated by `SENTRY_TEST_ABORT=1`. - `scripts/verify-ios-crash-screenshot-no-freeze.sh` builds the sample, crashes it off the main thread, and asserts a clean terminate + captured screenshot with no `dispatch_assert_queue_fail` re-entry. - `.github/workflows/ios-crash-screenshot-no-freeze.yml` runs it on a bundled cocoa version bump and on manual dispatch. This check is RED until the bundled sentry-cocoa carries the #9281 fix; the cocoa-bump PR turns it green. Co-Authored-By: Claude Opus 4.8 --- .../ios-crash-screenshot-no-freeze.yml | 66 +++++++++ samples/expo/AGENTS.md | 10 ++ samples/expo/app.json | 3 +- samples/expo/plugins/withIosSceneLifecycle.js | 93 +++++++++++++ .../verify-ios-crash-screenshot-no-freeze.sh | 126 ++++++++++++++++++ 5 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ios-crash-screenshot-no-freeze.yml create mode 100644 samples/expo/plugins/withIosSceneLifecycle.js create mode 100755 scripts/verify-ios-crash-screenshot-no-freeze.sh diff --git a/.github/workflows/ios-crash-screenshot-no-freeze.yml b/.github/workflows/ios-crash-screenshot-no-freeze.yml new file mode 100644 index 0000000000..3fb265df8d --- /dev/null +++ b/.github/workflows/ios-crash-screenshot-no-freeze.yml @@ -0,0 +1,66 @@ +name: iOS Crash Screenshot No-Freeze + +# Regression guard for the sentry-cocoa crash-handler freeze (getsentry/sentry-cocoa#9281): +# crashing off the main thread with the UIScene lifecycle + a Swift (MainActor) scene delegate + +# attachScreenshot must NOT hang the crash handler. See +# scripts/verify-ios-crash-screenshot-no-freeze.sh for the full mechanism. +# +# It validates whatever sentry-cocoa the SDK currently bundles, so it is wired to run when the +# bundled cocoa version changes (the podspec / version table) and on manual dispatch. It will be +# RED until the bundled cocoa is bumped to a release containing the fix — that is the point: the +# cocoa-bump PR turns it green. + +on: + workflow_dispatch: + push: + branches: [main] + paths: + - "packages/core/RNSentry.podspec" + - "packages/core/scripts/sentry_utils.rb" + - ".github/workflows/ios-crash-screenshot-no-freeze.yml" + - "scripts/verify-ios-crash-screenshot-no-freeze.sh" + - "samples/expo/plugins/withIosSceneLifecycle.js" + pull_request: + paths: + - "packages/core/RNSentry.podspec" + - "packages/core/scripts/sentry_utils.rb" + - ".github/workflows/ios-crash-screenshot-no-freeze.yml" + - "scripts/verify-ios-crash-screenshot-no-freeze.sh" + - "samples/expo/plugins/withIosSceneLifecycle.js" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +jobs: + verify: + name: Verify crash-time screenshot does not freeze + runs-on: macos-26-xlarge + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Enable Corepack + run: corepack enable + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6 + with: + package-manager-cache: false + node-version: 20 + cache: "yarn" + cache-dependency-path: yarn.lock + + - uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1 + with: + working-directory: samples/expo + ruby-version: "3.3.0" + bundler-cache: true + cache-version: 1 + + - name: Install SDK Dependencies + run: yarn install + + - name: Build SDK + run: yarn build + + - name: Verify crash-time screenshot does not freeze the crash handler + run: scripts/verify-ios-crash-screenshot-no-freeze.sh diff --git a/samples/expo/AGENTS.md b/samples/expo/AGENTS.md index fb2193c7b7..e1aaeaa44d 100644 --- a/samples/expo/AGENTS.md +++ b/samples/expo/AGENTS.md @@ -11,3 +11,13 @@ yarn android # Build & run the Android dev client (expo run:android) ``` `yarn start` then follows the Expo CLI prompts to open on an iOS simulator, Android emulator, or a physical device. Because the SDK ships native code, plain Expo Go isn't enough — the `run:*` scripts build a dev client that includes it. + +## iOS UIScene lifecycle + +The `plugins/withIosSceneLifecycle.js` config plugin makes this app adopt the iOS **UIScene lifecycle** with Expo's own `EXExpoAppSceneDelegate` (a Swift `UIWindowSceneDelegate`). This is where Apple/Expo are pushing every app ("Required by iOS 27"), and — importantly — it is the exact configuration behind the crash-handler freeze in [sentry-cocoa#9281](https://github.com/getsentry/sentry-cocoa/issues/9281). Keeping it as the sample's normal config means that bug class stays exercised by regular iOS CI. Expo 57 ships `ExpoAppSceneDelegate` but does not wire it up during prebuild yet, so the plugin adds the `UIApplicationSceneManifest` and adjusts the generated `AppDelegate`. + +### Crash-handler regression check + +The same plugin injects a documented test hook: launching the app with the env var **`SENTRY_TEST_ABORT=1`** crashes it via `abort()` on a **background thread** ~8s after launch. That makes SentryCrash's inline signal handler run off the main thread, forcing the crash-time screenshot (`attachScreenshot: true`) to read the MainActor scene-delegate `window` getter off-main — which **hangs** on an unfixed sentry-cocoa and **terminates cleanly** on a fixed one. The hook is inert unless the env var is set. + +`scripts/verify-ios-crash-screenshot-no-freeze.sh` (repo root) drives this end to end against whatever cocoa the SDK currently bundles, asserting a clean terminate + a captured `screenshot.png` with no `dispatch_assert_queue_fail` re-entry. It needs **Xcode 27 / iOS 26+** (Swift 6 isolation enforcement). To validate a local cocoa build before it is released, stage it and pass `SENTRY_XCFRAMEWORK_CACHE_DIR=` (containing `/Sentry.xcframework`). The `.github/workflows/ios-crash-screenshot-no-freeze.yml` workflow runs it on a cocoa version bump (and on manual dispatch) — it stays red until the bundled cocoa carries the fix. diff --git a/samples/expo/app.json b/samples/expo/app.json index 408725e684..5eb45f1029 100644 --- a/samples/expo/app.json +++ b/samples/expo/app.json @@ -89,7 +89,8 @@ } } ], - "expo-web-browser" + "expo-web-browser", + "./plugins/withIosSceneLifecycle" ], "extra": { "router": { diff --git a/samples/expo/plugins/withIosSceneLifecycle.js b/samples/expo/plugins/withIosSceneLifecycle.js new file mode 100644 index 0000000000..ce21f1a230 --- /dev/null +++ b/samples/expo/plugins/withIosSceneLifecycle.js @@ -0,0 +1,93 @@ +/** + * Makes the Expo sample adopt the iOS UIScene lifecycle with Expo's own `EXExpoAppSceneDelegate` + * (a Swift `UIWindowSceneDelegate`). This is the direction Apple/Expo are pushing every app + * ("Required by iOS 27"), and it is the exact configuration behind the crash-handler freeze in + * getsentry/sentry-cocoa#9281 — so by being the sample's normal config, it keeps that bug class + * exercised by regular CI. + * + * Expo 57 ships `ExpoAppSceneDelegate` but does not yet wire it up during prebuild, so this plugin + * does it: + * 1. Adds a `UIApplicationSceneManifest` to Info.plist pointing at `EXExpoAppSceneDelegate`. + * 2. Makes the generated `AppDelegate` conform to `ExpoReactNativeFactoryProvider` and defer the + * window / React Native start to the scene delegate. + * + * It also injects a small, documented test hook used by the crash-handler regression check + * (scripts/verify-ios-crash-screenshot-no-freeze.sh): when the app is launched with the runtime + * env var `SENTRY_TEST_ABORT=1`, it crashes via `abort()` on a background thread a few seconds + * after launch. SentryCrash then handles the signal off the main thread, forcing the crash-time + * screenshot to read the MainActor `window` getter off-main — which hangs on an unfixed cocoa and + * terminates cleanly on a fixed one. The hook is inert unless that env var is set, so it never + * affects normal runs. + */ +const { withInfoPlist, withAppDelegate } = require('@expo/config-plugins'); + +const SCENE_DELEGATE_CLASS = 'EXExpoAppSceneDelegate'; + +function withSceneManifest(config) { + return withInfoPlist(config, cfg => { + cfg.modResults.UIApplicationSceneManifest = { + UIApplicationSupportsMultipleScenes: false, + UISceneConfigurations: { + UIWindowSceneSessionRoleApplication: [ + { + UISceneConfigurationName: 'Default Configuration', + UISceneDelegateClassName: SCENE_DELEGATE_CLASS, + }, + ], + }, + }; + return cfg; + }); +} + +function patchAppDelegate(contents) { + let out = contents; + + // Conform to ExpoReactNativeFactoryProvider so the scene delegate can retrieve the factory the + // app delegate creates in didFinishLaunching. + const classDecl = 'class AppDelegate: ExpoAppDelegate {'; + if (!out.includes(classDecl)) { + throw new Error('[withIosSceneLifecycle] AppDelegate class declaration not found; Expo template changed.'); + } + out = out.replace(classDecl, 'class AppDelegate: ExpoAppDelegate, ExpoReactNativeFactoryProvider {'); + + // Remove the app-delegate window creation + RN start; under the scene lifecycle the scene + // delegate (ExpoAppSceneDelegate) owns the window and starts React Native. + const windowBlock = /#if os\(iOS\) \|\| os\(tvOS\)[\s\S]*?factory\.startReactNative\([\s\S]*?\)\s*#endif/; + if (!windowBlock.test(out)) { + throw new Error('[withIosSceneLifecycle] window/startReactNative block not found; Expo template changed.'); + } + out = out.replace( + windowBlock, + [ + '// [withIosSceneLifecycle] Scene lifecycle: ExpoAppSceneDelegate creates the window and', + ' // starts React Native in scene(_:willConnectTo:). Do NOT start it here.', + '', + ' // Test hook for the crash-handler regression check (sentry-cocoa#9281): when launched', + ' // with SENTRY_TEST_ABORT=1, crash on a background thread so SentryCrash\'s inline handler', + ' // runs off the main thread and the crash-time screenshot reads the MainActor window', + ' // getter off-main. Inert unless the env var is set.', + ' if ProcessInfo.processInfo.environment["SENTRY_TEST_ABORT"] == "1" {', + ' DispatchQueue.global().asyncAfter(deadline: .now() + 8.0) { abort() }', + ' }', + ].join('\n'), + ); + + return out; +} + +function withSceneAppDelegate(config) { + return withAppDelegate(config, cfg => { + if (cfg.modResults.language !== 'swift') { + throw new Error('[withIosSceneLifecycle] expected a Swift AppDelegate.'); + } + cfg.modResults.contents = patchAppDelegate(cfg.modResults.contents); + return cfg; + }); +} + +module.exports = function withIosSceneLifecycle(config) { + config = withSceneManifest(config); + config = withSceneAppDelegate(config); + return config; +}; diff --git a/scripts/verify-ios-crash-screenshot-no-freeze.sh b/scripts/verify-ios-crash-screenshot-no-freeze.sh new file mode 100755 index 0000000000..48c1810012 --- /dev/null +++ b/scripts/verify-ios-crash-screenshot-no-freeze.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# +# Regression check for the sentry-cocoa crash-handler freeze (issue getsentry/sentry-cocoa#9281). +# +# With the UIScene lifecycle + a Swift (MainActor) scene delegate + `attachScreenshot`, an unfixed +# sentry-cocoa reads the scene delegate's `window` getter off the crash thread, trips +# `dispatch_assert_queue(main)`, re-enters the signal handler, and HANGS on non-Mach crashes +# (abort/terminate). A fixed cocoa reads `UIWindowScene.windows` instead and terminates cleanly. +# +# This script drives the Expo sample (with the env-gated `withSceneCrashRepro` plugin), crashes it +# off the main thread, and ASSERTS the process terminated cleanly, wrote a crash report, and still +# captured a screenshot — with no `dispatch_assert_queue_fail` re-entry. +# +# It validates whatever sentry-cocoa the SDK currently bundles, so it goes green once the bundled +# cocoa version is bumped to a release that contains the fix. To validate a local cocoa build before +# release, stage it and pass its cache dir: +# SENTRY_XCFRAMEWORK_CACHE_DIR=/path/to/cache (containing /Sentry.xcframework) ... +# +# Usage: scripts/verify-ios-crash-screenshot-no-freeze.sh +# Exit code: 0 = fixed (clean terminate + screenshot), 1 = bug present or setup failure. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +EXPO_DIR="$REPO_ROOT/samples/expo" +IOS_DIR="$EXPO_DIR/ios" +BUNDLE_ID="io.sentry.expo.sample" +WORKDIR="${WORKDIR:-$(mktemp -d)}" +DD="$WORKDIR/DerivedData" +ABORT_DELAY_PADDING=20 # seconds to wait past the 8s in-app abort before declaring a freeze + +log() { printf '\n\033[1m==> %s\033[0m\n' "$*"; } +fail() { printf '\n\033[31mFAIL: %s\033[0m\n' "$*" >&2; exit 1; } + +# ---- 1. Pick an iOS 26+ simulator (Swift 6 isolation enforcement needs the iOS 26+ runtime) ------- +log "Selecting an iOS 26+ simulator" +SIM_ID="${SIM_ID:-$(xcrun simctl list devices available --json 2>/dev/null | python3 -c ' +import json, sys +data = json.load(sys.stdin)["devices"] +for runtime, devices in sorted(data.items()): + # runtime looks like com.apple.CoreSimulator.SimRuntime.iOS-26-5 + key = runtime.rsplit(".", 1)[-1] + if not key.startswith("iOS-"): + continue + try: + major = int(key.split("-")[1]) + except (IndexError, ValueError): + continue + if major < 26: + continue + for d in devices: + if d.get("isAvailable") and "iPhone" in d.get("name", ""): + print(d["udid"]); sys.exit(0) +')}" +[ -n "$SIM_ID" ] || fail "No iOS 26+ iPhone simulator available (required for Swift 6 isolation enforcement)." +echo "Simulator: $SIM_ID" +xcrun simctl boot "$SIM_ID" 2>/dev/null || true + +# ---- 2. Prebuild the sample (the withIosSceneLifecycle plugin adopts the UIScene lifecycle) ------- +log "Prebuilding Expo sample" +( cd "$EXPO_DIR" && CI=1 npx expo prebuild --clean --no-install -p ios ) + +# Guard: fail loudly if the scene lifecycle did not get wired up (otherwise the check would pass +# trivially against a non-scene app that cannot hit the bug). +/usr/libexec/PlistBuddy -c "Print :UIApplicationSceneManifest:UISceneConfigurations:UIWindowSceneSessionRoleApplication:0:UISceneDelegateClassName" \ + "$IOS_DIR/sentryreactnativeexposample/Info.plist" 2>/dev/null | grep -q EXExpoAppSceneDelegate \ + || fail "Scene manifest not injected — withIosSceneLifecycle did not apply (Expo template drift?)." +grep -q "ExpoReactNativeFactoryProvider" "$IOS_DIR/sentryreactnativeexposample/AppDelegate.swift" \ + || fail "AppDelegate not wired for the scene lifecycle — withIosSceneLifecycle did not apply." + +# ---- 3. Pod install (honors SENTRY_XCFRAMEWORK_CACHE_DIR for local pre-release validation) -------- +log "Installing pods" +( cd "$IOS_DIR" && export REACT_NATIVE_NODE_MODULES_DIR="$(cd ../node_modules/react-native && pwd)" && pod install ) +echo "Bundled cocoa:"; grep -m2 "Sentry (" "$IOS_DIR/Podfile.lock" || true + +# ---- 4. Release build for the simulator (bundles JS; attachScreenshot is configured natively) ---- +log "Building Release app for the simulator" +( cd "$IOS_DIR" && SENTRY_DISABLE_AUTO_UPLOAD=true TOOLCHAINS=com.apple.dt.toolchain.XcodeDefault xcodebuild build \ + -workspace sentryreactnativeexposample.xcworkspace \ + -scheme sentryreactnativeexposample \ + -configuration Release -sdk iphonesimulator \ + -destination "platform=iOS Simulator,id=$SIM_ID" \ + -derivedDataPath "$DD" ONLY_ACTIVE_ARCH=yes ARCHS=arm64 CODE_SIGNING_ALLOWED=NO ) +APP="$(find "$DD/Build/Products/Release-iphonesimulator" -maxdepth 1 -name '*.app' | head -1)" +[ -d "$APP" ] || fail "Build did not produce an .app" + +# ---- 5. Install, crash off-main, and classify ---------------------------------------------------- +log "Running the crash and classifying the outcome" +xcrun simctl terminate "$SIM_ID" "$BUNDLE_ID" 2>/dev/null || true +xcrun simctl uninstall "$SIM_ID" "$BUNDLE_ID" 2>/dev/null || true +xcrun simctl install "$SIM_ID" "$APP" +PID="$(SIMCTL_CHILD_SENTRY_TEST_ABORT=1 xcrun simctl launch "$SIM_ID" "$BUNDLE_ID" | awk -F': ' '{print $2}')" +echo "Launched pid=$PID (abort scheduled ~8s after launch)" + +TERMINATED=0 +for _ in $(seq 1 $((8 + ABORT_DELAY_PADDING))); do + sleep 1 + ps -p "$PID" >/dev/null 2>&1 || { TERMINATED=1; break; } +done + +if [ "$TERMINATED" -eq 0 ]; then + echo "Process $PID still alive long after the abort — capturing the hung stack:" + sample "$PID" 2 -file "$WORKDIR/sample.txt" 2>/dev/null || true + grep -iE "dispatch_assert_queue|isCurrentExecutor|collectWindowsOnCurrentThread|saveScreenShots|window.getter" \ + "$WORKDIR/sample.txt" | sort -u | head + xcrun simctl terminate "$SIM_ID" "$BUNDLE_ID" 2>/dev/null || true + fail "App FROZE during crash handling — the bundled sentry-cocoa still has issue #9281." +fi +echo "Process terminated cleanly after the crash." + +# ---- 6. Assert the crash report + screenshot were produced, with no trap re-entry ---------------- +log "Validating crash artifacts" +DATA="$(xcrun simctl get_app_container "$SIM_ID" "$BUNDLE_ID" data)" +REPORTS="$DATA/Library/Caches/SentryCrash/sentryreactnativeexposample/Reports" +REPORT="$(ls "$REPORTS"/*.json 2>/dev/null | head -1 || true)" +SHOT="$(find "$REPORTS" -name 'screenshot.png' 2>/dev/null | head -1 || true)" + +[ -n "$REPORT" ] || fail "No crash report was written." +[ -n "$SHOT" ] && [ -s "$SHOT" ] || fail "No (non-empty) crash-time screenshot was captured." +file "$SHOT" | grep -q "PNG image data" || fail "Screenshot is not a valid PNG." +if grep -q "dispatch_assert_queue_fail" "$REPORT"; then + fail "Crash report contains a dispatch_assert_queue_fail re-entry — the trap still fires." +fi + +echo "Crash report: $(basename "$REPORT")" +echo "Screenshot: $(file -b "$SHOT")" +log "PASS: clean terminate + screenshot captured, no crash-handler freeze."