From 8823c8de864841483bc4589e78e2110b99e8f457 Mon Sep 17 00:00:00 2001 From: Bobby Galli Date: Sun, 9 Aug 2026 12:45:40 -0400 Subject: [PATCH 1/2] fix: make expo-blob a peer dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit expo-blob ships native code that is versioned in lockstep with the Expo SDK, so the app — not this library — has to own which copy is installed. Declaring it as a dependency at ^55.0.13 pins consumers to the SDK 55 build, and the caret range can never reach 57.x. On SDK 57 that combination crashes at startup. expo-blob 55's BlobModule references expo.modules.kotlin.types.AnyTypeProvider, which no longer exists in expo-modules-core 57, so native module registration throws NoClassDefFoundError before any JS runs. The build itself succeeds, which makes it look like a runtime bug rather than a dependency one. Moving it to peerDependencies lets each app install the expo-blob build matching its SDK, and keeps a single copy in the tree. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 4 +++- package.json | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9036f99..491a43e 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,11 @@ BugSplat's `@bugsplat/expo` package provides crash and error reporting for Expo ## Installation ```sh -npx expo install @bugsplat/expo +npx expo install @bugsplat/expo expo-blob ``` +`expo-blob` is a peer dependency because it ships native code that must match your project's Expo SDK version. Installing it with `expo install` picks the build that matches your SDK. + ## Configuration Add the config plugin to your `app.json` or `app.config.js`: diff --git a/package.json b/package.json index 5bedfba..0a58120 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,12 @@ "license": "MIT", "homepage": "https://github.com/BugSplat-Git/bugsplat-expo#readme", "dependencies": { - "@bugsplat/react": "^2.1.1", - "expo-blob": "^55.0.13" + "@bugsplat/react": "^2.1.1" }, "devDependencies": { "@types/react": "~19.1.1", "expo": "~55.0.8", + "expo-blob": "~55.0.13", "expo-module-scripts": "^55.0.2", "jest-expo": "^55.0.11", "react": "19.2.0", @@ -50,6 +50,7 @@ "peerDependencies": { "@bugsplat/symbol-upload": "*", "expo": "*", + "expo-blob": "*", "react": "*", "react-native": "*" }, From aa9042473ebbffb60c2fbd0df26a1c22bb4c9ad5 Mon Sep 17 00:00:00 2001 From: Bobby Galli Date: Sun, 9 Aug 2026 13:23:28 -0400 Subject: [PATCH 2/2] chore: develop against Expo SDK 57 and peer-depend @bugsplat/react The package was developed and tested against SDK 55 only, which is how an SDK 57 incompatibility shipped unnoticed in the first place. Move the devDependencies and the example app to SDK 57 (expo 57.0.11, react-native 0.86.2, react 19.2.3) so local builds exercise the same core the library is published against. expo-module-scripts has no 57 line yet, so it goes to the latest available, 56.0.3. @bugsplat/react becomes a peer dependency as well. It exports React components and owns the BugSplat client singleton, so a consumer that installs it directly alongside this package would otherwise end up with two copies and two clients. Peering it keeps exactly one in the tree. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 6 ++++-- example/package.json | 28 +++++++++++++++------------- package.json | 21 ++++++++++----------- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 491a43e..9e52d38 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,12 @@ BugSplat's `@bugsplat/expo` package provides crash and error reporting for Expo ## Installation ```sh -npx expo install @bugsplat/expo expo-blob +npx expo install @bugsplat/expo expo-blob @bugsplat/react ``` -`expo-blob` is a peer dependency because it ships native code that must match your project's Expo SDK version. Installing it with `expo install` picks the build that matches your SDK. +`expo-blob` and `@bugsplat/react` are peer dependencies so that exactly one copy of each ends up in your app. + +`expo-blob` ships native code that has to match your project's Expo SDK, so install the release line for your SDK — `57.x` for SDK 57, `56.x` for SDK 56, and so on. It is not yet listed in Expo's bundled native modules manifest, so `expo install` will not pin it for you. ## Configuration diff --git a/example/package.json b/example/package.json index d57c147..2cca6e0 100644 --- a/example/package.json +++ b/example/package.json @@ -12,23 +12,25 @@ }, "dependencies": { "@bugsplat/expo": "file:..", - "@react-native-async-storage/async-storage": "^2.1.2", - "expo": "~55.0.8", - "expo-build-properties": "^55.0.10", - "expo-clipboard": "~55.0.13", - "expo-document-picker": "~55.0.13", - "expo-file-system": "~55.0.22", - "expo-sensors": "~55.0.15", - "expo-system-ui": "~6.0.7", - "react": "19.2.0", - "react-dom": "19.2.0", - "react-native": "0.83.2", - "react-native-safe-area-context": "~5.6.2", + "@bugsplat/react": "^2.1.1", + "@react-native-async-storage/async-storage": "2.2.0", + "expo": "~57.0.11", + "expo-blob": "~57.0.1", + "expo-build-properties": "~57.0.9", + "expo-clipboard": "~57.0.1", + "expo-document-picker": "~57.0.1", + "expo-file-system": "~57.0.2", + "expo-sensors": "~57.0.2", + "expo-system-ui": "~57.0.2", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-native": "0.86.2", + "react-native-safe-area-context": "~5.7.0", "react-native-web": "~0.21.0" }, "devDependencies": { "@babel/core": "^7.20.0", "@bugsplat/symbol-upload": "^10.2.4", - "babel-preset-expo": "~55.0.8" + "babel-preset-expo": "~57.0.6" } } diff --git a/package.json b/package.json index 0a58120..258db6c 100644 --- a/package.json +++ b/package.json @@ -33,21 +33,20 @@ "author": "BugSplat (https://bugsplat.com)", "license": "MIT", "homepage": "https://github.com/BugSplat-Git/bugsplat-expo#readme", - "dependencies": { - "@bugsplat/react": "^2.1.1" - }, "devDependencies": { - "@types/react": "~19.1.1", - "expo": "~55.0.8", - "expo-blob": "~55.0.13", - "expo-module-scripts": "^55.0.2", - "jest-expo": "^55.0.11", - "react": "19.2.0", - "react-dom": "19.2.0", - "react-native": "0.83.2", + "@bugsplat/react": "^2.1.1", + "@types/react": "~19.2.10", + "expo": "~57.0.11", + "expo-blob": "~57.0.1", + "expo-module-scripts": "^56.0.3", + "jest-expo": "~57.0.3", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-native": "0.86.2", "ts-jest": "^29.4.6" }, "peerDependencies": { + "@bugsplat/react": "^2.1.1", "@bugsplat/symbol-upload": "*", "expo": "*", "expo-blob": "*",