mindoodb 0.0.2 → 0.0.4

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 (305) hide show
  1. package/README-server.md +1001 -0
  2. package/README.md +89 -28
  3. package/dist/__mocks__/expo-standard-web-crypto.d.ts +10 -0
  4. package/dist/__mocks__/expo-standard-web-crypto.d.ts.map +1 -0
  5. package/dist/__mocks__/expo-standard-web-crypto.js +22 -0
  6. package/dist/__mocks__/expo-standard-web-crypto.js.map +1 -0
  7. package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +8 -0
  8. package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +1 -0
  9. package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +16 -0
  10. package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +1 -0
  11. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts +1 -1
  12. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts.map +1 -1
  13. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js +2 -2
  14. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js.map +1 -1
  15. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +30 -1
  16. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
  17. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +152 -5
  18. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
  19. package/dist/appendonlystores/network/HttpTransport.d.ts +17 -2
  20. package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
  21. package/dist/appendonlystores/network/HttpTransport.js +129 -0
  22. package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
  23. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +22 -2
  24. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
  25. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +110 -0
  26. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
  27. package/dist/appendonlystores/network/index.d.ts +1 -1
  28. package/dist/appendonlystores/network/index.d.ts.map +1 -1
  29. package/dist/appendonlystores/network/index.js.map +1 -1
  30. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +65 -0
  31. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -0
  32. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +741 -0
  33. package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -0
  34. package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts +25 -0
  35. package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts.map +1 -0
  36. package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js +41 -0
  37. package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js.map +1 -0
  38. package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts +21 -0
  39. package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts.map +1 -0
  40. package/dist/browser/cache/IndexedDBLocalCacheStore.js +106 -0
  41. package/dist/browser/cache/IndexedDBLocalCacheStore.js.map +1 -0
  42. package/dist/browser/index.d.ts +8 -0
  43. package/dist/browser/index.d.ts.map +1 -1
  44. package/dist/browser/index.js +21 -1
  45. package/dist/browser/index.js.map +1 -1
  46. package/dist/core/BaseMindooDB.d.ts +115 -13
  47. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  48. package/dist/core/BaseMindooDB.js +1232 -269
  49. package/dist/core/BaseMindooDB.js.map +1 -1
  50. package/dist/core/BaseMindooTenant.d.ts +69 -6
  51. package/dist/core/BaseMindooTenant.d.ts.map +1 -1
  52. package/dist/core/BaseMindooTenant.js +302 -109
  53. package/dist/core/BaseMindooTenant.js.map +1 -1
  54. package/dist/core/BaseMindooTenantDirectory.d.ts +13 -10
  55. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
  56. package/dist/core/BaseMindooTenantDirectory.js +144 -27
  57. package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
  58. package/dist/core/BaseMindooTenantFactory.d.ts +27 -29
  59. package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
  60. package/dist/core/BaseMindooTenantFactory.js +185 -112
  61. package/dist/core/BaseMindooTenantFactory.js.map +1 -1
  62. package/dist/core/MindooDBServerAdmin.d.ts +238 -0
  63. package/dist/core/MindooDBServerAdmin.d.ts.map +1 -0
  64. package/dist/core/MindooDBServerAdmin.js +345 -0
  65. package/dist/core/MindooDBServerAdmin.js.map +1 -0
  66. package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +68 -0
  67. package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
  68. package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +659 -0
  69. package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
  70. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +45 -3
  71. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
  72. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +184 -23
  73. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
  74. package/dist/core/appendonlystores/MaterializationPlanner.d.ts +49 -0
  75. package/dist/core/appendonlystores/MaterializationPlanner.d.ts.map +1 -0
  76. package/dist/core/appendonlystores/MaterializationPlanner.js +325 -0
  77. package/dist/core/appendonlystores/MaterializationPlanner.js.map +1 -0
  78. package/dist/core/appendonlystores/bloom.d.ts +85 -0
  79. package/dist/core/appendonlystores/bloom.d.ts.map +1 -0
  80. package/dist/core/appendonlystores/bloom.js +228 -0
  81. package/dist/core/appendonlystores/bloom.js.map +1 -0
  82. package/dist/core/appendonlystores/network/NetworkTransport.d.ts +37 -2
  83. package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
  84. package/dist/core/appendonlystores/network/types.d.ts +12 -0
  85. package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
  86. package/dist/core/appendonlystores/network/types.js.map +1 -1
  87. package/dist/core/appendonlystores/types.d.ts +206 -0
  88. package/dist/core/appendonlystores/types.d.ts.map +1 -1
  89. package/dist/core/automerge-adapter.d.ts +15 -0
  90. package/dist/core/automerge-adapter.d.ts.map +1 -0
  91. package/dist/core/automerge-adapter.js +73 -0
  92. package/dist/core/automerge-adapter.js.map +1 -0
  93. package/dist/core/cache/CacheManager.d.ts +75 -0
  94. package/dist/core/cache/CacheManager.d.ts.map +1 -0
  95. package/dist/core/cache/CacheManager.js +101 -0
  96. package/dist/core/cache/CacheManager.js.map +1 -0
  97. package/dist/core/cache/EncryptedLocalCacheStore.d.ts +41 -0
  98. package/dist/core/cache/EncryptedLocalCacheStore.d.ts.map +1 -0
  99. package/dist/core/cache/EncryptedLocalCacheStore.js +120 -0
  100. package/dist/core/cache/EncryptedLocalCacheStore.js.map +1 -0
  101. package/dist/core/cache/LocalCacheStore.d.ts +50 -0
  102. package/dist/core/cache/LocalCacheStore.d.ts.map +1 -0
  103. package/dist/core/cache/LocalCacheStore.js +39 -0
  104. package/dist/core/cache/LocalCacheStore.js.map +1 -0
  105. package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
  106. package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -0
  107. package/dist/core/crypto/pbkdf2Iterations.js +55 -0
  108. package/dist/core/crypto/pbkdf2Iterations.js.map +1 -0
  109. package/dist/core/crypto/privateKeyEncryption.d.ts +5 -0
  110. package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -0
  111. package/dist/core/crypto/privateKeyEncryption.js +87 -0
  112. package/dist/core/crypto/privateKeyEncryption.js.map +1 -0
  113. package/dist/core/index.d.ts +18 -6
  114. package/dist/core/index.d.ts.map +1 -1
  115. package/dist/core/index.js +42 -1
  116. package/dist/core/index.js.map +1 -1
  117. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +4 -1
  118. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
  119. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +39 -11
  120. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
  121. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +1 -0
  122. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -1
  123. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +3 -0
  124. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -1
  125. package/dist/core/indexing/virtualviews/VirtualView.d.ts +43 -0
  126. package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
  127. package/dist/core/indexing/virtualviews/VirtualView.js +173 -0
  128. package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
  129. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +7 -0
  130. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
  131. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +28 -0
  132. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
  133. package/dist/core/keys/KeyBag.d.ts +56 -12
  134. package/dist/core/keys/KeyBag.d.ts.map +1 -1
  135. package/dist/core/keys/KeyBag.js +156 -70
  136. package/dist/core/keys/KeyBag.js.map +1 -1
  137. package/dist/core/keys/KeyContext.d.ts +4 -0
  138. package/dist/core/keys/KeyContext.d.ts.map +1 -0
  139. package/dist/core/keys/KeyContext.js +17 -0
  140. package/dist/core/keys/KeyContext.js.map +1 -0
  141. package/dist/core/types.d.ts +512 -60
  142. package/dist/core/types.d.ts.map +1 -1
  143. package/dist/core/types.js +9 -1
  144. package/dist/core/types.js.map +1 -1
  145. package/dist/core/uri/MindooURI.d.ts +58 -0
  146. package/dist/core/uri/MindooURI.d.ts.map +1 -0
  147. package/dist/core/uri/MindooURI.js +169 -0
  148. package/dist/core/uri/MindooURI.js.map +1 -0
  149. package/dist/core/userid/index.d.ts +0 -10
  150. package/dist/core/userid/index.d.ts.map +1 -1
  151. package/dist/core/utils/idGeneration.d.ts.map +1 -1
  152. package/dist/core/utils/idGeneration.js +37 -3
  153. package/dist/core/utils/idGeneration.js.map +1 -1
  154. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +544 -0
  155. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
  156. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +1358 -0
  157. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
  158. package/dist/node/attachments/writeAttachmentToFile.d.ts +15 -0
  159. package/dist/node/attachments/writeAttachmentToFile.d.ts.map +1 -0
  160. package/dist/node/attachments/writeAttachmentToFile.js +73 -0
  161. package/dist/node/attachments/writeAttachmentToFile.js.map +1 -0
  162. package/dist/node/cache/FileSystemLocalCacheStore.d.ts +17 -0
  163. package/dist/node/cache/FileSystemLocalCacheStore.d.ts.map +1 -0
  164. package/dist/node/cache/FileSystemLocalCacheStore.js +128 -0
  165. package/dist/node/cache/FileSystemLocalCacheStore.js.map +1 -0
  166. package/dist/node/cli/change-identity-password.d.ts +7 -0
  167. package/dist/node/cli/change-identity-password.d.ts.map +1 -0
  168. package/dist/node/cli/change-identity-password.js +67 -0
  169. package/dist/node/cli/change-identity-password.js.map +1 -0
  170. package/dist/node/cli/cli-utils.d.ts +16 -0
  171. package/dist/node/cli/cli-utils.d.ts.map +1 -0
  172. package/dist/node/cli/cli-utils.js +113 -0
  173. package/dist/node/cli/cli-utils.js.map +1 -0
  174. package/dist/node/cli/identity-export-public.d.ts +4 -0
  175. package/dist/node/cli/identity-export-public.d.ts.map +1 -0
  176. package/dist/node/cli/identity-export-public.js +55 -0
  177. package/dist/node/cli/identity-export-public.js.map +1 -0
  178. package/dist/node/cli/identity-info.d.ts +4 -0
  179. package/dist/node/cli/identity-info.d.ts.map +1 -0
  180. package/dist/node/cli/identity-info.js +57 -0
  181. package/dist/node/cli/identity-info.js.map +1 -0
  182. package/dist/node/index.d.ts +2 -0
  183. package/dist/node/index.d.ts.map +1 -1
  184. package/dist/node/index.js +8 -1
  185. package/dist/node/index.js.map +1 -1
  186. package/dist/node/server/CapabilityMatcher.d.ts +45 -0
  187. package/dist/node/server/CapabilityMatcher.d.ts.map +1 -0
  188. package/dist/node/server/CapabilityMatcher.js +117 -0
  189. package/dist/node/server/CapabilityMatcher.js.map +1 -0
  190. package/dist/node/server/MindooDBServer.d.ts +87 -0
  191. package/dist/node/server/MindooDBServer.d.ts.map +1 -0
  192. package/dist/node/server/MindooDBServer.js +1040 -0
  193. package/dist/node/server/MindooDBServer.js.map +1 -0
  194. package/dist/node/server/ServerSync.d.ts +41 -0
  195. package/dist/node/server/ServerSync.d.ts.map +1 -0
  196. package/dist/node/server/ServerSync.js +187 -0
  197. package/dist/node/server/ServerSync.js.map +1 -0
  198. package/dist/node/server/StoreFactory.d.ts +45 -0
  199. package/dist/node/server/StoreFactory.d.ts.map +1 -0
  200. package/dist/node/server/StoreFactory.js +89 -0
  201. package/dist/node/server/StoreFactory.js.map +1 -0
  202. package/dist/node/server/SystemAdminAuth.d.ts +65 -0
  203. package/dist/node/server/SystemAdminAuth.d.ts.map +1 -0
  204. package/dist/node/server/SystemAdminAuth.js +200 -0
  205. package/dist/node/server/SystemAdminAuth.js.map +1 -0
  206. package/dist/node/server/SystemIpAllowlist.d.ts +21 -0
  207. package/dist/node/server/SystemIpAllowlist.d.ts.map +1 -0
  208. package/dist/node/server/SystemIpAllowlist.js +210 -0
  209. package/dist/node/server/SystemIpAllowlist.js.map +1 -0
  210. package/dist/node/server/TenantManager.d.ts +85 -0
  211. package/dist/node/server/TenantManager.d.ts.map +1 -0
  212. package/dist/node/server/TenantManager.js +493 -0
  213. package/dist/node/server/TenantManager.js.map +1 -0
  214. package/dist/node/server/add-to-network.d.ts +20 -0
  215. package/dist/node/server/add-to-network.d.ts.map +1 -0
  216. package/dist/node/server/add-to-network.js +275 -0
  217. package/dist/node/server/add-to-network.js.map +1 -0
  218. package/dist/node/server/config.d.ts +51 -0
  219. package/dist/node/server/config.d.ts.map +1 -0
  220. package/dist/node/server/config.js +218 -0
  221. package/dist/node/server/config.js.map +1 -0
  222. package/dist/node/server/resolveServerPassword.d.ts +7 -0
  223. package/dist/node/server/resolveServerPassword.d.ts.map +1 -0
  224. package/dist/node/server/resolveServerPassword.js +25 -0
  225. package/dist/node/server/resolveServerPassword.js.map +1 -0
  226. package/dist/node/server/server.d.ts +22 -0
  227. package/dist/node/server/server.d.ts.map +1 -0
  228. package/dist/node/server/server.js +225 -0
  229. package/dist/node/server/server.js.map +1 -0
  230. package/dist/node/server/serverinit.d.ts +21 -0
  231. package/dist/node/server/serverinit.d.ts.map +1 -0
  232. package/dist/node/server/serverinit.js +317 -0
  233. package/dist/node/server/serverinit.js.map +1 -0
  234. package/dist/node/server/types.d.ts +162 -0
  235. package/dist/node/server/types.d.ts.map +1 -0
  236. package/dist/node/server/types.js +24 -0
  237. package/dist/node/server/types.js.map +1 -0
  238. package/dist/node/server/validation.d.ts +47 -0
  239. package/dist/node/server/validation.d.ts.map +1 -0
  240. package/dist/node/server/validation.js +114 -0
  241. package/dist/node/server/validation.js.map +1 -0
  242. package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts +48 -0
  243. package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts.map +1 -0
  244. package/dist/reactnative/cache/MMKVLocalCacheStore.js +113 -0
  245. package/dist/reactnative/cache/MMKVLocalCacheStore.js.map +1 -0
  246. package/dist/reactnative/crypto/AESAdapter.d.ts +18 -0
  247. package/dist/reactnative/crypto/AESAdapter.d.ts.map +1 -0
  248. package/dist/reactnative/crypto/AESAdapter.js +112 -0
  249. package/dist/reactnative/crypto/AESAdapter.js.map +1 -0
  250. package/dist/reactnative/crypto/Ed25519Adapter.d.ts +34 -0
  251. package/dist/reactnative/crypto/Ed25519Adapter.d.ts.map +1 -0
  252. package/dist/reactnative/crypto/Ed25519Adapter.js +386 -0
  253. package/dist/reactnative/crypto/Ed25519Adapter.js.map +1 -0
  254. package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts +23 -0
  255. package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts.map +1 -0
  256. package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js +51 -0
  257. package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js.map +1 -0
  258. package/dist/reactnative/crypto/HMACAdapter.d.ts +13 -0
  259. package/dist/reactnative/crypto/HMACAdapter.d.ts.map +1 -0
  260. package/dist/reactnative/crypto/HMACAdapter.js +50 -0
  261. package/dist/reactnative/crypto/HMACAdapter.js.map +1 -0
  262. package/dist/reactnative/crypto/KeyFormatConverter.d.ts +21 -0
  263. package/dist/reactnative/crypto/KeyFormatConverter.d.ts.map +1 -0
  264. package/dist/reactnative/crypto/KeyFormatConverter.js +72 -0
  265. package/dist/reactnative/crypto/KeyFormatConverter.js.map +1 -0
  266. package/dist/reactnative/crypto/PBKDF2Adapter.d.ts +19 -0
  267. package/dist/reactnative/crypto/PBKDF2Adapter.d.ts.map +1 -0
  268. package/dist/reactnative/crypto/PBKDF2Adapter.js +67 -0
  269. package/dist/reactnative/crypto/PBKDF2Adapter.js.map +1 -0
  270. package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts +37 -0
  271. package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts.map +1 -0
  272. package/dist/reactnative/crypto/QuickCryptoAdapter.js +72 -0
  273. package/dist/reactnative/crypto/QuickCryptoAdapter.js.map +1 -0
  274. package/dist/reactnative/crypto/RSAAdapter.d.ts +38 -0
  275. package/dist/reactnative/crypto/RSAAdapter.d.ts.map +1 -0
  276. package/dist/reactnative/crypto/RSAAdapter.js +184 -0
  277. package/dist/reactnative/crypto/RSAAdapter.js.map +1 -0
  278. package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts +33 -0
  279. package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts.map +1 -0
  280. package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js +61 -0
  281. package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js.map +1 -0
  282. package/dist/reactnative/crypto/SHA256Adapter.d.ts +9 -0
  283. package/dist/reactnative/crypto/SHA256Adapter.d.ts.map +1 -0
  284. package/dist/reactnative/crypto/SHA256Adapter.js +29 -0
  285. package/dist/reactnative/crypto/SHA256Adapter.js.map +1 -0
  286. package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts +63 -0
  287. package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts.map +1 -0
  288. package/dist/reactnative/crypto/SubtleCryptoPolyfill.js +350 -0
  289. package/dist/reactnative/crypto/SubtleCryptoPolyfill.js.map +1 -0
  290. package/dist/reactnative/index.d.ts +9 -0
  291. package/dist/reactnative/index.d.ts.map +1 -0
  292. package/dist/reactnative/index.js +41 -0
  293. package/dist/reactnative/index.js.map +1 -0
  294. package/package.json +63 -7
  295. package/patches/PATCHES.md +111 -0
  296. package/patches/react-native+0.76.9.patch +34 -0
  297. package/patches/react-native-quick-crypto+1.0.7.patch +42 -0
  298. package/scripts/cli.js +21 -0
  299. package/scripts/setup-react-native.js +228 -0
  300. package/templates/reactnative/App.js +252 -0
  301. package/templates/reactnative/app.json +29 -0
  302. package/templates/reactnative/babel.config.js +6 -0
  303. package/templates/reactnative/index.js +26 -0
  304. package/templates/reactnative/metro.config.snippet.js +39 -0
  305. package/templates/reactnative/mindoodb-polyfills.js +116 -0
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "mindoodb",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "End-to-End Encrypted, Offline-first Sync Database",
5
5
  "main": "./dist/node/index.js",
