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
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>;
|
|
@@ -83,10 +79,9 @@ export declare const applyPatch: (data: JsonObj, patches: readonly DataPatch[])
|
|
|
83
79
|
* The attr writes that give `node` the data `patches` make of its own (new
|
|
84
80
|
* items get ids from `rand`, ranks from `client`), or `null` when a patch
|
|
85
81
|
* 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.
|
|
82
|
+
* touches change, so a concurrent edit of another key or item is kept. An
|
|
83
|
+
* atomic path is written as one leaf and the leaves under it are deleted.
|
|
84
|
+
* An unchanged value writes nothing.
|
|
90
85
|
*/
|
|
91
86
|
export declare const patchWrites: (node: EngineNode, patches: readonly DataPatch[], client?: number, rand?: () => number, atomic?: readonly string[]) => LeafWrite[] | null;
|
|
92
87
|
/** 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,22 @@ 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
357
|
export const itemIds = (node, path) => {
|
|
381
|
-
let t = treeOf(
|
|
358
|
+
let t = treeOf(leavesOf(node));
|
|
382
359
|
for (const k of path)
|
|
383
|
-
if (t && isArr(t)) {
|
|
360
|
+
if (t && isArr(open(t))) {
|
|
384
361
|
const item = itemAt(itemsOf(t), k);
|
|
385
362
|
t = item && t.k.get(item.id);
|
|
386
363
|
}
|
|
387
364
|
else
|
|
388
365
|
t = itemish(k) ? undefined : t?.k.get(enc(segmentKey(k)));
|
|
389
|
-
return t ? itemsOf(t).map(({ id }) => id) : [];
|
|
366
|
+
return t ? itemsOf(open(t)).map(({ id }) => id) : [];
|
|
390
367
|
};
|
|
391
368
|
/** `data` with `patches` applied in order, as a fresh value (a root patch replaces it); `null` when one fits no value. */
|
|
392
369
|
export const applyPatch = (data, patches) => {
|
|
@@ -399,40 +376,23 @@ export const applyPatch = (data, patches) => {
|
|
|
399
376
|
* The attr writes that give `node` the data `patches` make of its own (new
|
|
400
377
|
* items get ids from `rand`, ranks from `client`), or `null` when a patch
|
|
401
378
|
* 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.
|
|
379
|
+
* touches change, so a concurrent edit of another key or item is kept. An
|
|
380
|
+
* atomic path is written as one leaf and the leaves under it are deleted.
|
|
381
|
+
* An unchanged value writes nothing.
|
|
406
382
|
*/
|
|
407
383
|
export const patchWrites = (node, patches, client = 0, rand, atomic = []) => {
|
|
408
|
-
const
|
|
409
|
-
const
|
|
410
|
-
const root = treeOf(was);
|
|
384
|
+
const now = leavesOf(node);
|
|
385
|
+
const root = treeOf(now);
|
|
411
386
|
const before = valueOf(root);
|
|
412
387
|
const { apply } = edits(rand, client);
|
|
413
388
|
if (!patches.every((p) => apply(root, p)))
|
|
414
389
|
return null;
|
|
415
|
-
|
|
416
|
-
if (jsonEquals(before, value))
|
|
390
|
+
if (jsonEquals(before, valueOf(root)))
|
|
417
391
|
return [];
|
|
418
|
-
// An atomic path is written as one leaf, and every leaf stored under it goes.
|
|
419
392
|
const want = collapse(leavesFrom(root), atomic);
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
.filter((key) => !jsonEquals(from.get(key), want.get(key)))
|
|
393
|
+
return [...new Set([...now.keys(), ...want.keys()])]
|
|
394
|
+
.filter((key) => !jsonEquals(now.get(key), want.get(key)))
|
|
423
395
|
.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
396
|
};
|
|
437
397
|
/** Write `writes` on `node` (a detached one too: a block or atom being created). */
|
|
438
398
|
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;
|
package/dist/crdt/doc/funnel.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
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 pass.
|
|
6
|
+
*/
|
|
7
|
+
import { blockNodeOf, buildInline, materializeSpec, ownText, view as modelView, writePlacement, writeSplit } from '../placement/model.js';
|
|
1
8
|
import { ENTRY_FACET } from '../text/runs.js';
|
|
2
9
|
import { AT, DEL_PREFIX, ID, LAST_CHANGED_ATTR, TYPE } from '../schema.js';
|
|
3
10
|
import { writeLeaves } from '../data.js';
|
|
4
11
|
import { NOOP } from './plan.js';
|
|
12
|
+
import { claimInto, deleteRange, formatRangeIn, insertIntoText } from '../text/model.js';
|
|
5
13
|
/**
|
|
6
14
|
* Raised when a mutating facade op runs after `dispose()` — disposal is
|
|
7
15
|
* terminal for writes (reads stay dead-safe: a stale handle may still be
|
|
@@ -15,21 +23,9 @@ export class EdytorDocDisposedError extends Error {
|
|
|
15
23
|
this.name = 'EdytorDocDisposedError';
|
|
16
24
|
}
|
|
17
25
|
}
|
|
18
|
-
/**
|
|
19
|
-
* The lineage ring depth, validated — `NaN`/`Infinity`/fractional/negative
|
|
20
|
-
* values would silently disable the ring's trim bound. The one check every
|
|
21
|
-
* entry path (facade creation, document attach and reattach) runs.
|
|
22
|
-
*/
|
|
23
|
-
export const lineageDepthOf = (depth) => {
|
|
24
|
-
const d = depth ?? 0;
|
|
25
|
-
if (!Number.isInteger(d) || d < 0) {
|
|
26
|
-
throw new RangeError(`lineage.depth must be a non-negative integer, got ${JSON.stringify(d)}`);
|
|
27
|
-
}
|
|
28
|
-
return d;
|
|
29
|
-
};
|
|
30
26
|
/** The write funnel of one facade. */
|
|
31
27
|
export const writeFunnel = (c) => {
|
|
32
|
-
const { doc,
|
|
28
|
+
const { doc, runsView, dataNode, BA, config } = c;
|
|
33
29
|
/**
|
|
34
30
|
* Terminal flag — set by `dispose()`. Mutating ops funnel through
|
|
35
31
|
* `write`, so gating there covers every facade write + `transact` +
|
|
@@ -56,39 +52,14 @@ export const writeFunnel = (c) => {
|
|
|
56
52
|
// is observed, never predicted.
|
|
57
53
|
//
|
|
58
54
|
// Each apply opens a frame that tracks the index's folds. When it
|
|
59
|
-
// closes, ONE pass over the facets the fold saw stamps attribution
|
|
60
|
-
//
|
|
61
|
-
// its `createdBy` record; a block whose content, claims, type or data
|
|
55
|
+
// closes, ONE pass over the facets the fold saw stamps attribution: a
|
|
56
|
+
// block whose registry entry was created gets its `createdBy` record; a block whose content, claims, type or data
|
|
62
57
|
// changed gets a contributor stamp; moves and delete marks stamp
|
|
63
58
|
// nothing. Two intents the effects cannot name are recorded by their
|
|
64
59
|
// steps: a split-born block inherits its source's contributors, and a
|
|
65
|
-
// merge survivor unions the absorbed block's.
|
|
66
|
-
//
|
|
67
|
-
// only for targets the effects show changed, deleted or absorbed. With
|
|
68
|
-
// no configured `actor` the funnel writes no attribution at all.
|
|
60
|
+
// merge survivor unions the absorbed block's. With no configured
|
|
61
|
+
// `actor` the funnel writes no attribution at all.
|
|
69
62
|
const actorOf = () => config.actor?.();
|
|
70
|
-
const lineageDepth = lineageDepthOf(config.lineageDepth);
|
|
71
|
-
/**
|
|
72
|
-
* Capture `id`'s displaced state when the current actor is NOT the `l`
|
|
73
|
-
* winner (`force`: destructive paths, where the state is lost whoever
|
|
74
|
-
* owns `l`). First capture in a frame wins — it is the pre-frame state.
|
|
75
|
-
*/
|
|
76
|
-
const lineagePending = (id, force = false) => {
|
|
77
|
-
const actor = actorOf();
|
|
78
|
-
const node = M.blockNodeOf(doc, id);
|
|
79
|
-
if (lineageDepth <= 0 || actor === undefined || node === null)
|
|
80
|
-
return undefined;
|
|
81
|
-
const l = node.getAttr(LAST_CHANGED_ATTR);
|
|
82
|
-
if (!force && l === actor.id)
|
|
83
|
-
return undefined;
|
|
84
|
-
const j = blockJSON(id);
|
|
85
|
-
return { ...(typeof l === 'string' ? { a: l } : {}), by: actor.id, t: Date.now(), j };
|
|
86
|
-
};
|
|
87
|
-
const capture = (f, id, force = false) => {
|
|
88
|
-
const pending = f.lineage.has(id) ? undefined : lineagePending(id, force);
|
|
89
|
-
if (pending !== undefined)
|
|
90
|
-
f.lineage.set(id, pending);
|
|
91
|
-
};
|
|
92
63
|
/** The frame's one attribution pass over the facets the fold saw it write. */
|
|
93
64
|
const close = (f, folded) => {
|
|
94
65
|
const actor = actorOf();
|
|
@@ -96,79 +67,72 @@ export const writeFunnel = (c) => {
|
|
|
96
67
|
return;
|
|
97
68
|
const created = new Set();
|
|
98
69
|
const changed = new Set();
|
|
99
|
-
const gone = new Set(f.unions.map(([, from]) => from));
|
|
100
70
|
for (const [id, facets] of folded.touched) {
|
|
101
|
-
if (facets.has(ENTRY_FACET) &&
|
|
71
|
+
if (facets.has(ENTRY_FACET) && blockNodeOf(doc, id) !== null)
|
|
102
72
|
created.add(id);
|
|
103
73
|
else
|
|
104
|
-
for (const facet of facets)
|
|
105
|
-
if (facet.startsWith(DEL_PREFIX)
|
|
106
|
-
|
|
107
|
-
else if (![ENTRY_FACET, AT, ID, LAST_CHANGED_ATTR].includes(facet))
|
|
74
|
+
for (const facet of facets)
|
|
75
|
+
if (!facet.startsWith(DEL_PREFIX) &&
|
|
76
|
+
![ENTRY_FACET, AT, ID, LAST_CHANGED_ATTR].includes(facet))
|
|
108
77
|
changed.add(id);
|
|
109
|
-
}
|
|
110
78
|
}
|
|
111
79
|
for (const id of created) {
|
|
112
|
-
const node =
|
|
80
|
+
const node = blockNodeOf(doc, id);
|
|
113
81
|
if (node !== null)
|
|
114
82
|
BA.stampCreated(doc, node, id, actor.id, f.inherit.get(id));
|
|
115
83
|
}
|
|
116
84
|
for (const id of changed) {
|
|
117
|
-
const node = created.has(id) ? null :
|
|
85
|
+
const node = created.has(id) ? null : blockNodeOf(doc, id);
|
|
118
86
|
if (node !== null)
|
|
119
87
|
BA.stampChange(doc, node, id, actor.id);
|
|
120
88
|
}
|
|
121
89
|
for (const [into, from] of f.unions)
|
|
122
90
|
BA.unionContributors(doc, into, from);
|
|
123
|
-
for (const [id, pending] of f.lineage) {
|
|
124
|
-
if (changed.has(id) || gone.has(id))
|
|
125
|
-
BA.appendLineage(doc, id, pending, lineageDepth);
|
|
126
|
-
}
|
|
127
91
|
};
|
|
128
92
|
/**
|
|
129
93
|
* A streamless block gets its own text before the first write that
|
|
130
|
-
* needs a stream (`
|
|
94
|
+
* needs a stream (`ownText`: a writer derived from its dead
|
|
131
95
|
* incarnation); its attribution record follows the re-minted nonce.
|
|
132
96
|
*/
|
|
133
97
|
const needStream = (id) => {
|
|
134
|
-
if ((
|
|
98
|
+
if ((modelView(doc).own.display(id) ?? []).length > 0)
|
|
135
99
|
return;
|
|
136
|
-
const { from, to } =
|
|
100
|
+
const { from, to } = ownText(doc, id);
|
|
137
101
|
BA.retarget(doc, id, from, to);
|
|
138
102
|
};
|
|
139
103
|
/** One planned step, written (the plan decided it; writers never refuse). */
|
|
140
104
|
const writeStep = (w, f) => {
|
|
141
105
|
// Structural steps need no view: delete marks and placements write one node.
|
|
142
106
|
if (w.op === 'deleteBlock')
|
|
143
|
-
return w.marks.forEach((id) =>
|
|
107
|
+
return w.marks.forEach((id) => blockNodeOf(doc, id).setAttr(DEL_PREFIX + doc.clientID, true));
|
|
144
108
|
if (w.op === 'splitBlock' || w.op === 'insertText' || w.op === 'insertInline')
|
|
145
109
|
needStream(w.id);
|
|
146
|
-
const { blocks, own } =
|
|
147
|
-
const node = (id) =>
|
|
110
|
+
const { blocks, own } = modelView(doc);
|
|
111
|
+
const node = (id) => blockNodeOf(doc, id);
|
|
148
112
|
switch (w.op) {
|
|
149
113
|
case 'insertBlocks':
|
|
150
|
-
return w.specs.forEach((sp, i) =>
|
|
114
|
+
return w.specs.forEach((sp, i) => materializeSpec(doc, sp, w.parent, w.ranks[i]));
|
|
151
115
|
case 'moveBlocks':
|
|
152
|
-
return w.ids.forEach((id, i) =>
|
|
116
|
+
return w.ids.forEach((id, i) => writePlacement(doc, node(id), w.parent, w.ranks[i]));
|
|
153
117
|
case 'splitBlock':
|
|
154
118
|
f.inherit.set(w.newId, w.id);
|
|
155
|
-
return
|
|
119
|
+
return writeSplit(doc, w.id, w.offset, w.newId, w.tail, { p: w.parent, r: w.rank });
|
|
156
120
|
case 'mergeBlocks':
|
|
157
121
|
f.unions.push([w.into, w.from]);
|
|
158
|
-
return
|
|
122
|
+
return claimInto(blocks, own, w.from, w.into);
|
|
159
123
|
case 'setBlockType':
|
|
160
124
|
return void node(w.id).setAttr(TYPE, w.type);
|
|
161
125
|
case 'patchData':
|
|
162
126
|
return writeLeaves(dataNode(w.id, w.inlineId), w.leaves);
|
|
163
127
|
case 'insertText':
|
|
164
|
-
return
|
|
128
|
+
return insertIntoText(doc, blocks, own, w.id, w.offset, w.text, w.marks);
|
|
165
129
|
case 'insertInline':
|
|
166
|
-
return
|
|
130
|
+
return insertIntoText(doc, blocks, own, w.id, w.offset, buildInline(w.atom));
|
|
167
131
|
case 'deleteText':
|
|
168
132
|
case 'removeInline':
|
|
169
|
-
return
|
|
133
|
+
return deleteRange(doc, blocks, own, w.id, w.offset, 'length' in w ? w.length : 1);
|
|
170
134
|
case 'formatRange':
|
|
171
|
-
return
|
|
135
|
+
return formatRangeIn(doc, blocks, own, w.id, w.offset, w.length, w.marks);
|
|
172
136
|
}
|
|
173
137
|
};
|
|
174
138
|
/**
|
|
@@ -185,20 +149,8 @@ export const writeFunnel = (c) => {
|
|
|
185
149
|
}
|
|
186
150
|
return write(() => doc.transact(() => {
|
|
187
151
|
const frame = runsView.track();
|
|
188
|
-
const f = {
|
|
152
|
+
const f = { inherit: new Map(), unions: [] };
|
|
189
153
|
try {
|
|
190
|
-
// Lineage captures every target's pre-write state before the
|
|
191
|
-
// first write; destructive steps capture whoever owns `l`.
|
|
192
|
-
for (const w of p.writes) {
|
|
193
|
-
if (w.op === 'deleteBlock')
|
|
194
|
-
capture(f, w.id, true);
|
|
195
|
-
else if (w.op === 'mergeBlocks') {
|
|
196
|
-
capture(f, w.from, true);
|
|
197
|
-
capture(f, w.into);
|
|
198
|
-
}
|
|
199
|
-
else if ('id' in w && w.id !== undefined)
|
|
200
|
-
capture(f, w.id);
|
|
201
|
-
}
|
|
202
154
|
for (const w of p.writes)
|
|
203
155
|
writeStep(w, f);
|
|
204
156
|
}
|
|
@@ -215,9 +167,6 @@ export const writeFunnel = (c) => {
|
|
|
215
167
|
return {
|
|
216
168
|
write,
|
|
217
169
|
apply,
|
|
218
|
-
actorOf,
|
|
219
|
-
lineageDepth,
|
|
220
|
-
lineagePending,
|
|
221
170
|
/** Disposal is terminal for writes. */
|
|
222
171
|
dispose: () => {
|
|
223
172
|
disposed = true;
|
package/dist/crdt/doc/gate.d.ts
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
import type { EngineDoc } from '../engine-api.js';
|
|
28
|
-
export declare const SCHEMA_VERSION:
|
|
28
|
+
export declare const SCHEMA_VERSION: 6;
|
|
29
29
|
export declare const SCHEMA_NAME: "edytor-doc";
|
|
30
30
|
export declare const META_KEY: "meta";
|
|
31
31
|
/**
|
|
@@ -87,20 +87,19 @@ export declare class SchemaMismatchError extends Error {
|
|
|
87
87
|
*/
|
|
88
88
|
export declare const assertSchema: (doc: EngineDoc, docName?: string) => void;
|
|
89
89
|
/**
|
|
90
|
-
* Error raised by {@link assertUsableDoc} — the doc cannot host a v14 facade
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* legacy v13 Edytor schema (applied v13 update rows awaiting migration).
|
|
90
|
+
* Error raised by {@link assertUsableDoc} — the doc cannot host a v14 facade:
|
|
91
|
+
* a foreign engine object (a v13 `yjs` Doc — a different CRDT implementation
|
|
92
|
+
* entirely).
|
|
94
93
|
*/
|
|
95
94
|
export declare class UnsupportedDocError extends Error {
|
|
96
|
-
readonly kind: 'foreign'
|
|
97
|
-
constructor(kind: 'foreign'
|
|
95
|
+
readonly kind: 'foreign';
|
|
96
|
+
constructor(kind: 'foreign');
|
|
98
97
|
}
|
|
99
98
|
/**
|
|
100
99
|
* Document-boundary guard run by {@link EdytorDocBinding.create} before the
|
|
101
100
|
* runs view attaches. The facade only speaks the v14 unified-node surface —
|
|
102
101
|
* without this gate a foreign doc dies obscurely inside `buildView`
|
|
103
|
-
* (`registry.forEachAttr is not a function`)
|
|
104
|
-
*
|
|
102
|
+
* (`registry.forEachAttr is not a function`); it fails fast with an
|
|
103
|
+
* actionable error instead.
|
|
105
104
|
*/
|
|
106
105
|
export declare const assertUsableDoc: (doc: EngineDoc) => void;
|
package/dist/crdt/doc/gate.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { isNodeLike, SCHEMA } from '../schema.js';
|
|
2
|
-
import { isLegacyDoc } from '../migration/legacy-schema.js';
|
|
3
2
|
export const SCHEMA_VERSION = SCHEMA.version;
|
|
4
3
|
export const SCHEMA_NAME = SCHEMA.name;
|
|
5
4
|
export const META_KEY = SCHEMA.roots.meta;
|
|
@@ -75,21 +74,15 @@ export const assertSchema = (doc, docName = 'doc') => {
|
|
|
75
74
|
throw new SchemaMismatchError(docName, problem);
|
|
76
75
|
};
|
|
77
76
|
/**
|
|
78
|
-
* Error raised by {@link assertUsableDoc} — the doc cannot host a v14 facade
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* legacy v13 Edytor schema (applied v13 update rows awaiting migration).
|
|
77
|
+
* Error raised by {@link assertUsableDoc} — the doc cannot host a v14 facade:
|
|
78
|
+
* a foreign engine object (a v13 `yjs` Doc — a different CRDT implementation
|
|
79
|
+
* entirely).
|
|
82
80
|
*/
|
|
83
81
|
export class UnsupportedDocError extends Error {
|
|
84
82
|
kind;
|
|
85
83
|
constructor(kind) {
|
|
86
|
-
super(
|
|
87
|
-
|
|
88
|
-
'migrate it via `crdt.migration` before attaching an editor.'
|
|
89
|
-
: 'Document is not a v14 engine doc — the `blocks` registry is not a ' +
|
|
90
|
-
'unified Y.Node. Use `crdt.createDoc()` (or `new Y.Doc()` from ' +
|
|
91
|
-
'`edytor/crdt`); a v13 `yjs` Doc must be migrated via ' +
|
|
92
|
-
'`crdt.migration` (from its stored updates), not passed to the runtime.');
|
|
84
|
+
super('Document is not a v14 engine doc — the `blocks` registry is not a ' +
|
|
85
|
+
'unified Y.Node. Use `crdt.createDoc()` (or `new Y.Doc()` from `edytor/crdt`).');
|
|
93
86
|
this.kind = kind;
|
|
94
87
|
this.name = 'UnsupportedDocError';
|
|
95
88
|
}
|
|
@@ -98,8 +91,8 @@ export class UnsupportedDocError extends Error {
|
|
|
98
91
|
* Document-boundary guard run by {@link EdytorDocBinding.create} before the
|
|
99
92
|
* runs view attaches. The facade only speaks the v14 unified-node surface —
|
|
100
93
|
* without this gate a foreign doc dies obscurely inside `buildView`
|
|
101
|
-
* (`registry.forEachAttr is not a function`)
|
|
102
|
-
*
|
|
94
|
+
* (`registry.forEachAttr is not a function`); it fails fast with an
|
|
95
|
+
* actionable error instead.
|
|
103
96
|
*/
|
|
104
97
|
export const assertUsableDoc = (doc) => {
|
|
105
98
|
let registry;
|
|
@@ -112,7 +105,4 @@ export const assertUsableDoc = (doc) => {
|
|
|
112
105
|
if (!isNodeLike(registry) || typeof registry.forEachAttr !== 'function') {
|
|
113
106
|
throw new UnsupportedDocError('foreign');
|
|
114
107
|
}
|
|
115
|
-
if (isLegacyDoc(doc)) {
|
|
116
|
-
throw new UnsupportedDocError('legacy');
|
|
117
|
-
}
|
|
118
108
|
};
|