@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.
- package/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- package/src/useViewerAtoms.tsx +427 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type ResolvedDocumentSchema } from './schemas';
|
|
2
|
+
import { NativeEditorErrorBase } from './NativeEditorBoundaryError';
|
|
3
|
+
import { NativeEditorDocumentBridge } from './NativeEditorDocumentBridge';
|
|
4
|
+
import {
|
|
5
|
+
type NativeCollaborationTransportConfig,
|
|
6
|
+
type NativeCollaborationTransportEvent,
|
|
7
|
+
} from './NativeEditorCollaborationTransport';
|
|
8
|
+
import {
|
|
9
|
+
type NativeEditorLocalAwarenessIntent,
|
|
10
|
+
type NativeEditorCreateConfig,
|
|
11
|
+
} from './NativeEditorTypes';
|
|
12
|
+
import {
|
|
13
|
+
invalidV2RequestError,
|
|
14
|
+
unwrapNativeEditorV2Result,
|
|
15
|
+
} from './NativeEditorResultNormalization';
|
|
16
|
+
import { buildV2CreateRequest } from './NativeEditorCreateConfig';
|
|
17
|
+
import { invokeNativeEditorV2 } from './NativeEditorNativeModule';
|
|
18
|
+
import { normalizeNativeEditorV2CreateValue } from './NativeEditorRenderNormalization';
|
|
19
|
+
|
|
20
|
+
export const NATIVE_EDITOR_DOCUMENT_HANDLE_BRAND: unique symbol = Symbol(
|
|
21
|
+
'NativeEditorDocumentHandle.brand'
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export const NATIVE_EDITOR_DOCUMENT_HANDLE_TOKEN = Object.freeze({});
|
|
25
|
+
|
|
26
|
+
export const AUTHENTIC_NATIVE_EDITOR_DOCUMENT_HANDLES = new WeakSet<object>();
|
|
27
|
+
|
|
28
|
+
export const NATIVE_EDITOR_DOCUMENT_HANDLE_DESCRIPTORS = new WeakMap<
|
|
29
|
+
object,
|
|
30
|
+
ResolvedDocumentSchema
|
|
31
|
+
>();
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* One native document session, shared by everything that touches the
|
|
35
|
+
* document: the editor view, the headless `useNativeEditorDocument` binding,
|
|
36
|
+
* and the collaboration controller. Obtain one from
|
|
37
|
+
* {@link createNativeEditorDocumentHandle} — it cannot be constructed
|
|
38
|
+
* directly — and `destroy()` it when its owner unmounts.
|
|
39
|
+
*/
|
|
40
|
+
export interface NativeEditorDocumentHandle {
|
|
41
|
+
readonly [NATIVE_EDITOR_DOCUMENT_HANDLE_BRAND]: true;
|
|
42
|
+
/** Decimal-string session id, shared with the native view. */
|
|
43
|
+
readonly editorId: string;
|
|
44
|
+
/** Typed imperative access to the engine. The React APIs use this for you. */
|
|
45
|
+
readonly bridge: NativeEditorDocumentBridge;
|
|
46
|
+
readonly isDestroyed: boolean;
|
|
47
|
+
/** Release the native session. Every later call fails as non-retryable. */
|
|
48
|
+
destroy(): void;
|
|
49
|
+
/** Observe engine failures raised outside a caller's own call. Returns an unsubscribe function. */
|
|
50
|
+
addErrorListener(listener: (error: NativeEditorErrorBase) => void): () => void;
|
|
51
|
+
/** Point the native transport at a server, or pass null to detach. */
|
|
52
|
+
configureCollaborationTransport(config: NativeCollaborationTransportConfig | null): void;
|
|
53
|
+
/** Publish local presence, or pass null to withdraw it. */
|
|
54
|
+
setLocalAwareness(intent: NativeEditorLocalAwarenessIntent | null): void;
|
|
55
|
+
/** Observe transport state, errors, and protocol-adapter requests. Returns an unsubscribe function. */
|
|
56
|
+
addCollaborationTransportListener(
|
|
57
|
+
listener: (event: NativeCollaborationTransportEvent) => void
|
|
58
|
+
): () => void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export class NativeEditorDocumentHandleImpl implements NativeEditorDocumentHandle {
|
|
62
|
+
readonly [NATIVE_EDITOR_DOCUMENT_HANDLE_BRAND] = true as const;
|
|
63
|
+
|
|
64
|
+
constructor(
|
|
65
|
+
token: typeof NATIVE_EDITOR_DOCUMENT_HANDLE_TOKEN,
|
|
66
|
+
public readonly editorId: string,
|
|
67
|
+
public readonly bridge: NativeEditorDocumentBridge,
|
|
68
|
+
documentDescriptor: ResolvedDocumentSchema
|
|
69
|
+
) {
|
|
70
|
+
if (token !== NATIVE_EDITOR_DOCUMENT_HANDLE_TOKEN) {
|
|
71
|
+
throw invalidV2RequestError(
|
|
72
|
+
'NativeEditorBridge: NativeEditorDocumentHandle cannot be constructed directly'
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
AUTHENTIC_NATIVE_EDITOR_DOCUMENT_HANDLES.add(this);
|
|
76
|
+
NATIVE_EDITOR_DOCUMENT_HANDLE_DESCRIPTORS.set(this, documentDescriptor);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get isDestroyed(): boolean {
|
|
80
|
+
return this.bridge.isDestroyed;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
destroy(): void {
|
|
84
|
+
this.bridge.destroy();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
addErrorListener(listener: (error: NativeEditorErrorBase) => void): () => void {
|
|
88
|
+
return this.bridge.addErrorListener(listener);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
configureCollaborationTransport(config: NativeCollaborationTransportConfig | null): void {
|
|
92
|
+
this.bridge.configureCollaborationTransport(config);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
setLocalAwareness(intent: NativeEditorLocalAwarenessIntent | null): void {
|
|
96
|
+
this.bridge.setLocalAwareness(intent);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
addCollaborationTransportListener(
|
|
100
|
+
listener: (event: NativeCollaborationTransportEvent) => void
|
|
101
|
+
): () => void {
|
|
102
|
+
return this.bridge.addCollaborationTransportListener(listener);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** @internal Handle-owned schema metadata for source-module view bindings. */
|
|
107
|
+
export function _getNativeEditorDocumentHandleDescriptor(
|
|
108
|
+
handle: NativeEditorDocumentHandle
|
|
109
|
+
): ResolvedDocumentSchema {
|
|
110
|
+
_assertNativeEditorDocumentHandle(handle);
|
|
111
|
+
const documentDescriptor = NATIVE_EDITOR_DOCUMENT_HANDLE_DESCRIPTORS.get(handle);
|
|
112
|
+
if (documentDescriptor === undefined) {
|
|
113
|
+
throw invalidV2RequestError(
|
|
114
|
+
'NativeEditorBridge: authentic NativeEditorDocumentHandle has no document descriptor'
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return documentDescriptor;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** @internal Source-module boundary assertion; intentionally absent from the package index. */
|
|
121
|
+
export function _assertNativeEditorDocumentHandle(
|
|
122
|
+
value: unknown
|
|
123
|
+
): asserts value is NativeEditorDocumentHandle {
|
|
124
|
+
if (
|
|
125
|
+
(typeof value !== 'object' && typeof value !== 'function') ||
|
|
126
|
+
value === null ||
|
|
127
|
+
!AUTHENTIC_NATIVE_EDITOR_DOCUMENT_HANDLES.has(value)
|
|
128
|
+
) {
|
|
129
|
+
throw invalidV2RequestError(
|
|
130
|
+
'NativeEditorBridge: expected an authentic NativeEditorDocumentHandle'
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Create the native document session every other API binds to. Create it once
|
|
137
|
+
* per document — `useMemo`, not on each render — and destroy it when its
|
|
138
|
+
* owner unmounts.
|
|
139
|
+
*
|
|
140
|
+
* @throws NativeEditorErrorBase when the config is rejected: a malformed
|
|
141
|
+
* schema, an out-of-range limit, or content the engine cannot parse.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* const documentHandle = useMemo(
|
|
146
|
+
* () => createNativeEditorDocumentHandle({
|
|
147
|
+
* initialization: { type: 'localHtml', html: '<p>Hello world</p>' },
|
|
148
|
+
* }),
|
|
149
|
+
* []
|
|
150
|
+
* );
|
|
151
|
+
* useEffect(() => () => documentHandle.destroy(), [documentHandle]);
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export function createNativeEditorDocumentHandle(
|
|
155
|
+
config: NativeEditorCreateConfig
|
|
156
|
+
): NativeEditorDocumentHandle {
|
|
157
|
+
const { configJson, snapshotState, documentDescriptor } = buildV2CreateRequest(config);
|
|
158
|
+
const value = unwrapNativeEditorV2Result(
|
|
159
|
+
invokeNativeEditorV2('editorV2Create', configJson, snapshotState),
|
|
160
|
+
normalizeNativeEditorV2CreateValue
|
|
161
|
+
);
|
|
162
|
+
return new NativeEditorDocumentHandleImpl(
|
|
163
|
+
NATIVE_EDITOR_DOCUMENT_HANDLE_TOKEN,
|
|
164
|
+
value.editorId,
|
|
165
|
+
new NativeEditorDocumentBridge(value.editorId),
|
|
166
|
+
documentDescriptor
|
|
167
|
+
);
|
|
168
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { NativeEditorEngineBoundaryError } from './NativeEditorBoundaryError';
|
|
2
|
+
import { invalidV2RequestError, nativeEditorV2U32 } from './NativeEditorResultNormalization';
|
|
3
|
+
import {
|
|
4
|
+
type NativeEditorLocalAwarenessSelection,
|
|
5
|
+
NativeEditorLocalAwarenessSelectionValue,
|
|
6
|
+
} from './NativeEditorTypes';
|
|
7
|
+
import { normalizeV2JsonValue, serializeV2CreateEnvelope } from './NativeEditorCreateJson';
|
|
8
|
+
|
|
9
|
+
export const LOCAL_AWARENESS_INTENT_KEYS = new Set(['state', 'focused', 'selection']);
|
|
10
|
+
|
|
11
|
+
export const LOCAL_AWARENESS_SELECTION_VALUES = new WeakMap<
|
|
12
|
+
object,
|
|
13
|
+
Readonly<{ anchor: number; head: number }>
|
|
14
|
+
>();
|
|
15
|
+
|
|
16
|
+
export function invalidLocalAwarenessIntent(message = 'invalid local awareness intent'): never {
|
|
17
|
+
throw invalidV2RequestError(`NativeEditorBridge: ${message}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create the only caller-owned local-awareness selection accepted at the
|
|
22
|
+
* JavaScript-to-native boundary. The private WeakMap makes provenance an API
|
|
23
|
+
* capability instead of a structural object-shape check.
|
|
24
|
+
*/
|
|
25
|
+
export function createNativeEditorLocalAwarenessSelection(
|
|
26
|
+
anchor: number,
|
|
27
|
+
head: number
|
|
28
|
+
): NativeEditorLocalAwarenessSelection {
|
|
29
|
+
const acceptedAnchor = nativeEditorV2U32(anchor);
|
|
30
|
+
const acceptedHead = nativeEditorV2U32(head);
|
|
31
|
+
if (acceptedAnchor == null || acceptedHead == null) invalidLocalAwarenessIntent();
|
|
32
|
+
|
|
33
|
+
const selection: NativeEditorLocalAwarenessSelection =
|
|
34
|
+
new NativeEditorLocalAwarenessSelectionValue(acceptedAnchor, acceptedHead);
|
|
35
|
+
Object.freeze(selection);
|
|
36
|
+
LOCAL_AWARENESS_SELECTION_VALUES.set(selection, selection);
|
|
37
|
+
return selection;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function isLocalAwarenessRecord(value: unknown): value is Record<string, unknown> {
|
|
41
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
42
|
+
const prototype = Object.getPrototypeOf(value);
|
|
43
|
+
return prototype === Object.prototype || prototype === null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function localAwarenessOwnDataValue(record: Record<string, unknown>, key: string): unknown {
|
|
47
|
+
const descriptor = Object.getOwnPropertyDescriptor(record, key);
|
|
48
|
+
if (descriptor === undefined || !('value' in descriptor) || descriptor.enumerable !== true) {
|
|
49
|
+
invalidLocalAwarenessIntent();
|
|
50
|
+
}
|
|
51
|
+
return descriptor.value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function validateLocalAwarenessSelection(selection: unknown): {
|
|
55
|
+
anchor: number;
|
|
56
|
+
head: number;
|
|
57
|
+
} {
|
|
58
|
+
if (selection == null || typeof selection !== 'object') invalidLocalAwarenessIntent();
|
|
59
|
+
|
|
60
|
+
// Do not inspect caller-held values before provenance succeeds: a Proxy
|
|
61
|
+
// can imitate every structural and own-data check, but it cannot inherit
|
|
62
|
+
// this module's WeakMap identity.
|
|
63
|
+
const factoryValue = LOCAL_AWARENESS_SELECTION_VALUES.get(selection);
|
|
64
|
+
if (factoryValue === undefined) invalidLocalAwarenessIntent();
|
|
65
|
+
|
|
66
|
+
const anchor = nativeEditorV2U32(factoryValue.anchor);
|
|
67
|
+
const head = nativeEditorV2U32(factoryValue.head);
|
|
68
|
+
if (anchor == null || head == null) {
|
|
69
|
+
invalidLocalAwarenessIntent();
|
|
70
|
+
}
|
|
71
|
+
return { anchor, head };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Reject caller-owned sticky cursor data before a native call can occur. */
|
|
75
|
+
export function rejectReservedAwarenessCursor(value: unknown): void {
|
|
76
|
+
const pending: unknown[] = [value];
|
|
77
|
+
const seen = new WeakSet<object>();
|
|
78
|
+
while (pending.length > 0) {
|
|
79
|
+
const current = pending.pop();
|
|
80
|
+
if (current == null || typeof current !== 'object') continue;
|
|
81
|
+
if (seen.has(current)) continue;
|
|
82
|
+
seen.add(current);
|
|
83
|
+
for (const key of Reflect.ownKeys(current)) {
|
|
84
|
+
if (key === 'cursor') invalidLocalAwarenessIntent('reserved cursor key is not allowed');
|
|
85
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, key);
|
|
86
|
+
if (descriptor == null || !('value' in descriptor)) invalidLocalAwarenessIntent();
|
|
87
|
+
pending.push(descriptor.value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function normalizeLocalAwarenessState(value: unknown): Record<string, unknown> {
|
|
93
|
+
try {
|
|
94
|
+
const normalized = normalizeV2JsonValue(value, 'local awareness state', {
|
|
95
|
+
seen: new WeakSet<object>(),
|
|
96
|
+
work: 0,
|
|
97
|
+
});
|
|
98
|
+
if (!isLocalAwarenessRecord(normalized) || Object.getPrototypeOf(normalized) !== null) {
|
|
99
|
+
invalidLocalAwarenessIntent();
|
|
100
|
+
}
|
|
101
|
+
rejectReservedAwarenessCursor(normalized);
|
|
102
|
+
return normalized;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (error instanceof NativeEditorEngineBoundaryError) throw error;
|
|
105
|
+
invalidLocalAwarenessIntent();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface NativeEditorLocalAwarenessWireIntent {
|
|
110
|
+
state: Record<string, unknown>;
|
|
111
|
+
focused: boolean;
|
|
112
|
+
/** Absent retains the Rust-owned cursor; `null` clears it. */
|
|
113
|
+
selection?: { type: 'text'; anchor: number; head: number } | null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function validateLocalAwarenessIntent(
|
|
117
|
+
intent: unknown
|
|
118
|
+
): NativeEditorLocalAwarenessWireIntent {
|
|
119
|
+
try {
|
|
120
|
+
if (
|
|
121
|
+
!isLocalAwarenessRecord(intent) ||
|
|
122
|
+
Reflect.ownKeys(intent).some(
|
|
123
|
+
(key) => typeof key !== 'string' || !LOCAL_AWARENESS_INTENT_KEYS.has(key)
|
|
124
|
+
) ||
|
|
125
|
+
!Object.prototype.hasOwnProperty.call(intent, 'state') ||
|
|
126
|
+
!Object.prototype.hasOwnProperty.call(intent, 'focused')
|
|
127
|
+
) {
|
|
128
|
+
invalidLocalAwarenessIntent();
|
|
129
|
+
}
|
|
130
|
+
const state = normalizeLocalAwarenessState(localAwarenessOwnDataValue(intent, 'state'));
|
|
131
|
+
const focused = localAwarenessOwnDataValue(intent, 'focused');
|
|
132
|
+
if (typeof focused !== 'boolean') invalidLocalAwarenessIntent();
|
|
133
|
+
|
|
134
|
+
if (!Object.prototype.hasOwnProperty.call(intent, 'selection')) {
|
|
135
|
+
// Absent: retain whatever cursor Rust already holds.
|
|
136
|
+
return { state, focused };
|
|
137
|
+
}
|
|
138
|
+
const rawSelection = localAwarenessOwnDataValue(intent, 'selection');
|
|
139
|
+
if (rawSelection === null) return { state, focused, selection: null };
|
|
140
|
+
const selection = validateLocalAwarenessSelection(rawSelection);
|
|
141
|
+
return { state, focused, selection: { type: 'text', ...selection } };
|
|
142
|
+
} catch (error) {
|
|
143
|
+
if (error instanceof NativeEditorEngineBoundaryError) throw error;
|
|
144
|
+
invalidLocalAwarenessIntent();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function serializeLocalAwarenessIntent(
|
|
149
|
+
intent: NativeEditorLocalAwarenessWireIntent
|
|
150
|
+
): string {
|
|
151
|
+
try {
|
|
152
|
+
const wire = Object.create(null) as Record<string, unknown>;
|
|
153
|
+
wire.state = intent.state;
|
|
154
|
+
wire.focused = intent.focused;
|
|
155
|
+
if (intent.selection === null) {
|
|
156
|
+
wire.selection = null;
|
|
157
|
+
} else if (intent.selection !== undefined) {
|
|
158
|
+
const selection = Object.create(null) as Record<string, unknown>;
|
|
159
|
+
selection.type = intent.selection.type;
|
|
160
|
+
selection.anchor = intent.selection.anchor;
|
|
161
|
+
selection.head = intent.selection.head;
|
|
162
|
+
wire.selection = selection;
|
|
163
|
+
}
|
|
164
|
+
return serializeV2CreateEnvelope(wire);
|
|
165
|
+
} catch {
|
|
166
|
+
invalidLocalAwarenessIntent();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { requireNativeModule } from 'expo-modules-core';
|
|
2
|
+
import { type NativeEditorError } from './NativeEditorBoundaryError';
|
|
3
|
+
|
|
4
|
+
export let _nativeModule: NativeEditorModule | null = null;
|
|
5
|
+
|
|
6
|
+
export function getNativeModule(): NativeEditorModule {
|
|
7
|
+
if (!_nativeModule) {
|
|
8
|
+
_nativeModule = requireNativeModule<NativeEditorModule>('NativeEditor');
|
|
9
|
+
}
|
|
10
|
+
return _nativeModule;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** @internal Reset the cached native module reference. For testing only. */
|
|
14
|
+
export function _resetNativeModuleCache(): void {
|
|
15
|
+
_nativeModule = null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// The only construction path. Consumes the frozen v2 result records
|
|
19
|
+
// ({ value, error }, exactly one side set), normalizes them at the JS boundary
|
|
20
|
+
// (decimal-string u64s, direct binaries, unsafe-integer rejection), and raises
|
|
21
|
+
// typed per-domain errors with a non-retryable class for
|
|
22
|
+
// ENGINE_INVARIANT_FAILED and destroyed lifecycles.
|
|
23
|
+
|
|
24
|
+
export const ERR_V2_NATIVE_RESPONSE =
|
|
25
|
+
'NativeEditorBridge: invalid v2 result record from native module';
|
|
26
|
+
|
|
27
|
+
export const ERR_V2_DESTROYED = 'NativeEditorBridge: v2 editor handle has been destroyed';
|
|
28
|
+
|
|
29
|
+
export const V2_ENVELOPE_VERSION = 1;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The v2 surface of the NativeEditor native module — the complete
|
|
33
|
+
* production ABI. Every call resolves the method lazily and fails clearly
|
|
34
|
+
* when the v2 surface is absent. Decimal-string identifiers keep full u64
|
|
35
|
+
* fidelity across the JavaScript boundary, and binaries travel as direct
|
|
36
|
+
* Uint8Array values (never JSON number arrays).
|
|
37
|
+
*/
|
|
38
|
+
export interface NativeEditorModule {
|
|
39
|
+
editorV2Create(configJson: string, snapshotState: Uint8Array | null): unknown;
|
|
40
|
+
editorV2Destroy(editorId: string): unknown;
|
|
41
|
+
editorV2GetState(editorId: string): unknown;
|
|
42
|
+
editorV2GetDocumentJson(editorId: string): unknown;
|
|
43
|
+
editorV2GetDocumentHtml(editorId: string): unknown;
|
|
44
|
+
editorV2GetContentSnapshot(editorId: string): unknown;
|
|
45
|
+
editorV2ReplaceDocument(editorId: string, requestJson: string): unknown;
|
|
46
|
+
editorV2ApplyInput(editorId: string, requestJson: string): unknown;
|
|
47
|
+
editorV2ApplyCommand(editorId: string, requestJson: string): unknown;
|
|
48
|
+
editorV2ApplyLocalApi(editorId: string, requestJson: string): unknown;
|
|
49
|
+
editorV2SetSelection(editorId: string, requestJson: string): unknown;
|
|
50
|
+
editorV2Undo(editorId: string, requestJson: string): unknown;
|
|
51
|
+
editorV2Redo(editorId: string, requestJson: string): unknown;
|
|
52
|
+
editorV2RenderUpdate(
|
|
53
|
+
editorId: string,
|
|
54
|
+
mirrorScalarAnchor: number | null,
|
|
55
|
+
mirrorScalarHead: number | null
|
|
56
|
+
): unknown;
|
|
57
|
+
editorV2CollaborationConfigureTransport(
|
|
58
|
+
editorId: string,
|
|
59
|
+
configJsonOrNull: string | null
|
|
60
|
+
): unknown;
|
|
61
|
+
editorV2CollaborationResolveProtocolAdapter(
|
|
62
|
+
editorId: string,
|
|
63
|
+
attemptId: string,
|
|
64
|
+
eventId: string,
|
|
65
|
+
responseJson: string
|
|
66
|
+
): unknown;
|
|
67
|
+
editorV2CollaborationSetAwareness(editorId: string, awarenessJson: string): unknown;
|
|
68
|
+
editorV2SnapshotExport(editorId: string): unknown;
|
|
69
|
+
editorV2SnapshotRestore(
|
|
70
|
+
editorId: string,
|
|
71
|
+
metadataJson: string,
|
|
72
|
+
encodedState: Uint8Array
|
|
73
|
+
): unknown;
|
|
74
|
+
addListener(
|
|
75
|
+
eventName: 'onCollaborationTransportEvent',
|
|
76
|
+
listener: (event: unknown) => void
|
|
77
|
+
): { remove(): void };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function invokeNativeEditorV2<K extends keyof NativeEditorModule>(
|
|
81
|
+
name: K,
|
|
82
|
+
...args: Parameters<NativeEditorModule[K]>
|
|
83
|
+
): unknown {
|
|
84
|
+
const nativeModule = getNativeModule() as unknown as Record<string, unknown>;
|
|
85
|
+
const method = nativeModule[name as string];
|
|
86
|
+
if (typeof method !== 'function') {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`NativeEditorBridge: native module does not expose the v2 entry ${String(name)}`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return (method as (...fnArgs: unknown[]) => unknown).apply(nativeModule, args);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The discriminated envelope every v2 result record normalizes into. */
|
|
95
|
+
export type NativeEditorResult<T> =
|
|
96
|
+
| { ok: true; value: T }
|
|
97
|
+
| { ok: false; error: NativeEditorError };
|