@voithos-labs/aragonite 0.10.4 → 0.10.7
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 +2 -2
- package/dist/a11y-strings.d.ts +11 -5
- package/dist/a11y-strings.js +60 -5
- package/dist/action-contracts.d.ts +242 -155
- package/dist/action-contracts.js +2 -2
- package/dist/active-editor.d.ts +3 -3
- package/dist/active-editor.js +8 -9
- package/dist/ambient/ambient-dom.d.ts +2 -5
- package/dist/ambient/ambient-dom.js +16 -62
- package/dist/assert.js +6 -5
- package/dist/block-component.d.ts +135 -109
- package/dist/block-component.js +30 -22
- package/dist/block-id.d.ts +6 -10
- package/dist/block-id.js +25 -14
- package/dist/bounded-memo.d.ts +5 -5
- package/dist/bounded-memo.js +6 -6
- package/dist/components/BlockDragHandle.svelte +12 -21
- package/dist/components/BlockHost.svelte +56 -134
- package/dist/components/BlockList.svelte +22 -19
- package/dist/components/DecorationOverlay.svelte +9 -10
- package/dist/components/DecorationOverlay.svelte.d.ts +2 -2
- package/dist/components/Editor.svelte +603 -1126
- package/dist/components/Editor.svelte.d.ts +9 -20
- package/dist/components/GapCaret.svelte +26 -59
- package/dist/components/SelectionOverlay.svelte +26 -51
- package/dist/components/SelectionOverlay.svelte.d.ts +5 -3
- package/dist/components/TailInsert.svelte +8 -55
- package/dist/components/TailInsert.svelte.d.ts +4 -6
- package/dist/components/block-content-selector.d.ts +11 -11
- package/dist/components/block-content-selector.js +11 -11
- package/dist/components/block-el-lookup.d.ts +6 -0
- package/dist/components/block-el-lookup.js +27 -0
- package/dist/components/blocks/BlockquoteBlock.svelte +3 -3
- package/dist/components/blocks/ThematicBreakBlock.svelte +22 -63
- package/dist/components/blocks/ThematicBreakBlock.svelte.d.ts +0 -2
- package/dist/components/blocks/code/CodeBlock.svelte +255 -276
- package/dist/components/blocks/code/CodeBlock.svelte.d.ts +2 -3
- package/dist/components/blocks/code/CodeBlockRail.svelte +72 -87
- package/dist/components/blocks/code/CodeBlockRail.svelte.d.ts +9 -4
- package/dist/components/blocks/code/code-beforeinput.d.ts +1 -1
- package/dist/components/blocks/code/code-bootstrap.d.ts +3 -5
- package/dist/components/blocks/code/code-bootstrap.js +29 -34
- package/dist/components/blocks/code/code-context-actions.js +5 -4
- package/dist/components/blocks/code/code-enter.js +2 -2
- package/dist/components/blocks/code/code-fence-boundary.d.ts +29 -46
- package/dist/components/blocks/code/code-fence-boundary.js +40 -66
- package/dist/components/blocks/code/code-fence-exit.d.ts +6 -11
- package/dist/components/blocks/code/code-fence-exit.js +24 -25
- package/dist/components/blocks/code/code-indent.d.ts +2 -2
- package/dist/components/blocks/code/code-indent.js +4 -7
- package/dist/components/blocks/code/code-languages.d.ts +16 -12
- package/dist/components/blocks/code/code-languages.js +57 -39
- package/dist/components/blocks/code/code-paste-surface.d.ts +3 -2
- package/dist/components/blocks/code/code-paste-surface.js +9 -18
- package/dist/components/blocks/code/code-renderer.d.ts +21 -5
- package/dist/components/blocks/code/code-renderer.js +90 -125
- package/dist/components/blocks/directive/DirectiveContainerBlock.svelte +5 -8
- package/dist/components/blocks/directive/activate-directives.d.ts +4 -4
- package/dist/components/blocks/directive/activate-directives.js +18 -13
- package/dist/components/blocks/editable-leaf.d.ts +50 -74
- package/dist/components/blocks/editable-leaf.js +141 -203
- package/dist/components/blocks/editable-surface.d.ts +96 -100
- package/dist/components/blocks/editable-surface.js +101 -109
- package/dist/components/blocks/list/ListBlock.svelte +45 -90
- package/dist/components/blocks/list/ListItemBlock.svelte +93 -147
- package/dist/components/blocks/list/ListItemBlock.svelte.d.ts +1 -0
- package/dist/components/blocks/list/task-checkbox.d.ts +5 -2
- package/dist/components/blocks/list/task-checkbox.js +12 -7
- package/dist/components/blocks/plain-text-backend.d.ts +4 -20
- package/dist/components/blocks/plain-text-backend.js +9 -43
- package/dist/components/blocks/surface-wiring.svelte.d.ts +8 -9
- package/dist/components/blocks/surface-wiring.svelte.js +15 -34
- package/dist/components/blocks/table/TableActionMenu.svelte +19 -18
- package/dist/components/blocks/table/TableActionMenu.svelte.d.ts +3 -1
- package/dist/components/blocks/table/TableBlock.svelte +100 -165
- package/dist/components/blocks/table/TableBlock.svelte.d.ts +3 -3
- package/dist/components/blocks/table/TableCellBlock.svelte +307 -385
- package/dist/components/blocks/table/TableCellBlock.svelte.d.ts +1 -0
- package/dist/components/blocks/table/TableRowBlock.svelte +60 -104
- package/dist/components/blocks/table/TableRowBlock.svelte.d.ts +0 -1
- package/dist/components/blocks/table/cell-keydown-plan.d.ts +4 -9
- package/dist/components/blocks/table/cell-keydown-plan.js +8 -12
- package/dist/components/blocks/table/cell-pointer.d.ts +18 -23
- package/dist/components/blocks/table/cell-pointer.js +49 -71
- package/dist/components/blocks/table/cell-render.d.ts +24 -29
- package/dist/components/blocks/table/cell-render.js +29 -31
- package/dist/components/blocks/table/selected-cells.d.ts +7 -7
- package/dist/components/blocks/table/selected-cells.js +9 -13
- package/dist/components/blocks/table/table-caret-at-point.d.ts +4 -4
- package/dist/components/blocks/table/table-caret-at-point.js +5 -5
- package/dist/components/blocks/table/table-cell-paste.d.ts +5 -11
- package/dist/components/blocks/table/table-cell-paste.js +27 -43
- package/dist/components/blocks/table/table-drag-hit-test.js +2 -1
- package/dist/components/blocks/table/table-menu-model.d.ts +4 -8
- package/dist/components/blocks/table/table-menu-model.js +6 -10
- package/dist/components/blocks/table/table-navigation.js +2 -2
- package/dist/components/blocks/text/TextEditableBlock.svelte +392 -310
- package/dist/components/blocks/text/TextEditableBlock.svelte.d.ts +2 -1
- package/dist/components/blocks/text/auto-pair-record.d.ts +23 -0
- package/dist/components/blocks/text/auto-pair-record.js +51 -0
- package/dist/components/blocks/text/click-snap-guard.d.ts +8 -6
- package/dist/components/blocks/text/click-snap-guard.js +10 -7
- package/dist/components/blocks/text/composition-seat.d.ts +17 -14
- package/dist/components/blocks/text/composition-seat.js +11 -11
- package/dist/components/blocks/text/construct-edge-delete.d.ts +20 -20
- package/dist/components/blocks/text/construct-edge-delete.js +50 -65
- package/dist/components/blocks/text/construct-reveal.d.ts +16 -21
- package/dist/components/blocks/text/construct-reveal.js +13 -14
- package/dist/components/blocks/text/delimiter-autopair.d.ts +51 -34
- package/dist/components/blocks/text/delimiter-autopair.js +87 -103
- package/dist/components/blocks/text/edge-policy-dispatch.d.ts +44 -46
- package/dist/components/blocks/text/edge-policy-dispatch.js +150 -181
- package/dist/components/blocks/text/edge-seat.d.ts +17 -26
- package/dist/components/blocks/text/edge-seat.js +43 -70
- package/dist/components/blocks/text/link-at-point.d.ts +9 -9
- package/dist/components/blocks/text/link-at-point.js +12 -15
- package/dist/components/blocks/text/live-join-seam.d.ts +6 -9
- package/dist/components/blocks/text/live-join-seam.js +75 -112
- package/dist/components/blocks/text/live-selection-edit.d.ts +14 -43
- package/dist/components/blocks/text/live-selection-edit.js +32 -108
- package/dist/components/blocks/text/live-split-rebalance.d.ts +9 -13
- package/dist/components/blocks/text/live-split-rebalance.js +50 -67
- package/dist/components/blocks/text/marker-completion.d.ts +7 -12
- package/dist/components/blocks/text/marker-completion.js +17 -10
- package/dist/components/blocks/text/pending-mark-insert.d.ts +11 -18
- package/dist/components/blocks/text/pending-mark-insert.js +30 -49
- package/dist/components/blocks/text/screen-diff.d.ts +5 -15
- package/dist/components/blocks/text/screen-diff.js +5 -19
- package/dist/components/blocks/text/text-clipboard.d.ts +23 -32
- package/dist/components/blocks/text/text-clipboard.js +27 -32
- package/dist/components/blocks/text/text-keydown.d.ts +20 -30
- package/dist/components/blocks/text/text-keydown.js +54 -51
- package/dist/components/blocks/text/text-render.d.ts +25 -35
- package/dist/components/blocks/text/text-render.js +82 -61
- package/dist/components/blocks/text/widget-adjacency.d.ts +9 -9
- package/dist/components/blocks/text/widget-adjacency.js +17 -17
- package/dist/components/blocks/text/widget-interaction.d.ts +67 -43
- package/dist/components/blocks/text/widget-interaction.js +212 -199
- package/dist/components/blocks/widget-portal.d.ts +20 -29
- package/dist/components/blocks/widget-portal.js +16 -14
- package/dist/components/built-in-blocks.d.ts +3 -4
- package/dist/components/built-in-blocks.js +17 -18
- package/dist/components/drag-handle.d.ts +12 -35
- package/dist/components/drag-handle.js +22 -68
- package/dist/components/editor-built-ins.d.ts +1 -0
- package/dist/components/editor-built-ins.js +16 -0
- package/dist/components/editor-root-clipboard.d.ts +6 -6
- package/dist/components/editor-root-clipboard.js +16 -27
- package/dist/components/editor-root-document-swap.d.ts +49 -0
- package/dist/components/editor-root-document-swap.js +54 -0
- package/dist/components/editor-root-focus.d.ts +5 -4
- package/dist/components/editor-root-focus.js +51 -22
- package/dist/components/editor-root-focused-surface.d.ts +35 -0
- package/dist/components/editor-root-focused-surface.js +65 -0
- package/dist/components/editor-root-geometry.d.ts +15 -24
- package/dist/components/editor-root-geometry.js +27 -31
- package/dist/components/editor-root-gestures.d.ts +39 -0
- package/dist/components/editor-root-gestures.js +189 -0
- package/dist/components/editor-root-keydown.d.ts +10 -25
- package/dist/components/editor-root-keydown.js +19 -43
- package/dist/components/editor-root-listeners.d.ts +22 -24
- package/dist/components/editor-root-listeners.js +49 -24
- package/dist/components/editor-root-menus.d.ts +51 -0
- package/dist/components/editor-root-menus.js +147 -0
- package/dist/components/editor-root-mode-flip.d.ts +16 -11
- package/dist/components/editor-root-mode-flip.js +36 -34
- package/dist/components/editor-root-scroll-host.d.ts +22 -0
- package/dist/components/editor-root-scroll-host.js +34 -0
- package/dist/components/editor-root-test-surface.d.ts +48 -0
- package/dist/components/editor-root-test-surface.js +6 -0
- package/dist/components/image/ImageOverlayHost.svelte +44 -35
- package/dist/components/image/ImageOverlayHost.svelte.d.ts +5 -6
- package/dist/components/image/ImageProperties.svelte +37 -41
- package/dist/components/image/ImageProperties.svelte.d.ts +9 -4
- package/dist/components/image/ImageResizeHandles.svelte +14 -26
- package/dist/components/image/image-crop.d.ts +5 -11
- package/dist/components/image/image-crop.js +5 -11
- package/dist/components/image/image-edit-commit.d.ts +19 -16
- package/dist/components/image/image-edit-commit.js +74 -38
- package/dist/components/image/image-resize.d.ts +2 -5
- package/dist/components/image/image-resize.js +3 -6
- package/dist/components/image/image-widget-editing.d.ts +3 -3
- package/dist/components/image/image-widget-editing.js +9 -9
- package/dist/components/image/widget-dom.d.ts +2 -3
- package/dist/components/image/widget-dom.js +19 -24
- package/dist/components/image/widget-selection-state.svelte.d.ts +10 -11
- package/dist/components/image/widget-selection-state.svelte.js +26 -19
- package/dist/components/kind-cue.svelte.d.ts +21 -0
- package/dist/components/kind-cue.svelte.js +35 -0
- package/dist/components/link-card/LinkCard.svelte +115 -64
- package/dist/components/link-card/LinkCard.svelte.d.ts +7 -5
- package/dist/components/link-card/LinkCardHost.svelte +42 -33
- package/dist/components/link-card/LinkCardHost.svelte.d.ts +10 -8
- package/dist/components/link-card/link-card-commit.d.ts +16 -19
- package/dist/components/link-card/link-card-commit.js +21 -30
- package/dist/components/link-card/link-card-entry.d.ts +13 -23
- package/dist/components/link-card/link-card-entry.js +16 -24
- package/dist/components/link-card/link-card-state.svelte.d.ts +17 -21
- package/dist/components/link-card/link-card-state.svelte.js +2 -2
- package/dist/components/lrd-map-gate.d.ts +4 -11
- package/dist/components/lrd-map-gate.js +5 -11
- package/dist/components/menu/BlockMenu.svelte +20 -81
- package/dist/components/menu/BlockMenu.svelte.d.ts +11 -9
- package/dist/components/menu/InlineMenuHost.svelte +191 -0
- package/dist/components/menu/InlineMenuHost.svelte.d.ts +13 -0
- package/dist/components/menu/MenuIcon.svelte +3 -103
- package/dist/components/menu/MenuIcon.svelte.d.ts +2 -44
- package/dist/components/menu/SelectionToolbar.svelte +30 -35
- package/dist/components/menu/SelectionToolbar.svelte.d.ts +3 -5
- package/dist/components/menu/clipboard-actions.d.ts +3 -4
- package/dist/components/menu/clipboard-actions.js +3 -4
- package/dist/components/menu/default-context-actions.d.ts +4 -13
- package/dist/components/menu/default-context-actions.js +49 -67
- package/dist/components/menu/flyout-placement.d.ts +2 -2
- package/dist/components/menu/flyout-placement.js +2 -2
- package/dist/components/menu/menu-presence.svelte.d.ts +12 -0
- package/dist/components/menu/menu-presence.svelte.js +19 -0
- package/dist/components/paste-image-arm.d.ts +6 -11
- package/dist/components/paste-image-arm.js +11 -18
- package/dist/components/portal.d.ts +2 -5
- package/dist/components/portal.js +4 -7
- package/dist/core/directive/activate.d.ts +4 -5
- package/dist/core/directive/activate.js +8 -9
- package/dist/core/directive/container-opener.js +13 -12
- package/dist/core/directive/grammar.d.ts +2 -5
- package/dist/core/directive/grammar.js +10 -10
- package/dist/core/directive/kinds.d.ts +4 -7
- package/dist/core/directive/kinds.js +14 -16
- package/dist/core/directive/registry.d.ts +12 -9
- package/dist/core/directive/registry.js +19 -20
- package/dist/core/directive/text-recognizer.d.ts +3 -2
- package/dist/core/directive/text-recognizer.js +5 -9
- package/dist/core/escapable.d.ts +1 -5
- package/dist/core/escapable.js +1 -5
- package/dist/core/inline/backticks.d.ts +3 -4
- package/dist/core/inline/backticks.js +3 -4
- package/dist/core/inline/character-refs.js +2 -1
- package/dist/core/inline/destination-bytes.d.ts +6 -3
- package/dist/core/inline/destination-bytes.js +50 -8
- package/dist/core/inline/entity-widget.d.ts +4 -3
- package/dist/core/inline/entity-widget.js +6 -6
- package/dist/core/inline/format-toggle.d.ts +22 -28
- package/dist/core/inline/format-toggle.js +97 -129
- package/dist/core/inline/html-entities.d.ts +2 -3
- package/dist/core/inline/html-entities.js +2 -3
- package/dist/core/inline/html-tag-grammar.js +6 -2
- package/dist/core/inline/image-dimensions.d.ts +2 -0
- package/dist/core/inline/image-dimensions.js +19 -2
- package/dist/core/inline/image-source-bytes.d.ts +11 -0
- package/dist/core/inline/image-source-bytes.js +71 -0
- package/dist/core/inline/index.d.ts +28 -21
- package/dist/core/inline/index.js +56 -34
- package/dist/core/inline/inline-cache.d.ts +12 -15
- package/dist/core/inline/inline-cache.js +11 -14
- package/dist/core/inline/inline-widgets.d.ts +54 -75
- package/dist/core/inline/inline-widgets.js +54 -62
- package/dist/core/inline/link-destination.d.ts +31 -0
- package/dist/core/inline/link-destination.js +129 -0
- package/dist/core/inline/link-reference-resolver.d.ts +8 -6
- package/dist/core/inline/link-reference-resolver.js +10 -6
- package/dist/core/inline/link-source-bytes.d.ts +31 -0
- package/dist/{components/blocks/text → core/inline}/link-source-bytes.js +43 -54
- package/dist/core/inline/live-edit/read-back.d.ts +29 -0
- package/dist/core/inline/live-edit/read-back.js +50 -0
- package/dist/core/inline/picture.d.ts +10 -0
- package/dist/core/inline/picture.js +40 -0
- package/dist/core/inline/scan/autolinks.d.ts +7 -8
- package/dist/core/inline/scan/autolinks.js +80 -59
- package/dist/core/inline/scan/brackets.d.ts +2 -2
- package/dist/core/inline/scan/brackets.js +6 -103
- package/dist/core/inline/scan/code-spans.d.ts +4 -0
- package/dist/core/inline/scan/code-spans.js +8 -0
- package/dist/core/inline/scan/emphasis.js +10 -14
- package/dist/core/inline/scan/index.d.ts +3 -1
- package/dist/core/inline/scan/index.js +32 -33
- package/dist/core/inline/scan/plugin-syntax.d.ts +28 -36
- package/dist/core/inline/scan/plugin-syntax.js +75 -89
- package/dist/core/inline/scan/scan-state.d.ts +2 -0
- package/dist/core/inline/scan/scan-state.js +1 -0
- package/dist/core/inline/scan/simple-nodes.d.ts +2 -5
- package/dist/core/inline/scan/simple-nodes.js +2 -5
- package/dist/core/inline/scan/triggers.d.ts +17 -0
- package/dist/core/inline/scan/triggers.js +26 -0
- package/dist/core/inline/scan/url.js +8 -10
- package/dist/core/inline/transparency.d.ts +2 -1
- package/dist/core/inline/transparency.js +31 -15
- package/dist/core/inline/visibility.d.ts +30 -49
- package/dist/core/inline/visibility.js +31 -49
- package/dist/core/inline/walk.d.ts +4 -10
- package/dist/core/inline/walk.js +4 -10
- package/dist/core/inline-render.d.ts +22 -27
- package/dist/core/inline-render.js +51 -60
- package/dist/core/lines.d.ts +67 -26
- package/dist/core/lines.js +164 -33
- package/dist/core/metadata-parity.d.ts +9 -0
- package/dist/core/metadata-parity.js +25 -0
- package/dist/core/node-views.d.ts +7 -6
- package/dist/core/node-views.js +5 -5
- package/dist/core/nodes.d.ts +34 -44
- package/dist/core/nodes.js +4 -12
- package/dist/core/parser.d.ts +27 -34
- package/dist/core/parser.js +53 -67
- package/dist/core/parsers/blockquote.d.ts +5 -8
- package/dist/core/parsers/blockquote.js +11 -10
- package/dist/core/parsers/built-in-openers.d.ts +2 -5
- package/dist/core/parsers/built-in-openers.js +5 -8
- package/dist/core/parsers/fence-syntax.d.ts +36 -7
- package/dist/core/parsers/fence-syntax.js +61 -11
- package/dist/core/parsers/fenced-code.d.ts +16 -0
- package/dist/core/parsers/fenced-code.js +16 -15
- package/dist/core/parsers/heading.d.ts +19 -2
- package/dist/core/parsers/heading.js +50 -2
- package/dist/core/parsers/html-block.d.ts +3 -6
- package/dist/core/parsers/html-block.js +10 -11
- package/dist/core/parsers/indented-code.d.ts +1 -1
- package/dist/core/parsers/indented-code.js +2 -8
- package/dist/core/parsers/link-reference.d.ts +5 -3
- package/dist/core/parsers/link-reference.js +116 -120
- package/dist/core/parsers/list.d.ts +12 -5
- package/dist/core/parsers/list.js +53 -36
- package/dist/core/parsers/paragraph.d.ts +3 -3
- package/dist/core/parsers/paragraph.js +14 -5
- package/dist/core/parsers/table-completion.d.ts +2 -5
- package/dist/core/parsers/table-completion.js +7 -10
- package/dist/core/parsers/table.d.ts +8 -8
- package/dist/core/parsers/table.js +23 -26
- package/dist/core/parsers/thematic-break.js +15 -14
- package/dist/core/paths.d.ts +13 -0
- package/dist/core/paths.js +31 -0
- package/dist/core/terminator-escalation.d.ts +0 -7
- package/dist/core/terminator-escalation.js +5 -8
- package/dist/core/url-policy.d.ts +2 -5
- package/dist/core/url-policy.js +8 -12
- package/dist/cursor/caret-memory.d.ts +34 -0
- package/dist/cursor/caret-memory.js +82 -0
- package/dist/cursor/coordinate-spaces.d.ts +26 -19
- package/dist/cursor/coordinate-spaces.js +32 -20
- package/dist/cursor/dom-walk.d.ts +7 -13
- package/dist/cursor/dom-walk.js +7 -13
- package/dist/cursor/edge-affinity.d.ts +7 -35
- package/dist/cursor/edge-affinity.js +13 -44
- package/dist/cursor/focused-caret.d.ts +6 -8
- package/dist/cursor/focused-caret.js +7 -16
- package/dist/cursor/height-model.d.ts +3 -3
- package/dist/cursor/height-model.js +5 -5
- package/dist/cursor/height-oracle.d.ts +10 -6
- package/dist/cursor/height-oracle.js +26 -74
- package/dist/cursor/observe-resize.d.ts +13 -0
- package/dist/cursor/observe-resize.js +43 -0
- package/dist/cursor/overlay-rects.d.ts +2 -5
- package/dist/cursor/overlay-rects.js +2 -5
- package/dist/cursor/overlay-remeasure.d.ts +6 -7
- package/dist/cursor/overlay-remeasure.js +10 -14
- package/dist/cursor/pending-marks.d.ts +7 -9
- package/dist/cursor/pending-marks.js +6 -27
- package/dist/cursor/point-offset.d.ts +16 -10
- package/dist/cursor/point-offset.js +60 -25
- package/dist/cursor/reveal-source.d.ts +7 -11
- package/dist/cursor/reveal-source.js +10 -18
- package/dist/cursor/scroll-ancestors.d.ts +9 -20
- package/dist/cursor/scroll-ancestors.js +14 -26
- package/dist/cursor/scroll-owner.d.ts +92 -0
- package/dist/cursor/scroll-owner.js +283 -0
- package/dist/cursor/scrollport.d.ts +14 -15
- package/dist/cursor/scrollport.js +7 -13
- package/dist/cursor/sticky-column.d.ts +6 -29
- package/dist/cursor/sticky-column.js +6 -49
- package/dist/cursor/sticky-measure.d.ts +14 -9
- package/dist/cursor/sticky-measure.js +99 -49
- package/dist/cursor/surface-backend.d.ts +41 -0
- package/dist/cursor/surface-backend.js +78 -0
- package/dist/cursor/typography-estimates.d.ts +3 -3
- package/dist/cursor/typography-estimates.js +3 -3
- package/dist/cursor/visual-lines.d.ts +25 -14
- package/dist/cursor/visual-lines.js +45 -46
- package/dist/cursor/widget-edge-snap.d.ts +10 -15
- package/dist/cursor/widget-edge-snap.js +13 -12
- package/dist/cursor/widget-offset.d.ts +110 -104
- package/dist/cursor/widget-offset.js +344 -179
- package/dist/debug/diagnostics-report.d.ts +6 -6
- package/dist/debug/diagnostics-report.js +5 -5
- package/dist/debug/dump-tree.js +2 -2
- package/dist/debug/editor-diagnostics.d.ts +15 -0
- package/dist/debug/editor-diagnostics.js +33 -0
- package/dist/debug/inspect.d.ts +2 -2
- package/dist/debug/inspect.js +4 -4
- package/dist/debug/interaction-trace.d.ts +14 -15
- package/dist/debug/interaction-trace.js +19 -20
- package/dist/debug/operations-log.d.ts +1 -1
- package/dist/debug/operations-log.js +1 -1
- package/dist/decorations/buckets.d.ts +6 -12
- package/dist/decorations/buckets.js +4 -11
- package/dist/decorations/decoration-state.svelte.d.ts +2 -3
- package/dist/decorations/decoration-state.svelte.js +24 -26
- package/dist/decorations/island-dom.d.ts +10 -18
- package/dist/decorations/island-dom.js +25 -50
- package/dist/decorations/reserved-attrs.d.ts +6 -8
- package/dist/decorations/reserved-attrs.js +30 -17
- package/dist/decorations/types.d.ts +6 -7
- package/dist/decorations/types.js +2 -1
- package/dist/decorations/use-block-decorations.svelte.d.ts +19 -0
- package/dist/decorations/use-block-decorations.svelte.js +71 -0
- package/dist/decorations/widget-dom.d.ts +3 -3
- package/dist/decorations/widget-dom.js +5 -5
- package/dist/dev-warn.d.ts +5 -2
- package/dist/dev-warn.js +16 -4
- package/dist/editor-actions/ancestry-folds.d.ts +9 -14
- package/dist/editor-actions/ancestry-folds.js +13 -18
- package/dist/editor-actions/block-edit-core.d.ts +49 -22
- package/dist/editor-actions/block-edit-core.js +279 -151
- package/dist/editor-actions/block-edit-scope.d.ts +63 -50
- package/dist/editor-actions/block-edit-scope.js +100 -48
- package/dist/editor-actions/block-edit.d.ts +2 -3
- package/dist/editor-actions/block-edit.js +14 -90
- package/dist/editor-actions/commit/history.d.ts +4 -4
- package/dist/editor-actions/commit/history.js +33 -34
- package/dist/editor-actions/commit/reading-write-gate.d.ts +18 -0
- package/dist/editor-actions/commit/reading-write-gate.js +56 -0
- package/dist/editor-actions/commit/text-batch.d.ts +7 -11
- package/dist/editor-actions/commit/text-batch.js +6 -7
- package/dist/editor-actions/commit/undo-controller.d.ts +6 -4
- package/dist/editor-actions/commit/undo-controller.js +346 -216
- package/dist/editor-actions/container-block-component.d.ts +32 -51
- package/dist/editor-actions/container-block-component.js +66 -92
- package/dist/editor-actions/container-edit.d.ts +4 -2
- package/dist/editor-actions/container-edit.js +14 -44
- package/dist/editor-actions/container-exit-overrides.d.ts +6 -4
- package/dist/editor-actions/container-exit-overrides.js +19 -21
- package/dist/editor-actions/deps.d.ts +25 -32
- package/dist/editor-actions/enter-completion.d.ts +12 -15
- package/dist/editor-actions/enter-completion.js +49 -51
- package/dist/editor-actions/focus/focus-dispatch.d.ts +24 -25
- package/dist/editor-actions/focus/focus-dispatch.js +28 -50
- package/dist/editor-actions/focus/focus-landing.d.ts +8 -11
- package/dist/editor-actions/focus/focus-landing.js +15 -14
- package/dist/editor-actions/focus/focus.d.ts +3 -2
- package/dist/editor-actions/focus/focus.js +42 -59
- package/dist/editor-actions/index.d.ts +4 -3
- package/dist/editor-actions/index.js +5 -4
- package/dist/editor-actions/inline-range-commit.d.ts +18 -16
- package/dist/editor-actions/inline-range-commit.js +45 -54
- package/dist/editor-actions/leaf-write.d.ts +11 -0
- package/dist/editor-actions/leaf-write.js +102 -0
- package/dist/editor-actions/list-context.d.ts +9 -10
- package/dist/editor-actions/list-context.js +115 -110
- package/dist/editor-actions/list-overrides.d.ts +13 -5
- package/dist/editor-actions/list-overrides.js +36 -12
- package/dist/editor-actions/merge-fallback.d.ts +10 -16
- package/dist/editor-actions/merge-fallback.js +11 -22
- package/dist/editor-actions/nested/container-actions.d.ts +37 -0
- package/dist/editor-actions/nested/container-actions.js +42 -0
- package/dist/editor-actions/nested/emptied-container.d.ts +5 -0
- package/dist/editor-actions/nested/emptied-container.js +5 -0
- package/dist/editor-actions/nested/nested-actions.d.ts +22 -25
- package/dist/editor-actions/nested/nested-actions.js +17 -15
- package/dist/editor-actions/nested/nested-block-edit.d.ts +3 -4
- package/dist/editor-actions/nested/nested-block-edit.js +40 -134
- package/dist/editor-actions/nested/nested-focus.d.ts +2 -3
- package/dist/editor-actions/nested/nested-focus.js +33 -21
- package/dist/editor-actions/paste-coordinator.d.ts +3 -2
- package/dist/editor-actions/paste-coordinator.js +17 -13
- package/dist/editor-actions/plugin/chrome-leaf.d.ts +11 -9
- package/dist/editor-actions/plugin/chrome-leaf.js +14 -13
- package/dist/editor-actions/plugin/container.d.ts +54 -82
- package/dist/editor-actions/plugin/container.js +105 -188
- package/dist/editor-actions/plugin/directive-container.d.ts +4 -4
- package/dist/editor-actions/plugin/directive-container.js +7 -8
- package/dist/editor-actions/reorder-action.d.ts +7 -12
- package/dist/editor-actions/reorder-action.js +32 -48
- package/dist/editor-actions/reorder-drag.d.ts +12 -8
- package/dist/editor-actions/reorder-drag.js +45 -41
- package/dist/editor-actions/replacement-focus.d.ts +13 -21
- package/dist/editor-actions/replacement-focus.js +32 -33
- package/dist/editor-actions/search-replace.js +71 -67
- package/dist/editor-actions/stored-caret.d.ts +7 -0
- package/dist/editor-actions/stored-caret.js +10 -0
- package/dist/editor-actions/table-context.d.ts +9 -11
- package/dist/editor-actions/table-context.js +70 -93
- package/dist/editor-actions/unwrap-strategies.d.ts +4 -5
- package/dist/editor-actions/unwrap-strategies.js +52 -63
- package/dist/editor-actions/whole-block-focus-surface.d.ts +19 -28
- package/dist/editor-actions/whole-block-focus-surface.js +43 -53
- package/dist/editor-events.d.ts +25 -29
- package/dist/editor-events.js +17 -28
- package/dist/editor-keys.d.ts +96 -104
- package/dist/editor-keys.js +11 -24
- package/dist/editor-props.d.ts +88 -71
- package/dist/editor-rects.d.ts +23 -34
- package/dist/editor-rects.js +9 -77
- package/dist/env.d.ts +6 -4
- package/dist/env.js +8 -4
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/inline-menu/inline-menu-session.d.ts +37 -0
- package/dist/inline-menu/inline-menu-session.js +98 -0
- package/dist/inline-menu/inline-menu-state.svelte.d.ts +63 -0
- package/dist/inline-menu/inline-menu-state.svelte.js +409 -0
- package/dist/inline-menu/types.d.ts +77 -0
- package/dist/inline-menu/types.js +7 -0
- package/dist/invariants/child-id-parity.d.ts +23 -0
- package/dist/invariants/child-id-parity.js +39 -0
- package/dist/invariants/commit-paths.d.ts +4 -4
- package/dist/invariants/commit-paths.js +4 -4
- package/dist/invariants/commit-scope.d.ts +4 -4
- package/dist/invariants/commit-scope.js +9 -8
- package/dist/invariants/context-keys.d.ts +2 -5
- package/dist/invariants/context-keys.js +3 -6
- package/dist/invariants/descriptor.d.ts +2 -6
- package/dist/invariants/descriptor.js +2 -6
- package/dist/invariants/inline-transitions.d.ts +9 -16
- package/dist/invariants/inline-transitions.js +10 -18
- package/dist/invariants/install.d.ts +18 -27
- package/dist/invariants/install.js +29 -30
- package/dist/invariants/keeps-a-block.d.ts +7 -0
- package/dist/invariants/keeps-a-block.js +14 -0
- package/dist/invariants/landable-caret.d.ts +5 -7
- package/dist/invariants/landable-caret.js +8 -11
- package/dist/invariants/landing-focus-scroll.d.ts +7 -0
- package/dist/invariants/landing-focus-scroll.js +13 -0
- package/dist/invariants/landing-value.d.ts +13 -0
- package/dist/invariants/landing-value.js +27 -0
- package/dist/invariants/marker-css-parity.d.ts +5 -6
- package/dist/invariants/marker-css-parity.js +11 -12
- package/dist/invariants/measures-in-own-list.d.ts +6 -0
- package/dist/invariants/measures-in-own-list.js +13 -0
- package/dist/invariants/node-shape.d.ts +18 -37
- package/dist/invariants/node-shape.js +123 -79
- package/dist/invariants/open-tail.d.ts +7 -0
- package/dist/invariants/open-tail.js +45 -0
- package/dist/invariants/placement-ends-widget.d.ts +8 -0
- package/dist/invariants/placement-ends-widget.js +13 -0
- package/dist/invariants/registry.d.ts +27 -66
- package/dist/invariants/registry.js +61 -137
- package/dist/invariants/render-fidelity.d.ts +4 -4
- package/dist/invariants/render-fidelity.js +5 -5
- package/dist/invariants/selection-endpoints.d.ts +6 -7
- package/dist/invariants/selection-endpoints.js +18 -16
- package/dist/invariants/single-node-sink.d.ts +4 -5
- package/dist/invariants/single-node-sink.js +4 -5
- package/dist/invariants/snapshot-integrity.d.ts +5 -6
- package/dist/invariants/snapshot-integrity.js +1 -1
- package/dist/invariants/structural-descriptor.d.ts +6 -15
- package/dist/invariants/structural-descriptor.js +6 -15
- package/dist/menu-icons.d.ts +47 -0
- package/dist/menu-icons.js +113 -0
- package/dist/perf/instruments.d.ts +20 -5
- package/dist/perf/instruments.js +35 -15
- package/dist/perf/use-mount-gauge.svelte.js +4 -4
- package/dist/plugin.d.ts +37 -8
- package/dist/plugin.js +100 -77
- package/dist/plugins/admonitions/AdmonitionBlock.svelte +14 -11
- package/dist/plugins/admonitions/admonition-kind.js +12 -10
- package/dist/plugins/admonitions/convert-document.d.ts +5 -5
- package/dist/plugins/admonitions/convert-document.js +8 -7
- package/dist/plugins/admonitions/gh-alert.d.ts +8 -1
- package/dist/plugins/admonitions/gh-alert.js +21 -22
- package/dist/plugins/admonitions/github-alert-kind.d.ts +5 -7
- package/dist/plugins/admonitions/github-alert-kind.js +28 -37
- package/dist/plugins/admonitions/index.js +2 -2
- package/dist/plugins/admonitions/kinds.d.ts +1 -1
- package/dist/plugins/admonitions/register.js +11 -2
- package/dist/plugins/details/DetailsBlock.svelte +20 -20
- package/dist/plugins/details/details-disclosure.svelte.d.ts +5 -6
- package/dist/plugins/details/details-disclosure.svelte.js +6 -7
- package/dist/plugins/details/details-kind.d.ts +6 -7
- package/dist/plugins/details/details-kind.js +44 -59
- package/dist/plugins/emoji/emoji-recognizer.d.ts +4 -7
- package/dist/plugins/emoji/emoji-recognizer.js +7 -14
- package/dist/plugins/footnotes/FootnoteDefinition.svelte +33 -16
- package/dist/plugins/footnotes/FootnoteReference.svelte +39 -19
- package/dist/plugins/footnotes/constants.d.ts +2 -0
- package/dist/plugins/footnotes/constants.js +3 -0
- package/dist/plugins/footnotes/footnote-definition.d.ts +8 -6
- package/dist/plugins/footnotes/footnote-definition.js +69 -45
- package/dist/plugins/footnotes/footnote-lookup.d.ts +3 -3
- package/dist/plugins/footnotes/footnote-lookup.js +14 -26
- package/dist/plugins/footnotes/footnote-numbering.d.ts +11 -11
- package/dist/plugins/footnotes/footnote-numbering.js +22 -31
- package/dist/plugins/footnotes/footnote-reference.d.ts +4 -4
- package/dist/plugins/footnotes/footnote-reference.js +8 -13
- package/dist/plugins/footnotes/index.js +2 -3
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.d.ts +5 -8
- package/dist/plugins/highlight-occurrences/highlight-occurrences-plugin.js +8 -3
- package/dist/plugins/highlight-occurrences/occurrence-source.d.ts +10 -12
- package/dist/plugins/highlight-occurrences/occurrence-source.js +21 -18
- package/dist/plugins/highlight-occurrences/occurrences.d.ts +11 -11
- package/dist/plugins/highlight-occurrences/occurrences.js +14 -36
- package/dist/plugins/highlight-occurrences/word-char.d.ts +1 -0
- package/dist/plugins/highlight-occurrences/word-char.js +4 -0
- package/dist/plugins/latex/BlockMath.svelte +58 -75
- package/dist/plugins/latex/BlockMath.svelte.d.ts +2 -4
- package/dist/plugins/latex/MathInline.svelte +10 -9
- package/dist/plugins/latex/flanking.d.ts +1 -0
- package/dist/plugins/latex/flanking.js +3 -0
- package/dist/plugins/latex/index.d.ts +1 -1
- package/dist/plugins/latex/latex-kind.d.ts +4 -4
- package/dist/plugins/latex/latex-kind.js +78 -67
- package/dist/plugins/latex/math-completion.d.ts +1 -1
- package/dist/plugins/latex/math-completion.js +5 -8
- package/dist/plugins/latex/math-layout.d.ts +2 -8
- package/dist/plugins/latex/math-layout.js +0 -9
- package/dist/plugins/latex/math-renderer.d.ts +17 -20
- package/dist/plugins/latex/math-renderer.js +21 -38
- package/dist/plugins/latex/math-source.d.ts +4 -8
- package/dist/plugins/latex/math-source.js +36 -81
- package/dist/plugins/latex/register.d.ts +10 -11
- package/dist/plugins/latex/register.js +24 -10
- package/dist/plugins/latex/renderer.d.ts +9 -10
- package/dist/plugins/latex/renderer.js +9 -24
- package/dist/plugins/mermaid/MermaidBlock.svelte +51 -45
- package/dist/plugins/mermaid/index.js +1 -1
- package/dist/plugins/mermaid/mermaid-kind.d.ts +4 -7
- package/dist/plugins/mermaid/mermaid-kind.js +30 -47
- package/dist/plugins/mermaid/mermaid-renderer.d.ts +9 -16
- package/dist/plugins/mermaid/mermaid-renderer.js +12 -31
- package/dist/plugins/mermaid/register.d.ts +3 -3
- package/dist/plugins/mermaid/register.js +5 -5
- package/dist/plugins/mermaid/renderer.d.ts +5 -5
- package/dist/plugins/mermaid/renderer.js +8 -11
- package/dist/plugins/parrot/ParrotBlock.svelte +15 -6
- package/dist/plugins/parrot/ParrotBlock.svelte.d.ts +2 -2
- package/dist/plugins/parrot/parrot-plugin.js +3 -3
- package/dist/plugins/slash-commands/filter.d.ts +23 -0
- package/dist/plugins/slash-commands/filter.js +31 -0
- package/dist/plugins/slash-commands/index.d.ts +2 -0
- package/dist/plugins/slash-commands/index.js +2 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.d.ts +12 -0
- package/dist/plugins/slash-commands/slash-commands-plugin.js +40 -0
- package/dist/plugins/slash-commands/slash-source.d.ts +36 -0
- package/dist/plugins/slash-commands/slash-source.js +108 -0
- package/dist/plugins/toc/TocBlock.svelte +23 -22
- package/dist/plugins/toc/TocBlock.svelte.d.ts +2 -3
- package/dist/plugins/toc/heading-outline.d.ts +7 -12
- package/dist/plugins/toc/heading-outline.js +22 -36
- package/dist/plugins/toc/navigation-queue.d.ts +2 -4
- package/dist/plugins/toc/toc-plugin.d.ts +5 -5
- package/dist/plugins/toc/toc-plugin.js +20 -13
- package/dist/presentation-mode.d.ts +15 -23
- package/dist/presentation-mode.js +19 -25
- package/dist/reactivity/block-list-state.svelte.d.ts +9 -11
- package/dist/reactivity/block-list-state.svelte.js +8 -9
- package/dist/reactivity/block-window.svelte.d.ts +12 -6
- package/dist/reactivity/block-window.svelte.js +44 -17
- package/dist/reactivity/child-list.d.ts +34 -0
- package/dist/reactivity/child-list.js +48 -0
- package/dist/reactivity/content-version.svelte.d.ts +4 -7
- package/dist/reactivity/content-version.svelte.js +3 -5
- package/dist/reactivity/hold-across.d.ts +39 -0
- package/dist/reactivity/hold-across.js +57 -0
- package/dist/reactivity/layout-state.svelte.d.ts +27 -0
- package/dist/reactivity/layout-state.svelte.js +51 -0
- package/dist/reactivity/list-tree.d.ts +39 -0
- package/dist/reactivity/list-tree.js +132 -0
- package/dist/reactivity/list-windowing.svelte.d.ts +50 -71
- package/dist/reactivity/list-windowing.svelte.js +141 -310
- package/dist/reactivity/measure-batch.d.ts +6 -8
- package/dist/reactivity/measure-batch.js +5 -6
- package/dist/reactivity/publish-ref.svelte.d.ts +16 -41
- package/dist/reactivity/publish-ref.svelte.js +21 -85
- package/dist/reactivity/scope-geometry.d.ts +6 -13
- package/dist/reactivity/scope-geometry.js +7 -14
- package/dist/reactivity/state-registry.d.ts +5 -5
- package/dist/reactivity/state-registry.js +11 -15
- package/dist/reactivity/use-container-windowing.svelte.d.ts +13 -26
- package/dist/reactivity/use-container-windowing.svelte.js +64 -74
- package/dist/reactivity/use-measured-child.svelte.d.ts +10 -0
- package/dist/reactivity/use-measured-child.svelte.js +41 -0
- package/dist/reactivity/use-window-floor.svelte.d.ts +2 -0
- package/dist/reactivity/use-window-floor.svelte.js +27 -0
- package/dist/reactivity/window-slice.d.ts +4 -4
- package/dist/reactivity/window-slice.js +0 -2
- package/dist/renderer-slot.d.ts +48 -0
- package/dist/renderer-slot.js +85 -0
- package/dist/scan-index.d.ts +4 -4
- package/dist/scan-index.js +4 -4
- package/dist/schema/block-commands.d.ts +69 -54
- package/dist/schema/block-commands.js +91 -104
- package/dist/schema/block-completions.d.ts +16 -19
- package/dist/schema/block-completions.js +25 -32
- package/dist/schema/block-component-registry.d.ts +13 -14
- package/dist/schema/block-component-registry.js +19 -17
- package/dist/schema/block-kind-descriptor.d.ts +234 -168
- package/dist/schema/block-kind-descriptor.js +151 -66
- package/dist/schema/block-openers.d.ts +48 -39
- package/dist/schema/block-openers.js +73 -83
- package/dist/schema/built-in-descriptors.d.ts +3 -5
- package/dist/schema/built-in-descriptors.js +96 -80
- package/dist/schema/child-spans.d.ts +12 -10
- package/dist/schema/child-spans.js +68 -34
- package/dist/schema/closure.d.ts +18 -16
- package/dist/schema/closure.js +24 -14
- package/dist/schema/command-id.d.ts +6 -8
- package/dist/schema/command-id.js +20 -25
- package/dist/schema/commands.d.ts +78 -84
- package/dist/schema/commands.js +152 -117
- package/dist/schema/container-raw.d.ts +51 -11
- package/dist/schema/container-raw.js +143 -14
- package/dist/schema/container-rebuilders.d.ts +17 -15
- package/dist/schema/container-rebuilders.js +30 -22
- package/dist/schema/context-actions.d.ts +25 -13
- package/dist/schema/context-actions.js +32 -17
- package/dist/schema/define-plugin-block.d.ts +8 -6
- package/dist/schema/define-plugin-block.js +6 -4
- package/dist/schema/fenced-code-raw.d.ts +30 -17
- package/dist/schema/fenced-code-raw.js +155 -107
- package/dist/schema/global-commands.d.ts +6 -6
- package/dist/schema/global-commands.js +14 -22
- package/dist/schema/height-estimates.d.ts +31 -0
- package/dist/schema/height-estimates.js +64 -0
- package/dist/schema/inline-construct-policy.d.ts +42 -55
- package/dist/schema/inline-construct-policy.js +36 -35
- package/dist/schema/insert-catalogue.d.ts +30 -0
- package/dist/schema/insert-catalogue.js +95 -0
- package/dist/schema/keybinding-overrides.d.ts +9 -11
- package/dist/schema/keybinding-overrides.js +1 -1
- package/dist/schema/keybindings.d.ts +15 -7
- package/dist/schema/keybindings.js +21 -9
- package/dist/schema/merge-rules.d.ts +5 -7
- package/dist/schema/merge-rules.js +7 -9
- package/dist/schema/opener-priorities.d.ts +4 -4
- package/dist/schema/opener-priorities.js +4 -4
- package/dist/schema/operations.d.ts +8 -10
- package/dist/schema/operations.js +3 -3
- package/dist/schema/page-role.d.ts +14 -0
- package/dist/schema/page-role.js +19 -0
- package/dist/schema/plugin-activation.d.ts +4 -6
- package/dist/schema/plugin-activation.js +12 -10
- package/dist/schema/plugin-editor-context.d.ts +25 -10
- package/dist/schema/plugin-editor-context.js +40 -9
- package/dist/schema/plugin-install.d.ts +49 -17
- package/dist/schema/plugin-install.js +51 -25
- package/dist/schema/plugin-kind.d.ts +12 -8
- package/dist/schema/plugin-kind.js +35 -42
- package/dist/schema/plugin-name.js +3 -3
- package/dist/schema/plugin-registry.d.ts +54 -0
- package/dist/schema/plugin-registry.js +70 -0
- package/dist/schema/reading.d.ts +23 -0
- package/dist/schema/reading.js +7 -0
- package/dist/schema/register-once.d.ts +3 -5
- package/dist/schema/register-once.js +7 -16
- package/dist/schema/registration-checks.d.ts +12 -16
- package/dist/schema/registration-checks.js +35 -51
- package/dist/schema/registration-pairs.d.ts +54 -0
- package/dist/schema/registration-pairs.js +48 -0
- package/dist/schema/registration-pending.d.ts +8 -12
- package/dist/schema/registration-pending.js +9 -9
- package/dist/schema/registry-reset.d.ts +8 -4
- package/dist/schema/registry-reset.js +13 -26
- package/dist/schema/registry-view.d.ts +25 -13
- package/dist/schema/registry-view.js +26 -20
- package/dist/schema/reserved-chords.d.ts +9 -10
- package/dist/schema/reserved-chords.js +63 -80
- package/dist/schema/reserved-chrome.d.ts +12 -11
- package/dist/schema/reserved-chrome.js +15 -11
- package/dist/schema/setext-raw.d.ts +13 -0
- package/dist/schema/setext-raw.js +33 -0
- package/dist/schema/stored-as.d.ts +20 -0
- package/dist/schema/stored-as.js +6 -0
- package/dist/schema/table-cell-raw.d.ts +18 -7
- package/dist/schema/table-cell-raw.js +28 -7
- package/dist/schema/whole-block-unit.d.ts +5 -4
- package/dist/schema/whole-block-unit.js +5 -4
- package/dist/search/document-scan.d.ts +3 -3
- package/dist/search/document-scan.js +2 -2
- package/dist/search/matcher.d.ts +1 -1
- package/dist/search/regex-executor.d.ts +5 -6
- package/dist/search/regex-executor.js +6 -8
- package/dist/search/replace.d.ts +2 -5
- package/dist/search/replace.js +2 -5
- package/dist/search/search-state.svelte.d.ts +5 -5
- package/dist/search/search-state.svelte.js +12 -16
- package/dist/selection/autoscroll.d.ts +6 -9
- package/dist/selection/block-hit-test.d.ts +16 -24
- package/dist/selection/block-hit-test.js +29 -22
- package/dist/selection/caret-doors.d.ts +15 -14
- package/dist/selection/caret-doors.js +37 -26
- package/dist/selection/caret-landing.d.ts +62 -0
- package/dist/selection/caret-landing.js +157 -0
- package/dist/selection/caret-restore.d.ts +17 -10
- package/dist/selection/caret-restore.js +10 -22
- package/dist/selection/caret-target.d.ts +30 -0
- package/dist/selection/caret-target.js +84 -0
- package/dist/selection/char-endpoint-snap.d.ts +6 -10
- package/dist/selection/char-endpoint-snap.js +8 -14
- package/dist/selection/clipboard-text.d.ts +5 -12
- package/dist/selection/clipboard-text.js +69 -172
- package/dist/selection/covered-block.d.ts +6 -8
- package/dist/selection/covered-block.js +8 -19
- package/dist/selection/cross-block/clipboard.d.ts +3 -2
- package/dist/selection/cross-block/clipboard.js +13 -4
- package/dist/selection/cross-block/dispatch.d.ts +47 -43
- package/dist/selection/cross-block/dispatch.js +12 -23
- package/dist/selection/cross-block/format-range.d.ts +18 -21
- package/dist/selection/cross-block/format-range.js +104 -103
- package/dist/selection/cross-block/format-toggle.d.ts +10 -15
- package/dist/selection/cross-block/format-toggle.js +28 -33
- package/dist/selection/cross-block/keydown.d.ts +4 -4
- package/dist/selection/cross-block/keydown.js +92 -125
- package/dist/selection/cross-block/ops.d.ts +19 -34
- package/dist/selection/cross-block/ops.js +110 -95
- package/dist/selection/cross-block/paste.d.ts +2 -3
- package/dist/selection/cross-block/paste.js +59 -96
- package/dist/selection/cross-block/pointer.d.ts +17 -15
- package/dist/selection/cross-block/pointer.js +74 -25
- package/dist/selection/cross-block/type-replace.d.ts +4 -6
- package/dist/selection/cross-block/type-replace.js +51 -134
- package/dist/selection/dead-space-caret.d.ts +19 -30
- package/dist/selection/dead-space-caret.js +70 -88
- package/dist/selection/drag-pointer.d.ts +7 -9
- package/dist/selection/drag-pointer.js +23 -33
- package/dist/selection/gap-caret.d.ts +17 -28
- package/dist/selection/gap-caret.js +14 -26
- package/dist/selection/grid-selection.d.ts +12 -0
- package/dist/selection/grid-selection.js +22 -0
- package/dist/selection/keyboard-extend.d.ts +27 -40
- package/dist/selection/keyboard-extend.js +94 -117
- package/dist/selection/multi-click.d.ts +13 -18
- package/dist/selection/multi-click.js +32 -38
- package/dist/selection/native-bridge.d.ts +29 -39
- package/dist/selection/native-bridge.js +78 -127
- package/dist/selection/nearest-block.d.ts +17 -12
- package/dist/selection/nearest-block.js +37 -18
- package/dist/selection/path-lookup.d.ts +25 -16
- package/dist/selection/path-lookup.js +101 -18
- package/dist/selection/path-math.d.ts +9 -11
- package/dist/selection/path-math.js +5 -7
- package/dist/selection/pointer-gesture.d.ts +5 -5
- package/dist/selection/pointer-gesture.js +5 -5
- package/dist/selection/pointer-session.d.ts +10 -16
- package/dist/selection/pointer-session.js +6 -7
- package/dist/selection/primitives.d.ts +64 -40
- package/dist/selection/primitives.js +57 -67
- package/dist/selection/range-coverage.d.ts +94 -0
- package/dist/selection/range-coverage.js +365 -0
- package/dist/selection/range-delete-ceremony.d.ts +28 -74
- package/dist/selection/range-delete-ceremony.js +100 -141
- package/dist/selection/range-delete-chrome.d.ts +20 -33
- package/dist/selection/range-delete-chrome.js +53 -78
- package/dist/selection/range-delete-table-coverage.d.ts +11 -25
- package/dist/selection/range-delete-table-coverage.js +42 -112
- package/dist/selection/range-delete-table.d.ts +14 -12
- package/dist/selection/range-delete-table.js +106 -310
- package/dist/selection/range-delete.d.ts +18 -23
- package/dist/selection/range-delete.js +83 -123
- package/dist/selection/round-trip-restore.d.ts +18 -0
- package/dist/selection/round-trip-restore.js +19 -0
- package/dist/selection/selection-announcer.d.ts +17 -0
- package/dist/selection/selection-announcer.js +25 -0
- package/dist/selection/selection-description.d.ts +4 -3
- package/dist/selection/selection-description.js +5 -4
- package/dist/selection/selection-drop.d.ts +34 -16
- package/dist/selection/selection-drop.js +159 -95
- package/dist/selection/selection-restore.d.ts +20 -33
- package/dist/selection/selection-restore.js +21 -44
- package/dist/selection/selection-state.svelte.d.ts +50 -42
- package/dist/selection/selection-state.svelte.js +144 -98
- package/dist/selection/shared-keydown.d.ts +22 -27
- package/dist/selection/shared-keydown.js +25 -45
- package/dist/selection/table-endpoint-snap.d.ts +17 -41
- package/dist/selection/table-endpoint-snap.js +54 -80
- package/dist/selection/table-rect-extend.d.ts +3 -6
- package/dist/selection/table-rect-extend.js +19 -14
- package/dist/styles/editor-theme.css +60 -53
- package/dist/styles/editor.css +201 -143
- package/dist/testing/conformance-core.d.ts +50 -18
- package/dist/testing/conformance-core.js +88 -50
- package/dist/testing/container-conformance.d.ts +48 -84
- package/dist/testing/container-conformance.js +159 -285
- package/dist/testing/headless-actions.d.ts +34 -19
- package/dist/testing/headless-actions.js +116 -65
- package/dist/testing/headless-block-list.svelte.d.ts +16 -0
- package/dist/testing/headless-block-list.svelte.js +22 -0
- package/dist/testing/inline-conformance.d.ts +15 -22
- package/dist/testing/inline-conformance.js +131 -148
- package/dist/testing/kind-conformance.d.ts +19 -24
- package/dist/testing/kind-conformance.js +204 -117
- package/dist/testing/kit-reading.d.ts +7 -0
- package/dist/testing/kit-reading.js +16 -0
- package/dist/testing/mount-dom-stubs.d.ts +4 -5
- package/dist/testing/mount-dom-stubs.js +8 -5
- package/dist/testing/parse-convergence.d.ts +10 -10
- package/dist/testing/parse-convergence.js +14 -49
- package/dist/testing.d.ts +13 -9
- package/dist/testing.js +28 -38
- package/dist/tree-operations/blockquote.d.ts +8 -14
- package/dist/tree-operations/blockquote.js +25 -45
- package/dist/tree-operations/chain-rebuild.d.ts +34 -25
- package/dist/tree-operations/chain-rebuild.js +115 -52
- package/dist/tree-operations/children.d.ts +5 -9
- package/dist/tree-operations/children.js +7 -11
- package/dist/tree-operations/cleanup.d.ts +6 -7
- package/dist/tree-operations/cleanup.js +14 -11
- package/dist/tree-operations/clone.js +5 -4
- package/dist/tree-operations/container-lift.d.ts +10 -5
- package/dist/tree-operations/container-lift.js +20 -14
- package/dist/tree-operations/container-offsets.d.ts +22 -0
- package/dist/tree-operations/container-offsets.js +89 -0
- package/dist/tree-operations/content-write.d.ts +52 -29
- package/dist/tree-operations/content-write.js +155 -110
- package/dist/tree-operations/index.d.ts +4 -4
- package/dist/tree-operations/index.js +4 -4
- package/dist/tree-operations/keep-one-block.d.ts +10 -0
- package/dist/tree-operations/keep-one-block.js +19 -0
- package/dist/tree-operations/leaf-range.d.ts +33 -0
- package/dist/tree-operations/leaf-range.js +67 -0
- package/dist/tree-operations/list/empty-check.d.ts +2 -3
- package/dist/tree-operations/list/empty-check.js +4 -4
- package/dist/tree-operations/list/exit-replacement.d.ts +4 -6
- package/dist/tree-operations/list/exit-replacement.js +4 -9
- package/dist/tree-operations/list/item-partition.d.ts +2 -2
- package/dist/tree-operations/list/item-partition.js +2 -2
- package/dist/tree-operations/list/list-builders.d.ts +18 -16
- package/dist/tree-operations/list/list-builders.js +59 -30
- package/dist/tree-operations/list/ordered-markers.d.ts +7 -16
- package/dist/tree-operations/list/ordered-markers.js +7 -16
- package/dist/tree-operations/list/reconcile-task.d.ts +16 -7
- package/dist/tree-operations/list/reconcile-task.js +80 -23
- package/dist/tree-operations/list/sublist-separator.d.ts +7 -7
- package/dist/tree-operations/list/sublist-separator.js +20 -27
- package/dist/tree-operations/list/task-paragraph.d.ts +25 -0
- package/dist/tree-operations/list/task-paragraph.js +54 -0
- package/dist/tree-operations/list/unwrap-merge.d.ts +8 -16
- package/dist/tree-operations/list/unwrap-merge.js +44 -79
- package/dist/tree-operations/node-ops.d.ts +30 -52
- package/dist/tree-operations/node-ops.js +152 -218
- package/dist/tree-operations/node-primitives.d.ts +44 -31
- package/dist/tree-operations/node-primitives.js +84 -60
- package/dist/tree-operations/open-tail.d.ts +25 -0
- package/dist/tree-operations/open-tail.js +100 -0
- package/dist/tree-operations/parse-block.d.ts +15 -2
- package/dist/tree-operations/parse-block.js +19 -4
- package/dist/tree-operations/paste/apply.d.ts +7 -8
- package/dist/tree-operations/paste/apply.js +33 -63
- package/dist/tree-operations/paste/body-write.d.ts +8 -6
- package/dist/tree-operations/paste/body-write.js +13 -14
- package/dist/tree-operations/paste/container-match.d.ts +7 -10
- package/dist/tree-operations/paste/container-match.js +76 -58
- package/dist/tree-operations/paste/container-paste.d.ts +3 -3
- package/dist/tree-operations/paste/container-paste.js +3 -3
- package/dist/tree-operations/paste/dispatch.d.ts +26 -29
- package/dist/tree-operations/paste/dispatch.js +68 -53
- package/dist/tree-operations/paste/focus-target.d.ts +11 -14
- package/dist/tree-operations/paste/focus-target.js +13 -18
- package/dist/tree-operations/paste/hooks.d.ts +7 -12
- package/dist/tree-operations/paste/hooks.js +49 -46
- package/dist/tree-operations/paste/line-ending.d.ts +11 -0
- package/dist/tree-operations/paste/line-ending.js +32 -0
- package/dist/tree-operations/paste/list-absorb.d.ts +8 -11
- package/dist/tree-operations/paste/list-absorb.js +17 -19
- package/dist/tree-operations/paste/list-break-out.d.ts +12 -11
- package/dist/tree-operations/paste/list-break-out.js +24 -32
- package/dist/tree-operations/paste/parent-scope.d.ts +8 -12
- package/dist/tree-operations/paste/parent-scope.js +9 -16
- package/dist/tree-operations/paste/paste-deps.d.ts +14 -9
- package/dist/tree-operations/paste/paste-replacement.d.ts +20 -3
- package/dist/tree-operations/paste/paste-replacement.js +73 -42
- package/dist/tree-operations/paste/paste-transforms.d.ts +5 -7
- package/dist/tree-operations/paste/paste-transforms.js +18 -27
- package/dist/tree-operations/paste/replacement-parse.d.ts +9 -7
- package/dist/tree-operations/paste/replacement-parse.js +12 -10
- package/dist/tree-operations/paste/strategy.d.ts +1 -1
- package/dist/tree-operations/paste/strategy.js +1 -1
- package/dist/tree-operations/paste/table-slice.js +15 -10
- package/dist/tree-operations/paste-surfaces.d.ts +18 -29
- package/dist/tree-operations/paste-surfaces.js +14 -10
- package/dist/tree-operations/path-mutate.d.ts +7 -8
- package/dist/tree-operations/path-mutate.js +4 -4
- package/dist/tree-operations/reorder-unit.d.ts +4 -5
- package/dist/tree-operations/reorder-unit.js +5 -6
- package/dist/tree-operations/reorder.d.ts +7 -9
- package/dist/tree-operations/reorder.js +39 -40
- package/dist/tree-operations/settle.d.ts +42 -53
- package/dist/tree-operations/settle.js +241 -162
- package/dist/tree-operations/sharing.d.ts +5 -5
- package/dist/tree-operations/splice-many.d.ts +5 -5
- package/dist/tree-operations/splice-many.js +5 -5
- package/dist/tree-operations/stored-as.d.ts +13 -0
- package/dist/tree-operations/stored-as.js +48 -0
- package/dist/tree-operations/structural-change.d.ts +11 -15
- package/dist/tree-operations/structural-change.js +10 -14
- package/dist/tree-operations/structural-suffix.d.ts +22 -0
- package/dist/tree-operations/structural-suffix.js +61 -0
- package/dist/tree-operations/sub-table-copy.d.ts +7 -0
- package/dist/tree-operations/sub-table-copy.js +40 -36
- package/dist/tree-operations/table-grid-clipboard.d.ts +2 -7
- package/dist/tree-operations/table-grid-clipboard.js +11 -36
- package/dist/tree-operations/table-mutations.d.ts +7 -3
- package/dist/tree-operations/table-mutations.js +45 -9
- package/dist/tree-operations/unshare.d.ts +11 -15
- package/dist/tree-operations/unshare.js +15 -17
- package/dist/undo/manager.js +1 -1
- package/dist/undo/types.d.ts +2 -2
- package/docs/guide/consumer-guide.md +327 -205
- package/docs/guide/directives.md +7 -7
- package/docs/guide/plugin-api.md +253 -185
- package/docs/guide/plugin-guide.md +332 -235
- package/docs/guide/plugin-testing.md +96 -82
- package/package.json +12 -16
- package/dist/ambient/ambient-cursor.d.ts +0 -41
- package/dist/ambient/ambient-cursor.js +0 -120
- package/dist/components/blocks/code/code-paste.d.ts +0 -24
- package/dist/components/blocks/code/code-paste.js +0 -21
- package/dist/components/blocks/table/cell-clipboard.d.ts +0 -33
- package/dist/components/blocks/table/cell-clipboard.js +0 -67
- package/dist/components/blocks/text/hidden-suffix.d.ts +0 -10
- package/dist/components/blocks/text/hidden-suffix.js +0 -15
- package/dist/components/blocks/text/link-source-bytes.d.ts +0 -37
- package/dist/components/image/image-source-bytes.d.ts +0 -15
- package/dist/components/image/image-source-bytes.js +0 -80
- package/dist/cursor/content-offsets.d.ts +0 -29
- package/dist/cursor/content-offsets.js +0 -151
- package/dist/cursor/reveal-anchor.d.ts +0 -30
- package/dist/cursor/reveal-anchor.js +0 -31
- package/dist/cursor/scroll-hold.d.ts +0 -10
- package/dist/cursor/scroll-hold.js +0 -22
- package/dist/invariants/split-landing.d.ts +0 -8
- package/dist/invariants/split-landing.js +0 -15
- package/dist/tree-operations/list/terminator.d.ts +0 -17
- package/dist/tree-operations/list/terminator.js +0 -60
- package/dist/tree-operations/paste/replace-block-at-parent.d.ts +0 -31
- package/dist/tree-operations/paste/replace-block-at-parent.js +0 -78
|
@@ -1,67 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* asserts or is excused
|
|
5
|
-
*
|
|
6
|
-
* checks drive the real per-kind action path, stopping at the nested-action default and at a DOM.
|
|
2
|
+
* The container conformance kit, published at `@voithos-labs/aragonite/testing`. Register your
|
|
3
|
+
* kind, then run the kit with fixtures and a coverage table saying, per invariant, whether the cell
|
|
4
|
+
* asserts or is excused; a thin excuse fails the run. What each cell expects:
|
|
5
|
+
* `docs/guide/plugin-testing.md` § The container checkup.
|
|
7
6
|
*/
|
|
8
|
-
import { splitLines, trailingLineEnding } from '../core/lines';
|
|
7
|
+
import { documentLineEnding, splitLines, trailingLineEnding } from '../core/lines';
|
|
9
8
|
import { parse } from '../core/parser';
|
|
9
|
+
import { ancestorsOf } from '../core/paths';
|
|
10
10
|
import { createContainerEditActions } from '../editor-actions/container-edit';
|
|
11
11
|
import { createUndoController } from '../editor-actions/commit/undo-controller';
|
|
12
|
-
import { createListContext } from '../editor-actions/list-context';
|
|
13
12
|
import { createStandardNestedActions } from '../editor-actions/nested/nested-actions';
|
|
14
13
|
import { createNestedFocus } from '../editor-actions/nested/nested-focus';
|
|
15
|
-
import { createTableMutationsContext } from '../editor-actions/table-context';
|
|
16
14
|
import { firstChildUnwrapStrategies, middleChildUnwrapStrategies } from '../editor-actions/unwrap-strategies';
|
|
17
15
|
import { isDirectiveKind } from '../core/directive/registry';
|
|
18
|
-
import { isBlockOpenerRegistered } from '../schema/block-openers';
|
|
19
|
-
import {
|
|
16
|
+
import { defaultGrammarView, isBlockOpenerRegistered } from '../schema/block-openers';
|
|
17
|
+
import { kitReading } from './kit-reading';
|
|
18
|
+
import { getBlockKindDescriptor, isGridDescriptor } from '../schema/block-kind-descriptor';
|
|
20
19
|
import { rebuildContainerRawIfContainer } from '../schema/container-raw';
|
|
21
20
|
import { createSharingState } from '../tree-operations/sharing';
|
|
22
|
-
import { rebuildUnsharedAncestry } from '../tree-operations/chain-rebuild';
|
|
21
|
+
import { rebuildUnsharedAncestry, rebuildUnsharedChain } from '../tree-operations/chain-rebuild';
|
|
22
|
+
import { walkUnsharing } from '../tree-operations/unshare';
|
|
23
23
|
import { assertParseConverged } from './parse-convergence';
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
*
|
|
29
|
-
* is what makes cell N+1 unmissable at either caller.
|
|
30
|
-
*/
|
|
24
|
+
import { mountBlockListState } from './headless-block-list.svelte';
|
|
25
|
+
import { createHeadlessActions, recordingFocus, stubBlockEdit, stubCaretMemory } from './headless-actions';
|
|
26
|
+
import { assert, assertIndices, assertIs, assertRebuildIsParseCanonical, assertReasonDocumented, fail, findFirstOfKind, nodeAtPath, pathPassesThroughKind, runCells, subjectNode, subjectPath } from './conformance-core';
|
|
27
|
+
/** The kit's cells as data, so {@link runContainerConformance} and the built-in sweep run the
|
|
28
|
+
* same set; `titleRow` and `declarations` declare no coverage and always run. */
|
|
31
29
|
export const CONTAINER_CONFORMANCE_CELLS = [
|
|
32
30
|
{
|
|
33
31
|
cell: 'localIndex',
|
|
34
|
-
coverage: (profile) => profile.localIndex,
|
|
35
|
-
run: (kind, profile) => getBlockKindDescriptor(kind)
|
|
36
|
-
?
|
|
37
|
-
: checkStripLocalIndexAddressing(profile)
|
|
32
|
+
coverage: ({ profile }) => profile.localIndex,
|
|
33
|
+
run: ({ kind, profile }) => isGridDescriptor(getBlockKindDescriptor(kind))
|
|
34
|
+
? driverOf(kind, profile, 'gridLocalIndex', 'a grid op')()
|
|
35
|
+
: checkStripLocalIndexAddressing(kind, profile)
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
cell: 'ancestry',
|
|
39
|
+
coverage: ({ profile }) => profile.ancestry,
|
|
40
|
+
run: ({ kind, profile }) => checkInnermostFirstAncestry(kind, profile)
|
|
38
41
|
},
|
|
39
|
-
{ cell: 'ancestry', coverage: (profile) => profile.ancestry, run: checkInnermostFirstAncestry },
|
|
40
42
|
{
|
|
41
43
|
cell: 'multiScope',
|
|
42
|
-
coverage: (profile) => profile.multiScope,
|
|
43
|
-
run:
|
|
44
|
+
coverage: ({ profile }) => profile.multiScope,
|
|
45
|
+
run: ({ kind, profile }) => driverOf(kind, profile, 'multiScope', 'an op spanning two scopes')()
|
|
44
46
|
},
|
|
45
47
|
{
|
|
46
48
|
cell: 'focusBubble',
|
|
47
|
-
coverage: (profile) => profile.focusBubble,
|
|
48
|
-
run: checkFocusBubbleTermination
|
|
49
|
+
coverage: ({ profile }) => profile.focusBubble,
|
|
50
|
+
run: ({ kind, profile }) => checkFocusBubbleTermination(kind, profile)
|
|
49
51
|
},
|
|
50
52
|
{
|
|
51
53
|
cell: 'terminatorCollision',
|
|
52
|
-
coverage: (profile) => profile.terminatorCollision,
|
|
53
|
-
run: checkTerminatorCollision
|
|
54
|
+
coverage: ({ profile }) => profile.terminatorCollision,
|
|
55
|
+
run: ({ kind, profile }) => checkTerminatorCollision(kind, profile),
|
|
56
|
+
falsify: ({ kind }) => refuseExcusedCollision(kind)
|
|
54
57
|
},
|
|
55
|
-
{
|
|
58
|
+
{
|
|
59
|
+
cell: 'titleRow',
|
|
60
|
+
run: ({ kind }) => checkTitleRowFeedsNoMetadata(kind)
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
cell: 'declarations',
|
|
64
|
+
run: ({ kind, profile }) => checkDeclarationSanity(kind, profile)
|
|
65
|
+
}
|
|
56
66
|
];
|
|
57
|
-
/** The cells whose coverage a profile declares — `declarations` is the kit's, not the author's. */
|
|
58
|
-
const BEHAVIORAL_CELLS = CONTAINER_CONFORMANCE_CELLS.filter((c) => c.cell !== 'declarations');
|
|
59
67
|
/**
|
|
60
|
-
* A profile
|
|
61
|
-
*
|
|
68
|
+
* A profile must assert at least one cell it declares. `declarations` doesn't count: it asserts
|
|
69
|
+
* for every kind, so counting it would let a profile that excuses everything pass.
|
|
62
70
|
*/
|
|
63
71
|
export function assertProfileCoverageFloor(kind, profile) {
|
|
64
|
-
const asserts =
|
|
72
|
+
const asserts = CONTAINER_CONFORMANCE_CELLS.filter((c) => c.coverage?.({ kind, profile }).mode === 'assert');
|
|
65
73
|
if (asserts.length > 0) {
|
|
66
74
|
assert(profile.wholeProfileExemption === undefined, `${kind} declares a wholeProfileExemption while ${asserts.length} behavioral cell(s) assert`);
|
|
67
75
|
return;
|
|
@@ -76,42 +84,30 @@ export function assertProfileCoverageFloor(kind, profile) {
|
|
|
76
84
|
* `Error` naming every failed cell.
|
|
77
85
|
*/
|
|
78
86
|
export async function runContainerConformance(kind, profile) {
|
|
79
|
-
const
|
|
80
|
-
const failures = [];
|
|
87
|
+
const earlier = [];
|
|
81
88
|
try {
|
|
82
89
|
assertProfileCoverageFloor(kind, profile);
|
|
83
90
|
}
|
|
84
91
|
catch (error) {
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
for (const { cell, coverage: read, run } of CONTAINER_CONFORMANCE_CELLS) {
|
|
88
|
-
const coverage = read(profile);
|
|
89
|
-
try {
|
|
90
|
-
if (coverage.mode === 'assert') {
|
|
91
|
-
await run(kind, profile);
|
|
92
|
-
cells.push({ cell, status: 'asserted' });
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
assertExemptionDocumented(coverage, `${kind} ${cell}`);
|
|
96
|
-
cells.push({ cell, status: coverage.mode, reason: coverage.reason });
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
failures.push(`${cell}: ${error.message}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (failures.length > 0) {
|
|
104
|
-
throw new Error(`container conformance failed for "${kind}":\n - ${failures.join('\n - ')}`);
|
|
92
|
+
earlier.push(`coverageFloor: ${error.message}`);
|
|
105
93
|
}
|
|
94
|
+
const cells = await runCells(CONTAINER_CONFORMANCE_CELLS,
|
|
95
|
+
// A published profile never supplies drivers: no published API can perform their ops.
|
|
96
|
+
{ kind, profile: { ...profile, drivers: undefined } }, { subject: kind, heading: `container conformance failed for "${kind}"` }, earlier);
|
|
106
97
|
return { kind, cells };
|
|
107
98
|
}
|
|
108
99
|
// ── (a) local-index addressing ───────────────────────────────────────────────
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
100
|
+
function driverOf(kind, profile, driver, op) {
|
|
101
|
+
const run = profile.drivers?.[driver];
|
|
102
|
+
if (run)
|
|
103
|
+
return run;
|
|
104
|
+
const cell = driver === 'gridLocalIndex' ? 'localIndex' : 'multiScope';
|
|
105
|
+
fail(`"${kind}" asserts ${cell}, but the kit drives ${op} only for the built-in kinds that own ` +
|
|
106
|
+
`one, so declare it boundary (or exempt, when the kind owns no such op)`);
|
|
107
|
+
}
|
|
108
|
+
/** Asserts the addressed child is the one removed and the emitted path is the chain of local
|
|
109
|
+
* indices; the fixture avoids chain [0,0] child 0, where local and global indices coincide. */
|
|
110
|
+
export async function checkStripLocalIndexAddressing(kind, profile) {
|
|
115
111
|
const fixture = profile.localIndexFixture;
|
|
116
112
|
if (!fixture)
|
|
117
113
|
fail('localIndex asserts but the profile carries no localIndexFixture');
|
|
@@ -120,6 +116,7 @@ export async function checkStripLocalIndexAddressing(profile) {
|
|
|
120
116
|
assert(targetChild > 0 || containerChain.some((idx) => idx > 0), 'localIndexFixture must edit a non-first child or descend through a non-zero chain position (else the local-vs-global check is vacuous)');
|
|
121
117
|
const outer = parse(fixture.source).children[0];
|
|
122
118
|
const { deps, doc, events } = createHeadlessActions([outer]);
|
|
119
|
+
const kindNode = subjectNode(doc, kind, containerChain, 'localIndexFixture');
|
|
123
120
|
const controller = createUndoController(deps);
|
|
124
121
|
const rootContainerEdit = createContainerEditActions(deps, controller);
|
|
125
122
|
let parentBundle = null;
|
|
@@ -136,9 +133,8 @@ export async function checkStripLocalIndexAddressing(profile) {
|
|
|
136
133
|
},
|
|
137
134
|
path: containerChain.slice(0, depth + 1)
|
|
138
135
|
},
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
linkRef: undefined,
|
|
136
|
+
caretMemory: stubCaretMemory(),
|
|
137
|
+
reading: kitReading(),
|
|
142
138
|
parent: {
|
|
143
139
|
blockEdit: parentBundle?.blockEdit ?? stubBlockEdit(),
|
|
144
140
|
focus: parentBundle?.focus ?? recordingFocus(),
|
|
@@ -150,83 +146,23 @@ export async function checkStripLocalIndexAddressing(profile) {
|
|
|
150
146
|
if (depth < containerChain.length - 1)
|
|
151
147
|
node = node.children[containerChain[depth + 1]];
|
|
152
148
|
}
|
|
153
|
-
const kindNode = node;
|
|
154
149
|
assert(kindNode.children.length > 1, 'kind node has ≥2 children to target a non-first one');
|
|
155
150
|
const targetMarker = kindNode.children[targetChild].raw;
|
|
156
151
|
const seen = [];
|
|
157
152
|
events.on('edit', (e) => seen.push(e));
|
|
158
|
-
await parentBundle.blockEdit.deleteBlock(targetChild);
|
|
159
|
-
// The commit replaced the
|
|
160
|
-
const liveKind =
|
|
153
|
+
await parentBundle.blockEdit.deleteBlock(targetChild, 'keyless');
|
|
154
|
+
// The commit replaced the ancestor nodes, so resolve again through the live document.
|
|
155
|
+
const liveKind = subjectNode(doc, kind, containerChain, 'the document after the delete');
|
|
161
156
|
const remaining = (liveKind.children ?? []).map((c) => c.raw);
|
|
162
157
|
assert(!remaining.includes(targetMarker), `local index ${targetChild} was the child removed`);
|
|
163
158
|
const editEvent = seen.find((e) => e.op === 'delete');
|
|
164
159
|
assert(editEvent, 'a delete edit event fired');
|
|
165
160
|
assertIndices(editEvent.path.slice(0, containerChain.length), containerChain, 'path is the local-index chain');
|
|
166
161
|
assertIs(editEvent.path.at(-1), targetChild, 'path ends at the targeted local child index');
|
|
167
|
-
//
|
|
168
|
-
//
|
|
162
|
+
// Compared against a fresh parse, not byte round-trip, which is trivially true here: this
|
|
163
|
+
// catches an op that left the container's raw stale or its shape different.
|
|
169
164
|
assertParseConverged(doc, 'doc converges after a local-index op');
|
|
170
165
|
}
|
|
171
|
-
/**
|
|
172
|
-
* Grid local addressing: a table column op addresses cells by (rowIdx, colIdx) and emits
|
|
173
|
-
* the table's own local path. The leading paragraph keeps the table at a non-zero doc
|
|
174
|
-
* index, so a flat global offset would not coincide with the local one.
|
|
175
|
-
*/
|
|
176
|
-
export async function checkGridLocalIndexAddressing() {
|
|
177
|
-
const parsed = parse('lead para\n\n| h1 | h2 |\n| --- | --- |\n| a | b |\n');
|
|
178
|
-
assertIs(parsed.children[1].kind, 'table', 'table at non-zero doc index');
|
|
179
|
-
const { ctx, deps, doc, events } = mountTableMutations(parsed.children, 1);
|
|
180
|
-
const seen = [];
|
|
181
|
-
events.on('edit', (e) => seen.push(e));
|
|
182
|
-
// Pinning the new cell's POSITION by content is what proves cells are addressed by
|
|
183
|
-
// local col index rather than appended at the end.
|
|
184
|
-
await ctx.insertColumnRight(0);
|
|
185
|
-
const liveTable = deps.doc.children[1];
|
|
186
|
-
for (const row of liveTable.children) {
|
|
187
|
-
const cells = row.children.map((c) => c.raw);
|
|
188
|
-
assertIs(cells.length, 3, 'every row gained one cell');
|
|
189
|
-
assert(cells[0] !== '', 'column 0 unchanged');
|
|
190
|
-
assertIs(cells[1], '', 'new empty cell landed at the addressed colIdx 1');
|
|
191
|
-
assert(cells[2] !== '', 'original second cell shifted to colIdx 2');
|
|
192
|
-
}
|
|
193
|
-
const editEvent = seen.find((e) => e.op === 'tableInsertColumn');
|
|
194
|
-
assert(editEvent, 'tableInsertColumn edit event fired');
|
|
195
|
-
assertIndices(editEvent.path, [1], 'column op emits the table’s own local path');
|
|
196
|
-
// The strip twin's oracle, which the grid arm went without: a column op leaving a stale
|
|
197
|
-
// table raw or a row the delimiter no longer describes fires here, not at a byte round-trip.
|
|
198
|
-
assertParseConverged(doc, 'doc converges after a grid column op');
|
|
199
|
-
}
|
|
200
|
-
/** The table-mutations mount both grid cells share: headless deps, controller, row states, ctx. */
|
|
201
|
-
function mountTableMutations(children, tableIndex) {
|
|
202
|
-
const table = children[tableIndex];
|
|
203
|
-
const { deps, doc, events } = createHeadlessActions(children);
|
|
204
|
-
const controller = createUndoController(deps);
|
|
205
|
-
const rootContainerEdit = createContainerEditActions(deps, controller);
|
|
206
|
-
const rowsState = mountBlockListState(() => table);
|
|
207
|
-
// commitColumnEdit resolves each row via expectStateForNode — register them.
|
|
208
|
-
for (const row of table.children)
|
|
209
|
-
mountBlockListState(() => row);
|
|
210
|
-
const ctx = createTableMutationsContext({
|
|
211
|
-
get node() {
|
|
212
|
-
return table;
|
|
213
|
-
},
|
|
214
|
-
get myPath() {
|
|
215
|
-
return [tableIndex];
|
|
216
|
-
},
|
|
217
|
-
get rowsState() {
|
|
218
|
-
return rowsState;
|
|
219
|
-
},
|
|
220
|
-
get focusedCell() {
|
|
221
|
-
return { rowIdx: 0, colIdx: 0 };
|
|
222
|
-
},
|
|
223
|
-
parentContainerEdit: rootContainerEdit,
|
|
224
|
-
controller,
|
|
225
|
-
focusCell: () => { },
|
|
226
|
-
announceReorder: () => { }
|
|
227
|
-
});
|
|
228
|
-
return { ctx, deps, doc, events };
|
|
229
|
-
}
|
|
230
166
|
// ── (b) innermost-first ancestry rebuild ─────────────────────────────────────
|
|
231
167
|
export function checkInnermostFirstAncestry(kind, profile) {
|
|
232
168
|
const { source, leafPath } = profile.deepNesting;
|
|
@@ -237,16 +173,13 @@ export function checkInnermostFirstAncestry(kind, profile) {
|
|
|
237
173
|
assert(!leaf.children, 'leaf is editable (no children)');
|
|
238
174
|
const marker = `zzmark-${kind}`;
|
|
239
175
|
leaf.raw = marker + '\n';
|
|
240
|
-
// Fresh sharing state, no
|
|
241
|
-
//
|
|
242
|
-
rebuildUnsharedAncestry(doc, leafPath, createSharingState(), null,
|
|
176
|
+
// Fresh sharing state, no merge callback and the global grammar: the check covers only raw
|
|
177
|
+
// propagation, and the kit owns no ids to reconcile a splice with.
|
|
178
|
+
rebuildUnsharedAncestry(doc, leafPath, createSharingState(), null, defaultGrammarView);
|
|
243
179
|
assert(root.raw.includes(marker), `root raw reflects the deep leaf edit through "${kind}"`);
|
|
244
180
|
}
|
|
245
|
-
/**
|
|
246
|
-
*
|
|
247
|
-
* rebuild leaves the root stale for a strip/opaque container. Returns false for a
|
|
248
|
-
* container that re-derives its whole subtree (grid), which is why grid excuses ancestry.
|
|
249
|
-
*/
|
|
181
|
+
/** Shows the ancestry check can fail: an outer-to-inner rebuild leaves a strip or opaque root
|
|
182
|
+
* stale. False for a grid, which re-derives its whole subtree and so excuses ancestry. */
|
|
250
183
|
export function reversedAncestryLeavesRootStale(profile) {
|
|
251
184
|
const { source, leafPath } = profile.deepNesting;
|
|
252
185
|
const doc = parse(source);
|
|
@@ -254,88 +187,19 @@ export function reversedAncestryLeavesRootStale(profile) {
|
|
|
254
187
|
const leaf = nodeAtPath(doc, leafPath);
|
|
255
188
|
const marker = 'reversed-mark';
|
|
256
189
|
leaf.raw = marker + '\n';
|
|
257
|
-
const ancestors = [];
|
|
258
|
-
let cur = doc;
|
|
259
|
-
for (let depth = 0; depth < leafPath.length - 1; depth++) {
|
|
260
|
-
cur = cur.children[leafPath[depth]];
|
|
261
|
-
ancestors.push(cur);
|
|
262
|
-
}
|
|
263
190
|
// Outermost-first: each ancestor rebuilt before its descendants are fresh.
|
|
264
|
-
for (const
|
|
265
|
-
rebuildContainerRawIfContainer(
|
|
191
|
+
for (const ancestor of ancestorsOf(doc, leafPath))
|
|
192
|
+
rebuildContainerRawIfContainer(ancestor);
|
|
266
193
|
return !root.raw.includes(marker);
|
|
267
194
|
}
|
|
268
|
-
// ── (c) one undo entry per multi-scope op ────────────────────────────────────
|
|
269
|
-
/**
|
|
270
|
-
* A multi-scope op is kind-specific: it drives through the kind's own context, not a
|
|
271
|
-
* generic bundle, so only the built-ins that own one are dispatched here.
|
|
272
|
-
*/
|
|
273
|
-
export async function checkOneUndoPerMultiScope(kind) {
|
|
274
|
-
if (kind === 'list')
|
|
275
|
-
return checkListIndentOneUndo();
|
|
276
|
-
if (kind === 'table')
|
|
277
|
-
return checkTableColumnOneUndo();
|
|
278
|
-
fail(`"${kind}" asserts multiScope but the kit drives no multi-scope op for it — ` +
|
|
279
|
-
`declare the cell exempt if the kind owns no ≥2-scope op`);
|
|
280
|
-
}
|
|
281
|
-
async function checkListIndentOneUndo() {
|
|
282
|
-
// Indenting item 1 under item 0 spans outer-list + the new nested-list scope.
|
|
283
|
-
const list = firstChildOfKind('- alpha\n- beta\n', 'list');
|
|
284
|
-
const { deps } = createHeadlessActions([list]);
|
|
285
|
-
const controller = createUndoController(deps);
|
|
286
|
-
const listState = mountBlockListState(() => list);
|
|
287
|
-
// indentItem reaches into prevItem (item 0) via expectStateForNode — register each item.
|
|
288
|
-
for (const item of list.children)
|
|
289
|
-
mountBlockListState(() => item);
|
|
290
|
-
const ctx = createListContext({
|
|
291
|
-
scope: {
|
|
292
|
-
get index() {
|
|
293
|
-
return 0;
|
|
294
|
-
},
|
|
295
|
-
get node() {
|
|
296
|
-
return list;
|
|
297
|
-
},
|
|
298
|
-
get path() {
|
|
299
|
-
return [0];
|
|
300
|
-
}
|
|
301
|
-
},
|
|
302
|
-
state: listState,
|
|
303
|
-
parentBlockEdit: stubBlockEdit(),
|
|
304
|
-
parentFocus: recordingFocus(),
|
|
305
|
-
parentListContext: undefined,
|
|
306
|
-
controller,
|
|
307
|
-
getPresentationMode: undefined,
|
|
308
|
-
linkRef: undefined
|
|
309
|
-
});
|
|
310
|
-
const before = deps.undoManager.getStacks().undo.length;
|
|
311
|
-
await ctx.indentItem(1);
|
|
312
|
-
const after = deps.undoManager.getStacks().undo.length;
|
|
313
|
-
assertIs(after - before, 1, 'list indentItem (multi-scope) pushes exactly ONE undo entry');
|
|
314
|
-
assertIs(deps.doc.children[0].children.length, 1, 'item 1 was indented out of the outer list');
|
|
315
|
-
assertParseConverged(deps.doc, 'doc converges after a multi-scope strip op');
|
|
316
|
-
}
|
|
317
|
-
async function checkTableColumnOneUndo() {
|
|
318
|
-
const table = firstChildOfKind('| h1 | h2 |\n| --- | --- |\n| a | b |\n| c | d |\n', 'table');
|
|
319
|
-
const { ctx, deps } = mountTableMutations([table], 0);
|
|
320
|
-
const before = deps.undoManager.getStacks().undo.length;
|
|
321
|
-
await ctx.insertColumnRight(0);
|
|
322
|
-
const after = deps.undoManager.getStacks().undo.length;
|
|
323
|
-
assertIs(after - before, 1, 'table insertColumn (multi-scope) pushes exactly ONE undo entry');
|
|
324
|
-
assertParseConverged(deps.doc, 'doc converges after a multi-scope grid op');
|
|
325
|
-
}
|
|
326
195
|
// ── (d) focus-bubble termination at root ─────────────────────────────────────
|
|
327
|
-
/**
|
|
328
|
-
*
|
|
329
|
-
* outer at its own top edge → recording root) and assert it reaches the root exactly
|
|
330
|
-
* once. Driving the kind's own bundle rather than `dispatchMoveFocus` is what catches a
|
|
331
|
-
* container whose focus wiring re-enters or double-escapes.
|
|
332
|
-
*/
|
|
196
|
+
/** Bubbles an out-of-range ArrowUp through the kind's own focus bundle, under a blockquote at its
|
|
197
|
+
* top edge, and asserts the root sees it once, catching wiring that re-enters or escapes twice. */
|
|
333
198
|
export async function checkFocusBubbleTermination(kind, profile) {
|
|
334
199
|
const source = profile.focusSource;
|
|
335
200
|
if (!source)
|
|
336
201
|
fail('focusBubble asserts but the profile carries no focusSource');
|
|
337
|
-
const innerNode =
|
|
338
|
-
assert(innerNode, `focusSource contains a "${kind}" node`);
|
|
202
|
+
const innerNode = subjectNode(parse(source), kind, 'first', 'focusSource');
|
|
339
203
|
assert((innerNode.children?.length ?? 0) > 0, `"${kind}" node has children`);
|
|
340
204
|
const rootFocus = recordingFocus();
|
|
341
205
|
const focusRung = (node, index, focus) => createNestedFocus(mountBlockListState(() => node), {
|
|
@@ -344,9 +208,8 @@ export async function checkFocusBubbleTermination(kind, profile) {
|
|
|
344
208
|
return node;
|
|
345
209
|
},
|
|
346
210
|
path: [index],
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
linkRef: undefined,
|
|
211
|
+
caretMemory: stubCaretMemory(),
|
|
212
|
+
reading: kitReading(),
|
|
350
213
|
parent: { blockEdit: stubBlockEdit(), focus, containerEdit: {} }
|
|
351
214
|
});
|
|
352
215
|
// At its own top edge, so moveFocus(-1) must delegate to root rather than re-enter.
|
|
@@ -363,22 +226,17 @@ export async function checkFocusBubbleTermination(kind, profile) {
|
|
|
363
226
|
assertIs(bubbled[1], 'end', 'root received the bubbled position');
|
|
364
227
|
}
|
|
365
228
|
// ── (f) terminator collision ─────────────────────────────────────────────────
|
|
366
|
-
/**
|
|
367
|
-
*
|
|
368
|
-
* commit path uses) and require the live tree to still converge with a fresh parse. Convergence
|
|
369
|
-
* is the oracle, not byte round-trip: `serialize(parse(s)) === s` holds throughout a collision
|
|
370
|
-
* while the container silently stops containing what it says it does. A childless container
|
|
371
|
-
* (body in metadata) seats the same bytes through the fixture's own `writeBody`.
|
|
372
|
-
*/
|
|
229
|
+
/** Writes a terminator-shaped body line through `bodyWrite`, as the commit path does, and requires
|
|
230
|
+
* the tree to match a fresh parse, since byte round-trip holds even through a collision. */
|
|
373
231
|
export function checkTerminatorCollision(kind, profile) {
|
|
374
232
|
const fixture = profile.terminatorCollisionFixture;
|
|
375
233
|
if (!fixture)
|
|
376
234
|
fail('terminatorCollision asserts but the profile carries no terminatorCollisionFixture');
|
|
377
235
|
const doc = parse(fixture.source);
|
|
378
|
-
const node = doc
|
|
379
|
-
assertIs(node?.kind, kind, 'terminatorCollisionFixture source opens with a node of the kind');
|
|
236
|
+
const node = subjectNode(doc, kind, [0], 'terminatorCollisionFixture');
|
|
380
237
|
const bodyWrite = getBlockKindDescriptor(kind).bodyWrite;
|
|
381
|
-
const
|
|
238
|
+
const ctx = { node, mode: 'literal', lineEnding: documentLineEnding(doc) };
|
|
239
|
+
const body = bodyWrite ? bodyWrite.normalize(fixture.bodyRaw, ctx) : fixture.bodyRaw;
|
|
382
240
|
const children = node.children ?? [];
|
|
383
241
|
const before = node.raw;
|
|
384
242
|
if (children.length > 0) {
|
|
@@ -391,30 +249,60 @@ export function checkTerminatorCollision(kind, profile) {
|
|
|
391
249
|
}
|
|
392
250
|
fixture.writeBody(node, body);
|
|
393
251
|
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
//
|
|
252
|
+
// Through the chain rebuild a commit runs, which also re-reads the container's metadata.
|
|
253
|
+
rebuildUnsharedAncestry(doc, [0], createSharingState(), null, defaultGrammarView);
|
|
254
|
+
// Without this the cell passes on a container the write never reached, which is how a body
|
|
255
|
+
// written to the wrong place would look like it survived a collision it never saw.
|
|
397
256
|
assert(node.raw !== before, `the fixture body reached "${kind}"'s own bytes`);
|
|
398
257
|
assertParseConverged(doc, `${kind} survives a body line reproducing its terminator`);
|
|
399
258
|
}
|
|
259
|
+
/** An opaque container wraps its body between its own marker lines, so a body line can reproduce
|
|
260
|
+
* its closer whatever it declares; a declared `bodyWrite` is tested on any contract. */
|
|
261
|
+
function refuseExcusedCollision(kind) {
|
|
262
|
+
const descriptor = getBlockKindDescriptor(kind);
|
|
263
|
+
if (descriptor.containerContract !== 'opaque' && !descriptor.bodyWrite)
|
|
264
|
+
return;
|
|
265
|
+
fail(`${kind} ${descriptor.bodyWrite ? 'declares container.bodyWrite' : 'is an opaque container'}, ` +
|
|
266
|
+
`and a body line reproducing its terminator truncates it, so assert terminatorCollision ` +
|
|
267
|
+
`with a fixture whose body does`);
|
|
268
|
+
}
|
|
269
|
+
// ── (g) title row feeds no metadata ──────────────────────────────────────────
|
|
270
|
+
/** Written into the title row; distinctive enough that no fixture's title is it already. */
|
|
271
|
+
const TITLE_PROBE = 'probe title';
|
|
272
|
+
/** A title keystroke skips an opaque container's metadata re-read, so the row is written through
|
|
273
|
+
* that keystroke's rebuild and the tree has to match a fresh parse, every metadata key included. */
|
|
274
|
+
export function checkTitleRowFeedsNoMetadata(kind) {
|
|
275
|
+
const descriptor = getBlockKindDescriptor(kind);
|
|
276
|
+
const chromeKind = descriptor.reservedChrome?.kind;
|
|
277
|
+
if (descriptor.containerContract !== 'opaque' || chromeKind === undefined) {
|
|
278
|
+
return {
|
|
279
|
+
status: 'exempt',
|
|
280
|
+
detail: `"${kind}" has no title row whose keystrokes skip the metadata re-read`
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const fixture = descriptor.conformanceFixture;
|
|
284
|
+
if (fixture === undefined) {
|
|
285
|
+
fail(`${kind} declares a title row but carries no conformanceFixture to write it in`);
|
|
286
|
+
}
|
|
287
|
+
const doc = parse(fixture);
|
|
288
|
+
const leafPath = [...subjectPath(doc, kind, 'first', `${kind} conformanceFixture`), 0];
|
|
289
|
+
const title = nodeAtPath(doc, leafPath);
|
|
290
|
+
assertIs(title.kind, chromeKind, `${kind} conformanceFixture opens a "${kind}" with its title row`);
|
|
291
|
+
const leafPreviousRaw = title.raw;
|
|
292
|
+
title.raw = TITLE_PROBE + trailingLineEnding(title.raw, documentLineEnding(doc));
|
|
293
|
+
const sharing = createSharingState();
|
|
294
|
+
const chain = walkUnsharing(doc, leafPath, sharing, false);
|
|
295
|
+
rebuildUnsharedChain(doc, chain, sharing, null, defaultGrammarView, {
|
|
296
|
+
path: leafPath,
|
|
297
|
+
leafPreviousRaw
|
|
298
|
+
});
|
|
299
|
+
assertParseConverged(doc, `${kind} after a keystroke in its title row`);
|
|
300
|
+
}
|
|
400
301
|
// ── (e) declaration sanity ───────────────────────────────────────────────────
|
|
401
|
-
/**
|
|
402
|
-
*
|
|
403
|
-
* strategies because the nested dispatcher indexes them unguarded, and a capability whose only
|
|
404
|
-
* job is a cell's repair may not ship behind that cell's excuse.
|
|
405
|
-
*/
|
|
302
|
+
/** Holds the kind to its declarations: an `unwrapRole` names implemented strategies, which the
|
|
303
|
+
* nested dispatcher indexes unguarded. */
|
|
406
304
|
export function checkDeclarationSanity(kind, profile) {
|
|
407
305
|
const descriptor = getBlockKindDescriptor(kind);
|
|
408
|
-
// Grammatical, not declared: an opaque container wraps its body between chrome lines of its
|
|
409
|
-
// own, so a body line CAN reproduce its closer whether or not the kind declares the repair.
|
|
410
|
-
// The bodyWrite arm stays because a declared repair must be probed on any contract.
|
|
411
|
-
const owesCollisionAnswer = descriptor.containerContract === 'opaque' || !!descriptor.bodyWrite;
|
|
412
|
-
if (owesCollisionAnswer && profile.terminatorCollision.mode !== 'assert') {
|
|
413
|
-
fail(`${kind} ${descriptor.bodyWrite ? 'declares container.bodyWrite' : 'is an opaque container'} ` +
|
|
414
|
-
`but its profile marks terminatorCollision "${profile.terminatorCollision.mode}" — a body ` +
|
|
415
|
-
`line reproducing the terminator truncates the container, so assert the cell with a ` +
|
|
416
|
-
`fixture whose body does`);
|
|
417
|
-
}
|
|
418
306
|
const role = descriptor.unwrapRole;
|
|
419
307
|
if (role) {
|
|
420
308
|
assertIs(typeof firstChildUnwrapStrategies[role.firstChildBackspace], 'function', `${kind} first-child unwrap strategy "${role.firstChildBackspace}" is implemented`);
|
|
@@ -427,40 +315,33 @@ export function checkDeclarationSanity(kind, profile) {
|
|
|
427
315
|
assertIs(typeof descriptor.containerPaste.siblingAbsorb, 'boolean', `${kind} containerPaste.siblingAbsorb is boolean`);
|
|
428
316
|
}
|
|
429
317
|
assertIs(typeof descriptor.rebuildRaw, 'function', `${kind} declares rebuildRaw`);
|
|
430
|
-
const node =
|
|
431
|
-
assert(node, `deepNesting fixture contains a "${kind}" node`);
|
|
318
|
+
const node = subjectNode(parse(profile.deepNesting.source), kind, 'first', 'deepNesting');
|
|
432
319
|
assertRebuildIsParseCanonical(descriptor, node, kind);
|
|
433
320
|
assertHintedRebuildMatchesFull(kind, descriptor, node);
|
|
434
321
|
assertBodyWrapMatchesParse(kind, descriptor);
|
|
435
322
|
assertContentStartSpaceIsRebuilt(kind, descriptor);
|
|
436
323
|
}
|
|
437
|
-
/**
|
|
438
|
-
*
|
|
439
|
-
* rebuilt with and without it are the same bytes. A rebuilder that ignores the hint passes here
|
|
440
|
-
* by construction, which is what makes the argument optional to adopt.
|
|
441
|
-
*/
|
|
324
|
+
/** `rebuildRaw`'s changed-child hint is a shortcut, never a different answer: the same children
|
|
325
|
+
* rebuilt with and without it give the same bytes. */
|
|
442
326
|
function assertHintedRebuildMatchesFull(kind, descriptor, node) {
|
|
443
327
|
const children = node.children;
|
|
444
328
|
if (!children?.length)
|
|
445
329
|
return;
|
|
446
330
|
const index = children.length - 1;
|
|
447
331
|
const previousRaw = children[index].raw;
|
|
448
|
-
// Doubling keeps
|
|
449
|
-
//
|
|
332
|
+
// Doubling keeps the child's own line shape, and with one operand the cross-node join check
|
|
333
|
+
// still reads it as the kind re-emitting its own bytes.
|
|
450
334
|
children[index].raw = previousRaw.repeat(2);
|
|
451
335
|
descriptor.rebuildRaw(node, { index, previousRaw });
|
|
452
336
|
const hinted = node.raw;
|
|
453
337
|
descriptor.rebuildRaw(node);
|
|
454
338
|
assertIs(hinted, node.raw, `${kind} rebuildRaw writes the same bytes for a changed-child hint as for a full rebuild`);
|
|
455
339
|
}
|
|
456
|
-
/** The content
|
|
457
|
-
* in it by accident. */
|
|
340
|
+
/** The content these checks write into a body child, distinctive enough that no fixture line
|
|
341
|
+
* ends in it by accident. */
|
|
458
342
|
const CONTENT_START_PROBE = 'probe';
|
|
459
|
-
/**
|
|
460
|
-
*
|
|
461
|
-
* rebuild mints that space back on a content line. A declarer whose rebuild does not eats the
|
|
462
|
-
* keystroke instead of deferring it.
|
|
463
|
-
*/
|
|
343
|
+
/** `container.contentStartSpace` swallows the user's space, so the rebuild must write it back on a
|
|
344
|
+
* content line or the keystroke is lost. */
|
|
464
345
|
function assertContentStartSpaceIsRebuilt(kind, descriptor) {
|
|
465
346
|
if (descriptor.contentStartSpace !== 'complete-marker')
|
|
466
347
|
return;
|
|
@@ -468,12 +349,13 @@ function assertContentStartSpaceIsRebuilt(kind, descriptor) {
|
|
|
468
349
|
if (fixture === undefined) {
|
|
469
350
|
fail(`${kind} declares container.contentStartSpace but carries no conformanceFixture to probe`);
|
|
470
351
|
}
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
//
|
|
352
|
+
const doc = parse(fixture);
|
|
353
|
+
const node = subjectNode(doc, kind, 'first', `${kind} conformanceFixture`);
|
|
354
|
+
assert(node.children?.length, `${kind} conformanceFixture opens a "${kind}" with a body child`);
|
|
355
|
+
// The last child, so a reserved title child (a heading, a summary) stays put: its own line
|
|
356
|
+
// already carries the opener's space, and rebuilding over it would test the wrong line.
|
|
475
357
|
const last = node.children[node.children.length - 1];
|
|
476
|
-
last.raw = CONTENT_START_PROBE +
|
|
358
|
+
last.raw = CONTENT_START_PROBE + trailingLineEnding(last.raw, documentLineEnding(doc));
|
|
477
359
|
descriptor.rebuildRaw(node);
|
|
478
360
|
const lines = splitLines(node.raw)
|
|
479
361
|
.map((line) => line.text)
|
|
@@ -484,13 +366,10 @@ function assertContentStartSpaceIsRebuilt(kind, descriptor) {
|
|
|
484
366
|
`child holding "${CONTENT_START_PROBE}" — the consumed space is only deferred where the ` +
|
|
485
367
|
`rebuild re-emits the marker's own trailing space on a content line`);
|
|
486
368
|
}
|
|
487
|
-
/**
|
|
488
|
-
*
|
|
489
|
-
* a freed blank line belongs to the wrap, and a kind whose parse disagrees loses its body head
|
|
490
|
-
* on reload (`tree-operations/settle.clearRedundantSeparator`).
|
|
491
|
-
*/
|
|
369
|
+
/** `container.bodyWrap` is tested, not trusted: `clearRedundantSeparator` reads it to place a freed
|
|
370
|
+
* blank line, and a kind whose parse disagrees loses the start of its body on reload. */
|
|
492
371
|
function assertBodyWrapMatchesParse(kind, descriptor) {
|
|
493
|
-
if (descriptor
|
|
372
|
+
if (isGridDescriptor(descriptor))
|
|
494
373
|
return;
|
|
495
374
|
const fixture = descriptor.conformanceFixture;
|
|
496
375
|
if (fixture === undefined) {
|
|
@@ -498,28 +377,23 @@ function assertBodyWrapMatchesParse(kind, descriptor) {
|
|
|
498
377
|
`the declaration in both directions, so every non-grid container needs a fixture ` +
|
|
499
378
|
`whose top level opens a "${kind}" carrying a body`);
|
|
500
379
|
}
|
|
501
|
-
// A kind with no
|
|
502
|
-
//
|
|
503
|
-
// shared `:::`.
|
|
380
|
+
// A kind with no recognizer of its own (listItem) is tested where the fixture nests it; a
|
|
381
|
+
// directive kind's recognizer is the shared `:::`, which the opener registry does not list.
|
|
504
382
|
const doc = parse(fixture);
|
|
505
383
|
const opensAtTop = isBlockOpenerRegistered(kind) || isDirectiveKind(kind);
|
|
506
|
-
const
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
`asserted`);
|
|
513
|
-
// A container that keeps its body in metadata parses childless, so there is no body child for a
|
|
514
|
-
// blank line to peel off — the probe has nothing to run and the declaration must be absent,
|
|
515
|
-
// since a wrap the parse can never perform would tell the separator settle a falsehood.
|
|
384
|
+
const path = subjectPath(doc, kind, 'first', `${kind} conformanceFixture`);
|
|
385
|
+
assert(!opensAtTop || path.length === 1, `${kind} conformanceFixture must open a "${kind}" at the top level — the bodyWrap probe ` +
|
|
386
|
+
`rebuilds that node and reparses its bytes as a document of their own`);
|
|
387
|
+
const node = nodeAtPath(doc, path);
|
|
388
|
+
// A container whose body lives in metadata parses childless, so it has no wrap to test and
|
|
389
|
+
// must declare none: the blank-line fix-up would trust a wrap the parse never performs.
|
|
516
390
|
if (!node.children?.length) {
|
|
517
391
|
assertIs(descriptor.bodyWrap?.afterOpenerLine, undefined, `${kind} parses childless (its body lives in metadata), so a blank line against its ` +
|
|
518
392
|
`opener belongs to that body — drop the container.bodyWrap declaration`);
|
|
519
393
|
return;
|
|
520
394
|
}
|
|
521
395
|
const expected = node.children.length;
|
|
522
|
-
const ending = trailingLineEnding(node.raw)
|
|
396
|
+
const ending = trailingLineEnding(node.raw, documentLineEnding(doc));
|
|
523
397
|
node.innerPrefix = '';
|
|
524
398
|
descriptor.rebuildRaw(node);
|
|
525
399
|
const withoutPrefix = node.raw;
|