edytor 1.0.0-rc.3 → 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/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- 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 +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- 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 +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- 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 +25 -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 +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- 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/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- 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 +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- 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 +2 -5
- 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 +18 -13
- package/dist/crdt/data.js +49 -71
- 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 +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- 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 +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -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 +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -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/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- 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/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- 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 +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- 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 +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- 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 +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- 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 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- 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 +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- 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/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- 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 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -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 +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- 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 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- 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 +30 -26
- package/dist/plugins/index.js +28 -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 +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- 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 +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- 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/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- 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 +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- 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 +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- 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 +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -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 +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- 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 +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- 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 +272 -106
- 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 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- 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 -335
- 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 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- 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
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
import { REGISTRY_KEY } from '../placement/model.js';
|
|
2
2
|
import { BLOCK_ATTR_ROOT, isNodeLike, LAST_CHANGED_ATTR, NONCE, REC_PREFIX } from '../schema.js';
|
|
3
|
-
import { attrItems, newNode as makeNode
|
|
4
|
-
/**
|
|
5
|
-
* The ring's retention bound — the deepest `lineage.depth` any surviving
|
|
6
|
-
* entry's writer was configured with. `POSITIVE_INFINITY` when ANY entry
|
|
7
|
-
* lacks `d` (pre-watermark data): without knowing every writer's bound,
|
|
8
|
-
* no entry may be evicted on their behalf.
|
|
9
|
-
*/
|
|
10
|
-
export const lineageWatermarkOf = (entries) => {
|
|
11
|
-
let wm = 0;
|
|
12
|
-
for (const e of entries) {
|
|
13
|
-
if (typeof e.d !== 'number' || !Number.isFinite(e.d))
|
|
14
|
-
return Number.POSITIVE_INFINITY;
|
|
15
|
-
if (e.d > wm)
|
|
16
|
-
wm = e.d;
|
|
17
|
-
}
|
|
18
|
-
return wm;
|
|
19
|
-
};
|
|
3
|
+
import { attrItems, newNode as makeNode } from '../structs.js';
|
|
20
4
|
// `BLOCK_ATTR_ROOT`/`LAST_CHANGED_ATTR`/`REC_PREFIX` live in the shared
|
|
21
5
|
// `../schema.js` leaf — re-exported so existing import sites stay.
|
|
22
6
|
export { BLOCK_ATTR_ROOT, LAST_CHANGED_ATTR };
|
|
@@ -82,15 +66,6 @@ export const blockAttributionOf = (doc, id) => {
|
|
|
82
66
|
lastChangedBy: typeof l === 'string' ? l : undefined
|
|
83
67
|
};
|
|
84
68
|
};
|
|
85
|
-
/**
|
|
86
|
-
* Read one block's lineage ring, oldest → newest — or `undefined` when
|
|
87
|
-
* the block carries no record. Entries are the stored content values;
|
|
88
|
-
* callers deep-copy before exposing them publicly.
|
|
89
|
-
*/
|
|
90
|
-
export const lineageOf = (doc, id) => {
|
|
91
|
-
const rec = recordOf(doc, id);
|
|
92
|
-
return rec === null ? undefined : rec.toArray();
|
|
93
|
-
};
|
|
94
69
|
/**
|
|
95
70
|
* Bound write helpers. `stampChange`/`stampCreated`/`unionContributors`
|
|
96
71
|
* must be called INSIDE the operation's `doc.transact` — they perform
|
|
@@ -205,124 +180,6 @@ export const bindBlockAttribution = (Y) => {
|
|
|
205
180
|
const into = ensureRecord(doc, intoId, blockNodeOf(doc, intoId));
|
|
206
181
|
for (const a of contributorsOfRecord(from))
|
|
207
182
|
addContributor(into, a);
|
|
208
|
-
},
|
|
209
|
-
/**
|
|
210
|
-
* Append a displaced-state checkpoint to the block's ring and trim
|
|
211
|
-
* to the ring's watermark — `max` of surviving entries' `d`,
|
|
212
|
-
* including the fresh one. The caller captures `entry.j` BEFORE its
|
|
213
|
-
* model write (see `lineagePending` in `edytor-doc.ts`) and calls
|
|
214
|
-
* this only after the write proves out, so a refused write appends
|
|
215
|
-
* nothing. The watermark is THE retention policy — identical on
|
|
216
|
-
* append, on receive (`attachRingTrim`), and on read — so a shallow
|
|
217
|
-
* replica never evicts a deeper writer's surviving history, and the
|
|
218
|
-
* bound shrinks only once the deepest entries have themselves
|
|
219
|
-
* aged out. Concurrent appends under partition can still merge a
|
|
220
|
-
* ring past the watermark — neither side saw the other's entry —
|
|
221
|
-
* which the receive-side repair converges back.
|
|
222
|
-
*/
|
|
223
|
-
appendLineage: (doc, id, entry, depth) => {
|
|
224
|
-
const rec = ensureRecord(doc, id);
|
|
225
|
-
rec.insert(rec.length, [{ ...entry, s: rec.length, d: depth }]);
|
|
226
|
-
const wm = lineageWatermarkOf(rec.toArray());
|
|
227
|
-
if (rec.length > wm)
|
|
228
|
-
rec.delete(0, rec.length - wm);
|
|
229
|
-
},
|
|
230
|
-
/**
|
|
231
|
-
* The block's lineage ring, oldest → newest — or `undefined` when
|
|
232
|
-
* the block has no record at all. Entries are the stored content
|
|
233
|
-
* values; the public surface copies them before handing them out.
|
|
234
|
-
*/
|
|
235
|
-
lineageOf,
|
|
236
|
-
/**
|
|
237
|
-
* Attach the doc's shared ring-watermark repair — once per doc for
|
|
238
|
-
* the doc's lifetime (module-level dedupe). See the module-level comment
|
|
239
|
-
* below.
|
|
240
|
-
*/
|
|
241
|
-
attachRingTrim: (doc) => {
|
|
242
|
-
if (ringTrimAttached.has(doc))
|
|
243
|
-
return;
|
|
244
|
-
ringTrimAttached.set(doc, true);
|
|
245
|
-
const trimToWatermark = (rec) => {
|
|
246
|
-
const wm = lineageWatermarkOf(rec.toArray());
|
|
247
|
-
if (rec.length > wm)
|
|
248
|
-
rec.delete(0, rec.length - wm);
|
|
249
|
-
};
|
|
250
|
-
onTransaction(doc, 'afterTransaction', (transaction) => {
|
|
251
|
-
try {
|
|
252
|
-
const changed = transaction?.changed;
|
|
253
|
-
if (changed === undefined)
|
|
254
|
-
return;
|
|
255
|
-
let over;
|
|
256
|
-
for (const type of changed.keys()) {
|
|
257
|
-
const rec = type;
|
|
258
|
-
if (rec?.name === REC_NODE &&
|
|
259
|
-
rec.length > lineageWatermarkOf(rec.toArray())) {
|
|
260
|
-
(over ??= []).push(rec);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
if (over === undefined)
|
|
264
|
-
return;
|
|
265
|
-
// A follow-up transaction in the same cleanup sweep — the
|
|
266
|
-
// trim deletes exactly the items the next append would
|
|
267
|
-
// evict, so concurrent trims (each replica runs this on
|
|
268
|
-
// the same merged state) delete the SAME items and stay
|
|
269
|
-
// convergent. The watermark never goes below a surviving
|
|
270
|
-
// entry's own configured depth.
|
|
271
|
-
doc.transact(() => {
|
|
272
|
-
for (const rec of over)
|
|
273
|
-
trimToWatermark(rec);
|
|
274
|
-
}, LINEAGE_TRIM_ORIGIN);
|
|
275
|
-
}
|
|
276
|
-
catch (err) {
|
|
277
|
-
// A failure here must never propagate — throwing inside
|
|
278
|
-
// `afterTransaction` would break the host transaction's
|
|
279
|
-
// cleanup sweep. An untrimmed ring still converges.
|
|
280
|
-
console.error('[edytor-doc] lineage ring trim failed; leaving over-cap state', err);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
// Install-time sweep: a doc that arrived over-cap BEFORE this
|
|
284
|
-
// listener existed — `loadDocument`/`attachDocument` integrate
|
|
285
|
-
// the payload before the facade composes — never fires the
|
|
286
|
-
// hook above for that data. One O(records) pass converges it.
|
|
287
|
-
try {
|
|
288
|
-
const root = doc.get(BLOCK_ATTR_ROOT);
|
|
289
|
-
let over;
|
|
290
|
-
for (const key of root.attrKeys()) {
|
|
291
|
-
if (!key.startsWith(REC_PREFIX))
|
|
292
|
-
continue;
|
|
293
|
-
const rec = root.getAttr(key);
|
|
294
|
-
if (isNodeLike(rec) &&
|
|
295
|
-
rec.name === REC_NODE &&
|
|
296
|
-
rec.length > lineageWatermarkOf(rec.toArray())) {
|
|
297
|
-
(over ??= []).push(rec);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
if (over !== undefined) {
|
|
301
|
-
doc.transact(() => {
|
|
302
|
-
for (const rec of over)
|
|
303
|
-
trimToWatermark(rec);
|
|
304
|
-
}, LINEAGE_TRIM_ORIGIN);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
catch (err) {
|
|
308
|
-
console.error('[edytor-doc] lineage ring sweep failed; leaving over-cap state', err);
|
|
309
|
-
}
|
|
310
183
|
}
|
|
311
184
|
};
|
|
312
185
|
};
|
|
313
|
-
/**
|
|
314
|
-
* Per-doc attach table for the shared ring-trim listener — module level
|
|
315
|
-
* (not binding- or facade-scoped) so the listener is installed ONCE per
|
|
316
|
-
* doc across every binding's facade `create()`, and never detached: a
|
|
317
|
-
* ring pushed over its watermark by concurrent appends is converged even
|
|
318
|
-
* after the last facade disposes. The `WeakMap` entry and the doc-held
|
|
319
|
-
* listener die with the doc — no leak.
|
|
320
|
-
*/
|
|
321
|
-
const ringTrimAttached = new WeakMap();
|
|
322
|
-
/**
|
|
323
|
-
* Origin of the ring-trim's delete writes — an origin no UndoManager
|
|
324
|
-
* tracks, so trims never enter an undo stack and never recurse (the trim
|
|
325
|
-
* only deletes ring items: the follow-up `afterTransaction` pass finds
|
|
326
|
-
* the ring at exactly the watermark and stops).
|
|
327
|
-
*/
|
|
328
|
-
const LINEAGE_TRIM_ORIGIN = Symbol('edytor.lineage-trim');
|
package/dist/crdt/data.d.ts
CHANGED
|
@@ -21,15 +21,11 @@
|
|
|
21
21
|
* Read rule: the leaves are read as a tree; a path with live items is an
|
|
22
22
|
* array (sorted by rank, then id), one with keys an object (it beats a
|
|
23
23
|
* primitive leaf at the same path: Ada sets `a = 1` while Bob sets
|
|
24
|
-
* `a.b = 2`), else its leaf.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* the
|
|
29
|
-
* exploding it write the same items. A patch
|
|
30
|
-
* writes its leaves over the attr while it still reads right, else deletes
|
|
31
|
-
* it and writes every leaf (residual: a peer's concurrent set of a key it
|
|
32
|
-
* held, or its removal of an item, may then lose to the exploded value).
|
|
24
|
+
* `a.b = 2`), else its leaf. A leaf holding an object or an array (an
|
|
25
|
+
* atomic path's, `data.atomic`, or an array 0.1.0-next.6 wrote) reads as
|
|
26
|
+
* its keys or as items with ids and ranks derived from the array (as any
|
|
27
|
+
* array assigned where no item is), so two replicas writing into it write
|
|
28
|
+
* the same items; a patch opens it only along its path.
|
|
33
29
|
*/
|
|
34
30
|
import type { EngineNode } from './engine-api.js';
|
|
35
31
|
type JsonObj = Record<string, unknown>;
|
|
@@ -77,16 +73,25 @@ export declare const readData: (node: EngineNode) => JsonObj | undefined;
|
|
|
77
73
|
* in `node`'s data, in order; `[]` where no array is.
|
|
78
74
|
*/
|
|
79
75
|
export declare const itemIds: (node: EngineNode, path: readonly string[]) => string[];
|
|
76
|
+
/**
|
|
77
|
+
* `node`'s data as it reads once `patches` are applied (nothing written),
|
|
78
|
+
* with the ids of the array items at a path (`itemIds`): an item a patch
|
|
79
|
+
* makes has no id yet (`''`), so a later patch names it by index.
|
|
80
|
+
* `null` when a patch fits no value.
|
|
81
|
+
*/
|
|
82
|
+
export declare const previewData: (node: EngineNode | undefined, patches: readonly DataPatch[]) => {
|
|
83
|
+
data: JsonObj;
|
|
84
|
+
ids: (path: readonly string[]) => string[];
|
|
85
|
+
} | null;
|
|
80
86
|
/** `data` with `patches` applied in order, as a fresh value (a root patch replaces it); `null` when one fits no value. */
|
|
81
87
|
export declare const applyPatch: (data: JsonObj, patches: readonly DataPatch[]) => JsonObj | null;
|
|
82
88
|
/**
|
|
83
89
|
* The attr writes that give `node` the data `patches` make of its own (new
|
|
84
90
|
* items get ids from `rand`, ranks from `client`), or `null` when a patch
|
|
85
91
|
* fits no value there: only the leaves of the keys and items a patch
|
|
86
|
-
* touches change, so a concurrent edit of another key or item is kept.
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* written, the attr deleted. An unchanged value writes nothing.
|
|
92
|
+
* touches change, so a concurrent edit of another key or item is kept. An
|
|
93
|
+
* atomic path is written as one leaf and the leaves under it are deleted.
|
|
94
|
+
* An unchanged value writes nothing.
|
|
90
95
|
*/
|
|
91
96
|
export declare const patchWrites: (node: EngineNode, patches: readonly DataPatch[], client?: number, rand?: () => number, atomic?: readonly string[]) => LeafWrite[] | null;
|
|
92
97
|
/** Write `writes` on `node` (a detached one too: a block or atom being created). */
|
package/dist/crdt/data.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DATA_LEAF_PREFIX } from './schema.js';
|
|
2
2
|
import { rankAfter } from './placement/rank.js';
|
|
3
3
|
import { hash32 } from './rand.js';
|
|
4
4
|
import { jsonEquals } from '../utils/json.js';
|
|
@@ -33,8 +33,21 @@ const itemsOf = (t) => {
|
|
|
33
33
|
const isArr = (t) => Array.isArray(t.v) || itemsOf(t).length > 0;
|
|
34
34
|
/** The item `seg` names among `items`: by its id (`~…`) or by its index. */
|
|
35
35
|
const itemAt = (items, seg) => itemish(seg) ? items.find((i) => i.id === seg) : items[index(seg)];
|
|
36
|
-
/**
|
|
36
|
+
/** Whether `t` holds a non-empty object or array as one leaf (no subtree under it). */
|
|
37
|
+
const closed = (t) => t.k.size === 0 && t.v !== null && typeof t.v === 'object' && Object.keys(t.v).length > 0;
|
|
38
|
+
/** `t` with a container leaf's value as its subtree: its keys, or derived items. */
|
|
39
|
+
const open = (t) => {
|
|
40
|
+
if (closed(t)) {
|
|
41
|
+
const value = t.v;
|
|
42
|
+
t.v = undefined;
|
|
43
|
+
derived.assign(t, value);
|
|
44
|
+
}
|
|
45
|
+
return t;
|
|
46
|
+
};
|
|
47
|
+
/** The JSON `t` reads as (`undefined` for nothing): a fresh value. */
|
|
37
48
|
const valueOf = (t) => {
|
|
49
|
+
if (closed(t))
|
|
50
|
+
return valueOf(open(tree(t.v)));
|
|
38
51
|
const items = itemsOf(t);
|
|
39
52
|
if (items.length)
|
|
40
53
|
return items.map(({ id }) => valueOf(t.k.get(id) ?? tree()) ?? null);
|
|
@@ -176,7 +189,7 @@ const edits = (rand, client = 0) => {
|
|
|
176
189
|
};
|
|
177
190
|
/** Make `t` read as `value`, writing only what differs: objects key by key, arrays item by item. */
|
|
178
191
|
const assign = (t, value) => {
|
|
179
|
-
if (Array.isArray(value) && itemsOf(t).length)
|
|
192
|
+
if (Array.isArray(value) && itemsOf(open(t)).length)
|
|
180
193
|
return arrange(t, value);
|
|
181
194
|
// Anything else replaces what `t` held, but an object's equal keys.
|
|
182
195
|
const object = isObject(value) && Object.keys(value).length > 0;
|
|
@@ -228,7 +241,7 @@ const edits = (rand, client = 0) => {
|
|
|
228
241
|
for (const k of path) {
|
|
229
242
|
if (!t)
|
|
230
243
|
return t;
|
|
231
|
-
if (isArr(t)) {
|
|
244
|
+
if (isArr(open(t))) {
|
|
232
245
|
const item = itemAt(itemsOf(t), k);
|
|
233
246
|
t = item && kid(t, item.id);
|
|
234
247
|
}
|
|
@@ -239,7 +252,7 @@ const edits = (rand, client = 0) => {
|
|
|
239
252
|
t = kid(t, enc(segmentKey(k)));
|
|
240
253
|
}
|
|
241
254
|
}
|
|
242
|
-
return t;
|
|
255
|
+
return t && open(t);
|
|
243
256
|
};
|
|
244
257
|
/** Apply `patch` to `root`; `false` when it fits no value there. */
|
|
245
258
|
const apply = (root, { path, value, splice, order }) => {
|
|
@@ -314,41 +327,6 @@ const leavesOfValue = (value, prefix = DATA_LEAF_PREFIX) => {
|
|
|
314
327
|
};
|
|
315
328
|
/** A new node's data, as leaves. */
|
|
316
329
|
export const dataLeaves = (data) => leavesOfValue(isObject(data) ? data : {});
|
|
317
|
-
/**
|
|
318
|
-
* `leaves` over the bases they shadow (each leaf at, above and under its
|
|
319
|
-
* path): the legacy attr, and each array leaf with values (as items).
|
|
320
|
-
*/
|
|
321
|
-
const effective = (base, leaves) => {
|
|
322
|
-
/** `key` and the paths above it longer than `floor`. */
|
|
323
|
-
const above = (key, floor = 0) => {
|
|
324
|
-
const out = [];
|
|
325
|
-
for (let i = key.length; i > floor; i = key.lastIndexOf('/', i - 1))
|
|
326
|
-
out.push(key.slice(0, i));
|
|
327
|
-
return out;
|
|
328
|
-
};
|
|
329
|
-
const near = new Set([...leaves.keys()].flatMap((key) => above(key)));
|
|
330
|
-
const out = new Map();
|
|
331
|
-
const under = (prefix, value) => {
|
|
332
|
-
for (const [key, v] of leavesOfValue(value, prefix))
|
|
333
|
-
if (!near.has(key) && !above(key, prefix.length - 1).some((p) => leaves.has(p)))
|
|
334
|
-
out.set(key, v);
|
|
335
|
-
};
|
|
336
|
-
if (isObject(base))
|
|
337
|
-
under(DATA_LEAF_PREFIX, base);
|
|
338
|
-
for (const [key, v] of leaves) {
|
|
339
|
-
out.set(key, v);
|
|
340
|
-
if (Array.isArray(v) && v.length) {
|
|
341
|
-
under(`${key}/`, v);
|
|
342
|
-
out.set(key, []);
|
|
343
|
-
}
|
|
344
|
-
else if (isObject(v) && Object.keys(v).length) {
|
|
345
|
-
// An object written as one leaf (an atomic path, `data.atomic`) reads as its keys.
|
|
346
|
-
under(`${key}/`, v);
|
|
347
|
-
out.set(key, {});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
return out;
|
|
351
|
-
};
|
|
352
330
|
/** A path of the data as a leaf key (`d/` and its pointer). */
|
|
353
331
|
export const leafKey = (path) => DATA_LEAF_PREFIX + path.map((k) => enc(k)).join('/');
|
|
354
332
|
/**
|
|
@@ -370,23 +348,40 @@ const collapse = (leaves, atomic) => {
|
|
|
370
348
|
}
|
|
371
349
|
return leavesFrom(root);
|
|
372
350
|
};
|
|
373
|
-
const read = (base, leaves) => valueOf(treeOf(effective(base, leaves)));
|
|
374
351
|
/** `node`'s data (`undefined` when it has none). */
|
|
375
|
-
export const readData = (node) =>
|
|
352
|
+
export const readData = (node) => valueOf(treeOf(leavesOf(node)));
|
|
376
353
|
/**
|
|
377
354
|
* The ids of the items of the array at `path` (keys, item indexes or ids)
|
|
378
355
|
* in `node`'s data, in order; `[]` where no array is.
|
|
379
356
|
*/
|
|
380
|
-
export const itemIds = (node, path) =>
|
|
381
|
-
|
|
357
|
+
export const itemIds = (node, path) => idsAt(treeOf(leavesOf(node)), path);
|
|
358
|
+
const idsAt = (root, path) => {
|
|
359
|
+
let t = root;
|
|
382
360
|
for (const k of path)
|
|
383
|
-
if (t && isArr(t)) {
|
|
361
|
+
if (t && isArr(open(t))) {
|
|
384
362
|
const item = itemAt(itemsOf(t), k);
|
|
385
363
|
t = item && t.k.get(item.id);
|
|
386
364
|
}
|
|
387
365
|
else
|
|
388
366
|
t = itemish(k) ? undefined : t?.k.get(enc(segmentKey(k)));
|
|
389
|
-
return t ? itemsOf(t).map(({ id }) => id) : [];
|
|
367
|
+
return t ? itemsOf(open(t)).map(({ id }) => id) : [];
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* `node`'s data as it reads once `patches` are applied (nothing written),
|
|
371
|
+
* with the ids of the array items at a path (`itemIds`): an item a patch
|
|
372
|
+
* makes has no id yet (`''`), so a later patch names it by index.
|
|
373
|
+
* `null` when a patch fits no value.
|
|
374
|
+
*/
|
|
375
|
+
export const previewData = (node, patches) => {
|
|
376
|
+
const base = node ? leavesOf(node) : new Map();
|
|
377
|
+
const root = treeOf(base);
|
|
378
|
+
if (!patches.every((p) => edits().apply(root, p)))
|
|
379
|
+
return null;
|
|
380
|
+
const known = new Set([...base.keys()].flatMap((key) => key.split('/')));
|
|
381
|
+
return {
|
|
382
|
+
data: valueOf(root) ?? {},
|
|
383
|
+
ids: (path) => idsAt(root, path).map((id) => (known.has(`${id}#`) ? id : ''))
|
|
384
|
+
};
|
|
390
385
|
};
|
|
391
386
|
/** `data` with `patches` applied in order, as a fresh value (a root patch replaces it); `null` when one fits no value. */
|
|
392
387
|
export const applyPatch = (data, patches) => {
|
|
@@ -399,40 +394,23 @@ export const applyPatch = (data, patches) => {
|
|
|
399
394
|
* The attr writes that give `node` the data `patches` make of its own (new
|
|
400
395
|
* items get ids from `rand`, ranks from `client`), or `null` when a patch
|
|
401
396
|
* fits no value there: only the leaves of the keys and items a patch
|
|
402
|
-
* touches change, so a concurrent edit of another key or item is kept.
|
|
403
|
-
*
|
|
404
|
-
*
|
|
405
|
-
* written, the attr deleted. An unchanged value writes nothing.
|
|
397
|
+
* touches change, so a concurrent edit of another key or item is kept. An
|
|
398
|
+
* atomic path is written as one leaf and the leaves under it are deleted.
|
|
399
|
+
* An unchanged value writes nothing.
|
|
406
400
|
*/
|
|
407
401
|
export const patchWrites = (node, patches, client = 0, rand, atomic = []) => {
|
|
408
|
-
const
|
|
409
|
-
const
|
|
410
|
-
const root = treeOf(was);
|
|
402
|
+
const now = leavesOf(node);
|
|
403
|
+
const root = treeOf(now);
|
|
411
404
|
const before = valueOf(root);
|
|
412
405
|
const { apply } = edits(rand, client);
|
|
413
406
|
if (!patches.every((p) => apply(root, p)))
|
|
414
407
|
return null;
|
|
415
|
-
|
|
416
|
-
if (jsonEquals(before, value))
|
|
408
|
+
if (jsonEquals(before, valueOf(root)))
|
|
417
409
|
return [];
|
|
418
|
-
// An atomic path is written as one leaf, and every leaf stored under it goes.
|
|
419
410
|
const want = collapse(leavesFrom(root), atomic);
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
.filter((key) => !jsonEquals(from.get(key), want.get(key)))
|
|
411
|
+
return [...new Set([...now.keys(), ...want.keys()])]
|
|
412
|
+
.filter((key) => !jsonEquals(now.get(key), want.get(key)))
|
|
423
413
|
.map((key) => [key, want.get(key)]);
|
|
424
|
-
const own = [
|
|
425
|
-
...diff(collapse(was, atomic)),
|
|
426
|
-
...[...now.keys()]
|
|
427
|
-
.filter((key) => under(key) && !want.has(key))
|
|
428
|
-
.map((key) => [key, undefined])
|
|
429
|
-
];
|
|
430
|
-
const after = new Map(now);
|
|
431
|
-
for (const [key, value] of own)
|
|
432
|
-
value === undefined ? after.delete(key) : after.set(key, value);
|
|
433
|
-
if (jsonEquals(read(base, after), value))
|
|
434
|
-
return own;
|
|
435
|
-
return [...(base === undefined ? [] : [[DATA, undefined]]), ...diff(now)];
|
|
436
414
|
};
|
|
437
415
|
/** Write `writes` on `node` (a detached one too: a block or atom being created). */
|
|
438
416
|
export const writeLeaves = (node, writes) => {
|
package/dist/crdt/doc/anchors.js
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* resolved to the block that displays it now (`resolveAnchor`).
|
|
5
5
|
*/
|
|
6
6
|
import { isLiveIn } from '../placement/model.js';
|
|
7
|
-
import { DEAD, displayOf, locate, ownedLength } from '../text/model.js';
|
|
7
|
+
import { anchorAt as textAnchorAt, DEAD, displayOf, locate, ownedLength, resolveAnchor as textResolveAnchor } from '../text/model.js';
|
|
8
8
|
import { followRedone } from '../structs.js';
|
|
9
9
|
/** The anchors of one facade. */
|
|
10
10
|
export const docAnchors = (c) => {
|
|
11
|
-
const { Y, doc,
|
|
11
|
+
const { Y, doc, view } = c;
|
|
12
12
|
// ── anchors ─────────────────────────────────────────────────
|
|
13
13
|
// An anchor is the home text id plus a relative position; the stream
|
|
14
14
|
// containing the position says which block displays it. Both reads use
|
|
@@ -31,7 +31,7 @@ export const docAnchors = (c) => {
|
|
|
31
31
|
const hit = locate(segs, Math.max(0, Math.min(offset, ownedLength(segs))), affinity);
|
|
32
32
|
if (hit === null)
|
|
33
33
|
return { b: blockId, a: { i: null, a: assoc } };
|
|
34
|
-
return { b: hit.seg.t, a:
|
|
34
|
+
return { b: hit.seg.t, a: textAnchorAt(hit.seg.text, hit.idx, assoc) };
|
|
35
35
|
};
|
|
36
36
|
/**
|
|
37
37
|
* `anchor` rebound to the copy this replica's last undo/redo
|
|
@@ -64,7 +64,7 @@ export const docAnchors = (c) => {
|
|
|
64
64
|
? { blockId: anchor.b, offset: 0 }
|
|
65
65
|
: null;
|
|
66
66
|
}
|
|
67
|
-
const i =
|
|
67
|
+
const i = textResolveAnchor(doc, text, anchor.a);
|
|
68
68
|
if (i === null)
|
|
69
69
|
return null;
|
|
70
70
|
const s = own.streamAt(anchor.b, i);
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import type { BlockId, InlineSpec } from '../placement/model.js';
|
|
2
2
|
import type { Prepared } from './types.js';
|
|
3
3
|
import type { OpsContext } from './steps.js';
|
|
4
|
+
/** An inline atom to insert: its id is minted when it names none. */
|
|
5
|
+
export type NewInline = Omit<InlineSpec, 'id'> & {
|
|
6
|
+
id?: string;
|
|
7
|
+
};
|
|
4
8
|
/** The content ops of one facade, prepared. */
|
|
5
9
|
export declare const contentOps: (c: OpsContext) => {
|
|
6
10
|
insertText: (id: BlockId, offset: number, text: string, marks?: Record<string, unknown>) => Prepared;
|
|
7
11
|
deleteText: (id: BlockId, offset: number, length: number) => Prepared;
|
|
8
12
|
formatRange: (id: BlockId, offset: number, length: number, marks: Record<string, unknown>) => Prepared;
|
|
9
13
|
clearMarks: (id: BlockId, offset: number, length: number) => Prepared;
|
|
10
|
-
insertInline: (id: BlockId, offset: number, atom:
|
|
14
|
+
insertInline: (id: BlockId, offset: number, atom: NewInline) => Prepared;
|
|
11
15
|
removeInline: (id: BlockId, inlineId: string) => Prepared;
|
|
12
16
|
};
|
package/dist/crdt/doc/content.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* inside voids — the caption contract), and marks over a range.
|
|
4
4
|
*/
|
|
5
5
|
import { sanitizeWireJson, jsonEquals } from '../../utils/json.js';
|
|
6
|
+
import { id as newId } from '../../utils.js';
|
|
6
7
|
import { ref, sanitizeInline } from './plan.js';
|
|
7
8
|
/** The content ops of one facade, prepared. */
|
|
8
9
|
export const contentOps = (c) => {
|
|
@@ -50,9 +51,10 @@ export const contentOps = (c) => {
|
|
|
50
51
|
}
|
|
51
52
|
return formatRange(id, offset, length, clears);
|
|
52
53
|
};
|
|
54
|
+
/** An atom without an id gets a fresh one. */
|
|
53
55
|
const insertInline = (id, offset, atom) => {
|
|
54
56
|
id = ref(id);
|
|
55
|
-
const clean = sanitizeInline(atom);
|
|
57
|
+
const clean = sanitizeInline({ ...atom, id: atom.id ?? newId('i') });
|
|
56
58
|
if (!contentTarget(id))
|
|
57
59
|
return REFUSED;
|
|
58
60
|
return plan([id], [{ op: 'insertInline', id, offset: clamp(id, offset, 0)[0], atom: clean }]);
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The write funnel: every facade write goes through `write` (disposal and the
|
|
3
|
-
* document's writable guard), and every prepared plan through `apply` — one
|
|
4
|
-
* transaction, its result read from what the transaction wrote, and the
|
|
5
|
-
* frame's one attribution and lineage pass.
|
|
6
|
-
*/
|
|
7
|
-
import type { BlockId } from '../placement/model.js';
|
|
8
1
|
import type { BlockAttributionApi } from '../attribution/block.js';
|
|
9
|
-
import type { AttributionActor } from '../attribution/index.js';
|
|
10
|
-
import type { JSONBlock } from '../../utils/json.js';
|
|
11
2
|
import type { EdytorDocConfig, OpResult, Prepared } from './types.js';
|
|
12
3
|
import type { DocBase, DocReads } from './reads.js';
|
|
13
4
|
/**
|
|
@@ -20,12 +11,6 @@ import type { DocBase, DocReads } from './reads.js';
|
|
|
20
11
|
export declare class EdytorDocDisposedError extends Error {
|
|
21
12
|
constructor(service?: string);
|
|
22
13
|
}
|
|
23
|
-
/**
|
|
24
|
-
* The lineage ring depth, validated — `NaN`/`Infinity`/fractional/negative
|
|
25
|
-
* values would silently disable the ring's trim bound. The one check every
|
|
26
|
-
* entry path (facade creation, document attach and reattach) runs.
|
|
27
|
-
*/
|
|
28
|
-
export declare const lineageDepthOf: (depth: number | undefined) => number;
|
|
29
14
|
/** What the write funnel writes with: the reads, the attribution writer and the facade's configuration. */
|
|
30
15
|
export type FunnelContext = DocBase & DocReads & {
|
|
31
16
|
BA: BlockAttributionApi;
|
|
@@ -35,14 +20,6 @@ export type FunnelContext = DocBase & DocReads & {
|
|
|
35
20
|
export declare const writeFunnel: (c: FunnelContext) => {
|
|
36
21
|
write: <R>(fn: () => R) => R;
|
|
37
22
|
apply: (p: Prepared) => OpResult;
|
|
38
|
-
actorOf: () => AttributionActor | undefined;
|
|
39
|
-
lineageDepth: number;
|
|
40
|
-
lineagePending: (id: BlockId, force?: boolean) => {
|
|
41
|
-
a?: string;
|
|
42
|
-
by: string;
|
|
43
|
-
t: number;
|
|
44
|
-
j: JSONBlock;
|
|
45
|
-
} | undefined;
|
|
46
23
|
/** Disposal is terminal for writes. */
|
|
47
24
|
dispose: () => void;
|
|
48
25
|
disposed: () => boolean;
|