diff --git a/.changeset/many-fishes-camp.md b/.changeset/many-fishes-camp.md new file mode 100644 index 00000000..ec44b623 --- /dev/null +++ b/.changeset/many-fishes-camp.md @@ -0,0 +1,9 @@ +--- +'@powersync/react-native': patch +--- + +Fixed issue where CRUD uploads could fail with the error + +``` +Exception: require(_dependencyMap[11], "rea(...)/BlobManager").createFromOptions is not a function (it is undefined) +``` diff --git a/packages/react-native/rollup.config.mjs b/packages/react-native/rollup.config.mjs index 8da7993c..9a180747 100644 --- a/packages/react-native/rollup.config.mjs +++ b/packages/react-native/rollup.config.mjs @@ -4,9 +4,9 @@ import inject from '@rollup/plugin-inject'; import json from '@rollup/plugin-json'; import nodeResolve from '@rollup/plugin-node-resolve'; import replace from '@rollup/plugin-replace'; +import terser from '@rollup/plugin-terser'; import path from 'path'; import { fileURLToPath } from 'url'; -import terser from '@rollup/plugin-terser'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -34,7 +34,7 @@ export default (commandLineArgs) => { }), json(), nodeResolve({ - preferBuiltins: false, + preferBuiltins: false }), commonjs({}), inject({ @@ -48,6 +48,10 @@ export default (commandLineArgs) => { alias({ entries: [ { find: 'bson', replacement: path.resolve(__dirname, '../../node_modules/bson/lib/bson.rn.cjs') }, + { + find: 'react-native/Libraries/Blob/BlobManager', + replacement: path.resolve(__dirname, './vendor/BlobManager.js') + } ] }), terser() @@ -59,7 +63,6 @@ export default (commandLineArgs) => { 'node-fetch', 'js-logger', 'react-native', - 'react-native/Libraries/Blob/BlobManager', 'react' ] }; diff --git a/packages/react-native/vendor/BlobManager.js b/packages/react-native/vendor/BlobManager.js new file mode 100644 index 00000000..2fc2660b --- /dev/null +++ b/packages/react-native/vendor/BlobManager.js @@ -0,0 +1,27 @@ +/** + * The current Rollup configuration targets a CommonJs output. + * This translates import statements to require statements. + * React native recently shifted to ESM exports. + * https://github.com/facebook/react-native/pull/48761/files + * This causes requiring this module to return an object + * of the form: + * ```javascript + * { + * _esModule: true, + * default: BlobManager + * } + * ``` + * This wrapper provides a small shim to conditionally return the default export of the module. + */ +const BlobManager = require('react-native/Libraries/Blob/BlobManager'); +const interop = (mod) => (mod && mod.__esModule ? mod.default : mod); + +/** + * Using an ESM export here is important. Rollup compiles this to + * ```javascript + * const BlobManager = require('react-native/Libraries/Blob/BlobManager'); + * const interop = (mod) => (mod && mod.__esModule ? mod.default : mod); + * var BlobManager$1 = interop(BlobManager); + * ``` + */ +export default interop(BlobManager);