6
6
  "browser": "./dist/browser/index.js",
7
+ "react-native": "./dist/reactnative/index.js",
7
8
  "types": "./dist/core/index.d.ts",
8
9
  "repository": {
9
10
  "type": "git",
@@ -15,44 +16,99 @@
15
16
  "offline-first",
16
17
  "sync",
17
18
  "crdt",
18
- "automerge"
19
+ "automerge",
20
+ "react-native",
21
+ "expo"
19
22
  ],
20
23
  "exports": {
21
24
  ".": {
25
+ "react-native": "./dist/reactnative/index.js",
22
26
  "browser": "./dist/browser/index.js",
23
27
  "node": "./dist/node/index.js",
24
28
  "default": "./dist/node/index.js"
25
29
  },
26
30
  "./core": "./dist/core/index.js",
27
31
  "./browser": "./dist/browser/index.js",
28
- "./node": "./dist/node/index.js"
32
+ "./node": "./dist/node/index.js",
33
+ "./reactnative": "./dist/reactnative/index.js"
29
34
  },
30
35
  "files": [
31
36
  "dist",
32
- "README.md"
37
+ "README.md",
38
+ "README-server.md",
39
+ "patches",
40
+ "scripts",
41
+ "templates"
33
42
  ],
43
+ "bin": {
44
+ "mindoodb": "./scripts/cli.js"
45
+ },
34
46
  "scripts": {
35
47
  "build": "tsc",
36
48
  "test": "jest",
37
- "test:watch": "jest --watch"
49
+ "test:watch": "jest --watch",
50
+ "test:stress": "MINDOODB_STRESS_TESTS=1 jest --runInBand BasicOnDiskContentAddressedStore.stress",
51
+ "test:soak": "MINDOODB_STRESS_TESTS=1 MINDOODB_SOAK_TESTS=1 jest --runInBand BasicOnDiskContentAddressedStore.stress",
52
+ "test:browser:install": "playwright install chromium",
53
+ "test:browser": "npm run build && playwright test",
54
+ "test:browser:watch": "npm run build && playwright test --ui",
55
+ "test:all": "npm test && npm run test:browser",
56
+ "identity:info": "node dist/node/cli/identity-info.js",
57
+ "identity:change-password": "node dist/node/cli/change-identity-password.js",
58
+ "identity:export-public": "node dist/node/cli/identity-export-public.js",
59
+ "server:start": "node dist/node/server/server.js",
60
+ "server:init": "node dist/node/server/serverinit.js",
61
+ "server:dev": "ts-node-dev --transpile-only src/node/server/server.ts",
62
+ "server:add-to-network": "ts-node-dev --transpile-only src/node/server/add-to-network.ts"
38
63
  },
