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
package/dist/crdt/doc/history.js
CHANGED
|
@@ -1,24 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document's history: the one undo manager (fork patch YP18 removed the
|
|
3
|
+
* engine's). It captures the tracked local transactions that write in its
|
|
4
|
+
* scope (the block registry, the text delete marks, the document's data)
|
|
5
|
+
* into steps, and an undo or a redo replays a step in one transaction over
|
|
6
|
+
* the engine's struct primitives (`redoItem`, `keepItem`). Its rules: text
|
|
7
|
+
* comes back as the delete marks allow (`hist.undo.restore`), an undone
|
|
8
|
+
* creation is withdrawn (`hist.undo.withdraw`), an overwritten attr is
|
|
9
|
+
* repaired, the stack keeps `limit` steps, and the purge horizon drops the
|
|
10
|
+
* steps below it (`hist.purge.horizon`).
|
|
11
|
+
*/
|
|
12
|
+
import { getUnixTime } from 'lib0-v14/time';
|
|
1
13
|
import { ownTextIds } from '../text/model.js';
|
|
2
14
|
import { readHorizon } from '../purge.js';
|
|
3
|
-
import { BLOCK_NODE,
|
|
4
|
-
import {
|
|
15
|
+
import { BLOCK_NODE, DATA_LEAF_PREFIX, DOC_DATA_ROOT, HORIZON_ROOT, INLINE_NODE, LAST_CHANGED_ATTR, TYPE } from '../schema.js';
|
|
16
|
+
import { changedUnder, collectable, collectNow, collects, dropSearchMarkers, engineOps, walkIdSet } from '../structs.js';
|
|
5
17
|
import { isInitialized } from './gate.js';
|
|
6
18
|
import { EdytorDocDisposedError } from './funnel.js';
|
|
19
|
+
import { registryOf, withdrawOnUndo } from '../placement/model.js';
|
|
7
20
|
/** The undo steps a document's history keeps by default: older ones are released. */
|
|
8
21
|
export const DEFAULT_HISTORY_LIMIT = 200;
|
|
9
22
|
/** The origin of the transaction that releases a dropped history step's content. */
|
|
10
23
|
const HISTORY_TRIM = Symbol('edytor.history.trim');
|
|
24
|
+
/** One undo or redo step: what its transactions inserted and deleted, and what the views keep on it. */
|
|
25
|
+
export class StackItem {
|
|
26
|
+
inserts;
|
|
27
|
+
deletes;
|
|
28
|
+
/** Per-view metadata (`session/history.ts`: the selections around the step). */
|
|
29
|
+
meta = new Map();
|
|
30
|
+
constructor(inserts, deletes) {
|
|
31
|
+
this.inserts = inserts;
|
|
32
|
+
this.deletes = deletes;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** The single-value attrs a history step must never leave undefined. */
|
|
36
|
+
const REPAIRED = {
|
|
37
|
+
[BLOCK_NODE]: [TYPE, LAST_CHANGED_ATTR],
|
|
38
|
+
[INLINE_NODE]: [TYPE]
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* A document's undo manager: the undo and redo stacks of the tracked local
|
|
42
|
+
* transactions in its scope. `undo()`/`redo()` replay the top step and
|
|
43
|
+
* return it (`null`: nothing changed); `stopCapturing()` closes the open
|
|
44
|
+
* step; `clear()` drops every step and releases what they kept.
|
|
45
|
+
*/
|
|
46
|
+
export class UndoManager {
|
|
47
|
+
undoStack = [];
|
|
48
|
+
redoStack = [];
|
|
49
|
+
/** Whether an `undo()` is replaying (its transaction is captured into the redo stack). */
|
|
50
|
+
undoing = false;
|
|
51
|
+
redoing = false;
|
|
52
|
+
/** The step a replay applies, while its transaction runs. */
|
|
53
|
+
currStackItem = null;
|
|
54
|
+
/** When the open step last took a transaction (ms since the epoch; 0: no open step). */
|
|
55
|
+
lastChange = 0;
|
|
56
|
+
captureTimeout;
|
|
57
|
+
trackedOrigins;
|
|
58
|
+
captureTransaction;
|
|
59
|
+
limit;
|
|
60
|
+
doc;
|
|
61
|
+
#rules;
|
|
62
|
+
#ops;
|
|
63
|
+
#observers = new Set();
|
|
64
|
+
/** What dropped steps released (an item is released once every step that deleted it is gone). */
|
|
65
|
+
#released;
|
|
66
|
+
#horizon;
|
|
67
|
+
constructor(rules, options = {}) {
|
|
68
|
+
this.#rules = rules;
|
|
69
|
+
this.#ops = engineOps(rules.Y);
|
|
70
|
+
this.#released = this.#ops.idSet();
|
|
71
|
+
this.doc = rules.doc;
|
|
72
|
+
this.#horizon = rules.doc.get(HORIZON_ROOT);
|
|
73
|
+
this.captureTimeout = options.captureTimeout ?? 500;
|
|
74
|
+
this.limit = options.limit ?? DEFAULT_HISTORY_LIMIT;
|
|
75
|
+
this.captureTransaction = options.captureTransaction ?? (() => true);
|
|
76
|
+
this.trackedOrigins = options.trackedOrigins ?? new Set([null]);
|
|
77
|
+
// Its own replays are tracked: an undo's transaction becomes a redo step.
|
|
78
|
+
this.trackedOrigins.add(this);
|
|
79
|
+
this.#ops.on(rules.doc, 'afterTransaction', this.#afterTransaction);
|
|
80
|
+
this.#ops.on(rules.doc, 'destroy', this.destroy);
|
|
81
|
+
}
|
|
82
|
+
/** Be told of every step taken into a stack (added, or the open one updated). Returns the unsubscribe. */
|
|
83
|
+
observe(f) {
|
|
84
|
+
this.#observers.add(f);
|
|
85
|
+
return () => this.#observers.delete(f);
|
|
86
|
+
}
|
|
87
|
+
/** The next transaction starts a step of its own. */
|
|
88
|
+
stopCapturing() {
|
|
89
|
+
this.lastChange = 0;
|
|
90
|
+
}
|
|
91
|
+
canUndo() {
|
|
92
|
+
return this.undoStack.length > 0;
|
|
93
|
+
}
|
|
94
|
+
canRedo() {
|
|
95
|
+
return this.redoStack.length > 0;
|
|
96
|
+
}
|
|
97
|
+
/** Replay the top undo step; the step, or `null` when nothing changed. */
|
|
98
|
+
undo() {
|
|
99
|
+
this.undoing = true;
|
|
100
|
+
try {
|
|
101
|
+
return this.#pop(this.undoStack);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
this.undoing = false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Replay the top redo step; the step, or `null` when nothing changed. */
|
|
108
|
+
redo() {
|
|
109
|
+
this.redoing = true;
|
|
110
|
+
try {
|
|
111
|
+
return this.#pop(this.redoStack);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
this.redoing = false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Drop every step (undo and redo) and release what they kept for their replay. */
|
|
118
|
+
clear() {
|
|
119
|
+
this.#release([...this.undoStack.splice(0), ...this.redoStack.splice(0)]);
|
|
120
|
+
}
|
|
121
|
+
destroy = () => {
|
|
122
|
+
this.trackedOrigins.delete(this);
|
|
123
|
+
this.#ops.off(this.doc, 'afterTransaction', this.#afterTransaction);
|
|
124
|
+
this.#ops.off(this.doc, 'destroy', this.destroy);
|
|
125
|
+
this.#observers.clear();
|
|
126
|
+
};
|
|
127
|
+
#inScope(item) {
|
|
128
|
+
return this.#rules.scope.some((node) => this.#ops.inside(node, item));
|
|
129
|
+
}
|
|
130
|
+
#afterTransaction = (transaction) => {
|
|
131
|
+
const tr = transaction;
|
|
132
|
+
this.#capture(tr);
|
|
133
|
+
// The purge horizon arrived: the steps below it go (`hist.purge.horizon`).
|
|
134
|
+
if (tr.changed.has(this.#horizon))
|
|
135
|
+
this.#prune();
|
|
136
|
+
};
|
|
137
|
+
#capture(tr) {
|
|
138
|
+
const ops = this.#ops;
|
|
139
|
+
const origin = tr.origin;
|
|
140
|
+
if (!this.captureTransaction(tr) ||
|
|
141
|
+
!changedUnder(tr, this.#rules.scope) ||
|
|
142
|
+
(!this.trackedOrigins.has(origin) &&
|
|
143
|
+
(!origin || !this.trackedOrigins.has(origin.constructor))))
|
|
144
|
+
return;
|
|
145
|
+
const { undoing, redoing } = this;
|
|
146
|
+
const stack = undoing ? this.redoStack : this.undoStack;
|
|
147
|
+
// A replay's step is its own; a new edit ends what could be redone.
|
|
148
|
+
if (undoing)
|
|
149
|
+
this.lastChange = 0;
|
|
150
|
+
else if (!redoing)
|
|
151
|
+
this.#release(this.redoStack.splice(0));
|
|
152
|
+
const now = getUnixTime();
|
|
153
|
+
const open = stack.at(-1);
|
|
154
|
+
const merge = open !== undefined &&
|
|
155
|
+
!undoing &&
|
|
156
|
+
!redoing &&
|
|
157
|
+
this.lastChange > 0 &&
|
|
158
|
+
now - this.lastChange < this.captureTimeout;
|
|
159
|
+
if (merge) {
|
|
160
|
+
open.deletes = ops.merge([open.deletes, tr.deleteSet]);
|
|
161
|
+
open.inserts = ops.merge([open.inserts, tr.insertSet]);
|
|
162
|
+
}
|
|
163
|
+
else
|
|
164
|
+
stack.push(new StackItem(tr.insertSet, tr.deleteSet));
|
|
165
|
+
if (!undoing && !redoing)
|
|
166
|
+
this.lastChange = now;
|
|
167
|
+
// What the step deleted is kept from collection while a step may bring it back.
|
|
168
|
+
ops.iterate(tr, tr.deleteSet, (item) => {
|
|
169
|
+
if (ops.isItem(item) && this.#inScope(item))
|
|
170
|
+
ops.keep(item);
|
|
171
|
+
});
|
|
172
|
+
const step = stack.at(-1);
|
|
173
|
+
// A streamless block's own text is shared by every replica that
|
|
174
|
+
// typed into it first: no step captures it, so undoing the first
|
|
175
|
+
// typing removes the typing and keeps the text (and nonce).
|
|
176
|
+
const own = ownTextIds.get(this.doc);
|
|
177
|
+
if (own !== undefined)
|
|
178
|
+
step.inserts = ops.diff(step.inserts, own);
|
|
179
|
+
// The undo stack keeps its newest `limit` steps.
|
|
180
|
+
const over = this.undoStack.length - this.limit;
|
|
181
|
+
if (!merge && !undoing && over > 0)
|
|
182
|
+
this.#release(this.undoStack.splice(0, over));
|
|
183
|
+
const event = {
|
|
184
|
+
stackItem: step,
|
|
185
|
+
origin: tr.origin,
|
|
186
|
+
type: undoing ? 'redo' : 'undo'
|
|
187
|
+
};
|
|
188
|
+
for (const f of this.#observers)
|
|
189
|
+
f(event, !merge);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Replay the top step of `stack` in one transaction (origin: this
|
|
193
|
+
* manager): what it inserted is deleted (or withdrawn), what it deleted
|
|
194
|
+
* comes back (text as its delete marks allow), the overwritten attrs are
|
|
195
|
+
* repaired. A step that changes nothing is skipped for the one below.
|
|
196
|
+
*/
|
|
197
|
+
#pop(stack) {
|
|
198
|
+
const ops = this.#ops;
|
|
199
|
+
const { marks, withdraw, repair } = this.#rules;
|
|
200
|
+
const deletedByHistory = (id) => [this.undoStack, this.redoStack].some((s) => s.some((step) => step.deletes.has(id.client, id.clock)));
|
|
201
|
+
this.doc.transact((transaction) => {
|
|
202
|
+
const tr = transaction;
|
|
203
|
+
while (stack.length > 0 && this.currStackItem === null) {
|
|
204
|
+
const step = stack.pop();
|
|
205
|
+
const restore = new Set();
|
|
206
|
+
const remove = [];
|
|
207
|
+
let changed = false;
|
|
208
|
+
ops.iterate(tr, step.inserts, (struct) => {
|
|
209
|
+
if (!ops.isItem(struct))
|
|
210
|
+
return;
|
|
211
|
+
const item = ops.latest(tr, struct);
|
|
212
|
+
if (!item.deleted && this.#inScope(item))
|
|
213
|
+
remove.push(item);
|
|
214
|
+
});
|
|
215
|
+
ops.iterate(tr, step.deletes, (struct) => {
|
|
216
|
+
if (!ops.isItem(struct) || !this.#inScope(struct))
|
|
217
|
+
return;
|
|
218
|
+
// Created and deleted within the step: nothing to bring back.
|
|
219
|
+
if (step.inserts.has(struct.id.client, struct.id.clock))
|
|
220
|
+
return;
|
|
221
|
+
// Text comes back through the delete marks (`onApply`): withheld here.
|
|
222
|
+
if (!marks.restoreFilter(struct))
|
|
223
|
+
changed = true;
|
|
224
|
+
else
|
|
225
|
+
restore.add(struct);
|
|
226
|
+
});
|
|
227
|
+
for (const item of restore)
|
|
228
|
+
changed = ops.redo(tr, item, restore, step.inserts, deletedByHistory) !== null || changed;
|
|
229
|
+
// Children before parents: more is known when an item is judged.
|
|
230
|
+
for (let i = remove.length - 1; i >= 0; i--) {
|
|
231
|
+
if (!withdraw(remove[i], step))
|
|
232
|
+
ops.remove(tr, remove[i]);
|
|
233
|
+
changed = true;
|
|
234
|
+
}
|
|
235
|
+
this.currStackItem = changed ? step : null;
|
|
236
|
+
if (changed) {
|
|
237
|
+
marks.onApply(tr, step);
|
|
238
|
+
repair(step);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
tr.changed.forEach((keys, node) => {
|
|
242
|
+
if (keys.has(null))
|
|
243
|
+
dropSearchMarkers(node);
|
|
244
|
+
});
|
|
245
|
+
}, this);
|
|
246
|
+
const step = this.currStackItem;
|
|
247
|
+
this.currStackItem = null;
|
|
248
|
+
return step;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Release what dropped steps kept for their replay: the engine collects
|
|
252
|
+
* that content now, as it would have at the delete without a history
|
|
253
|
+
* (the doc's `gcFilter` still decides: a text copy another replica may
|
|
254
|
+
* have to copy again stays, `text/deletes.ts`). An item is released only
|
|
255
|
+
* once every step that deleted part of it was dropped (the engine merges
|
|
256
|
+
* deleted items across steps): never split, so the store keeps its
|
|
257
|
+
* merged items. Only the items themselves are released: a kept
|
|
258
|
+
* container's flag may guard a newer step's items inside it.
|
|
259
|
+
*/
|
|
260
|
+
#release(dropped) {
|
|
261
|
+
if (dropped.length === 0)
|
|
262
|
+
return;
|
|
263
|
+
const { Y, doc } = this.#rules;
|
|
264
|
+
const released = this.#released;
|
|
265
|
+
for (const step of dropped)
|
|
266
|
+
this.#ops.insertInto(released, step.deletes);
|
|
267
|
+
const covered = (st) => {
|
|
268
|
+
const end = st.id.clock + st.length;
|
|
269
|
+
return (released.clients.get(st.id.client)?.getIds() ?? []).some((r) => r.clock <= st.id.clock && end <= r.clock + r.len);
|
|
270
|
+
};
|
|
271
|
+
const gc = collects(doc);
|
|
272
|
+
doc.transact((tr) => {
|
|
273
|
+
for (const step of dropped)
|
|
274
|
+
walkIdSet(Y, doc, step.deletes, (st) => {
|
|
275
|
+
const it = st;
|
|
276
|
+
if (it.content === undefined || it.keep !== true || !covered(it))
|
|
277
|
+
return;
|
|
278
|
+
it.keep = false;
|
|
279
|
+
if (gc && it.deleted && collectable(doc, it))
|
|
280
|
+
collectNow(it, tr);
|
|
281
|
+
});
|
|
282
|
+
}, HISTORY_TRIM);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The purge horizon (`hist.purge.horizon`): every step all of whose
|
|
286
|
+
* inserts the room stored before it is dropped and released — a replay
|
|
287
|
+
* of it would bring back content the purge removed. A step that inserted
|
|
288
|
+
* nothing is kept.
|
|
289
|
+
*/
|
|
290
|
+
#prune() {
|
|
291
|
+
const horizon = readHorizon(this.doc);
|
|
292
|
+
if (horizon === null)
|
|
293
|
+
return;
|
|
294
|
+
const sv = this.#rules.Y.decodeStateVector(horizon.sv);
|
|
295
|
+
const past = (step) => {
|
|
296
|
+
let any = false;
|
|
297
|
+
for (const [client, ranges] of step.inserts.clients)
|
|
298
|
+
for (const r of ranges.getIds()) {
|
|
299
|
+
any = true;
|
|
300
|
+
if (r.clock + r.len > (sv.get(client) ?? 0))
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
return any;
|
|
304
|
+
};
|
|
305
|
+
const dropped = [];
|
|
306
|
+
for (const stack of [this.undoStack, this.redoStack]) {
|
|
307
|
+
const kept = stack.filter((step) => !past(step) || !dropped.push(step));
|
|
308
|
+
stack.splice(0, stack.length, ...kept);
|
|
309
|
+
}
|
|
310
|
+
this.#release(dropped);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
11
313
|
/** The history factory of one facade. */
|
|
12
314
|
export const docHistory = (c) => {
|
|
13
|
-
const { Y, doc,
|
|
14
|
-
const ops = engineOps(Y);
|
|
15
|
-
/** The single-value attrs a history step must never leave undefined. */
|
|
16
|
-
const REPAIRED = {
|
|
17
|
-
[BLOCK_NODE]: [TYPE, DATA, LAST_CHANGED_ATTR],
|
|
18
|
-
[INLINE_NODE]: [TYPE, DATA]
|
|
19
|
-
};
|
|
315
|
+
const { Y, doc, D, init, write, disposed } = c;
|
|
20
316
|
/**
|
|
21
|
-
* Undo repair, inside the
|
|
317
|
+
* Undo repair, inside the replay's transaction. A replayed step
|
|
22
318
|
* deletes its own attr write and re-creates the value that write
|
|
23
319
|
* overwrote — unless a concurrent write sits between them, where the
|
|
24
320
|
* engine refuses the restore (the peer's value was deleted at
|
|
@@ -30,7 +326,7 @@ export const docHistory = (c) => {
|
|
|
30
326
|
*/
|
|
31
327
|
const repairAttrs = (step) => {
|
|
32
328
|
const lost = new Map();
|
|
33
|
-
|
|
329
|
+
walkIdSet(Y, doc, step.deletes, (s) => {
|
|
34
330
|
const node = s.parent;
|
|
35
331
|
const key = s.parentSub;
|
|
36
332
|
// A collected struct (a node the room's purge removed) has no key.
|
|
@@ -54,153 +350,42 @@ export const docHistory = (c) => {
|
|
|
54
350
|
node.setAttr(key, value);
|
|
55
351
|
}
|
|
56
352
|
};
|
|
353
|
+
/**
|
|
354
|
+
* The document's undo manager, SCOPED TO THE BLOCK REGISTRY (with the
|
|
355
|
+
* text delete marks and the document's data), attached only after the
|
|
356
|
+
* doc carries the schema version record:
|
|
357
|
+
*
|
|
358
|
+
* - the `meta` root (version stamp, schema name) is outside the scope,
|
|
359
|
+
* so `init`'s version write is undo-inert: undo can never strip
|
|
360
|
+
* `meta.v` or resurrect a stale schema version;
|
|
361
|
+
* - attach-after-init: the deterministic bootstrap insert IS inside the
|
|
362
|
+
* registry; this factory runs `init` first (a no-op on initialized
|
|
363
|
+
* docs), so the bootstrap always predates capture;
|
|
364
|
+
* - remote/provider writes never enter the stack: applied updates carry
|
|
365
|
+
* a foreign origin (and are non-local), which the tracked origins
|
|
366
|
+
* (and the document's `captureTransaction`) leave out.
|
|
367
|
+
*/
|
|
57
368
|
const createUndoManager = (options = {}) => {
|
|
58
369
|
if (disposed()) {
|
|
59
370
|
throw new EdytorDocDisposedError('createUndoManager');
|
|
60
371
|
}
|
|
61
|
-
const { limit = DEFAULT_HISTORY_LIMIT, ...opts } = options;
|
|
62
372
|
write(() => {
|
|
63
373
|
if (!isInitialized(doc))
|
|
64
374
|
init(doc);
|
|
65
375
|
});
|
|
66
|
-
// Text delete marks (
|
|
67
|
-
// undoer's own), and the history restores text only as the
|
|
68
|
-
// An undone creation withdraws the block instead of
|
|
376
|
+
// Text delete marks (`text/deletes.ts`): the marks are in scope (an undo
|
|
377
|
+
// removes the undoer's own), and the history restores text only as the
|
|
378
|
+
// marks allow. An undone creation withdraws the block instead of
|
|
379
|
+
// deleting it (`hist.undo.withdraw`).
|
|
69
380
|
const marks = D.history(doc, () => um);
|
|
70
|
-
const um = new
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
});
|
|
79
|
-
// A streamless block's own text is shared by every replica that
|
|
80
|
-
// typed into it first: no history step captures it, so undoing the
|
|
81
|
-
// first typing removes the typing and keeps the text (and nonce).
|
|
82
|
-
const skipOwnText = ({ stackItem }) => {
|
|
83
|
-
const ids = ownTextIds.get(doc);
|
|
84
|
-
if (ids !== undefined)
|
|
85
|
-
stackItem.inserts = ops.diff(stackItem.inserts, ids);
|
|
86
|
-
};
|
|
87
|
-
um.on('stack-item-added', skipOwnText);
|
|
88
|
-
um.on('stack-item-updated', skipOwnText);
|
|
89
|
-
// The undo stack keeps its newest `limit` steps. A step that
|
|
90
|
-
// falls off releases what it kept for its undo (its deleted items),
|
|
91
|
-
// and the engine collects their content now, as it would have at
|
|
92
|
-
// the delete without a history (the doc's `gcFilter` still decides:
|
|
93
|
-
// a text copy another replica may have to copy again stays, fork patch YP11).
|
|
94
|
-
// An item is released only once every step that deleted part of it
|
|
95
|
-
// fell off (the engine merges deleted items across steps): never
|
|
96
|
-
// split, so the store keeps its merged items. Only the items
|
|
97
|
-
// themselves are released: a kept container's flag may guard a
|
|
98
|
-
// newer step's items inside it.
|
|
99
|
-
const released = ops.idSet();
|
|
100
|
-
const covered = (st) => {
|
|
101
|
-
const end = st.id.clock + st.length;
|
|
102
|
-
return (released.clients.get(st.id.client)?.getIds() ?? []).some((r) => r.clock <= st.id.clock && end <= r.clock + r.len);
|
|
103
|
-
};
|
|
104
|
-
const release = (dropped) => {
|
|
105
|
-
if (dropped.length === 0)
|
|
106
|
-
return;
|
|
107
|
-
for (const step of dropped)
|
|
108
|
-
ops.insertInto(released, step.deletes);
|
|
109
|
-
const gc = collects(doc);
|
|
110
|
-
doc.transact((tr) => {
|
|
111
|
-
for (const step of dropped)
|
|
112
|
-
walkIdSetStructs(Y, doc, step.deletes, (st) => {
|
|
113
|
-
const it = st;
|
|
114
|
-
if (it.content === undefined || it.keep !== true || !covered(it))
|
|
115
|
-
return;
|
|
116
|
-
it.keep = false;
|
|
117
|
-
if (gc && it.deleted && collectable(doc, it))
|
|
118
|
-
collectNow(it, tr);
|
|
119
|
-
});
|
|
120
|
-
}, HISTORY_TRIM);
|
|
121
|
-
};
|
|
122
|
-
const trim = ({ type }) => {
|
|
123
|
-
const over = um.undoStack.length - limit;
|
|
124
|
-
if (type !== 'undo' || !(over > 0))
|
|
125
|
-
return;
|
|
126
|
-
release(stepsOf(um.undoStack.splice(0, over)));
|
|
127
|
-
};
|
|
128
|
-
um.on('stack-item-added', trim);
|
|
129
|
-
// `releaseHistory(um)`: every step dropped and released by the same rule.
|
|
130
|
-
releasers.set(um, () => release(stepsOf([...um.undoStack.splice(0), ...um.redoStack.splice(0)])));
|
|
131
|
-
// The purge horizon (`hist.purge.horizon`): when the room's purge horizon arrives,
|
|
132
|
-
// every step all of whose inserts the room stored before it is
|
|
133
|
-
// dropped and released — an undo of it would bring back content
|
|
134
|
-
// the purge removed. A step that inserted nothing is kept.
|
|
135
|
-
const horizonRoot = doc.get(HORIZON_ROOT);
|
|
136
|
-
const pastHorizon = (step, sv) => {
|
|
137
|
-
let any = false;
|
|
138
|
-
for (const [client, ranges] of step.inserts.clients)
|
|
139
|
-
for (const r of ranges.getIds()) {
|
|
140
|
-
any = true;
|
|
141
|
-
if (r.clock + r.len > (sv.get(client) ?? 0))
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
return any;
|
|
145
|
-
};
|
|
146
|
-
const prune = () => {
|
|
147
|
-
const horizon = readHorizon(doc);
|
|
148
|
-
if (horizon === null)
|
|
149
|
-
return;
|
|
150
|
-
const sv = Y.decodeStateVector(horizon.sv);
|
|
151
|
-
const dropped = [];
|
|
152
|
-
for (const stack of [um.undoStack, um.redoStack].map((stepsOf))) {
|
|
153
|
-
const kept = stack.filter((step) => !pastHorizon(step, sv) || !dropped.push(step));
|
|
154
|
-
stack.splice(0, stack.length, ...kept);
|
|
155
|
-
}
|
|
156
|
-
release(dropped);
|
|
157
|
-
};
|
|
158
|
-
onTransaction(doc, 'afterTransaction', (tr) => {
|
|
159
|
-
if (tr.changed.has(horizonRoot))
|
|
160
|
-
prune();
|
|
161
|
-
});
|
|
162
|
-
// Lineage for undo/redo: the replay displaces the state
|
|
163
|
-
// every block the popped stack item touches, so each one's subtree
|
|
164
|
-
// is captured (`force`: lost whoever owns `l`) from the history
|
|
165
|
-
// transaction's own `beforeTransaction`, before the replay writes.
|
|
166
|
-
// The ring writes join that transaction — one update per undo —
|
|
167
|
-
// and sit outside the manager's scope, so the replay never undoes
|
|
168
|
-
// or re-captures them. Nothing else is stamped for undo/redo: the
|
|
169
|
-
// engine's replay restores `l`, and `contributors` are add-only.
|
|
170
|
-
// An undo run inside an enclosing transaction gets no lineage (it
|
|
171
|
-
// is a defect of its own: it empties the redo stack).
|
|
172
|
-
if (lineageDepth > 0) {
|
|
173
|
-
const onBefore = (tr) => {
|
|
174
|
-
const stack = um.undoing ? um.undoStack : um.redoing ? um.redoStack : [];
|
|
175
|
-
const item = stack[stack.length - 1];
|
|
176
|
-
if (tr.origin !== um || item === undefined || actorOf() === undefined)
|
|
177
|
-
return;
|
|
178
|
-
try {
|
|
179
|
-
const touched = new Set();
|
|
180
|
-
for (const idSet of [item.inserts, item.deletes]) {
|
|
181
|
-
walkIdSetStructs(Y, doc, idSet, (s) => {
|
|
182
|
-
let n = s.parent;
|
|
183
|
-
while (isNodeLike(n)) {
|
|
184
|
-
const bid = n.name === BLOCK_NODE ? n.getAttr(ID) : undefined;
|
|
185
|
-
if (typeof bid === 'string')
|
|
186
|
-
return void touched.add(bid);
|
|
187
|
-
n = n._item?.parent;
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
for (const bid of touched) {
|
|
192
|
-
const pending = lineagePending(bid, true);
|
|
193
|
-
if (pending !== undefined)
|
|
194
|
-
BA.appendLineage(doc, bid, pending, lineageDepth);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (err) {
|
|
198
|
-
// Throwing here would leave the engine's transaction open.
|
|
199
|
-
console.error('[edytor-doc] undo lineage capture failed', err);
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
onTransaction(doc, 'beforeTransaction', onBefore);
|
|
203
|
-
}
|
|
381
|
+
const um = new UndoManager({
|
|
382
|
+
Y,
|
|
383
|
+
doc,
|
|
384
|
+
scope: [registryOf(doc), D.scope(doc), doc.get(DOC_DATA_ROOT)],
|
|
385
|
+
marks,
|
|
386
|
+
withdraw: withdrawOnUndo(doc),
|
|
387
|
+
repair: repairAttrs
|
|
388
|
+
}, options);
|
|
204
389
|
return um;
|
|
205
390
|
};
|
|
206
391
|
return { createUndoManager };
|
|
@@ -3,7 +3,6 @@ import type { Prepared } from './types.js';
|
|
|
3
3
|
import type { OpsContext } from './steps.js';
|
|
4
4
|
/** The layout ops of one facade, prepared. */
|
|
5
5
|
export declare const layoutOps: (c: OpsContext) => {
|
|
6
|
-
layoutKind: (kind?: string) => string | undefined;
|
|
7
6
|
besideAt: (target: BlockId, kind?: string) => BlockId;
|
|
8
7
|
placeBeside: (ids: readonly BlockId[], target: BlockId, side: "left" | "right", kind?: string) => Prepared;
|
|
9
8
|
wrapInLayout: (ids: readonly BlockId[], kind?: string, columns?: number) => Prepared;
|
package/dist/crdt/doc/layout.js
CHANGED
|
@@ -16,6 +16,8 @@ export const layoutOps = (c) => {
|
|
|
16
16
|
const kinds = [...roles.layoutKinds()];
|
|
17
17
|
return kinds.length === 1 ? kinds[0] : undefined;
|
|
18
18
|
};
|
|
19
|
+
/** A fresh empty block of `type`. */
|
|
20
|
+
const spec = (type) => sanitizeSpec({ id: newId('b'), type, data: {} });
|
|
19
21
|
/**
|
|
20
22
|
* The block a beside placement at `target` stands beside
|
|
21
23
|
* (`layout.place-beside`): a layout or an item for itself; a block whose
|
|
@@ -95,7 +97,6 @@ export const layoutOps = (c) => {
|
|
|
95
97
|
return REFUSED;
|
|
96
98
|
if (layout !== null && (isIsland(layout) || insideIsland(layout, v)))
|
|
97
99
|
return REFUSED;
|
|
98
|
-
const spec = (type) => sanitizeSpec({ id: newId('b'), type, data: {} });
|
|
99
100
|
const fresh = spec(item);
|
|
100
101
|
const into = (parent) => moveTo(moved, parent, 0, ranksFor(parent, 0, moved.length));
|
|
101
102
|
let writes;
|
|
@@ -160,7 +161,6 @@ export const layoutOps = (c) => {
|
|
|
160
161
|
if (columns > blocks.length && !fitsIn(item, fill))
|
|
161
162
|
return REFUSED;
|
|
162
163
|
const ordered = blocks.toSorted((a, b) => positionOf(a).index - positionOf(b).index);
|
|
163
|
-
const spec = (type) => sanitizeSpec({ id: newId('b'), type, data: {} });
|
|
164
164
|
const items = Array.from({ length: columns }, (_, i) => i < ordered.length ? spec(item) : { ...spec(item), children: [spec(fill)] });
|
|
165
165
|
const wrapper = { ...spec(wrap), children: items };
|
|
166
166
|
const at = positionOf(ordered[0]).index;
|
|
@@ -182,7 +182,6 @@ export const layoutOps = (c) => {
|
|
|
182
182
|
return plan([wrapper.id], emptied(ordered, writes, kept));
|
|
183
183
|
};
|
|
184
184
|
return {
|
|
185
|
-
layoutKind,
|
|
186
185
|
besideAt,
|
|
187
186
|
placeBeside,
|
|
188
187
|
wrapInLayout
|
package/dist/crdt/doc/meta.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type JSONBlock, type JSONInlineBlock, type JSONText } from '../../utils/json.js';
|
|
1
2
|
import { type DataPatch } from '../data.js';
|
|
2
3
|
import { type BlockId, type BlockSpec, type ContentItem } from '../placement/model.js';
|
|
3
4
|
import type { Prepared, PlanStep, DataTarget } from './types.js';
|
|
@@ -6,14 +7,13 @@ import type { OpsContext } from './steps.js';
|
|
|
6
7
|
export declare const metaOps: (c: OpsContext) => {
|
|
7
8
|
dataSteps: (target: DataTarget, patches: DataPatch[]) => PlanStep[] | null;
|
|
8
9
|
replaceData: (data: unknown) => DataPatch[];
|
|
9
|
-
leafSets: (data: unknown, current: unknown) => DataPatch[];
|
|
10
|
-
retypeSteps: (id: BlockId, type: string) => PlanStep[];
|
|
11
10
|
setBlockType: (id: BlockId, type: string) => Prepared;
|
|
12
11
|
patchData: (target: DataTarget, patches: readonly DataPatch[]) => Prepared;
|
|
13
12
|
setBlock: (id: BlockId, value: {
|
|
14
13
|
type?: string;
|
|
15
14
|
data?: Record<string, unknown>;
|
|
16
|
-
content?: ContentItem[];
|
|
17
|
-
children?: BlockSpec[];
|
|
15
|
+
content?: (ContentItem | JSONText | JSONInlineBlock)[];
|
|
16
|
+
children?: (BlockSpec | JSONBlock)[];
|
|
18
17
|
}) => Prepared;
|
|
19
18
|
};
|
|
19
|
+
export type MetaOps = ReturnType<typeof metaOps>;
|
package/dist/crdt/doc/meta.js
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { randOf } from '../rand.js';
|
|
7
7
|
import { TYPE } from '../schema.js';
|
|
8
|
-
import { sanitizeSpec, sanitizeWireJson } from '../../utils/json.js';
|
|
8
|
+
import { asBlockSpec, asContentItem, sanitizeSpec, sanitizeWireJson } from '../../utils/json.js';
|
|
9
9
|
import { patchWrites, leafKey, isObject } from '../data.js';
|
|
10
|
-
import { promotedRank } from '../placement/model.js';
|
|
10
|
+
import { collides, promotedRank, ranksAt } from '../placement/model.js';
|
|
11
11
|
import { ref, refused, sanitizeItem } from './plan.js';
|
|
12
12
|
/** The meta ops of one facade, prepared. */
|
|
13
13
|
export const metaOps = (c) => {
|
|
14
|
-
const { doc,
|
|
14
|
+
const { doc, roles, roleOf, dataNode, view, blockTypeOf, blockDataOf, childrenIds, positionOf, is, isVoid, displayLength, live, contentTarget, REFUSED, plan, moveTo, attr, leavingIsland, settle, remove, atomOf, writeContent } = c;
|
|
15
15
|
/**
|
|
16
16
|
* The data step of `patches` (sanitized) on a block, one of its atoms or
|
|
17
17
|
* the document (`crdt/data.ts`): none when it changes nothing, `null`
|
|
@@ -52,11 +52,10 @@ export const metaOps = (c) => {
|
|
|
52
52
|
*/
|
|
53
53
|
const leafSets = (data, current) => {
|
|
54
54
|
const out = [];
|
|
55
|
-
const plainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
56
55
|
const walk = (v, at, path) => {
|
|
57
|
-
if (
|
|
56
|
+
if (isObject(v) && Object.keys(v).length > 0 && (path.length === 0 || isObject(at)))
|
|
58
57
|
for (const [k, x] of Object.entries(v))
|
|
59
|
-
walk(x,
|
|
58
|
+
walk(x, isObject(at) ? at[k] : undefined, [...path, k]);
|
|
60
59
|
else if (path.length > 0)
|
|
61
60
|
out.push({ path, value: v });
|
|
62
61
|
};
|
|
@@ -158,15 +157,15 @@ export const metaOps = (c) => {
|
|
|
158
157
|
*/
|
|
159
158
|
const setBlock = (id, value) => {
|
|
160
159
|
id = ref(id);
|
|
161
|
-
const content = value.content?.map(sanitizeItem);
|
|
162
|
-
const children = value.children?.map(sanitizeSpec);
|
|
160
|
+
const content = value.content?.map((item) => sanitizeItem(asContentItem(item)));
|
|
161
|
+
const children = value.children?.map((child) => sanitizeSpec(asBlockSpec(child)));
|
|
163
162
|
if (!live(id) || (content !== undefined && !contentTarget(id)))
|
|
164
163
|
return REFUSED;
|
|
165
164
|
const type = value.type === undefined ? undefined : ref(value.type);
|
|
166
165
|
const toVoid = type === undefined ? isVoid(id) : roles.childless(type);
|
|
167
166
|
if (children?.length && toVoid)
|
|
168
167
|
return REFUSED;
|
|
169
|
-
if (children !== undefined &&
|
|
168
|
+
if (children !== undefined && collides(doc, children))
|
|
170
169
|
return refused('id-collision');
|
|
171
170
|
const data = value.data === undefined ? [] : dataSteps(id, leafSets(value.data, blockDataOf(id)));
|
|
172
171
|
if (data === null)
|
|
@@ -183,21 +182,13 @@ export const metaOps = (c) => {
|
|
|
183
182
|
const length = displayLength(id);
|
|
184
183
|
if (length > 0)
|
|
185
184
|
writes.push({ op: 'deleteText', id, offset: 0, length });
|
|
186
|
-
|
|
187
|
-
for (const item of content) {
|
|
188
|
-
if (item.kind === 'inline')
|
|
189
|
-
writes.push({ op: 'insertInline', id, offset: at++, atom: item });
|
|
190
|
-
else if (item.text !== '') {
|
|
191
|
-
writes.push({ op: 'insertText', id, offset: at, text: item.text, marks: item.marks });
|
|
192
|
-
at += item.text.length;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
185
|
+
writeContent(writes, id, 0, content);
|
|
195
186
|
}
|
|
196
187
|
if (children !== undefined) {
|
|
197
188
|
for (const kid of childrenIds(id))
|
|
198
189
|
writes.push(remove(kid));
|
|
199
190
|
// Every current child is deleted, so the new ones rank from an empty list.
|
|
200
|
-
const ranks =
|
|
191
|
+
const ranks = ranksAt([], 0, children.length, doc.clientID, randOf(doc));
|
|
201
192
|
if (children.length > 0)
|
|
202
193
|
writes.push({ op: 'insertBlocks', parent: id, index: 0, specs: children, ranks });
|
|
203
194
|
}
|
|
@@ -206,8 +197,6 @@ export const metaOps = (c) => {
|
|
|
206
197
|
return {
|
|
207
198
|
dataSteps,
|
|
208
199
|
replaceData,
|
|
209
|
-
leafSets,
|
|
210
|
-
retypeSteps,
|
|
211
200
|
setBlockType,
|
|
212
201
|
patchData,
|
|
213
202
|
setBlock
|