@apollohg/react-native-rich-text-editor 2.0.0

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 (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,469 @@
1
+ import {
2
+ NativeEditorEngineBoundaryError,
3
+ NativeEditorNonRetryableError,
4
+ nativeEditorV2ErrorToException,
5
+ normalizeNativeEditorV2Error,
6
+ } from './NativeEditorBoundaryError';
7
+ import { normalizeNativeEditorV2U64 } from './NativeEditorV2Decimal';
8
+ import {
9
+ type NativeEditorResult,
10
+ ERR_V2_NATIVE_RESPONSE,
11
+ ERR_V2_DESTROYED,
12
+ } from './NativeEditorNativeModule';
13
+ import { type RenderElement, type RenderMark } from './NativeEditorTypes';
14
+ import { type NativeEditorPeerInfo } from './NativeEditorCollaborationTransport';
15
+
16
+ export function isPlainRecord(value: unknown): value is Record<string, unknown> {
17
+ return value != null && typeof value === 'object' && !Array.isArray(value);
18
+ }
19
+
20
+ /**
21
+ * Validate a raw v2 result record: exactly one of value/error, every error
22
+ * field type, every domain/code string, and the caller-supplied value
23
+ * normalizer. Returns null for any contract violation; the imperative layer
24
+ * turns that into the non-retryable FFI_RESULT_INVALID error.
25
+ */
26
+ export function normalizeNativeEditorV2Result<T>(
27
+ raw: unknown,
28
+ normalizeValue: (value: unknown) => T | null
29
+ ): NativeEditorResult<T> | null {
30
+ if (!isPlainRecord(raw)) return null;
31
+ const hasValue = raw.value !== null && raw.value !== undefined;
32
+ const hasError = raw.error !== null && raw.error !== undefined;
33
+ if (hasValue === hasError) return null;
34
+ if (hasError) {
35
+ const error = normalizeNativeEditorV2Error({ error: raw.error });
36
+ return error == null ? null : { ok: false, error };
37
+ }
38
+ const value = normalizeValue(raw.value);
39
+ return value == null ? null : { ok: true, value };
40
+ }
41
+
42
+ /** Parse a JSON-string result value; anything else is a contract violation. */
43
+ export function parseNativeEditorV2JsonValue(value: unknown): unknown | null {
44
+ if (typeof value !== 'string' || value === '') return null;
45
+ try {
46
+ return JSON.parse(value) as unknown;
47
+ } catch {
48
+ return null;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Validate a direct binary result value. JSON number arrays are rejected on
54
+ * purpose: the frozen v2 contract moves bytes as bytes.
55
+ */
56
+ export function normalizeNativeEditorV2Bytes(value: unknown): Uint8Array | null {
57
+ if (value instanceof Uint8Array) return value;
58
+ if (ArrayBuffer.isView(value)) {
59
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
60
+ }
61
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
62
+ return null;
63
+ }
64
+
65
+ /** FfiUnitResult successes are exactly `true`; anything else is invalid. */
66
+ export function normalizeNativeEditorV2Unit(value: unknown): true | null {
67
+ return value === true ? true : null;
68
+ }
69
+
70
+ /**
71
+ * Normalize a request/revision identifier to its canonical decimal string.
72
+ * V2 never accepts numeric compatibility values: JavaScript numbers cannot
73
+ * represent the complete Rust u64 domain.
74
+ */
75
+ export function normalizeNativeEditorV2DecimalId(value: unknown): string | null {
76
+ return normalizeNativeEditorV2U64(value);
77
+ }
78
+
79
+ export function normalizeRevisionField(
80
+ record: Record<string, unknown>,
81
+ field: string
82
+ ): string | null {
83
+ return normalizeNativeEditorV2DecimalId(record[field]);
84
+ }
85
+
86
+ export function nativeEditorV2U32(value: unknown): number | null {
87
+ return typeof value === 'number' &&
88
+ Number.isFinite(value) &&
89
+ Number.isInteger(value) &&
90
+ value >= 0 &&
91
+ value <= 0xffff_ffff
92
+ ? value
93
+ : null;
94
+ }
95
+
96
+ /** Require one exact JavaScript/platform u32 value at the v2 boundary. */
97
+ export function requireNativeEditorV2U32(value: unknown, field: string): number {
98
+ const normalized = nativeEditorV2U32(value);
99
+ if (normalized == null) {
100
+ throw invalidV2RequestError(`NativeEditorBridge: invalid u32 ${field}`);
101
+ }
102
+ return normalized;
103
+ }
104
+
105
+ export function optionalBoolean(value: unknown): boolean | null {
106
+ return typeof value === 'boolean' ? value : null;
107
+ }
108
+
109
+ export const V2_DOCUMENT_STATES = ['LocalReady', 'AwaitRemote', 'RoomReady'] as const;
110
+
111
+ /**
112
+ * Readiness of the engine document. `AwaitRemote` is a room document still
113
+ * waiting for the server's copy: content getters return empty values and the
114
+ * view renders nothing until it promotes to `RoomReady`.
115
+ */
116
+ export type NativeEditorDocumentState = (typeof V2_DOCUMENT_STATES)[number];
117
+
118
+ export const V2_TRANSPORT_STATES = [
119
+ 'Detached',
120
+ 'Disconnected',
121
+ 'Connecting',
122
+ 'Handshaking',
123
+ 'Synchronized',
124
+ 'Incompatible',
125
+ 'Destroying',
126
+ 'Destroyed',
127
+ ] as const;
128
+
129
+ /** Raw transport lifecycle. `YjsTransportStatus` is the friendlier projection of it. */
130
+ export type NativeEditorTransportState = (typeof V2_TRANSPORT_STATES)[number];
131
+
132
+ export const V2_RENDER_STATES = ['Loading', 'Ready'] as const;
133
+
134
+ /** Whether the engine has a render snapshot to draw. */
135
+ export type NativeEditorRenderState = (typeof V2_RENDER_STATES)[number];
136
+
137
+ export const V2_DOCUMENT_ORIGINS = [
138
+ 'nativeView',
139
+ 'jsApi',
140
+ 'remoteCollaboration',
141
+ 'history',
142
+ 'restore',
143
+ 'import',
144
+ ] as const;
145
+
146
+ export type NativeEditorDocumentOrigin = (typeof V2_DOCUMENT_ORIGINS)[number];
147
+
148
+ export function whitelisted<T extends string>(value: unknown, allowed: readonly T[]): T | null {
149
+ return typeof value === 'string' && (allowed as readonly string[]).includes(value)
150
+ ? (value as T)
151
+ : null;
152
+ }
153
+
154
+ /** The engine's own account of a session: readiness, revisions, and history. */
155
+ export interface NativeEditorState {
156
+ documentState: NativeEditorDocumentState;
157
+ transportState: NativeEditorTransportState;
158
+ renderState: NativeEditorRenderState;
159
+ /** Decimal-string revision advancing on every document change. */
160
+ documentRevision: string;
161
+ /** Trusted origin of the transaction that produced documentRevision. */
162
+ documentOrigin: NativeEditorDocumentOrigin;
163
+ /** Decimal-string revision advancing on every state change, document or not. */
164
+ stateRevision: string;
165
+ canUndo: boolean;
166
+ canRedo: boolean;
167
+ }
168
+
169
+ export function normalizeNativeEditorV2StateValue(
170
+ value: unknown
171
+ ): NativeEditorState | null {
172
+ const parsed = typeof value === 'string' ? parseNativeEditorV2JsonValue(value) : value;
173
+ if (!isPlainRecord(parsed)) return null;
174
+ const documentState = whitelisted(parsed.documentState, V2_DOCUMENT_STATES);
175
+ const transportState = whitelisted(parsed.transportState, V2_TRANSPORT_STATES);
176
+ const renderState = whitelisted(parsed.renderState, V2_RENDER_STATES);
177
+ const documentRevision = normalizeRevisionField(parsed, 'documentRevision');
178
+ const documentOrigin = whitelisted(parsed.documentOrigin, V2_DOCUMENT_ORIGINS);
179
+ const stateRevision = normalizeRevisionField(parsed, 'stateRevision');
180
+ const canUndo = optionalBoolean(parsed.canUndo);
181
+ const canRedo = optionalBoolean(parsed.canRedo);
182
+ if (
183
+ documentState == null ||
184
+ transportState == null ||
185
+ renderState == null ||
186
+ documentRevision == null ||
187
+ documentOrigin == null ||
188
+ stateRevision == null ||
189
+ canUndo == null ||
190
+ canRedo == null
191
+ ) {
192
+ return null;
193
+ }
194
+ return {
195
+ documentState,
196
+ transportState,
197
+ renderState,
198
+ documentRevision,
199
+ documentOrigin,
200
+ stateRevision,
201
+ canUndo,
202
+ canRedo,
203
+ };
204
+ }
205
+
206
+ export type NativeEditorMutationOutcome =
207
+ | {
208
+ type: 'transaction';
209
+ changed: boolean;
210
+ documentRevision: string;
211
+ stateRevision: string;
212
+ canUndo: boolean;
213
+ canRedo: boolean;
214
+ }
215
+ | { type: 'notApplicable' }
216
+ | { type: 'replacement'; changed: boolean; documentRevision: string };
217
+
218
+ export function normalizeNativeEditorV2MutationOutcomeValue(
219
+ value: unknown
220
+ ): NativeEditorMutationOutcome | null {
221
+ const parsed = parseNativeEditorV2JsonValue(value);
222
+ if (!isPlainRecord(parsed)) return null;
223
+ if (parsed.type === 'notApplicable') {
224
+ return { type: 'notApplicable' };
225
+ }
226
+ if (parsed.type === 'replacement') {
227
+ const changed = optionalBoolean(parsed.changed);
228
+ const documentRevision = normalizeRevisionField(parsed, 'documentRevision');
229
+ if (changed == null || documentRevision == null) return null;
230
+ return { type: 'replacement', changed, documentRevision };
231
+ }
232
+ if (parsed.type === 'transaction') {
233
+ const changed = optionalBoolean(parsed.changed);
234
+ const documentRevision = normalizeRevisionField(parsed, 'documentRevision');
235
+ const stateRevision = normalizeRevisionField(parsed, 'stateRevision');
236
+ const canUndo = optionalBoolean(parsed.canUndo);
237
+ const canRedo = optionalBoolean(parsed.canRedo);
238
+ if (
239
+ changed == null ||
240
+ documentRevision == null ||
241
+ stateRevision == null ||
242
+ canUndo == null ||
243
+ canRedo == null
244
+ ) {
245
+ return null;
246
+ }
247
+ return {
248
+ type: 'transaction',
249
+ changed,
250
+ documentRevision,
251
+ stateRevision,
252
+ canUndo,
253
+ canRedo,
254
+ };
255
+ }
256
+ return null;
257
+ }
258
+
259
+ export interface NativeEditorCommitInfo {
260
+ changed: boolean;
261
+ documentRevision: string;
262
+ }
263
+
264
+ export function normalizeNativeEditorV2CommitValue(
265
+ value: unknown
266
+ ): NativeEditorCommitInfo | null {
267
+ const parsed = parseNativeEditorV2JsonValue(value);
268
+ if (!isPlainRecord(parsed)) return null;
269
+ const changed = optionalBoolean(parsed.changed);
270
+ const documentRevision = normalizeRevisionField(parsed, 'documentRevision');
271
+ if (changed == null || documentRevision == null) return null;
272
+ return { changed, documentRevision };
273
+ }
274
+
275
+ export function normalizeNativeEditorV2ChangedValue(value: unknown): boolean | null {
276
+ const parsed = parseNativeEditorV2JsonValue(value);
277
+ if (!isPlainRecord(parsed)) return null;
278
+ return optionalBoolean(parsed.changed);
279
+ }
280
+
281
+ export function normalizeNativeEditorV2HtmlValue(value: unknown): string | null {
282
+ const parsed = parseNativeEditorV2JsonValue(value);
283
+ if (!isPlainRecord(parsed) || typeof parsed.html !== 'string') return null;
284
+ return parsed.html;
285
+ }
286
+
287
+ export const RENDER_ELEMENT_TYPES = new Set<RenderElement['type']>([
288
+ 'textRun',
289
+ 'blockStart',
290
+ 'blockEnd',
291
+ 'voidInline',
292
+ 'voidBlock',
293
+ 'opaqueInlineAtom',
294
+ 'opaqueBlockAtom',
295
+ ]);
296
+
297
+ export function hasExactOwnKeys(
298
+ record: Record<string, unknown>,
299
+ expected: readonly string[]
300
+ ): boolean {
301
+ const actual = Object.keys(record).sort();
302
+ const sortedExpected = [...expected].sort();
303
+ return (
304
+ actual.length === sortedExpected.length &&
305
+ actual.every((key, index) => key === sortedExpected[index])
306
+ );
307
+ }
308
+
309
+ export function hasOnlyOwnKeys(
310
+ record: Record<string, unknown>,
311
+ allowed: readonly string[]
312
+ ): boolean {
313
+ const allowedKeys = new Set(allowed);
314
+ return Object.keys(record).every((key) => allowedKeys.has(key));
315
+ }
316
+
317
+ export function booleanRecord(value: unknown): value is Record<string, boolean> {
318
+ return (
319
+ isPlainRecord(value) && Object.values(value).every((entry) => typeof entry === 'boolean')
320
+ );
321
+ }
322
+
323
+ export function stringArray(value: unknown): value is string[] {
324
+ return Array.isArray(value) && value.every((entry) => typeof entry === 'string');
325
+ }
326
+
327
+ export function validJsonValue(value: unknown): boolean {
328
+ if (value === null) return true;
329
+ if (typeof value === 'string' || typeof value === 'boolean') return true;
330
+ if (typeof value === 'number') return Number.isFinite(value);
331
+ if (Array.isArray(value)) return value.every(validJsonValue);
332
+ return isPlainRecord(value) && Object.values(value).every(validJsonValue);
333
+ }
334
+
335
+ export function validRenderMark(value: unknown): value is RenderMark {
336
+ return (
337
+ typeof value === 'string' ||
338
+ (isPlainRecord(value) &&
339
+ typeof value.type === 'string' &&
340
+ Object.values(value).every(validJsonValue))
341
+ );
342
+ }
343
+
344
+ export function normalizeNativeEditorV2PeersValue(value: unknown): NativeEditorPeerInfo[] | null {
345
+ const parsed = typeof value === 'string' ? parseNativeEditorV2JsonValue(value) : value;
346
+ if (!isPlainRecord(parsed) || !Array.isArray(parsed.peers)) return null;
347
+ const peers: NativeEditorPeerInfo[] = [];
348
+ for (const rawPeer of parsed.peers) {
349
+ if (!isPlainRecord(rawPeer)) return null;
350
+ const clientId = normalizeNativeEditorV2DecimalId(rawPeer.clientId);
351
+ const clock = nativeEditorV2U32(rawPeer.clock);
352
+ const isLocal = optionalBoolean(rawPeer.isLocal);
353
+ if (clientId == null || clock == null || isLocal == null) return null;
354
+ if (rawPeer.state !== null && !isPlainRecord(rawPeer.state)) return null;
355
+ let cursor: NativeEditorPeerInfo['cursor'] = null;
356
+ if (rawPeer.cursor !== null && rawPeer.cursor !== undefined) {
357
+ if (!isPlainRecord(rawPeer.cursor)) return null;
358
+ const anchor = nativeEditorV2U32(rawPeer.cursor.anchor);
359
+ const head = nativeEditorV2U32(rawPeer.cursor.head);
360
+ if (anchor == null || head == null) return null;
361
+ cursor = { anchor, head };
362
+ }
363
+ peers.push({
364
+ clientId,
365
+ clock,
366
+ isLocal,
367
+ state: (rawPeer.state as Record<string, unknown> | null) ?? null,
368
+ cursor,
369
+ });
370
+ }
371
+ return peers;
372
+ }
373
+
374
+ export const REJECTED_V2_RECORD_PREVIEW_CHARS = 4_000;
375
+
376
+ /** Dev-only preview of a rejected boundary record, bounded so a large document never floods the log. */
377
+ export function describeRejectedV2Record(raw: unknown): string {
378
+ let serialized: string;
379
+ try {
380
+ serialized = JSON.stringify(raw);
381
+ } catch {
382
+ return `<unserializable ${typeof raw}>`;
383
+ }
384
+ if (serialized === undefined) return `<${typeof raw}>`;
385
+ return serialized.length > REJECTED_V2_RECORD_PREVIEW_CHARS
386
+ ? `${serialized.slice(0, REJECTED_V2_RECORD_PREVIEW_CHARS)}… (${serialized.length} chars)`
387
+ : serialized;
388
+ }
389
+
390
+ export function invalidV2ResultError(): NativeEditorNonRetryableError {
391
+ return new NativeEditorNonRetryableError({
392
+ domain: 'boundary',
393
+ code: 'FFI_RESULT_INVALID',
394
+ message: ERR_V2_NATIVE_RESPONSE,
395
+ requestId: null,
396
+ operationIndex: null,
397
+ limit: null,
398
+ actual: null,
399
+ details: null,
400
+ });
401
+ }
402
+
403
+ export function destroyedHandleError(): NativeEditorNonRetryableError {
404
+ return new NativeEditorNonRetryableError({
405
+ domain: 'lifecycle',
406
+ code: 'ENGINE_DESTROYED',
407
+ message: ERR_V2_DESTROYED,
408
+ requestId: null,
409
+ operationIndex: null,
410
+ limit: null,
411
+ actual: null,
412
+ details: null,
413
+ });
414
+ }
415
+
416
+ export function invalidV2RequestError(message: string): NativeEditorEngineBoundaryError {
417
+ return new NativeEditorEngineBoundaryError({
418
+ domain: 'boundary',
419
+ code: 'CONFIG_INVALID',
420
+ message,
421
+ requestId: null,
422
+ operationIndex: null,
423
+ limit: null,
424
+ actual: null,
425
+ details: null,
426
+ });
427
+ }
428
+
429
+ /**
430
+ * Unwrap a raw v2 result record on the imperative path: typed per-domain
431
+ * throws for recoverable engine errors, the distinct non-retryable class for
432
+ * ENGINE_INVARIANT_FAILED / lifecycle-destroyed states and for malformed
433
+ * records (a bridge contract violation can never succeed on retry).
434
+ */
435
+ export function unwrapNativeEditorV2Result<T>(
436
+ raw: unknown,
437
+ normalizeValue: (value: unknown) => T | null
438
+ ): T {
439
+ const result = normalizeNativeEditorV2Result(raw, normalizeValue);
440
+ if (result == null) {
441
+ // The thrown error cannot carry the payload, so name the rejected
442
+ // record here — otherwise the failure is unattributable in the app.
443
+ if (__DEV__) {
444
+ console.error(
445
+ 'NativeEditorBridge: native module returned a record this boundary rejected',
446
+ describeRejectedV2Record(raw)
447
+ );
448
+ }
449
+ throw invalidV2ResultError();
450
+ }
451
+ if (!result.ok) throw nativeEditorV2ErrorToException(result.error);
452
+ return result.value;
453
+ }
454
+
455
+ export function requireV2DecimalId(value: string, field: string): string {
456
+ const normalized = normalizeNativeEditorV2DecimalId(value);
457
+ if (normalized == null) {
458
+ throw invalidV2RequestError(`NativeEditorBridge: invalid ${field} for v2 request`);
459
+ }
460
+ return normalized;
461
+ }
462
+
463
+ export function requireV2Bytes(value: unknown, field: string): Uint8Array {
464
+ const normalized = normalizeNativeEditorV2Bytes(value);
465
+ if (normalized == null) {
466
+ throw invalidV2RequestError(`NativeEditorBridge: invalid ${field} for v2 request`);
467
+ }
468
+ return normalized;
469
+ }