39
64
  "author": "Mindoo GmbH",
40
65
  "license": "ISC",
41
66
  "dependencies": {
42
67
  "@automerge/automerge": "^3.2.1",
43
- "@digitalmaas/uuid-base62": "^2.0.1",
44
68
  "uuid": "^10.0.0"
45
69
  },
46
70
  "devDependencies": {
71
+ "@playwright/test": "^1.58.2",
72
+ "@types/cors": "^2.8.19",
47
73
  "@types/express": "^4.17.21",
48
74
  "@types/jest": "^29.5.12",
49
75
  "@types/node": "^20.11.0",
76
+ "@types/node-forge": "^1.3.14",
50
77
  "@types/uuid": "^10.0.0",
78
+ "cors": "^2.8.6",
79
+ "esbuild": "^0.27.3",
51
80
  "express": "^4.18.2",
81
+ "express-rate-limit": "^8.2.1",
82
+ "helmet": "^8.1.0",
52
83
  "jest": "^29.7.0",
84
+ "node-forge": "^1.3.1",
53
85
  "ts-jest": "^29.1.2",
54
86
  "ts-node-dev": "^2.0.0",
87
+ "tweetnacl": "^1.0.3",
55
88
  "typescript": "^5.6.0"
56
89
  },
57
- "peerDependenciesMeta": {}
90
+ "peerDependencies": {
91
+ "expo-standard-web-crypto": "^3.0.0",
92
+ "node-forge": "^1.3.1",
93
+ "react-native-automerge-generated": "^0.1.0",
94
+ "react-native-quick-crypto": "^1.0.0",
95
+ "tweetnacl": "^1.0.3"
96
+ },
97
+ "peerDependenciesMeta": {
98
+ "react-native-automerge-generated": {
99
+ "optional": true
100
+ },
101
+ "react-native-quick-crypto": {
102
+ "optional": true
103
+ },
104
+ "expo-standard-web-crypto": {
105
+ "optional": true
106
+ },
107
+ "node-forge": {
108
+ "optional": true
109
+ },
110
+ "tweetnacl": {
111
+ "optional": true
112
+ }
113
+ }
58
114
  }
