edytor 1.0.0-rc.2 → 1.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/README.md +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +20 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +48 -14
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +8 -13
- package/dist/crdt/data.js +30 -70
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +39 -24
- package/dist/plugins/index.js +30 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +315 -126
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -447
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { rankAfter, rankBetween } from './rank.js';
|
|
2
2
|
import { AT, AT_NODE, BLOCK_NODE, CONTENT, CONTENT_NODE, DEL_PREFIX, hasDeleteMark, ID, CLAIMS, CLAIMS_NODE, INLINE_NODE, isNodeLike, NONCE, REGISTRY_KEY, TYPE, WITHDRAW_PREFIX } from '../schema.js';
|
|
3
3
|
import { nonceOf, randOf } from '../rand.js';
|
|
4
|
-
import {
|
|
4
|
+
import { indexOf } from '../text/runs.js';
|
|
5
|
+
import { Y } from '../engine.js';
|
|
5
6
|
import { writeRunMarks } from '../text/marks.js';
|
|
6
|
-
import {
|
|
7
|
+
import { blockTextOf, DEAD, newNode, ownText as ownTextOf, splitAt } from '../text/model.js';
|
|
7
8
|
import { cloneJson } from '../../utils/json.js';
|
|
8
9
|
import { dataLeaves, patchWrites, writeLeaves } from '../data.js';
|
|
9
10
|
import { incarnationNode, isIncarnationId } from '../incarnations.js';
|
|
10
|
-
import { engineOps
|
|
11
|
+
import { engineOps } from '../structs.js';
|
|
11
12
|
export { REGISTRY_KEY };
|
|
12
13
|
export { candidatesOf, resolvePlacements } from './resolve.js';
|
|
13
14
|
export { promotedRank, sourceRank, SOURCE_SIDE } from './source.js';
|
|
14
|
-
export { bySlot, childrenIndex,
|
|
15
|
+
export { bySlot, childrenIndex, displayParentOf, displaySlotOf, documentOrder, isLiveIn, textRanker } from './display.js';
|
|
15
16
|
import { candidatesOf, resolvePlacements } from './resolve.js';
|
|
16
17
|
import { bySlot, childrenIndex, displayParentOf, displaySlotOf, isLiveIn } from './display.js';
|
|
17
18
|
/**
|
|
@@ -21,425 +22,423 @@ import { bySlot, childrenIndex, displayParentOf, displaySlotOf, isLiveIn } from
|
|
|
21
22
|
* 'lib/crdt/vendor/yjs'`). Consumers inject it so this file stays free of
|
|
22
23
|
* runtime vendor imports (see `engine-api.ts`).
|
|
23
24
|
*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const registry = registryOf(doc);
|
|
64
|
-
let below = null;
|
|
65
|
-
let cur = item;
|
|
66
|
-
while (cur?.parent !== registry) {
|
|
67
|
-
below = cur;
|
|
68
|
-
cur = cur?.parent?._item ?? null;
|
|
69
|
-
if (cur === null)
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
if (!stackItem.inserts.hasId(cur.id))
|
|
25
|
+
const { isKeptReplaced } = engineOps(Y);
|
|
26
|
+
// ── registry / record access ────────────────────────────────────────
|
|
27
|
+
export const registryOf = (doc) => doc.get(REGISTRY_KEY);
|
|
28
|
+
export const blockNodeOf = (doc, id) => {
|
|
29
|
+
const registry = registryOf(doc);
|
|
30
|
+
const v = registry.getAttr(id);
|
|
31
|
+
if (isNodeLike(v))
|
|
32
|
+
return v;
|
|
33
|
+
// A losing incarnation under its derived id.
|
|
34
|
+
return isIncarnationId(id) ? incarnationNode(registry, id, isKeptReplaced) : null;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* The registry node when it carries no delete mark — the DELETED half of
|
|
38
|
+
* deleted-vs-hidden (a block under a deleted parent is hidden, not
|
|
39
|
+
* deleted). Not a targetability answer: ops ask {@link isLive}.
|
|
40
|
+
*/
|
|
41
|
+
export const liveNodeOf = (doc, id) => {
|
|
42
|
+
const n = blockNodeOf(doc, id);
|
|
43
|
+
return n !== null && !hasDeleteMark(n) ? n : null;
|
|
44
|
+
};
|
|
45
|
+
/** {@link isLiveIn} over the doc's current view. */
|
|
46
|
+
export const isLive = (doc, id) => isLiveIn(view(doc), id);
|
|
47
|
+
/**
|
|
48
|
+
* The history's creation rule (`doc/history.ts`, `hist.undo.withdraw`): an
|
|
49
|
+
* undo never deletes a block the undone step created. Its node and
|
|
50
|
+
* structure (attrs, placement candidates, the content and claims nodes)
|
|
51
|
+
* stay and the undoer's withdraw mark is written on it; what the step wrote
|
|
52
|
+
* inside the content and claims nodes (the undoer's own text, atoms,
|
|
53
|
+
* boundaries, claims) is deleted as usual. The index shows a withdrawn
|
|
54
|
+
* block while it holds another writer's content.
|
|
55
|
+
*/
|
|
56
|
+
export const withdrawOnUndo = (doc) => (item, stackItem) => {
|
|
57
|
+
const registry = registryOf(doc);
|
|
58
|
+
let below = null;
|
|
59
|
+
let cur = item;
|
|
60
|
+
while (cur?.parent !== registry) {
|
|
61
|
+
below = cur;
|
|
62
|
+
cur = cur?.parent?._item ?? null;
|
|
63
|
+
if (cur === null)
|
|
73
64
|
return false;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
node.setAttr(WITHDRAW_PREFIX + doc.clientID, true);
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
return below === item || (below.parentSub !== CONTENT && below.parentSub !== CLAIMS);
|
|
80
|
-
};
|
|
81
|
-
// ── placement write ──────────────────────────────────────────────────
|
|
82
|
-
/**
|
|
83
|
-
* Atomically append one placement candidate `{p, r}` to a block's `at`
|
|
84
|
-
* map, stamped `seq = localMax+1, client = doc.clientID`, then compact:
|
|
85
|
-
* candidates below the top-2 are tombstoned (the runner-up survives as
|
|
86
|
-
* the acyclic fallback; deeper history is re-created by undo anyway).
|
|
87
|
-
* Must run inside a transaction.
|
|
88
|
-
*/
|
|
89
|
-
const writePlacement = (doc, node, p, r) => {
|
|
90
|
-
const at = node.getAttr(AT);
|
|
91
|
-
if (!isNodeLike(at))
|
|
92
|
-
throw new Error(`writePlacement: block missing at-map`);
|
|
93
|
-
const cands = candidatesOf(node);
|
|
94
|
-
const seq = (cands[0]?.seq ?? 0) + 1;
|
|
95
|
-
// Tombstone everything below the runner-up (top-2 kept).
|
|
96
|
-
for (const c of cands.slice(2))
|
|
97
|
-
at.deleteAttr(c.key);
|
|
98
|
-
at.setAttr(`${seq}.${doc.clientID}`, { p, r });
|
|
99
|
-
};
|
|
100
|
-
// ── derived state ───────────────────────────────────────────────────
|
|
101
|
-
/** The doc's index as a `ModelView` — folded up to the open transaction's last write. */
|
|
102
|
-
const view = (doc) => R.attach(doc).view();
|
|
103
|
-
// ── content (rich-text sequence) helpers ────────────────────────────
|
|
104
|
-
/** A detached inline-atom node (inputs arrive normalized by the facade's ingress). */
|
|
105
|
-
const buildInline = (atom) => {
|
|
106
|
-
const node = newNode(INLINE_NODE);
|
|
107
|
-
node.setAttr(ID, atom.id);
|
|
108
|
-
node.setAttr(TYPE, atom.type);
|
|
109
|
-
writeLeaves(node, dataLeaves(atom.data));
|
|
110
|
-
return node;
|
|
111
|
-
};
|
|
112
|
-
// ── structural predicates ───────────────────────────────────────────
|
|
113
|
-
/**
|
|
114
|
-
* True iff `maybeAncestor` is `id` itself or lies on `id`'s
|
|
115
|
-
* DISPLAY-ancestor chain — the composed relation `owner(parent)`
|
|
116
|
-
* (`displayParentOf`), not the raw placement chain. A merge claim can
|
|
117
|
-
* place a block inside another's display subtree without appearing in
|
|
118
|
-
* its raw ancestry, so the merge refusal must see through the claim
|
|
119
|
-
* redirect — this is exactly the relation `resolvePlacements` keeps
|
|
120
|
-
* acyclic: a merge that would close a cycle is refused without mutation.
|
|
121
|
-
*/
|
|
122
|
-
const isSelfOrDescendant = (placements, own, id, maybeAncestor) => {
|
|
123
|
-
let cur = id;
|
|
124
|
-
const seen = new Set();
|
|
125
|
-
while (cur !== null && !seen.has(cur)) {
|
|
126
|
-
if (cur === maybeAncestor)
|
|
127
|
-
return true;
|
|
128
|
-
seen.add(cur);
|
|
129
|
-
const pl = placements.get(cur);
|
|
130
|
-
if (pl === undefined)
|
|
131
|
-
break;
|
|
132
|
-
const dp = displayParentOf(own, pl, placements, cur);
|
|
133
|
-
if (dp === DEAD)
|
|
134
|
-
break; // unknown ancestor — hidden, not cyclic
|
|
135
|
-
cur = dp;
|
|
136
|
-
}
|
|
65
|
+
}
|
|
66
|
+
if (!cur.id || !stackItem.inserts.has(cur.id.client, cur.id.clock))
|
|
137
67
|
return false;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
68
|
+
if (below === null) {
|
|
69
|
+
const node = cur.content.type;
|
|
70
|
+
node.setAttr(WITHDRAW_PREFIX + doc.clientID, true);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return below === item || (below.parentSub !== CONTENT && below.parentSub !== CLAIMS);
|
|
74
|
+
};
|
|
75
|
+
// ── placement write ──────────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Atomically append one placement candidate `{p, r}` to a block's `at`
|
|
78
|
+
* map, stamped `seq = localMax+1, client = doc.clientID`, then compact:
|
|
79
|
+
* candidates below the top-2 are tombstoned (the runner-up survives as
|
|
80
|
+
* the acyclic fallback; deeper history is re-created by undo anyway).
|
|
81
|
+
* Must run inside a transaction.
|
|
82
|
+
*/
|
|
83
|
+
export const writePlacement = (doc, node, p, r) => {
|
|
84
|
+
const at = node.getAttr(AT);
|
|
85
|
+
if (!isNodeLike(at))
|
|
86
|
+
throw new Error(`writePlacement: block missing at-map`);
|
|
87
|
+
const cands = candidatesOf(node);
|
|
88
|
+
const seq = (cands[0]?.seq ?? 0) + 1;
|
|
89
|
+
// Tombstone everything below the runner-up (top-2 kept).
|
|
90
|
+
for (const c of cands.slice(2))
|
|
91
|
+
at.deleteAttr(c.key);
|
|
92
|
+
at.setAttr(`${seq}.${doc.clientID}`, { p, r });
|
|
93
|
+
};
|
|
94
|
+
// ── derived state ───────────────────────────────────────────────────
|
|
95
|
+
/** The doc's index as a `ModelView` — folded up to the open transaction's last write. */
|
|
96
|
+
export const view = (doc) => indexOf(doc).view();
|
|
97
|
+
// ── content (rich-text sequence) helpers ────────────────────────────
|
|
98
|
+
/** A detached inline-atom node (inputs arrive normalized by the facade's ingress). */
|
|
99
|
+
export const buildInline = (atom) => {
|
|
100
|
+
const node = newNode(INLINE_NODE);
|
|
101
|
+
node.setAttr(ID, atom.id);
|
|
102
|
+
node.setAttr(TYPE, atom.type);
|
|
103
|
+
writeLeaves(node, dataLeaves(atom.data));
|
|
104
|
+
return node;
|
|
105
|
+
};
|
|
106
|
+
// ── structural predicates ───────────────────────────────────────────
|
|
107
|
+
/**
|
|
108
|
+
* True iff `maybeAncestor` is `id` itself or lies on `id`'s
|
|
109
|
+
* DISPLAY-ancestor chain — the composed relation `owner(parent)`
|
|
110
|
+
* (`displayParentOf`), not the raw placement chain. A merge claim can
|
|
111
|
+
* place a block inside another's display subtree without appearing in
|
|
112
|
+
* its raw ancestry, so the merge refusal must see through the claim
|
|
113
|
+
* redirect — this is exactly the relation `resolvePlacements` keeps
|
|
114
|
+
* acyclic: a merge that would close a cycle is refused without mutation.
|
|
115
|
+
*/
|
|
116
|
+
export const isSelfOrDescendant = (placements, own, id, maybeAncestor) => {
|
|
117
|
+
let cur = id;
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
while (cur !== null && !seen.has(cur)) {
|
|
120
|
+
if (cur === maybeAncestor)
|
|
121
|
+
return true;
|
|
122
|
+
seen.add(cur);
|
|
123
|
+
const pl = placements.get(cur);
|
|
124
|
+
if (pl === undefined)
|
|
125
|
+
break;
|
|
126
|
+
const dp = displayParentOf(own, pl, placements, cur);
|
|
127
|
+
if (dp === DEAD)
|
|
128
|
+
break; // unknown ancestor — hidden, not cyclic
|
|
129
|
+
cur = dp;
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
};
|
|
133
|
+
// ── write primitives ────────────────────────────────────────────────
|
|
134
|
+
// The document's prepared plans decide every write; these only
|
|
135
|
+
// perform one planned step and never refuse. Must run inside a transaction.
|
|
136
|
+
/**
|
|
137
|
+
* `count` consecutive insertion ranks at `index` into the sibling list
|
|
138
|
+
* `siblings`.
|
|
139
|
+
*
|
|
140
|
+
* Degenerate seams (`left >= right`) are legal replicated states, not
|
|
141
|
+
* caller errors: equal-rank neighbours occur after cycle-fallback
|
|
142
|
+
* rehoming (two blocks may carry the same rank string minted in
|
|
143
|
+
* different sibling lists), and `rankBetween` THROWS on them — so
|
|
144
|
+
* callers must guard. No string sorts strictly between equal strings,
|
|
145
|
+
* so each new member takes `left` verbatim: it JOINS the tie and the
|
|
146
|
+
* `(rank, id)` display sort orders the whole group deterministically.
|
|
147
|
+
* On a valid seam the emitted chain is `rankBetween(left, right)` then
|
|
148
|
+
* `rankBetween(prev, right)` — with `run`, `rankAfter` (an insert: after a
|
|
149
|
+
* block this client ranked, in its run there).
|
|
150
|
+
*/
|
|
151
|
+
export const ranksAt = (siblings, index, count, clientId, rand, run = false) => {
|
|
152
|
+
let left = siblings[index - 1]?.rank;
|
|
153
|
+
const right = siblings[index]?.rank;
|
|
154
|
+
if (left !== undefined && right !== undefined && left >= right) {
|
|
155
|
+
return new Array(count).fill(left);
|
|
156
|
+
}
|
|
157
|
+
const out = [];
|
|
158
|
+
for (let i = 0; i < count; i++) {
|
|
159
|
+
// An insert extends this client's run after a block it ranked.
|
|
160
|
+
const r = run
|
|
161
|
+
? rankAfter(left, right, clientId, rand)
|
|
162
|
+
: rankBetween(left, right, clientId, rand);
|
|
163
|
+
out.push(r);
|
|
164
|
+
left = r;
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* One registry entry: the block node with its `claims` list (holding
|
|
170
|
+
* `claims`), its own backing text holding `items` (none for a split-born
|
|
171
|
+
* block: its stream lives in the text it was split from), and the atomic
|
|
172
|
+
* first placement candidate `{p, r}` stamped `1.clientID`. Pre-integration
|
|
173
|
+
* writes materialize when the node integrates (the registry write comes last).
|
|
174
|
+
*/
|
|
175
|
+
const createBlock = (doc, id, type, data, place, claims, items, n = nonceOf(doc)) => {
|
|
176
|
+
const node = newNode(BLOCK_NODE);
|
|
177
|
+
node.setAttr(ID, id);
|
|
178
|
+
node.setAttr(NONCE, n);
|
|
179
|
+
node.setAttr(TYPE, type);
|
|
180
|
+
writeLeaves(node, dataLeaves(data));
|
|
181
|
+
const content = items === null ? null : textOf(items);
|
|
182
|
+
if (content !== null)
|
|
183
|
+
node.setAttr(CONTENT, content);
|
|
184
|
+
const list = newNode(CLAIMS_NODE);
|
|
185
|
+
node.setAttr(CLAIMS, list);
|
|
186
|
+
if (claims.length > 0)
|
|
187
|
+
list.insert(0, claims);
|
|
188
|
+
const at = newNode(AT_NODE);
|
|
189
|
+
node.setAttr(AT, at);
|
|
190
|
+
at.setAttr(`1.${doc.clientID}`, place);
|
|
191
|
+
registryOf(doc).setAttr(id, node);
|
|
192
|
+
if (content !== null)
|
|
193
|
+
markText(doc, content, items);
|
|
194
|
+
};
|
|
195
|
+
/** A detached backing text holding `items`, unmarked ({@link markText} marks it once integrated). */
|
|
196
|
+
const textOf = (items) => {
|
|
197
|
+
const content = newNode(CONTENT_NODE);
|
|
198
|
+
let clen = 0;
|
|
199
|
+
for (const item of items) {
|
|
200
|
+
if (item.kind === 'text') {
|
|
201
|
+
content.insert(clen, item.text);
|
|
202
|
+
clen += item.text.length;
|
|
162
203
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
// An insert extends this client's run after a block it ranked.
|
|
166
|
-
const r = run
|
|
167
|
-
? rankAfter(left, right, clientId, rand)
|
|
168
|
-
: rankBetween(left, right, clientId, rand);
|
|
169
|
-
out.push(r);
|
|
170
|
-
left = r;
|
|
204
|
+
else {
|
|
205
|
+
content.insert(clen++, [buildInline(item)]);
|
|
171
206
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (item.kind === 'text') {
|
|
207
|
-
content.insert(clen, item.text);
|
|
208
|
-
clen += item.text.length;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
content.insert(clen++, [buildInline(item)]);
|
|
207
|
+
}
|
|
208
|
+
return content;
|
|
209
|
+
};
|
|
210
|
+
/** The marks of `items`, written as paired operations on their integrated text. */
|
|
211
|
+
const markText = (doc, content, items) => writeRunMarks(doc, content, 0, items.map((item) => item.kind === 'text'
|
|
212
|
+
? { length: item.text.length, marks: item.marks }
|
|
213
|
+
: { length: 1 }));
|
|
214
|
+
/**
|
|
215
|
+
* Restore definition (migration only; a first import
|
|
216
|
+
* restores into an empty doc): make `specs` the whole visible document
|
|
217
|
+
* under their own ids, in ONE transaction. An existing id keeps its
|
|
218
|
+
* registry entry: every delete mark is cleared and its type, data,
|
|
219
|
+
* placement and content are rewritten in place — a fresh own text holding
|
|
220
|
+
* the spec's content and an empty claims list; a block whose stream still
|
|
221
|
+
* starts at a live boundary gets a new nonce, so that boundary goes inert
|
|
222
|
+
* and the own text is its stream. An absent id is created. Every other
|
|
223
|
+
* block gets this writer's delete mark. Ranks are derived from the tree
|
|
224
|
+
* alone and the rewrites are last-writer-wins attrs, so two replicas
|
|
225
|
+
* restoring the same specs converge on one copy.
|
|
226
|
+
*/
|
|
227
|
+
export const restoreBlocks = (doc, specs) => doc.transact(() => {
|
|
228
|
+
const { own } = view(doc);
|
|
229
|
+
const keep = new Set();
|
|
230
|
+
const restore = (list, parent) => {
|
|
231
|
+
let rank;
|
|
232
|
+
for (const sp of list) {
|
|
233
|
+
keep.add(sp.id);
|
|
234
|
+
let node = blockNodeOf(doc, sp.id);
|
|
235
|
+
if (node === null) {
|
|
236
|
+
node = newNode(BLOCK_NODE);
|
|
237
|
+
node.setAttr(ID, sp.id);
|
|
238
|
+
node.setAttr(NONCE, nonceOf(doc));
|
|
239
|
+
node.setAttr(AT, newNode(AT_NODE));
|
|
240
|
+
registryOf(doc).setAttr(sp.id, node);
|
|
212
241
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
};
|
|
216
|
-
/** The marks of `items`, written as paired operations on their integrated text. */
|
|
217
|
-
const markText = (doc, content, items) => writeRunMarks(doc, content, 0, items.map((item) => item.kind === 'text'
|
|
218
|
-
? { length: item.text.length, marks: item.marks }
|
|
219
|
-
: { length: 1 }));
|
|
220
|
-
/**
|
|
221
|
-
* Restore definition (migration only; a first import
|
|
222
|
-
* restores into an empty doc): make `specs` the whole visible document
|
|
223
|
-
* under their own ids, in ONE transaction. An existing id keeps its
|
|
224
|
-
* registry entry: every delete mark is cleared and its type, data,
|
|
225
|
-
* placement and content are rewritten in place — a fresh own text holding
|
|
226
|
-
* the spec's content and an empty claims list; a block whose stream still
|
|
227
|
-
* starts at a live boundary gets a new nonce, so that boundary goes inert
|
|
228
|
-
* and the own text is its stream. An absent id is created. Every other
|
|
229
|
-
* block gets this writer's delete mark. Ranks are derived from the tree
|
|
230
|
-
* alone and the rewrites are last-writer-wins attrs, so two replicas
|
|
231
|
-
* restoring the same specs converge on one copy.
|
|
232
|
-
*/
|
|
233
|
-
const restoreBlocks = (doc, specs) => doc.transact(() => {
|
|
234
|
-
const { own } = view(doc);
|
|
235
|
-
const keep = new Set();
|
|
236
|
-
const restore = (list, parent) => {
|
|
237
|
-
let rank;
|
|
238
|
-
for (const sp of list) {
|
|
239
|
-
keep.add(sp.id);
|
|
240
|
-
let node = blockNodeOf(doc, sp.id);
|
|
241
|
-
if (node === null) {
|
|
242
|
-
node = newNode(BLOCK_NODE);
|
|
243
|
-
node.setAttr(ID, sp.id);
|
|
244
|
-
node.setAttr(NONCE, nonceOf(doc));
|
|
245
|
-
node.setAttr(AT, newNode(AT_NODE));
|
|
246
|
-
registryOf(doc).setAttr(sp.id, node);
|
|
247
|
-
}
|
|
248
|
-
else if (own.streamOf(sp.id)?.home !== sp.id && own.streamOf(sp.id) !== undefined) {
|
|
249
|
-
node.setAttr(NONCE, nonceOf(doc));
|
|
250
|
-
}
|
|
251
|
-
for (const key of [...node.attrKeys()]) {
|
|
252
|
-
if (key.startsWith(DEL_PREFIX) || key.startsWith(WITHDRAW_PREFIX))
|
|
253
|
-
node.deleteAttr(key);
|
|
254
|
-
}
|
|
255
|
-
if (node.getAttr(TYPE) !== sp.type)
|
|
256
|
-
node.setAttr(TYPE, sp.type);
|
|
257
|
-
writeLeaves(node, patchWrites(node, [{ path: [], value: sp.data ?? {} }]) ?? []);
|
|
258
|
-
const text = textOf(sp.content ?? []);
|
|
259
|
-
node.setAttr(CONTENT, text);
|
|
260
|
-
markText(doc, text, sp.content ?? []);
|
|
261
|
-
node.setAttr(CLAIMS, newNode(CLAIMS_NODE));
|
|
262
|
-
rank = rankBetween(rank, undefined, 0, () => 0);
|
|
263
|
-
writePlacement(doc, node, parent, rank);
|
|
264
|
-
restore(sp.children ?? [], sp.id);
|
|
242
|
+
else if (own.streamOf(sp.id)?.home !== sp.id && own.streamOf(sp.id) !== undefined) {
|
|
243
|
+
node.setAttr(NONCE, nonceOf(doc));
|
|
265
244
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
if (!keep.has(id) && isNodeLike(node) && !hasDeleteMark(node)) {
|
|
270
|
-
node.setAttr(DEL_PREFIX + doc.clientID, true);
|
|
245
|
+
for (const key of [...node.attrKeys()]) {
|
|
246
|
+
if (key.startsWith(DEL_PREFIX) || key.startsWith(WITHDRAW_PREFIX))
|
|
247
|
+
node.deleteAttr(key);
|
|
271
248
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
for (const child of sp.children ?? []) {
|
|
283
|
-
const r = rankBetween(left, undefined, doc.clientID, randOf(doc));
|
|
284
|
-
materializeSpec(doc, child, sp.id, r);
|
|
285
|
-
left = r;
|
|
249
|
+
if (node.getAttr(TYPE) !== sp.type)
|
|
250
|
+
node.setAttr(TYPE, sp.type);
|
|
251
|
+
writeLeaves(node, patchWrites(node, [{ path: [], value: sp.data ?? {} }]) ?? []);
|
|
252
|
+
const text = textOf(sp.content ?? []);
|
|
253
|
+
node.setAttr(CONTENT, text);
|
|
254
|
+
markText(doc, text, sp.content ?? []);
|
|
255
|
+
node.setAttr(CLAIMS, newNode(CLAIMS_NODE));
|
|
256
|
+
rank = rankBetween(rank, undefined, 0, () => 0);
|
|
257
|
+
writePlacement(doc, node, parent, rank);
|
|
258
|
+
restore(sp.children ?? [], sp.id);
|
|
286
259
|
}
|
|
287
260
|
};
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
*/
|
|
293
|
-
const collides = (doc, specs) => {
|
|
294
|
-
const seen = new Set();
|
|
295
|
-
const stack = [...specs];
|
|
296
|
-
while (stack.length > 0) {
|
|
297
|
-
const sp = stack.pop();
|
|
298
|
-
// A derived incarnation id (U+0000) is never a caller's.
|
|
299
|
-
if (seen.has(sp.id) || isIncarnationId(sp.id) || blockNodeOf(doc, sp.id) !== null)
|
|
300
|
-
return true;
|
|
301
|
-
seen.add(sp.id);
|
|
302
|
-
stack.push(...(sp.children ?? []));
|
|
261
|
+
restore(specs, null);
|
|
262
|
+
registryOf(doc).forEachAttr((node, id) => {
|
|
263
|
+
if (!keep.has(id) && isNodeLike(node) && !hasDeleteMark(node)) {
|
|
264
|
+
node.setAttr(DEL_PREFIX + doc.clientID, true);
|
|
303
265
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
/**
|
|
269
|
+
* Materialize one spec subtree: the block owns its backing text (its
|
|
270
|
+
* stream from index 0); children recurse under a fresh sequential rank
|
|
271
|
+
* chain (a new block has no siblings to interleave with).
|
|
272
|
+
*/
|
|
273
|
+
export const materializeSpec = (doc, sp, parent, rank) => {
|
|
274
|
+
createBlock(doc, sp.id, sp.type, sp.data, { p: parent, r: rank }, [], sp.content ?? []);
|
|
275
|
+
let left;
|
|
276
|
+
for (const child of sp.children ?? []) {
|
|
277
|
+
const r = rankBetween(left, undefined, doc.clientID, randOf(doc));
|
|
278
|
+
materializeSpec(doc, child, sp.id, r);
|
|
279
|
+
left = r;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
/**
|
|
283
|
+
* Does any id of `specs` (whole subtrees) collide — with another spec id,
|
|
284
|
+
* or with any registry entry, live or deleted? The registry is keyed by
|
|
285
|
+
* id, so writing a taken id would replace that block in place.
|
|
286
|
+
*/
|
|
287
|
+
export const collides = (doc, specs) => {
|
|
288
|
+
const seen = new Set();
|
|
289
|
+
const stack = [...specs];
|
|
290
|
+
while (stack.length > 0) {
|
|
291
|
+
const sp = stack.pop();
|
|
292
|
+
// A derived incarnation id (U+0000) is never a caller's.
|
|
293
|
+
if (seen.has(sp.id) || isIncarnationId(sp.id) || blockNodeOf(doc, sp.id) !== null)
|
|
326
294
|
return true;
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
* `place`: one boundary item for `newId` at the end of the gap at `offset`
|
|
332
|
-
* (fork patch YP7) and the merge claims that follow it re-inserted on the new block —
|
|
333
|
-
* no text is copied, so an offline edit to the tail keeps landing on the
|
|
334
|
-
* same items and displays in the new block after convergence. `tail` is
|
|
335
|
-
* the new block's type/data, decided once by the plan. Children are a
|
|
336
|
-
* separate step. `id` must have a stream or a claim ({@link ownText}).
|
|
337
|
-
*/
|
|
338
|
-
const writeSplit = (doc, id, offset, newId, tail, place) => {
|
|
339
|
-
const { blocks, own } = view(doc);
|
|
340
|
-
const n = nonceOf(doc);
|
|
341
|
-
const claims = T.splitAt(blocks, own, id, offset, newId, n);
|
|
342
|
-
const data = tail.data === undefined ? undefined : cloneJson(tail.data);
|
|
343
|
-
createBlock(doc, newId, tail.type, data, place, claims, null, n);
|
|
344
|
-
};
|
|
345
|
-
/**
|
|
346
|
-
* Give the streamless block `id` its own text (`T.ownText`: a derived
|
|
347
|
-
* writer, a re-minted nonce) — before the first write that needs a stream.
|
|
348
|
-
*/
|
|
349
|
-
const ownText = (doc, id) => T.ownText(doc, view(doc).blocks.get(id));
|
|
350
|
-
// ── queries ─────────────────────────────────────────────────────────
|
|
351
|
-
/**
|
|
352
|
-
* Canonical projection: pure derivation from replicated state — the
|
|
353
|
-
* visible tree of live blocks ordered by `(rank, id)`, children of a
|
|
354
|
-
* merged-away parent under its owner, those of a deleted parent in its
|
|
355
|
-
* slot ({@link displaySlotOf}). Content is each block's display.
|
|
356
|
-
*/
|
|
357
|
-
const project = (doc) => ({ children: R.attach(doc).project() });
|
|
358
|
-
/**
|
|
359
|
-
* `positionOf` in a view: the display parent and the index among its
|
|
360
|
-
* visible children — a binary search by the block's display rank (the
|
|
361
|
-
* list's own order), not a scan of its siblings.
|
|
362
|
-
*/
|
|
363
|
-
const positionInView = (v, id) => {
|
|
364
|
-
if (!isLiveIn(v, id))
|
|
365
|
-
return null;
|
|
366
|
-
const slot = displaySlotOf(v.own, v.placements, v.placements.get(id), id);
|
|
367
|
-
const dp = slot.parent;
|
|
368
|
-
const list = v.kids.get(dp) ?? [];
|
|
369
|
-
let [lo, hi] = [0, list.length];
|
|
370
|
-
while (lo < hi) {
|
|
371
|
-
const mid = (lo + hi) >> 1;
|
|
372
|
-
if (bySlot(list[mid], { id, rank: slot.rank }) < 0)
|
|
373
|
-
lo = mid + 1;
|
|
374
|
-
else
|
|
375
|
-
hi = mid;
|
|
376
|
-
}
|
|
377
|
-
const index = list[lo]?.id === id ? lo : list.findIndex((s) => s.id === id);
|
|
378
|
-
return index < 0 ? null : { parent: dp, index };
|
|
379
|
-
};
|
|
380
|
-
/**
|
|
381
|
-
* `{parent, index}` of `id` in the visible tree, or null when hidden/absent.
|
|
382
|
-
* `parent` is the DISPLAY parent (merged-away ancestors resolve to their
|
|
383
|
-
* owner — see `displayParentOf`).
|
|
384
|
-
*/
|
|
385
|
-
const positionOf = (doc, id) => positionInView(view(doc), id);
|
|
386
|
-
/** Pre-order ids of the visible tree — the document order. */
|
|
387
|
-
const listBlockIds = (doc) => [...view(doc).order.ids];
|
|
388
|
-
/** Flat text of a block's OWNED content (atoms render as ''). */
|
|
389
|
-
const blockText = (doc, id) => {
|
|
390
|
-
const v = view(doc);
|
|
391
|
-
return isLiveIn(v, id) ? T.blockTextOf(id, v.blocks, v.own) : null;
|
|
392
|
-
};
|
|
393
|
-
/**
|
|
394
|
-
* Engine identity of the registry entry (`client:clock` of its item), or
|
|
395
|
-
* null when the block is absent from the visible tree (deleted, or hidden
|
|
396
|
-
* under a deleted/unreachable ancestor).
|
|
397
|
-
*/
|
|
398
|
-
const crdtId = (doc, id) => {
|
|
399
|
-
if (!isLive(doc, id))
|
|
400
|
-
return null;
|
|
401
|
-
const node = blockNodeOf(doc, id);
|
|
402
|
-
const item = node?._item;
|
|
403
|
-
if (!node || !item || item.deleted || !item.id)
|
|
404
|
-
return null;
|
|
405
|
-
return `${item.id.client}:${item.id.clock}`;
|
|
406
|
-
};
|
|
407
|
-
/** Engine handle for a logical id, or null when absent or delete-marked (debug surface). */
|
|
408
|
-
const resolveBlock = (doc, id) => liveNodeOf(doc, id);
|
|
409
|
-
return {
|
|
410
|
-
// constants
|
|
411
|
-
REGISTRY_KEY,
|
|
412
|
-
// records / projection internals (exported for tests + ADR probes)
|
|
413
|
-
registryOf,
|
|
414
|
-
blockNodeOf,
|
|
415
|
-
liveNodeOf,
|
|
416
|
-
isLive,
|
|
417
|
-
candidatesOf,
|
|
418
|
-
/** The doc's index as a `ModelView`. */
|
|
419
|
-
view,
|
|
420
|
-
resolvePlacements,
|
|
421
|
-
childrenIndex,
|
|
422
|
-
positionInView,
|
|
423
|
-
// write primitives (the document's prepared plans apply these)
|
|
424
|
-
buildInline,
|
|
425
|
-
isSelfOrDescendant,
|
|
426
|
-
ranksAt,
|
|
427
|
-
writePlacement,
|
|
428
|
-
withdrawOnUndo,
|
|
429
|
-
materializeSpec,
|
|
430
|
-
collides,
|
|
431
|
-
writeSplit,
|
|
432
|
-
ownText,
|
|
433
|
-
// the seed writer's bulk insert
|
|
434
|
-
insertBlocks,
|
|
435
|
-
insertBlock: (doc, dest, spec) => insertBlocks(doc, dest, [spec]),
|
|
436
|
-
restoreBlocks,
|
|
437
|
-
// queries
|
|
438
|
-
project,
|
|
439
|
-
positionOf,
|
|
440
|
-
listBlockIds,
|
|
441
|
-
blockText,
|
|
442
|
-
crdtId,
|
|
443
|
-
resolveBlock
|
|
444
|
-
};
|
|
295
|
+
seen.add(sp.id);
|
|
296
|
+
stack.push(...(sp.children ?? []));
|
|
297
|
+
}
|
|
298
|
+
return false;
|
|
445
299
|
};
|
|
300
|
+
/**
|
|
301
|
+
* The seed writer's bulk insert (the document is written by document
|
|
302
|
+
* operations and, once, by the seed writer — `init`, the local
|
|
303
|
+
* materializer): `specs` (whole subtrees, in list order) at `dest` in one
|
|
304
|
+
* transaction, all-or-nothing — `false` without writing when the parent
|
|
305
|
+
* is not live or any id collides. Document operations never call it:
|
|
306
|
+
* they prepare their inserts (`insertBlocks` in the facade).
|
|
307
|
+
*/
|
|
308
|
+
export const insertBlocks = (doc, dest, specs) => {
|
|
309
|
+
if (specs.length === 0)
|
|
310
|
+
return true;
|
|
311
|
+
if (dest.parent !== null && !isLive(doc, dest.parent))
|
|
312
|
+
return false;
|
|
313
|
+
if (collides(doc, specs))
|
|
314
|
+
return false;
|
|
315
|
+
return doc.transact(() => {
|
|
316
|
+
const sibs = view(doc).kids.get(dest.parent) ?? [];
|
|
317
|
+
const at = Math.max(0, Math.min(dest.index, sibs.length));
|
|
318
|
+
const ranks = ranksAt(sibs, at, specs.length, doc.clientID, randOf(doc));
|
|
319
|
+
specs.forEach((sp, i) => materializeSpec(doc, sp, dest.parent, ranks[i]));
|
|
320
|
+
return true;
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
/** {@link insertBlocks} of one spec. */
|
|
324
|
+
export const insertBlock = (doc, dest, spec) => insertBlocks(doc, dest, [spec]);
|
|
325
|
+
/**
|
|
326
|
+
* Split `id` at content `offset` into the new block `newId` placed at
|
|
327
|
+
* `place`: one boundary item for `newId` at the end of the gap at `offset`
|
|
328
|
+
* (fork patch YP7) and the merge claims that follow it re-inserted on the new block —
|
|
329
|
+
* no text is copied, so an offline edit to the tail keeps landing on the
|
|
330
|
+
* same items and displays in the new block after convergence. `tail` is
|
|
331
|
+
* the new block's type/data, decided once by the plan. Children are a
|
|
332
|
+
* separate step. `id` must have a stream or a claim ({@link ownText}).
|
|
333
|
+
*/
|
|
334
|
+
export const writeSplit = (doc, id, offset, newId, tail, place) => {
|
|
335
|
+
const { blocks, own } = view(doc);
|
|
336
|
+
const n = nonceOf(doc);
|
|
337
|
+
const claims = splitAt(blocks, own, id, offset, newId, n);
|
|
338
|
+
const data = tail.data === undefined ? undefined : cloneJson(tail.data);
|
|
339
|
+
createBlock(doc, newId, tail.type, data, place, claims, null, n);
|
|
340
|
+
};
|
|
341
|
+
/**
|
|
342
|
+
* Give the streamless block `id` its own text (`T.ownText`: a derived
|
|
343
|
+
* writer, a re-minted nonce) — before the first write that needs a stream.
|
|
344
|
+
*/
|
|
345
|
+
export const ownText = (doc, id) => ownTextOf(doc, view(doc).blocks.get(id));
|
|
346
|
+
// ── queries ─────────────────────────────────────────────────────────
|
|
347
|
+
/**
|
|
348
|
+
* Canonical projection: pure derivation from replicated state — the
|
|
349
|
+
* visible tree of live blocks ordered by `(rank, id)`, children of a
|
|
350
|
+
* merged-away parent under its owner, those of a deleted parent in its
|
|
351
|
+
* slot ({@link displaySlotOf}). Content is each block's display.
|
|
352
|
+
*/
|
|
353
|
+
export const project = (doc) => ({ children: indexOf(doc).project() });
|
|
354
|
+
/**
|
|
355
|
+
* `positionOf` in a view: the display parent and the index among its
|
|
356
|
+
* visible children — a binary search by the block's display rank (the
|
|
357
|
+
* list's own order), not a scan of its siblings.
|
|
358
|
+
*/
|
|
359
|
+
export const positionInView = (v, id) => {
|
|
360
|
+
if (!isLiveIn(v, id))
|
|
361
|
+
return null;
|
|
362
|
+
const slot = displaySlotOf(v.own, v.placements, v.placements.get(id), id);
|
|
363
|
+
const dp = slot.parent;
|
|
364
|
+
const list = v.kids.get(dp) ?? [];
|
|
365
|
+
let [lo, hi] = [0, list.length];
|
|
366
|
+
while (lo < hi) {
|
|
367
|
+
const mid = (lo + hi) >> 1;
|
|
368
|
+
if (bySlot(list[mid], { id, rank: slot.rank }) < 0)
|
|
369
|
+
lo = mid + 1;
|
|
370
|
+
else
|
|
371
|
+
hi = mid;
|
|
372
|
+
}
|
|
373
|
+
const index = list[lo]?.id === id ? lo : list.findIndex((s) => s.id === id);
|
|
374
|
+
return index < 0 ? null : { parent: dp, index };
|
|
375
|
+
};
|
|
376
|
+
/**
|
|
377
|
+
* `{parent, index}` of `id` in the visible tree, or null when hidden/absent.
|
|
378
|
+
* `parent` is the DISPLAY parent (merged-away ancestors resolve to their
|
|
379
|
+
* owner — see `displayParentOf`).
|
|
380
|
+
*/
|
|
381
|
+
export const positionOf = (doc, id) => positionInView(view(doc), id);
|
|
382
|
+
/** Pre-order ids of the visible tree — the document order. */
|
|
383
|
+
export const listBlockIds = (doc) => [...view(doc).order.ids];
|
|
384
|
+
/** Flat text of a block's OWNED content (atoms render as ''). */
|
|
385
|
+
export const blockText = (doc, id) => {
|
|
386
|
+
const v = view(doc);
|
|
387
|
+
return isLiveIn(v, id) ? blockTextOf(id, v.blocks, v.own) : null;
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* Engine identity of the registry entry (`client:clock` of its item), or
|
|
391
|
+
* null when the block is absent from the visible tree (deleted, or hidden
|
|
392
|
+
* under a deleted/unreachable ancestor).
|
|
393
|
+
*/
|
|
394
|
+
export const crdtId = (doc, id) => {
|
|
395
|
+
if (!isLive(doc, id))
|
|
396
|
+
return null;
|
|
397
|
+
const node = blockNodeOf(doc, id);
|
|
398
|
+
const item = node?._item;
|
|
399
|
+
if (!node || !item || item.deleted || !item.id)
|
|
400
|
+
return null;
|
|
401
|
+
return `${item.id.client}:${item.id.clock}`;
|
|
402
|
+
};
|
|
403
|
+
/** Engine handle for a logical id, or null when absent or delete-marked (debug surface). */
|
|
404
|
+
export const resolveBlock = (doc, id) => liveNodeOf(doc, id);
|
|
405
|
+
/**
|
|
406
|
+
* The placement model as one object (the public binding's `model`): the
|
|
407
|
+
* primitives above. Edytor's own modules import them directly.
|
|
408
|
+
*/
|
|
409
|
+
export const bindModel = (_Y) => ({
|
|
410
|
+
// constants
|
|
411
|
+
REGISTRY_KEY,
|
|
412
|
+
// records / projection internals (exported for tests + ADR probes)
|
|
413
|
+
registryOf,
|
|
414
|
+
blockNodeOf,
|
|
415
|
+
liveNodeOf,
|
|
416
|
+
isLive,
|
|
417
|
+
candidatesOf,
|
|
418
|
+
/** The doc's index as a `ModelView`. */
|
|
419
|
+
view,
|
|
420
|
+
resolvePlacements,
|
|
421
|
+
childrenIndex,
|
|
422
|
+
positionInView,
|
|
423
|
+
// write primitives (the document's prepared plans apply these)
|
|
424
|
+
buildInline,
|
|
425
|
+
isSelfOrDescendant,
|
|
426
|
+
ranksAt,
|
|
427
|
+
writePlacement,
|
|
428
|
+
withdrawOnUndo,
|
|
429
|
+
materializeSpec,
|
|
430
|
+
collides,
|
|
431
|
+
writeSplit,
|
|
432
|
+
ownText,
|
|
433
|
+
// the seed writer's bulk insert
|
|
434
|
+
insertBlocks,
|
|
435
|
+
insertBlock,
|
|
436
|
+
restoreBlocks,
|
|
437
|
+
// queries
|
|
438
|
+
project,
|
|
439
|
+
positionOf,
|
|
440
|
+
listBlockIds,
|
|
441
|
+
blockText,
|
|
442
|
+
crdtId,
|
|
443
|
+
resolveBlock
|
|
444
|
+
});
|