@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,178 @@
1
+ import { HARD_EDITOR_RESOURCE_LIMITS, validateEditorCreateLimits } from './ResourceLimits';
2
+ import {
3
+ NativeEditorBoundaryError,
4
+ NativeEditorEngineBoundaryError,
5
+ } from './NativeEditorBoundaryError';
6
+ import { type NativeEditorCreateConfig } from './NativeEditorTypes';
7
+
8
+ export const V2_CREATE_CONFIG_KEYS = new Set([
9
+ 'initialization',
10
+ 'schema',
11
+ 'fragmentName',
12
+ 'policy',
13
+ 'limits',
14
+ ]);
15
+
16
+ export const V2_CREATE_POLICY_KEYS = new Set([
17
+ 'maxLength',
18
+ 'readOnly',
19
+ 'inputFilter',
20
+ 'allowBase64Images',
21
+ ]);
22
+
23
+ export const V2_CREATE_LIMIT_KEYS = new Set(['resource', 'editing', 'collaboration']);
24
+
25
+ export const V2_CREATE_RESOURCE_LIMIT_KEYS = new Set([
26
+ 'maxInputBytes',
27
+ 'maxDocumentNodes',
28
+ 'maxDocumentDepth',
29
+ 'maxSchemaNodes',
30
+ 'maxSchemaExpressionBytes',
31
+ 'maxCollaborationMessageBytes',
32
+ 'maxEncodedStateBytes',
33
+ ]);
34
+
35
+ export const V2_CREATE_EDITING_LIMIT_KEYS = new Set([
36
+ 'maxOperationsPerTransaction',
37
+ 'maxUndoGroups',
38
+ 'maxUndoRetainedUnits',
39
+ 'maxDerivedOutputBytes',
40
+ ]);
41
+
42
+ export const V2_CREATE_COLLABORATION_LIMIT_KEYS = new Set([
43
+ 'maxFramesPerMessage',
44
+ 'maxFrameBytes',
45
+ 'maxAggregateResponseBytes',
46
+ 'maxAwarenessPeers',
47
+ 'maxAwarenessPeerBytes',
48
+ 'maxAwarenessBytes',
49
+ 'maxPendingOutboxMessages',
50
+ 'maxPendingOutboxBytes',
51
+ 'maxPendingDependencyUpdateBytes',
52
+ 'maxPendingDependencyUpdateWork',
53
+ ]);
54
+
55
+ export const V2_CREATE_INITIALIZATION_KEYS: Readonly<Record<string, ReadonlySet<string>>> = {
56
+ localEmpty: new Set(['type']),
57
+ localJson: new Set(['type', 'json']),
58
+ localHtml: new Set(['type', 'html']),
59
+ room: new Set(['type', 'documentId', 'lineageId', 'snapshot']),
60
+ };
61
+
62
+ export const V2_CREATE_ROOM_SNAPSHOT_KEYS = new Set(['metadata', 'encodedState']);
63
+
64
+ export const V2_CREATE_SNAPSHOT_METADATA_KEYS = new Set([
65
+ 'formatVersion',
66
+ 'documentId',
67
+ 'lineageId',
68
+ 'fragmentName',
69
+ 'schemaFingerprint',
70
+ ]);
71
+
72
+ export const V2_CREATE_MAX_U32 = 0xffff_ffff;
73
+
74
+ export const V2_CREATE_JSON_MAX_BYTES = HARD_EDITOR_RESOURCE_LIMITS.maxInputBytes;
75
+
76
+ export const V2_CREATE_JSON_MAX_DEPTH = HARD_EDITOR_RESOURCE_LIMITS.maxDocumentDepth * 2 + 16;
77
+
78
+ export const V2_CREATE_JSON_MAX_WORK = HARD_EDITOR_RESOURCE_LIMITS.maxInputBytes;
79
+
80
+ export const V2_CREATE_ENVELOPE_MAX_BYTES = 64 * 1024;
81
+
82
+ export const V2_CREATE_WIRE_MAX_BYTES =
83
+ V2_CREATE_JSON_MAX_BYTES * 7 + V2_CREATE_ENVELOPE_MAX_BYTES + 2;
84
+
85
+ export const V2_CREATE_ENVELOPE_JSON_MAX_DEPTH = V2_CREATE_JSON_MAX_DEPTH + 8;
86
+
87
+ export const V2_CREATE_JSON_OUTPUT_CHUNK_SIZE = 64 * 1024;
88
+
89
+ export const V2_CREATE_STRING_CHAR_CODE_AT = String.prototype.charCodeAt;
90
+
91
+ export const V2_CREATE_STRING_SLICE = String.prototype.slice;
92
+
93
+ export const V2_CREATE_NUMBER_TO_STRING = Number.prototype.toString;
94
+
95
+ export class NativeEditorCreateConfigError extends Error {
96
+ constructor(message: string) {
97
+ super(message);
98
+ this.name = 'NativeEditorCreateConfigError';
99
+ }
100
+ }
101
+
102
+ export function invalidV2CreateRequestError(message: string): NativeEditorCreateConfigError {
103
+ return new NativeEditorCreateConfigError(message);
104
+ }
105
+
106
+ export function validateV2CreateLimits(limits: NativeEditorCreateConfig['limits']): void {
107
+ try {
108
+ validateEditorCreateLimits(limits);
109
+ } catch (error) {
110
+ if (!(error instanceof NativeEditorBoundaryError)) throw error;
111
+ throw new NativeEditorEngineBoundaryError({
112
+ domain: 'boundary',
113
+ code: error.code,
114
+ message: error.message,
115
+ requestId: null,
116
+ operationIndex: null,
117
+ limit: error.limit == null ? null : String(error.limit),
118
+ actual: error.actual == null ? null : String(error.actual),
119
+ details: error.details ?? null,
120
+ });
121
+ }
122
+ }
123
+
124
+ export function emptyV2CreateRecord(): Record<string, unknown> {
125
+ return Object.create(null) as Record<string, unknown>;
126
+ }
127
+
128
+ export function isV2CreateRecord(value: unknown): value is Record<string, unknown> {
129
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) return false;
130
+ const prototype = Object.getPrototypeOf(value);
131
+ return prototype === Object.prototype || prototype === null;
132
+ }
133
+
134
+ export function hasOwnV2CreateKey(value: Record<string, unknown>, key: string): boolean {
135
+ return Object.prototype.hasOwnProperty.call(value, key);
136
+ }
137
+
138
+ export function ownV2CreateValue(value: Record<string, unknown>, key: string): unknown {
139
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
140
+ if (descriptor === undefined) return undefined;
141
+ if (!('value' in descriptor)) {
142
+ throw invalidV2CreateRequestError(
143
+ `NativeEditorBridge: accessor ${key} is not allowed for v2 create`
144
+ );
145
+ }
146
+ return descriptor.value;
147
+ }
148
+
149
+ export function requireKnownV2CreateKeys(
150
+ value: unknown,
151
+ allowed: ReadonlySet<string>,
152
+ label: string
153
+ ): asserts value is Record<string, unknown> {
154
+ if (
155
+ !isV2CreateRecord(value) ||
156
+ Reflect.ownKeys(value).some((key) => typeof key !== 'string' || !allowed.has(key))
157
+ ) {
158
+ throw invalidV2CreateRequestError(`NativeEditorBridge: invalid ${label} for v2 create`);
159
+ }
160
+ }
161
+
162
+ export function normalizeV2CreateRecord(
163
+ value: Record<string, unknown>,
164
+ allowed: ReadonlySet<string>,
165
+ label: string
166
+ ): Record<string, unknown> {
167
+ requireKnownV2CreateKeys(value, allowed, label);
168
+ const normalized = emptyV2CreateRecord();
169
+ for (const key of allowed) {
170
+ if (!hasOwnV2CreateKey(value, key)) continue;
171
+ const fieldValue = ownV2CreateValue(value, key);
172
+ if (fieldValue === null) {
173
+ throw invalidV2CreateRequestError(`NativeEditorBridge: invalid ${label} for v2 create`);
174
+ }
175
+ if (fieldValue !== undefined) normalized[key] = fieldValue;
176
+ }
177
+ return normalized;
178
+ }
@@ -0,0 +1,485 @@
1
+ import {
2
+ NativeEditorErrorBase,
3
+ NativeEditorNonRetryableError,
4
+ nativeEditorV2ErrorToException,
5
+ normalizeNativeEditorV2Error,
6
+ } from './NativeEditorBoundaryError';
7
+ import {
8
+ type NativeCollaborationProtocolAdapter,
9
+ type NativeCollaborationTransportConfig,
10
+ collaborationTransportWireConfig,
11
+ normalizeNativeCollaborationTransportEvent,
12
+ type NativeCollaborationProtocolAdapterContext,
13
+ serializeCollaborationProtocolAdapterResult,
14
+ type NativeCollaborationTransportEvent,
15
+ } from './NativeEditorCollaborationTransport';
16
+ import {
17
+ destroyedHandleError,
18
+ unwrapNativeEditorV2Result,
19
+ invalidV2RequestError,
20
+ requireV2DecimalId,
21
+ normalizeNativeEditorV2Unit,
22
+ isPlainRecord,
23
+ invalidV2ResultError,
24
+ type NativeEditorState,
25
+ normalizeNativeEditorV2StateValue,
26
+ normalizeNativeEditorV2HtmlValue,
27
+ requireNativeEditorV2U32,
28
+ type NativeEditorCommitInfo,
29
+ normalizeNativeEditorV2CommitValue,
30
+ type NativeEditorMutationOutcome,
31
+ normalizeNativeEditorV2MutationOutcomeValue,
32
+ normalizeNativeEditorV2ChangedValue,
33
+ requireV2Bytes,
34
+ } from './NativeEditorResultNormalization';
35
+ import {
36
+ V2_ENVELOPE_VERSION,
37
+ invokeNativeEditorV2,
38
+ getNativeModule,
39
+ } from './NativeEditorNativeModule';
40
+ import {
41
+ type DocumentJSON,
42
+ type ContentSnapshot,
43
+ type NativeEditorAtomicRenderSnapshot,
44
+ type NativeEditorReplaceDocumentRequest,
45
+ type NativeEditorInputRequest,
46
+ type NativeEditorCommandRequest,
47
+ type NativeEditorLocalApiRequest,
48
+ type NativeEditorSelectionRequest,
49
+ type NativeEditorSnapshotMetadata,
50
+ type NativeEditorLocalAwarenessIntent,
51
+ } from './NativeEditorTypes';
52
+ import {
53
+ normalizeNativeEditorV2DocumentJsonValue,
54
+ normalizeNativeEditorV2ContentSnapshotValue,
55
+ normalizeNativeEditorV2RenderUpdateValue,
56
+ type NativeEditorSnapshotExport,
57
+ normalizeNativeEditorV2SnapshotExportValue,
58
+ } from './NativeEditorRenderNormalization';
59
+ import {
60
+ serializeLocalAwarenessIntent,
61
+ validateLocalAwarenessIntent,
62
+ } from './NativeEditorLocalAwareness';
63
+
64
+ /**
65
+ * Typed imperative v2 bridge bound to one decimal-string editor id. Every
66
+ * entry normalizes the frozen result record, keeps revisions as decimal
67
+ * strings, and throws typed errors; results that arrive for a destroyed
68
+ * handle (including re-entrant destroy races) are classified non-retryable.
69
+ */
70
+ export class NativeEditorDocumentBridge {
71
+ private readonly _editorId: string;
72
+ private _destroyed = false;
73
+ /** @internal Reset intent waiting for the interactive view handoff. */
74
+ _pendingViewReset: { json: string } | null = null;
75
+ private _nextRequestId = 0n;
76
+ private readonly _errorListeners = new Set<(error: NativeEditorErrorBase) => void>();
77
+ private _collaborationProtocolAdapter: NativeCollaborationProtocolAdapter | null = null;
78
+ private _collaborationProtocolAdapterSubscription: { remove(): void } | null = null;
79
+
80
+ /** @internal Created by createNativeEditorDocumentHandle. */
81
+ constructor(editorId: string) {
82
+ this._editorId = editorId;
83
+ }
84
+
85
+ get editorId(): string {
86
+ return this._editorId;
87
+ }
88
+
89
+ get isDestroyed(): boolean {
90
+ return this._destroyed;
91
+ }
92
+
93
+ private assertAlive(): void {
94
+ if (this._destroyed) throw destroyedHandleError();
95
+ }
96
+
97
+ private callV2<T>(invoke: () => unknown, normalizeValue: (value: unknown) => T | null): T {
98
+ this.assertAlive();
99
+ const raw = invoke();
100
+ // A re-entrant destroy racing the native call makes any result
101
+ // arriving now a result for a destroyed handle: non-retryable.
102
+ if (this._destroyed) throw destroyedHandleError();
103
+ return unwrapNativeEditorV2Result(raw, normalizeValue);
104
+ }
105
+
106
+ private nextRequestId(): string {
107
+ if (this._nextRequestId >= 18_446_744_073_709_551_615n) {
108
+ throw invalidV2RequestError('NativeEditorBridge: v2 request id exhausted');
109
+ }
110
+ this._nextRequestId += 1n;
111
+ return this._nextRequestId.toString();
112
+ }
113
+
114
+ /**
115
+ * Serialize a request envelope with canonical decimal-string u64 fields.
116
+ */
117
+ private buildEnvelopeJson(
118
+ payload: Record<string, unknown>,
119
+ baseDocumentRevision?: string
120
+ ): string {
121
+ const parts: string[] = [
122
+ `"version":${V2_ENVELOPE_VERSION}`,
123
+ `"requestId":"${this.nextRequestId()}"`,
124
+ ];
125
+ if (baseDocumentRevision !== undefined) {
126
+ const digits = requireV2DecimalId(baseDocumentRevision, 'baseDocumentRevision');
127
+ parts.push(`"baseDocumentRevision":"${digits}"`);
128
+ }
129
+ const payloadJson = JSON.stringify(payload);
130
+ const inner = payloadJson.slice(1, payloadJson.length - 1);
131
+ if (inner.length > 0) parts.push(inner);
132
+ return `{${parts.join(',')}}`;
133
+ }
134
+
135
+ /** Destroy the session. Repeated destroy is safe. */
136
+ destroy(): void {
137
+ if (this._destroyed) return;
138
+ try {
139
+ unwrapNativeEditorV2Result(
140
+ invokeNativeEditorV2('editorV2Destroy', this._editorId),
141
+ normalizeNativeEditorV2Unit
142
+ );
143
+ } catch (error) {
144
+ // An already-destroyed native session still satisfies the
145
+ // caller's goal; every other failure is reported.
146
+ if (
147
+ error instanceof NativeEditorNonRetryableError &&
148
+ (error.code === 'ENGINE_DESTROYED' || error.code === 'ENGINE_DESTROYING')
149
+ ) {
150
+ // An already-destroyed native session still commits the
151
+ // local teardown below.
152
+ } else {
153
+ throw error;
154
+ }
155
+ }
156
+ this._destroyed = true;
157
+ this._collaborationProtocolAdapter = null;
158
+ this._collaborationProtocolAdapterSubscription?.remove();
159
+ this._collaborationProtocolAdapterSubscription = null;
160
+ this._errorListeners.clear();
161
+ }
162
+
163
+ /** Subscribe to autonomous native failures; returns the unsubscribe. */
164
+ addErrorListener(listener: (error: NativeEditorErrorBase) => void): () => void {
165
+ this._errorListeners.add(listener);
166
+ return () => {
167
+ this._errorListeners.delete(listener);
168
+ };
169
+ }
170
+
171
+ /**
172
+ * @internal Route one autonomous native failure (input/accessibility) to
173
+ * the error listeners exactly once. Accepts a bare error record or the
174
+ * frozen envelope form; malformed payloads surface as a non-retryable
175
+ * contract violation so the view stays usable.
176
+ */
177
+ _emitAutonomousError(raw: unknown): void {
178
+ if (this._destroyed) return;
179
+ const candidate = isPlainRecord(raw) && 'error' in raw ? raw : { error: raw };
180
+ const normalized = normalizeNativeEditorV2Error(candidate);
181
+ const exception =
182
+ normalized == null
183
+ ? invalidV2ResultError()
184
+ : nativeEditorV2ErrorToException(normalized);
185
+ for (const listener of this._errorListeners) {
186
+ listener(exception);
187
+ }
188
+ }
189
+
190
+ getState(): NativeEditorState {
191
+ return this.callV2(
192
+ () => invokeNativeEditorV2('editorV2GetState', this._editorId),
193
+ normalizeNativeEditorV2StateValue
194
+ );
195
+ }
196
+
197
+ getDocumentJson(): DocumentJSON {
198
+ return this.callV2(
199
+ () => invokeNativeEditorV2('editorV2GetDocumentJson', this._editorId),
200
+ normalizeNativeEditorV2DocumentJsonValue
201
+ );
202
+ }
203
+
204
+ getDocumentHtml(): string {
205
+ return this.callV2(
206
+ () => invokeNativeEditorV2('editorV2GetDocumentHtml', this._editorId),
207
+ normalizeNativeEditorV2HtmlValue
208
+ );
209
+ }
210
+
211
+ getContentSnapshot(): ContentSnapshot {
212
+ return this.callV2(
213
+ () => invokeNativeEditorV2('editorV2GetContentSnapshot', this._editorId),
214
+ normalizeNativeEditorV2ContentSnapshotValue
215
+ );
216
+ }
217
+
218
+ /**
219
+ * Fetch the complete typed, immutable render snapshot a bound native view
220
+ * applies after a JS-driven engine change. Without a scalar mirror, its
221
+ * selection is the engine-authoritative selection; a mirror resolves only
222
+ * this snapshot's selection into document and scalar positions.
223
+ */
224
+ renderUpdate(mirrorScalarSelection?: {
225
+ anchor: number;
226
+ head: number;
227
+ }): NativeEditorAtomicRenderSnapshot {
228
+ this.assertAlive();
229
+ const mirrorAnchor = mirrorScalarSelection?.anchor ?? null;
230
+ const mirrorHead = mirrorScalarSelection?.head ?? null;
231
+ if ((mirrorAnchor == null) !== (mirrorHead == null)) {
232
+ throw invalidV2RequestError(
233
+ 'NativeEditorBridge: render update mirror requires both scalar anchor and head'
234
+ );
235
+ }
236
+ if (mirrorAnchor != null) requireNativeEditorV2U32(mirrorAnchor, 'mirrorScalarAnchor');
237
+ if (mirrorHead != null) requireNativeEditorV2U32(mirrorHead, 'mirrorScalarHead');
238
+ return this.callV2(
239
+ () =>
240
+ invokeNativeEditorV2(
241
+ 'editorV2RenderUpdate',
242
+ this._editorId,
243
+ mirrorAnchor,
244
+ mirrorHead
245
+ ),
246
+ normalizeNativeEditorV2RenderUpdateValue
247
+ );
248
+ }
249
+
250
+ replaceDocument(request: NativeEditorReplaceDocumentRequest): NativeEditorCommitInfo {
251
+ this.assertAlive();
252
+ const payload: Record<string, unknown> = {};
253
+ if (request.setJson !== undefined) payload.setJson = request.setJson;
254
+ if (request.setHtml !== undefined) payload.setHtml = request.setHtml;
255
+ payload.history = request.history;
256
+ const requestJson = this.buildEnvelopeJson(payload);
257
+ const result = this.callV2(
258
+ () => invokeNativeEditorV2('editorV2ReplaceDocument', this._editorId, requestJson),
259
+ normalizeNativeEditorV2CommitValue
260
+ );
261
+ if (request.history === 'resetAndClear' && 'documentRevision' in result) {
262
+ this._pendingViewReset = {
263
+ json: JSON.stringify({ ...payload, documentRevision: result.documentRevision }),
264
+ };
265
+ } else {
266
+ this._pendingViewReset = null;
267
+ }
268
+ return result;
269
+ }
270
+
271
+ applyInput(request: NativeEditorInputRequest): NativeEditorMutationOutcome {
272
+ this.assertAlive();
273
+ const requestJson = this.buildEnvelopeJson(
274
+ { text: request.text },
275
+ request.baseDocumentRevision
276
+ );
277
+ return this.callV2(
278
+ () => invokeNativeEditorV2('editorV2ApplyInput', this._editorId, requestJson),
279
+ normalizeNativeEditorV2MutationOutcomeValue
280
+ );
281
+ }
282
+
283
+ applyCommand(request: NativeEditorCommandRequest): NativeEditorMutationOutcome {
284
+ this.assertAlive();
285
+ const requestJson = this.buildEnvelopeJson(
286
+ { command: request.command },
287
+ request.baseDocumentRevision
288
+ );
289
+ return this.callV2(
290
+ () => invokeNativeEditorV2('editorV2ApplyCommand', this._editorId, requestJson),
291
+ normalizeNativeEditorV2MutationOutcomeValue
292
+ );
293
+ }
294
+
295
+ applyLocalApi(request: NativeEditorLocalApiRequest): NativeEditorMutationOutcome {
296
+ this.assertAlive();
297
+ const payload: Record<string, unknown> = {};
298
+ if (request.setJson !== undefined) payload.setJson = request.setJson;
299
+ if (request.setHtml !== undefined) payload.setHtml = request.setHtml;
300
+ payload.history = request.history;
301
+ const requestJson = this.buildEnvelopeJson(payload, request.baseDocumentRevision);
302
+ const result = this.callV2(
303
+ () => invokeNativeEditorV2('editorV2ApplyLocalApi', this._editorId, requestJson),
304
+ normalizeNativeEditorV2MutationOutcomeValue
305
+ );
306
+ if (request.history === 'resetAndClear' && 'documentRevision' in result) {
307
+ this._pendingViewReset = {
308
+ json: JSON.stringify({ ...payload, documentRevision: result.documentRevision }),
309
+ };
310
+ } else {
311
+ this._pendingViewReset = null;
312
+ }
313
+ return result;
314
+ }
315
+
316
+ setSelection(request: NativeEditorSelectionRequest): NativeEditorMutationOutcome {
317
+ this.assertAlive();
318
+ const requestJson = this.buildEnvelopeJson(
319
+ { selection: request.selection },
320
+ request.baseDocumentRevision
321
+ );
322
+ return this.callV2(
323
+ () => invokeNativeEditorV2('editorV2SetSelection', this._editorId, requestJson),
324
+ normalizeNativeEditorV2MutationOutcomeValue
325
+ );
326
+ }
327
+
328
+ undo(): boolean {
329
+ this.assertAlive();
330
+ const requestJson = this.buildEnvelopeJson({});
331
+ return this.callV2(
332
+ () => invokeNativeEditorV2('editorV2Undo', this._editorId, requestJson),
333
+ normalizeNativeEditorV2ChangedValue
334
+ );
335
+ }
336
+
337
+ redo(): boolean {
338
+ this.assertAlive();
339
+ const requestJson = this.buildEnvelopeJson({});
340
+ return this.callV2(
341
+ () => invokeNativeEditorV2('editorV2Redo', this._editorId, requestJson),
342
+ normalizeNativeEditorV2ChangedValue
343
+ );
344
+ }
345
+
346
+ snapshotExport(): NativeEditorSnapshotExport {
347
+ return this.callV2(
348
+ () => invokeNativeEditorV2('editorV2SnapshotExport', this._editorId),
349
+ normalizeNativeEditorV2SnapshotExportValue
350
+ );
351
+ }
352
+
353
+ snapshotRestore(
354
+ metadata: NativeEditorSnapshotMetadata,
355
+ encodedState: Uint8Array
356
+ ): NativeEditorCommitInfo {
357
+ this.assertAlive();
358
+ const bytes = requireV2Bytes(encodedState, 'snapshot encodedState');
359
+ return this.callV2(
360
+ () =>
361
+ invokeNativeEditorV2(
362
+ 'editorV2SnapshotRestore',
363
+ this._editorId,
364
+ JSON.stringify(metadata),
365
+ bytes
366
+ ),
367
+ normalizeNativeEditorV2CommitValue
368
+ );
369
+ }
370
+
371
+ configureCollaborationTransport(config: NativeCollaborationTransportConfig | null): void {
372
+ this.assertAlive();
373
+ const wireConfig = config === null ? null : collaborationTransportWireConfig(config);
374
+ const previousAdapter = this._collaborationProtocolAdapter;
375
+ const nextAdapter = config?.protocolAdapter ?? null;
376
+ if (nextAdapter !== null && this._collaborationProtocolAdapterSubscription === null) {
377
+ this._collaborationProtocolAdapterSubscription = getNativeModule().addListener(
378
+ 'onCollaborationTransportEvent',
379
+ (rawEvent) => this.handleCollaborationProtocolAdapterEvent(rawEvent)
380
+ );
381
+ }
382
+ this._collaborationProtocolAdapter = nextAdapter;
383
+ try {
384
+ this.callV2(
385
+ () =>
386
+ invokeNativeEditorV2(
387
+ 'editorV2CollaborationConfigureTransport',
388
+ this._editorId,
389
+ wireConfig === null ? null : JSON.stringify(wireConfig)
390
+ ),
391
+ normalizeNativeEditorV2Unit
392
+ );
393
+ } catch (error) {
394
+ this._collaborationProtocolAdapter = previousAdapter;
395
+ if (
396
+ previousAdapter === null &&
397
+ this._collaborationProtocolAdapterSubscription !== null
398
+ ) {
399
+ this._collaborationProtocolAdapterSubscription.remove();
400
+ this._collaborationProtocolAdapterSubscription = null;
401
+ }
402
+ throw error;
403
+ }
404
+ if (nextAdapter === null && this._collaborationProtocolAdapterSubscription !== null) {
405
+ this._collaborationProtocolAdapterSubscription.remove();
406
+ this._collaborationProtocolAdapterSubscription = null;
407
+ }
408
+ }
409
+
410
+ private handleCollaborationProtocolAdapterEvent(rawEvent: unknown): void {
411
+ if (this._destroyed || this._collaborationProtocolAdapter === null) return;
412
+ const event = normalizeNativeCollaborationTransportEvent(rawEvent);
413
+ if (event?.editorId !== this._editorId || event.kind !== 'protocolAdapter') {
414
+ return;
415
+ }
416
+ const adapter = this._collaborationProtocolAdapter;
417
+ const context: NativeCollaborationProtocolAdapterContext = {
418
+ attemptId: event.attemptId,
419
+ generation: event.generation,
420
+ negotiatedProtocol: event.negotiatedProtocol,
421
+ };
422
+ const callback =
423
+ event.phase === 'open'
424
+ ? () => adapter.onOpen(context)
425
+ : () => adapter.onMessage(context, event.frame!);
426
+ void Promise.resolve()
427
+ .then(callback)
428
+ .then((result) => serializeCollaborationProtocolAdapterResult(result))
429
+ .catch(() => '{"action":"reject"}')
430
+ .then((responseJson) => {
431
+ if (this._destroyed) return;
432
+ try {
433
+ this.callV2(
434
+ () =>
435
+ invokeNativeEditorV2(
436
+ 'editorV2CollaborationResolveProtocolAdapter',
437
+ this._editorId,
438
+ event.attemptId,
439
+ event.eventId,
440
+ responseJson
441
+ ),
442
+ normalizeNativeEditorV2Unit
443
+ );
444
+ } catch {
445
+ // Native treats stale attempt responses as no-ops. A live
446
+ // resolution failure is surfaced by its transport event;
447
+ // adapter payloads and callback errors are never logged.
448
+ }
449
+ });
450
+ }
451
+
452
+ setLocalAwareness(intent: NativeEditorLocalAwarenessIntent | null): void {
453
+ this.assertAlive();
454
+ const awarenessJson =
455
+ intent === null
456
+ ? 'null'
457
+ : serializeLocalAwarenessIntent(validateLocalAwarenessIntent(intent));
458
+ this.callV2(
459
+ () =>
460
+ invokeNativeEditorV2(
461
+ 'editorV2CollaborationSetAwareness',
462
+ this._editorId,
463
+ awarenessJson
464
+ ),
465
+ normalizeNativeEditorV2Unit
466
+ );
467
+ }
468
+
469
+ addCollaborationTransportListener(
470
+ listener: (event: NativeCollaborationTransportEvent) => void
471
+ ): () => void {
472
+ this.assertAlive();
473
+ const subscription = getNativeModule().addListener(
474
+ 'onCollaborationTransportEvent',
475
+ (rawEvent) => {
476
+ if (this._destroyed) return;
477
+ const event = normalizeNativeCollaborationTransportEvent(rawEvent);
478
+ if (event?.editorId === this._editorId) {
479
+ listener(event);
480
+ }
481
+ }
482
+ );
483
+ return () => subscription.remove();
484
+ }
485
+ }