@@ -0,0 +1,111 @@
1
+ # Patches
2
+
3
+ This project uses [patch-package](https://github.com/ds300/patch-package) to fix bugs in dependencies. Patches are applied automatically on `npm install` via the `postinstall` script.
4
+
5
+ All patches target the specific dependency versions listed below. After upgrading a patched dependency, verify whether the upstream fix has been merged and remove the patch if so.
6
+
7
+ > **Note:** `react-native-quick-crypto` contains symlinks in its bundled `OpenSSL.xcframework`, which prevents `patch-package` from auto-generating patches. To regenerate that patch, use `git diff` manually against a clean copy of the package (see procedure below).
8
+
9
+ ---
10
+
11
+ ## react-native+0.76.9.patch
12
+
13
+ **File changed:** `ReactCommon/jsc/JSCRuntime.cpp`
14
+
15
+ ### Problem
16
+
17
+ React Native's JSC (JavaScriptCore) runtime has `JSCRuntime::createArrayBuffer()` stubbed as:
18
+
19
+ ```cpp
20
+ throw std::logic_error("Not implemented");
21
+ ```
22
+
23
+ This breaks any NitroModules HybridObject method that returns an `ArrayBuffer` from native to JS (e.g., `Hash.digest()` in react-native-quick-crypto). The error surfaces as:
24
+
25
+ ```
26
+ Hash.digest(...): Not implemented
27
+ ```
28
+
29
+ ### Fix
30
+
31
+ Implements `createArrayBuffer()` using the JSC C API function `JSObjectMakeArrayBufferWithBytesNoCopy`. The implementation:
32
+
33
+ 1. Moves the `shared_ptr<MutableBuffer>` onto the heap so it outlives the function call.
34
+ 2. Creates a JSC ArrayBuffer that points directly to the buffer's data (zero-copy).
35
+ 3. Registers a deallocator callback that deletes the shared_ptr when the JS garbage collector collects the ArrayBuffer.
36
+ 4. Cleans up the heap allocation on failure before re-throwing.
37
+
38
+ ### Upstream status
39
+
40
+ Not yet fixed in react-native 0.76.x. The Hermes engine implements this method; only JSC is missing it.
41
+
42
+ ---
43
+
44
+ ## react-native-quick-crypto+1.0.7.patch
45
+
46
+ **Files changed:**
47
+ - `cpp/random/HybridRandom.cpp`
48
+ - `src/random.ts`
49
+
50
+ ### Problem 1: NULL pointer crash in native randomFillSync (SIGSEGV)
51
+
52
+ After extended runtime (~9 hours), the app crashes with a SIGSEGV in OpenSSL's `RAND_bytes` writing to address `0x0`. The crash originates from `HybridRandom::randomFillSync()` at line 42.
53
+
54
+ **Root cause:** `buffer.get()->data()` can return `nullptr` when the JS ArrayBuffer reference has been invalidated. NitroModules' `JSArrayBuffer::data()` is explicitly marked `NULLABLE` and returns `nullptr` when:
55
+ - The JS garbage collector has collected the underlying ArrayBuffer
56
+ - WASM memory growth has detached the ArrayBuffer
57
+ - The `BorrowingReference` to the JS object is no longer valid
58
+
59
+ The native code had **no null check** before passing the pointer to `RAND_bytes()`.
60
+
61
+ **Fix (HybridRandom.cpp):** Added a null check on the data pointer before calling `RAND_bytes`. If null, throws a descriptive `std::runtime_error` that surfaces as a catchable JS exception instead of a fatal SIGSEGV.
62
+
63
+ ### Problem 2: WASM memory corruption from TypedArray view handling
64
+
65
+ The original `randomFillSync` TypeScript implementation calls `abvToArrayBuffer(buffer)` which extracts the underlying `.buffer` property from TypedArray views. This **discards the view's `byteOffset` and `byteLength`**, using the full underlying ArrayBuffer's `byteLength` instead.
66
+
67
+ When automerge's WASM module calls `crypto.getRandomValues(wasmMemoryView)`:
68
+ - The TypedArray's `.buffer` is `WebAssembly.Memory.buffer` (the entire WASM linear memory, potentially megabytes)
69
+ - `abvToArrayBuffer()` returns this full buffer
70
+ - `size ?? buffer.byteLength` resolves to the entire WASM memory size
71
+ - The native side writes random bytes to the **entire WASM linear memory**, destroying the heap, stack, and all data
72
+
73
+ This causes automerge to crash with `RuntimeError: Out of bounds memory access` on the next WASM allocation (e.g., `dlmalloc::malloc` during `AutoCommit::new`).
74
+
75
+ > This bug exists in the **unpatched original code** as well, not just our patch. It is masked when WASM rarely calls `getRandomValues`, but is triggered reliably when automerge's Rust code needs random bytes for HashMap seeding.
76
+
77
+ **Fix (random.ts):** Rewrote `randomFillSync` to:
78
+
79
+ 1. **Preserve TypedArray view info** before extracting the underlying buffer: reads `buffer.byteOffset` and `buffer.byteLength` from the original TypedArray, so we know exactly which portion of the underlying buffer to fill.
80
+ 2. **Create an owned ArrayBuffer** of just the fill size (not the entire underlying buffer). This ensures the native side always receives a valid, correctly-sized buffer that won't be detached by WASM memory growth or GC.
81
+ 3. **Copy random bytes back** to the exact correct position in the original buffer using `viewByteOffset + offset`.
82
+
83
+ ### Upstream status
84
+
85
+ Neither fix has been submitted upstream to react-native-quick-crypto.
86
+
87
+ ---
88
+
89
+ ## Regenerating the quick-crypto patch
90
+
91
+ Because `patch-package` cannot handle symlinks in `OpenSSL.xcframework`, use this manual procedure:
92
+
93
+ ```bash
94
+ # 1. Get a clean copy of the package
95
+ npm pack react-native-quick-crypto@1.0.7 --pack-destination /tmp
96
+ mkdir -p /tmp/qc-orig && tar -xzf /tmp/react-native-quick-crypto-1.0.7.tgz -C /tmp/qc-orig
97
+
98
+ # 2. Set up a temp git repo for diffing
99
+ mkdir /tmp/qc-git && cd /tmp/qc-git && git init
100
+ mkdir -p node_modules/react-native-quick-crypto/{cpp/random,src}
101
+ cp /tmp/qc-orig/package/cpp/random/HybridRandom.cpp node_modules/react-native-quick-crypto/cpp/random/
102
+ cp /tmp/qc-orig/package/src/random.ts node_modules/react-native-quick-crypto/src/
103
+ git add . && git commit -m "original"
104
+
105
+ # 3. Copy in your modified files
106
+ cp <project>/node_modules/react-native-quick-crypto/cpp/random/HybridRandom.cpp node_modules/react-native-quick-crypto/cpp/random/
107
+ cp <project>/node_modules/react-native-quick-crypto/src/random.ts node_modules/react-native-quick-crypto/src/
108
+
109
+ # 4. Generate the patch
110
+ git diff --no-color > <project>/patches/react-native-quick-crypto+1.0.7.patch
111
+ ```
@@ -0,0 +1,34 @@
1
+ diff --git a/node_modules/react-native/ReactCommon/jsc/JSCRuntime.cpp b/node_modules/react-native/ReactCommon/jsc/JSCRuntime.cpp
2
+ index e63260a..b806880 100644
3
+ --- a/node_modules/react-native/ReactCommon/jsc/JSCRuntime.cpp
4
+ +++ b/node_modules/react-native/ReactCommon/jsc/JSCRuntime.cpp
5
+ @@ -1120,7 +1120,28 @@ jsi::Array JSCRuntime::createArray(size_t length) {
6
+
7
+ jsi::ArrayBuffer JSCRuntime::createArrayBuffer(
8
+ std::shared_ptr<jsi::MutableBuffer> buffer) {
9
+ - throw std::logic_error("Not implemented");
10
+ + JSValueRef exc = nullptr;
11
+ + // Move the shared_ptr into heap storage so it survives until JSC deallocates
12
+ + // the ArrayBuffer. The deallocator callback deletes it when the JS GC
13
+ + // collects the ArrayBuffer object.
14
+ + auto* pointerHolder =
15
+ + new std::shared_ptr<jsi::MutableBuffer>(std::move(buffer));
16
+ + JSObjectRef obj = JSObjectMakeArrayBufferWithBytesNoCopy(
17
+ + ctx_,
18
+ + (*pointerHolder)->data(),
19
+ + (*pointerHolder)->size(),
20
+ + [](void* /*bytes*/, void* deallocatorContext) {
21
+ + delete static_cast<std::shared_ptr<jsi::MutableBuffer>*>(
22
+ + deallocatorContext);
23
+ + },
24
+ + pointerHolder,
25
+ + &exc);
26
+ + if (!obj) {
27
+ + // Clean up on failure before throwing
28
+ + delete pointerHolder;
29
+ + checkException(exc);
30
+ + }
31
+ + return createObject(obj).getArrayBuffer(*this);
32
+ }
33
+
34
+ size_t JSCRuntime::size(const jsi::Array& arr) {
@@ -0,0 +1,42 @@
1
+ diff --git a/node_modules/react-native-quick-crypto/cpp/random/HybridRandom.cpp b/node_modules/react-native-quick-crypto/cpp/random/HybridRandom.cpp
2
+ index b1a132c..e48eb06 100644
3
+ --- a/node_modules/react-native-quick-crypto/cpp/random/HybridRandom.cpp
4
+ +++ b/node_modules/react-native-quick-crypto/cpp/random/HybridRandom.cpp
5
+ @@ -39,6 +39,9 @@ std::shared_ptr<ArrayBuffer> HybridRandom::randomFillSync(const std::shared_ptr<
6
+ size_t size = checkSize(dSize);
7
+ size_t offset = checkOffset(dSize, dOffset);
8
+ uint8_t* data = buffer.get()->data();
9
+ + if (!data) {
10
+ + throw std::runtime_error("randomFillSync: ArrayBuffer data pointer is null (buffer may have been detached or garbage collected)");
11
+ + }
12
+ if (RAND_bytes(data + offset, (int)size) != 1) {
13
+ throw std::runtime_error("error calling RAND_bytes: " + std::to_string(ERR_get_error()));
14
+ }
15
+ diff --git a/node_modules/react-native-quick-crypto/src/random.ts b/node_modules/react-native-quick-crypto/src/random.ts
16
+ index 4066c5a..753da81 100644
17
+ --- a/node_modules/react-native-quick-crypto/src/random.ts
18
+ +++ b/node_modules/react-native-quick-crypto/src/random.ts
19
+ @@ -73,9 +73,20 @@ export function randomFillSync<T extends ABV>(
20
+
21
+ export function randomFillSync(buffer: ABV, offset: number = 0, size?: number) {
22
+ getNative();
23
+ - buffer = abvToArrayBuffer(buffer);
24
+ - const res = random.randomFillSync(buffer, offset, size ?? buffer.byteLength);
25
+ - buffer = res;
26
+ + // Preserve the view's byte range before extracting the underlying ArrayBuffer.
27
+ + // This is critical when buffer is a TypedArray view into a larger buffer
28
+ + // (e.g. WebAssembly.Memory) — we must only fill the view's portion, not the
29
+ + // entire underlying buffer.
30
+ + const viewByteOffset = ArrayBuffer.isView(buffer) ? buffer.byteOffset : 0;
31
+ + const viewByteLength = ArrayBuffer.isView(buffer) ? buffer.byteLength : buffer.byteLength;
32
+ + const fillSize = size ?? viewByteLength;
33
+ + // Create an owned ArrayBuffer so native code is not dependent on the original
34
+ + // buffer reference staying valid (WASM memory growth can detach ArrayBuffers).
35
+ + const owned = new ArrayBuffer(fillSize);
36
+ + const res = random.randomFillSync(owned, 0, fillSize);
37
+ + // Copy the random bytes back into the caller's buffer at the correct position
38
+ + const src = abvToArrayBuffer(buffer);
39
+ + new Uint8Array(src, viewByteOffset + offset, fillSize).set(new Uint8Array(res));
40
+ return buffer;
41
+ }
42
+
package/scripts/cli.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const command = process.argv[2];
5
+
6
+ switch (command) {
7
+ case 'setup-react-native':
8
+ require('./setup-react-native.js');
9
+ break;
10
+ default:
11
+ console.log('MindooDB CLI');
12
+ console.log('');
13
+ console.log('Usage:');
14
+ console.log(' npx mindoodb setup-react-native Set up MindooDB for React Native / Expo');
15
+ console.log('');
16
+ if (command) {
17
+ console.error(`Unknown command: ${command}`);
18
+ process.exit(1);
19
+ }
20
+ break;
21
+ }
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const { execSync } = require('child_process');
7
+ const readline = require('readline');
8
+
9
+ // Resolve paths
10
+ const projectDir = process.cwd();
11
+ const mindoodbDir = path.dirname(__dirname); // node_modules/mindoodb
12
+
13
+ function ask(question) {
14
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
15
+ return new Promise(resolve => {
16
+ rl.question(question, answer => {
17
+ rl.close();
18
+ resolve(answer.trim().toLowerCase());
19
+ });
20
+ });
21
+ }
22
+
23
+ function copyFileWithPrompt(src, dest, description) {
24
+ if (fs.existsSync(dest)) {
25
+ console.log(` [exists] ${path.relative(projectDir, dest)} (skipped)`);
26
+ return false;
27
+ }
28
+ const destDir = path.dirname(dest);
29
+ if (!destDir) return false;
30
+ fs.mkdirSync(destDir, { recursive: true });
31
+ fs.copyFileSync(src, dest);
32
+ console.log(` [created] ${path.relative(projectDir, dest)}`);
33
+ return true;
34
+ }
35
+
36
+ async function main() {
37
+ console.log('');
38
+ console.log('MindooDB - React Native Setup');
39
+ console.log('=============================');
40
+ console.log('');
41
+
42
+ // Verify we're in a project directory
43
+ const projectPkgPath = path.join(projectDir, 'package.json');
44
+ if (!fs.existsSync(projectPkgPath)) {
45
+ console.error('Error: No package.json found in current directory.');
46
+ console.error('Run this command from your React Native project root.');
47
+ process.exit(1);
48
+ }
49
+
50
+ const projectPkg = JSON.parse(fs.readFileSync(projectPkgPath, 'utf8'));
51
+
52
+ // ── Step 1: Copy patches ──────────────────────────────────────────────
53
+ console.log('Step 1: Copying patches...');
54
+ const patchesDir = path.join(mindoodbDir, 'patches');
55
+ const destPatchesDir = path.join(projectDir, 'patches');
56
+
57
+ if (fs.existsSync(patchesDir)) {
58
+ fs.mkdirSync(destPatchesDir, { recursive: true });
59
+ const patchFiles = fs.readdirSync(patchesDir).filter(f => f.endsWith('.patch') || f.endsWith('.md'));
60
+ for (const file of patchFiles) {
61
+ copyFileWithPrompt(
62
+ path.join(patchesDir, file),
63
+ path.join(destPatchesDir, file),
64
+ file
65
+ );
66
+ }
67
+ } else {
68
+ console.log(' Warning: patches directory not found in mindoodb package.');
69
+ console.log(' You may need to copy patches manually from the mindoodb repository.');
70
+ }
71
+ console.log('');
72
+
73
+ // ── Step 2: Install patch-package ─────────────────────────────────────
74
+ console.log('Step 2: Checking patch-package...');
75
+ const hasPatchPackage = !!(projectPkg.devDependencies?.['patch-package'] || projectPkg.dependencies?.['patch-package']);
76
+ if (!hasPatchPackage) {
77
+ const answer = await ask(' Install patch-package as a devDependency? (Y/n) ');
78
+ if (answer !== 'n') {
79
+ console.log(' Installing patch-package...');
80
+ try {
81
+ execSync('npm install --save-dev patch-package', { cwd: projectDir, stdio: 'inherit' });
82
+ } catch (e) {
83
+ console.error(' Failed to install patch-package. Please install it manually:');
84
+ console.error(' npm install --save-dev patch-package');
85
+ }
86
+ }
87
+ } else {
88
+ console.log(' patch-package already installed.');
89
+ }
90
+ console.log('');
91
+
92
+ // ── Step 3: Add postinstall script ────────────────────────────────────
93
+ console.log('Step 3: Checking postinstall script...');
94
+ // Re-read package.json in case npm install changed it
95
+ const updatedPkg = JSON.parse(fs.readFileSync(projectPkgPath, 'utf8'));
96
+ if (!updatedPkg.scripts) updatedPkg.scripts = {};
97
+ if (!updatedPkg.scripts.postinstall) {
98
+ updatedPkg.scripts.postinstall = 'patch-package';
99
+ fs.writeFileSync(projectPkgPath, JSON.stringify(updatedPkg, null, 2) + '\n');
100
+ console.log(' Added "postinstall": "patch-package" to package.json');
101
+ } else if (!updatedPkg.scripts.postinstall.includes('patch-package')) {
102
+ console.log(` Warning: postinstall script exists but does not include patch-package:`);
103
+ console.log(` "${updatedPkg.scripts.postinstall}"`);
104
+ console.log(' Please add "patch-package" to your postinstall script manually.');
105
+ } else {
106
+ console.log(' postinstall script already configured.');
107
+ }
108
+ console.log('');
109
+
110
+ // ── Step 4: Install dependencies ──────────────────────────────────────
111
+ console.log('Step 4: Required dependencies...');
112
+ const requiredDeps = [
113
+ 'react-native-automerge-generated',
114
+ 'react-native-quick-crypto',
115
+ 'react-native-nitro-modules',
116
+ 'expo-standard-web-crypto',
117
+ 'expo-crypto',
118
+ 'text-encoding',
119
+ 'react-native-url-polyfill',
120
+ 'punycode',
121
+ 'node-forge',
122
+ 'tweetnacl',
123
+ '@babel/runtime',
124
+ ];
125
+
126
+ const missingDeps = requiredDeps.filter(dep => {
127
+ return !updatedPkg.dependencies?.[dep] && !updatedPkg.devDependencies?.[dep];
128
+ });
129
+
130
+ if (missingDeps.length > 0) {
131
+ console.log(' The following dependencies are required but not installed:');
132
+ for (const dep of missingDeps) {
133
+ console.log(` - ${dep}`);
134
+ }
135
+ console.log('');
136
+ const answer = await ask(' Install these dependencies? (Y/n) ');
137
+ if (answer !== 'n') {
138
+ console.log(' Installing...');
139
+ try {
140
+ execSync(`npm install ${missingDeps.join(' ')}`, { cwd: projectDir, stdio: 'inherit' });
141
+ } catch (e) {
142
+ console.error(' Some dependencies failed to install. Please install them manually:');
143
+ console.error(` npm install ${missingDeps.join(' ')}`);
144
+ }
145
+ }
146
+ } else {
147
+ console.log(' All required dependencies already installed.');
148
+ }
149
+ console.log('');
150
+
151
+ // ── Step 5: Copy template files ───────────────────────────────────────
152
+ console.log('Step 5: Copying starter files...');
153
+ const templatesDir = path.join(mindoodbDir, 'templates', 'reactnative');
154
+ if (fs.existsSync(templatesDir)) {
155
+ copyFileWithPrompt(
156
+ path.join(templatesDir, 'mindoodb-polyfills.js'),
157
+ path.join(projectDir, 'mindoodb-polyfills.js'),
158
+ 'polyfills file'
159
+ );
160
+ } else {
161
+ console.log(' Warning: templates directory not found in mindoodb package.');
162
+ }
163
+ console.log('');
164
+
165
+ // ── Step 6: Check app.json ────────────────────────────────────────────
166
+ console.log('Step 6: Checking app.json...');
167
+ const appJsonPath = path.join(projectDir, 'app.json');
168
+ if (fs.existsSync(appJsonPath)) {
169
+ try {
170
+ const appJson = JSON.parse(fs.readFileSync(appJsonPath, 'utf8'));
171
+ const iosEngine = appJson?.expo?.ios?.jsEngine;
172
+ if (iosEngine === 'jsc') {
173
+ console.log(' ios.jsEngine is set to "jsc".');
174
+ console.log(' This is supported, and the bundled react-native patch addresses JSC ArrayBuffer issues.');
175
+ } else {
176
+ console.log(' Hermes (default) is recommended and works with native Automerge.');
177
+ }
178
+ } catch (e) {
179
+ console.log(' Could not parse app.json. Ensure your Expo app config is valid.');
180
+ }
181
+ } else {
182
+ console.log(' No app.json found. If using Expo, this is expected only in unusual project layouts.');
183
+ }
184
+ console.log('');
185
+
186
+ // ── Step 7: Print Metro config snippet ────────────────────────────────
187
+ console.log('Step 7: Metro configuration');
188
+ console.log('');
189
+ console.log(' Add the following to your metro.config.js:');
190
+ console.log('');
191
+ console.log(' ──────────────────────────────────────────────────');
192
+ const snippetPath = path.join(templatesDir, 'metro.config.snippet.js');
193
+ if (fs.existsSync(snippetPath)) {
194
+ const snippet = fs.readFileSync(snippetPath, 'utf8');
195
+ for (const line of snippet.split('\n')) {
196
+ console.log(` ${line}`);
197
+ }
198
+ } else {
199
+ console.log(' // See docs/reactnative.md for Metro configuration');
200
+ }
201
+ console.log(' ──────────────────────────────────────────────────');
202
+ console.log('');
203
+
204
+ // ── Summary ───────────────────────────────────────────────────────────
205
+ console.log('');
206
+ console.log('Setup complete! Next steps:');
207
+ console.log('');
208
+ console.log(' 1. Add `import "./mindoodb-polyfills";` at the very top of your entry point (index.js)');
209
+ console.log(' 2. Update your metro.config.js with the snippet above');
210
+ console.log(' 3. Initialize native Automerge in your entry point:');
211
+ console.log(' import { UseApi } from "@automerge/automerge/slim";');
212
+ console.log(' import { nativeApi } from "react-native-automerge-generated";');
213
+ console.log(' UseApi(nativeApi);');
214
+ console.log(' 4. Run `npx patch-package` to apply the patches');
215
+ console.log(' 5. Rebuild your native app (expo prebuild --clean && expo run:ios)');
216
+ console.log('');
217
+ console.log(' For a complete working example, see the template files:');
218
+ console.log(` ${path.relative(projectDir, path.join(mindoodbDir, 'templates', 'reactnative'))}/`);
219
+ console.log('');
220
+ console.log(' Full documentation:');
221
+ console.log(` ${path.relative(projectDir, path.join(mindoodbDir, 'docs', 'reactnative.md'))}`);
222
+ console.log('');
223
+ }
224
+
225
+ main().catch(err => {
226
+ console.error('Setup failed:', err.message);
227
+ process.exit(1);
228
+ });