@portabletext/editor 3.3.2 → 3.3.4

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.
Files changed (307) hide show
  1. package/lib/_chunks-dts/index.d.ts +7 -1
  2. package/package.json +16 -19
  3. package/src/behaviors/_exports/index.ts +0 -1
  4. package/src/behaviors/behavior.abstract.annotation.ts +0 -77
  5. package/src/behaviors/behavior.abstract.decorator.ts +0 -39
  6. package/src/behaviors/behavior.abstract.delete.ts +0 -273
  7. package/src/behaviors/behavior.abstract.deserialize.ts +0 -232
  8. package/src/behaviors/behavior.abstract.insert.ts +0 -525
  9. package/src/behaviors/behavior.abstract.keyboard.ts +0 -189
  10. package/src/behaviors/behavior.abstract.list-item.ts +0 -70
  11. package/src/behaviors/behavior.abstract.move.ts +0 -79
  12. package/src/behaviors/behavior.abstract.select.ts +0 -118
  13. package/src/behaviors/behavior.abstract.serialize.ts +0 -96
  14. package/src/behaviors/behavior.abstract.split.ts +0 -170
  15. package/src/behaviors/behavior.abstract.style.ts +0 -55
  16. package/src/behaviors/behavior.abstract.ts +0 -139
  17. package/src/behaviors/behavior.config.ts +0 -7
  18. package/src/behaviors/behavior.core.annotations.ts +0 -62
  19. package/src/behaviors/behavior.core.block-element.ts +0 -116
  20. package/src/behaviors/behavior.core.block-objects.ts +0 -285
  21. package/src/behaviors/behavior.core.decorators.ts +0 -44
  22. package/src/behaviors/behavior.core.dnd.ts +0 -356
  23. package/src/behaviors/behavior.core.insert-break.ts +0 -266
  24. package/src/behaviors/behavior.core.insert.ts +0 -52
  25. package/src/behaviors/behavior.core.lists.ts +0 -691
  26. package/src/behaviors/behavior.core.ts +0 -44
  27. package/src/behaviors/behavior.perform-event.ts +0 -354
  28. package/src/behaviors/behavior.types.action.ts +0 -102
  29. package/src/behaviors/behavior.types.behavior.ts +0 -83
  30. package/src/behaviors/behavior.types.event.ts +0 -667
  31. package/src/behaviors/behavior.types.guard.ts +0 -11
  32. package/src/behaviors/index.ts +0 -17
  33. package/src/converters/converter.json.ts +0 -53
  34. package/src/converters/converter.portable-text.deserialize.test.ts +0 -680
  35. package/src/converters/converter.portable-text.ts +0 -75
  36. package/src/converters/converter.text-html.deserialize.test.ts +0 -406
  37. package/src/converters/converter.text-html.serialize.test.ts +0 -246
  38. package/src/converters/converter.text-html.ts +0 -87
  39. package/src/converters/converter.text-markdown.ts +0 -67
  40. package/src/converters/converter.text-plain.test.ts +0 -245
  41. package/src/converters/converter.text-plain.ts +0 -126
  42. package/src/converters/converter.types.ts +0 -72
  43. package/src/converters/converters.core.ts +0 -18
  44. package/src/editor/Editable.tsx +0 -1012
  45. package/src/editor/PortableTextEditor.tsx +0 -791
  46. package/src/editor/components/drop-indicator.tsx +0 -17
  47. package/src/editor/components/render-block-object.tsx +0 -121
  48. package/src/editor/components/render-default-object.tsx +0 -21
  49. package/src/editor/components/render-element.tsx +0 -88
  50. package/src/editor/components/render-inline-object.tsx +0 -129
  51. package/src/editor/components/render-leaf.tsx +0 -64
  52. package/src/editor/components/render-span.tsx +0 -303
  53. package/src/editor/components/render-text-block.tsx +0 -265
  54. package/src/editor/components/render-text.tsx +0 -18
  55. package/src/editor/components/use-core-block-element-behaviors.ts +0 -39
  56. package/src/editor/create-editor.ts +0 -323
  57. package/src/editor/create-slate-editor.tsx +0 -64
  58. package/src/editor/editor-actor-context.ts +0 -4
  59. package/src/editor/editor-context.tsx +0 -7
  60. package/src/editor/editor-dom.ts +0 -220
  61. package/src/editor/editor-machine.ts +0 -751
  62. package/src/editor/editor-provider.tsx +0 -111
  63. package/src/editor/editor-schema.ts +0 -6
  64. package/src/editor/editor-selector.ts +0 -89
  65. package/src/editor/editor-snapshot.ts +0 -68
  66. package/src/editor/event-to-change.tsx +0 -49
  67. package/src/editor/hooks/usePortableTextEditor.ts +0 -25
  68. package/src/editor/hooks/usePortableTextEditorSelection.tsx +0 -28
  69. package/src/editor/mutation-machine.ts +0 -322
  70. package/src/editor/plugins/create-with-event-listeners.ts +0 -271
  71. package/src/editor/plugins/createWithEditableAPI.ts +0 -529
  72. package/src/editor/plugins/createWithHotKeys.ts +0 -68
  73. package/src/editor/plugins/createWithObjectKeys.ts +0 -289
  74. package/src/editor/plugins/createWithPatches.ts +0 -272
  75. package/src/editor/plugins/createWithPortableTextMarkModel.ts +0 -559
  76. package/src/editor/plugins/createWithSchemaTypes.ts +0 -121
  77. package/src/editor/plugins/slate-plugin.update-selection.ts +0 -51
  78. package/src/editor/plugins/slate-plugin.update-value.ts +0 -46
  79. package/src/editor/plugins/with-plugins.ts +0 -69
  80. package/src/editor/range-decorations-machine.ts +0 -421
  81. package/src/editor/relay-actor-context.ts +0 -4
  82. package/src/editor/relay-machine.ts +0 -152
  83. package/src/editor/sync-machine.ts +0 -961
  84. package/src/editor/use-editor.ts +0 -27
  85. package/src/editor/validate-selection-machine.test.ts +0 -47
  86. package/src/editor/validate-selection-machine.ts +0 -149
  87. package/src/editor/weakMaps.ts +0 -15
  88. package/src/editor/with-normalizing-node.ts +0 -14
  89. package/src/editor/with-performing-behavior-operation.ts +0 -21
  90. package/src/editor/withChanges.ts +0 -13
  91. package/src/editor/without-normalizing-conditional.ts +0 -13
  92. package/src/editor/withoutPatching.ts +0 -14
  93. package/src/editor.ts +0 -59
  94. package/src/history/behavior.operation.history.redo.ts +0 -67
  95. package/src/history/behavior.operation.history.undo.ts +0 -71
  96. package/src/history/event.history.undo.test.tsx +0 -672
  97. package/src/history/history.preserving-keys.test.tsx +0 -112
  98. package/src/history/remote-patches.ts +0 -20
  99. package/src/history/slate-plugin.history.ts +0 -142
  100. package/src/history/slate-plugin.redoing.ts +0 -21
  101. package/src/history/slate-plugin.undoing.ts +0 -21
  102. package/src/history/slate-plugin.without-history.ts +0 -23
  103. package/src/history/transform-operation.ts +0 -245
  104. package/src/history/undo-redo-collaboration.test.tsx +0 -541
  105. package/src/history/undo-redo.feature +0 -125
  106. package/src/history/undo-redo.test.tsx +0 -195
  107. package/src/history/undo-step.ts +0 -148
  108. package/src/index.ts +0 -98
  109. package/src/internal-utils/__tests__/ranges.test.ts +0 -23
  110. package/src/internal-utils/__tests__/values.test.ts +0 -110
  111. package/src/internal-utils/apply-operation-to-portable-text.test.ts +0 -1861
  112. package/src/internal-utils/apply-operation-to-portable-text.ts +0 -615
  113. package/src/internal-utils/applyPatch.ts +0 -644
  114. package/src/internal-utils/block-keys.ts +0 -9
  115. package/src/internal-utils/build-index-maps.test.ts +0 -464
  116. package/src/internal-utils/build-index-maps.ts +0 -131
  117. package/src/internal-utils/collapse-selection.ts +0 -36
  118. package/src/internal-utils/compound-client-rect.ts +0 -28
  119. package/src/internal-utils/create-placeholder-block.ts +0 -21
  120. package/src/internal-utils/create-test-snapshot.ts +0 -28
  121. package/src/internal-utils/debug.ts +0 -12
  122. package/src/internal-utils/editor-selection.test.ts +0 -44
  123. package/src/internal-utils/editor-selection.ts +0 -56
  124. package/src/internal-utils/event-position.ts +0 -318
  125. package/src/internal-utils/global-scope.ts +0 -27
  126. package/src/internal-utils/globally-scoped-context.ts +0 -39
  127. package/src/internal-utils/is-hotkey.test.ts +0 -114
  128. package/src/internal-utils/is-hotkey.ts +0 -209
  129. package/src/internal-utils/mime-type.ts +0 -1
  130. package/src/internal-utils/move-range-by-operation.ts +0 -19
  131. package/src/internal-utils/operation-to-patches.test.ts +0 -522
  132. package/src/internal-utils/operation-to-patches.ts +0 -571
  133. package/src/internal-utils/portable-text-node.ts +0 -209
  134. package/src/internal-utils/schema.ts +0 -8
  135. package/src/internal-utils/selection-block-keys.ts +0 -20
  136. package/src/internal-utils/selection-focus-text.ts +0 -40
  137. package/src/internal-utils/selection-text.test.ts +0 -32
  138. package/src/internal-utils/selection-text.ts +0 -21
  139. package/src/internal-utils/selection.ts +0 -77
  140. package/src/internal-utils/sibling-utils.ts +0 -55
  141. package/src/internal-utils/slate-utils.test.tsx +0 -121
  142. package/src/internal-utils/slate-utils.ts +0 -417
  143. package/src/internal-utils/split-string.ts +0 -12
  144. package/src/internal-utils/stop-actor.ts +0 -43
  145. package/src/internal-utils/string-overlap.test.ts +0 -14
  146. package/src/internal-utils/string-overlap.ts +0 -28
  147. package/src/internal-utils/string-utils.ts +0 -7
  148. package/src/internal-utils/text-block-key.test.ts +0 -41
  149. package/src/internal-utils/text-block-key.ts +0 -26
  150. package/src/internal-utils/text-marks.test.ts +0 -41
  151. package/src/internal-utils/text-marks.ts +0 -22
  152. package/src/internal-utils/text-selection.test.ts +0 -211
  153. package/src/internal-utils/text-selection.ts +0 -121
  154. package/src/internal-utils/to-slate-range.test.ts +0 -278
  155. package/src/internal-utils/to-slate-range.ts +0 -171
  156. package/src/internal-utils/validateValue.ts +0 -443
  157. package/src/internal-utils/value-annotations.ts +0 -33
  158. package/src/internal-utils/values.test.ts +0 -282
  159. package/src/internal-utils/values.ts +0 -266
  160. package/src/keyboard-shortcuts/default-keyboard-shortcuts.ts +0 -146
  161. package/src/operations/behavior.operation.annotation.add.ts +0 -99
  162. package/src/operations/behavior.operation.annotation.remove.ts +0 -150
  163. package/src/operations/behavior.operation.block.set.ts +0 -104
  164. package/src/operations/behavior.operation.block.unset.ts +0 -54
  165. package/src/operations/behavior.operation.child.set.ts +0 -107
  166. package/src/operations/behavior.operation.child.unset.ts +0 -116
  167. package/src/operations/behavior.operation.decorator.add.ts +0 -131
  168. package/src/operations/behavior.operation.delete.ts +0 -294
  169. package/src/operations/behavior.operation.insert.block.ts +0 -495
  170. package/src/operations/behavior.operation.insert.child.ts +0 -129
  171. package/src/operations/behavior.operation.insert.text.ts +0 -8
  172. package/src/operations/behavior.operation.move.backward.ts +0 -12
  173. package/src/operations/behavior.operation.move.block.ts +0 -44
  174. package/src/operations/behavior.operation.move.forward.ts +0 -11
  175. package/src/operations/behavior.operation.select.ts +0 -27
  176. package/src/operations/behavior.operations.ts +0 -221
  177. package/src/plugins/_exports/index.ts +0 -1
  178. package/src/plugins/index.ts +0 -3
  179. package/src/plugins/plugin.behavior.tsx +0 -24
  180. package/src/plugins/plugin.editor-ref.tsx +0 -17
  181. package/src/plugins/plugin.event-listener.tsx +0 -68
  182. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +0 -71
  183. package/src/plugins/plugin.internal.auto-close-brackets.ts +0 -62
  184. package/src/plugins/plugin.internal.change-ref.tsx +0 -19
  185. package/src/plugins/plugin.internal.portable-text-editor-ref.tsx +0 -16
  186. package/src/plugins/plugin.internal.slate-editor-ref.tsx +0 -15
  187. package/src/priority/priority.core.ts +0 -3
  188. package/src/priority/priority.sort.test.ts +0 -319
  189. package/src/priority/priority.sort.ts +0 -123
  190. package/src/priority/priority.types.ts +0 -24
  191. package/src/selectors/_exports/index.ts +0 -1
  192. package/src/selectors/drag-selection.test.ts +0 -578
  193. package/src/selectors/drag-selection.ts +0 -118
  194. package/src/selectors/index.ts +0 -54
  195. package/src/selectors/selector.get-active-annotation-marks.ts +0 -12
  196. package/src/selectors/selector.get-active-annotations.ts +0 -36
  197. package/src/selectors/selector.get-active-decorators.ts +0 -29
  198. package/src/selectors/selector.get-active-list-item.ts +0 -38
  199. package/src/selectors/selector.get-active-style.ts +0 -38
  200. package/src/selectors/selector.get-anchor-block.ts +0 -22
  201. package/src/selectors/selector.get-anchor-child.ts +0 -36
  202. package/src/selectors/selector.get-anchor-span.ts +0 -17
  203. package/src/selectors/selector.get-anchor-text-block.ts +0 -18
  204. package/src/selectors/selector.get-block-offsets.ts +0 -34
  205. package/src/selectors/selector.get-caret-word-selection.test.ts +0 -284
  206. package/src/selectors/selector.get-caret-word-selection.ts +0 -134
  207. package/src/selectors/selector.get-first-block.ts +0 -14
  208. package/src/selectors/selector.get-focus-block-object.ts +0 -18
  209. package/src/selectors/selector.get-focus-block.ts +0 -23
  210. package/src/selectors/selector.get-focus-child.ts +0 -36
  211. package/src/selectors/selector.get-focus-inline-object.ts +0 -17
  212. package/src/selectors/selector.get-focus-list-block.ts +0 -18
  213. package/src/selectors/selector.get-focus-span.ts +0 -18
  214. package/src/selectors/selector.get-focus-text-block.ts +0 -18
  215. package/src/selectors/selector.get-last-block.ts +0 -16
  216. package/src/selectors/selector.get-mark-state.test.ts +0 -325
  217. package/src/selectors/selector.get-mark-state.ts +0 -263
  218. package/src/selectors/selector.get-next-block.ts +0 -29
  219. package/src/selectors/selector.get-next-inline-object.ts +0 -53
  220. package/src/selectors/selector.get-next-inline-objects.ts +0 -50
  221. package/src/selectors/selector.get-next-span.ts +0 -56
  222. package/src/selectors/selector.get-previous-block.ts +0 -29
  223. package/src/selectors/selector.get-previous-inline-object.ts +0 -50
  224. package/src/selectors/selector.get-previous-inline-objects.ts +0 -47
  225. package/src/selectors/selector.get-previous-span.ts +0 -53
  226. package/src/selectors/selector.get-selected-blocks.ts +0 -61
  227. package/src/selectors/selector.get-selected-spans.test.ts +0 -347
  228. package/src/selectors/selector.get-selected-spans.ts +0 -155
  229. package/src/selectors/selector.get-selected-text-blocks.ts +0 -73
  230. package/src/selectors/selector.get-selected-value.test.ts +0 -834
  231. package/src/selectors/selector.get-selected-value.ts +0 -66
  232. package/src/selectors/selector.get-selection-end-block.ts +0 -33
  233. package/src/selectors/selector.get-selection-end-child.ts +0 -33
  234. package/src/selectors/selector.get-selection-end-point.ts +0 -17
  235. package/src/selectors/selector.get-selection-start-block.ts +0 -33
  236. package/src/selectors/selector.get-selection-start-child.ts +0 -33
  237. package/src/selectors/selector.get-selection-start-point.ts +0 -17
  238. package/src/selectors/selector.get-selection-text.test.ts +0 -421
  239. package/src/selectors/selector.get-selection-text.ts +0 -27
  240. package/src/selectors/selector.get-selection.ts +0 -9
  241. package/src/selectors/selector.get-text-after.ts +0 -46
  242. package/src/selectors/selector.get-text-before.ts +0 -46
  243. package/src/selectors/selector.get-value.ts +0 -11
  244. package/src/selectors/selector.is-active-annotation.test.ts +0 -320
  245. package/src/selectors/selector.is-active-annotation.ts +0 -52
  246. package/src/selectors/selector.is-active-decorator.test.ts +0 -136
  247. package/src/selectors/selector.is-active-decorator.ts +0 -24
  248. package/src/selectors/selector.is-active-list-item.ts +0 -13
  249. package/src/selectors/selector.is-active-style.ts +0 -13
  250. package/src/selectors/selector.is-at-the-end-of-block.ts +0 -30
  251. package/src/selectors/selector.is-at-the-start-of-block.ts +0 -30
  252. package/src/selectors/selector.is-overlapping-selection.test.ts +0 -304
  253. package/src/selectors/selector.is-overlapping-selection.ts +0 -181
  254. package/src/selectors/selector.is-point-after-selection.ts +0 -97
  255. package/src/selectors/selector.is-point-before-selection.ts +0 -97
  256. package/src/selectors/selector.is-selecting-entire-blocks.ts +0 -43
  257. package/src/selectors/selector.is-selection-collapsed.ts +0 -17
  258. package/src/selectors/selector.is-selection-expanded.test.ts +0 -63
  259. package/src/selectors/selector.is-selection-expanded.ts +0 -9
  260. package/src/test/_exports/index.ts +0 -1
  261. package/src/test/gherkin-parameter-types.ts +0 -112
  262. package/src/test/index.ts +0 -1
  263. package/src/test/vitest/_exports/index.ts +0 -1
  264. package/src/test/vitest/index.ts +0 -3
  265. package/src/test/vitest/step-context.ts +0 -13
  266. package/src/test/vitest/step-definitions.tsx +0 -960
  267. package/src/test/vitest/test-editor.tsx +0 -198
  268. package/src/type-utils.ts +0 -29
  269. package/src/types/block-offset.ts +0 -9
  270. package/src/types/block-with-optional-key.ts +0 -25
  271. package/src/types/editor.ts +0 -509
  272. package/src/types/options.ts +0 -13
  273. package/src/types/paths.ts +0 -35
  274. package/src/types/slate-editor.ts +0 -50
  275. package/src/types/slate.ts +0 -27
  276. package/src/utils/_exports/index.ts +0 -1
  277. package/src/utils/asserters.ts +0 -9
  278. package/src/utils/index.ts +0 -24
  279. package/src/utils/key-generator.ts +0 -33
  280. package/src/utils/parse-blocks.test.ts +0 -836
  281. package/src/utils/parse-blocks.ts +0 -504
  282. package/src/utils/util.at-the-beginning-of-block.ts +0 -32
  283. package/src/utils/util.block-offset-to-block-selection-point.ts +0 -28
  284. package/src/utils/util.block-offset-to-selection-point.ts +0 -33
  285. package/src/utils/util.block-offset.test.ts +0 -375
  286. package/src/utils/util.block-offset.ts +0 -136
  287. package/src/utils/util.block-offsets-to-selection.ts +0 -38
  288. package/src/utils/util.child-selection-point-to-block-offset.ts +0 -51
  289. package/src/utils/util.get-block-end-point.ts +0 -35
  290. package/src/utils/util.get-block-start-point.ts +0 -31
  291. package/src/utils/util.get-selection-end-point.ts +0 -20
  292. package/src/utils/util.get-selection-start-point.ts +0 -20
  293. package/src/utils/util.get-text-block-text.ts +0 -8
  294. package/src/utils/util.is-empty-text-block.ts +0 -21
  295. package/src/utils/util.is-equal-selection-points.ts +0 -13
  296. package/src/utils/util.is-equal-selections.ts +0 -20
  297. package/src/utils/util.is-keyed-segment.ts +0 -8
  298. package/src/utils/util.is-selection-collapsed.ts +0 -16
  299. package/src/utils/util.is-selection-expanded.ts +0 -13
  300. package/src/utils/util.merge-text-blocks.ts +0 -40
  301. package/src/utils/util.reverse-selection.ts +0 -26
  302. package/src/utils/util.selection-point-to-block-offset.ts +0 -30
  303. package/src/utils/util.selection-point.ts +0 -22
  304. package/src/utils/util.slice-blocks.ts +0 -221
  305. package/src/utils/util.slice-text-block.test.ts +0 -190
  306. package/src/utils/util.slice-text-block.ts +0 -89
  307. package/src/utils/util.split-text-block.ts +0 -54
@@ -1,541 +0,0 @@
1
- import {getTersePt} from '@portabletext/test'
2
- import type {PortableTextBlock} from '@sanity/types'
3
- import {describe, expect, test, vi} from 'vitest'
4
- import {userEvent} from 'vitest/browser'
5
- import {
6
- getSelectionAfterText,
7
- getSelectionBeforeText,
8
- } from '../internal-utils/text-selection'
9
- import {createTestEditors} from '../test/vitest'
10
-
11
- function createInitialValue(text: string): Array<PortableTextBlock> {
12
- return [
13
- {
14
- _type: 'block',
15
- _key: 'b0',
16
- style: 'normal',
17
- markDefs: [],
18
- children: [
19
- {
20
- _type: 'span',
21
- _key: 'b0s0',
22
- marks: [],
23
- text,
24
- },
25
- ],
26
- },
27
- ]
28
- }
29
-
30
- describe('Undo/Redo Collaboration (hand-coded)', () => {
31
- test('will let editor A undo their change after B did an unrelated change (multi-line block)', async () => {
32
- const {editor, locator, editorB, locatorB} = await createTestEditors({
33
- initialValue: createInitialValue('First paragraph\n\nSecond paragraph!'),
34
- })
35
-
36
- await userEvent.click(locator)
37
-
38
- const selection = getSelectionAfterText(editor.getSnapshot().context, '!')
39
-
40
- editor.send({
41
- type: 'select',
42
- at: selection,
43
- })
44
-
45
- await vi.waitFor(() => {
46
- expect(editor.getSnapshot().context.selection).toEqual(selection)
47
- })
48
-
49
- await userEvent.type(locator, '?')
50
-
51
- await vi.waitFor(() => {
52
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
53
- 'First paragraph\n\nSecond paragraph!?',
54
- ])
55
- })
56
-
57
- await userEvent.click(locatorB)
58
-
59
- const selectionB = getSelectionBeforeText(
60
- editorB.getSnapshot().context,
61
- 'First',
62
- )
63
-
64
- editorB.send({
65
- type: 'select',
66
- at: selectionB,
67
- })
68
-
69
- await vi.waitFor(() => {
70
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
71
- })
72
-
73
- await userEvent.type(locatorB, 'Welcome')
74
-
75
- await userEvent.keyboard('{Shift>}{Enter}{/Shift}')
76
- await userEvent.keyboard('{Shift>}{Enter}{/Shift}')
77
-
78
- editor.send({
79
- type: 'history.undo',
80
- })
81
-
82
- await vi.waitFor(() => {
83
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
84
- 'Welcome\n\nFirst paragraph\n\nSecond paragraph!',
85
- ])
86
- })
87
- })
88
-
89
- // Flaky
90
- test.skip('undoing in reverse order as applied', async () => {
91
- const firstParagraph =
92
- '速ヒマヤレ誌相ルなあね日諸せ変評ホ真攻同潔ク作先た員勝どそ際接レゅ自17浅ッ実情スヤ籍認ス重力務鳥の。8平はートご多乗12青國暮整ル通国うれけこ能新ロコラハ元横ミ休探ミソ梓批ざょにね薬展むい本隣ば禁抗ワアミ部真えくト提知週むすほ。査ル人形ルおじつ政謙減セヲモ読見れレぞえ録精てざ定第ぐゆとス務接産ヤ写馬エモス聞氏サヘマ有午ごね客岡ヘロ修彩枝雨父のけリド。'
93
- const secondParagraph =
94
- '住ゅなぜ日16語約セヤチ任政崎ソオユ枠体ぞン古91一専泉給12関モリレネ解透ぴゃラぼ転地す球北ドざう記番重投ぼづ。期ゃ更緒リだすし夫内オ代他られくド潤刊本クヘフ伊一ウムニヘ感週け出入ば勇起ょ関図ぜ覧説めわぶ室訪おがト強車傾町コ本喰杜椿榎ほれた。暮る生的更芸窓どさはむ近問ラ入必ラニス療心コウ怒応りめけひ載総ア北吾ヌイヘ主最ニ余記エツヤ州5念稼め化浮ヌリ済毎養ぜぼ。'
95
- const {editor, locator, editorB, locatorB} = await createTestEditors({
96
- initialValue: createInitialValue(
97
- `${firstParagraph}\n\n${secondParagraph}`,
98
- ),
99
- })
100
-
101
- await userEvent.click(locator)
102
-
103
- const selection = getSelectionBeforeText(editor.getSnapshot().context, '速')
104
- editor.send({
105
- type: 'select',
106
- at: selection,
107
- })
108
- await vi.waitFor(() => {
109
- expect(editor.getSnapshot().context.selection).toEqual(selection)
110
- })
111
-
112
- await userEvent.type(locator, 'Paragraph 1: ')
113
-
114
- await vi.waitFor(() => {
115
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
116
- `Paragraph 1: ${firstParagraph}\n\n${secondParagraph}`,
117
- ])
118
- })
119
-
120
- await userEvent.click(locatorB)
121
-
122
- const selectionB = getSelectionAfterText(
123
- editorB.getSnapshot().context,
124
- 'ド。',
125
- )
126
- editorB.send({
127
- type: 'select',
128
- at: selectionB,
129
- })
130
- await vi.waitFor(() => {
131
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
132
- })
133
-
134
- await userEvent.type(locatorB, ' (end of paragraph 1)')
135
-
136
- await vi.waitFor(() => {
137
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
138
- `Paragraph 1: ${firstParagraph} (end of paragraph 1)\n\n${secondParagraph}`,
139
- ])
140
- })
141
-
142
- await userEvent.click(locator)
143
-
144
- const selectionC = getSelectionAfterText(
145
- editor.getSnapshot().context,
146
- 'ぼ。',
147
- )
148
- editor.send({
149
- type: 'select',
150
- at: selectionC,
151
- })
152
- await vi.waitFor(() => {
153
- expect(editor.getSnapshot().context.selection).toEqual(selectionC)
154
- })
155
-
156
- await userEvent.type(locator, '. EOL.')
157
-
158
- await vi.waitFor(() => {
159
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
160
- `Paragraph 1: ${firstParagraph} (end of paragraph 1)\n\n${secondParagraph}. EOL.`,
161
- ])
162
- })
163
-
164
- // Spaces in the text creates more undo steps
165
- editor.send({
166
- type: 'history.undo',
167
- })
168
- editor.send({
169
- type: 'history.undo',
170
- })
171
-
172
- await vi.waitFor(() => {
173
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
174
- `Paragraph 1: ${firstParagraph} (end of paragraph 1)\n\n${secondParagraph}`,
175
- ])
176
- })
177
-
178
- editorB.send({
179
- type: 'history.undo',
180
- })
181
- editorB.send({
182
- type: 'history.undo',
183
- })
184
- editorB.send({
185
- type: 'history.undo',
186
- })
187
- editorB.send({
188
- type: 'history.undo',
189
- })
190
-
191
- await vi.waitFor(() => {
192
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
193
- `Paragraph 1: ${firstParagraph}\n\n${secondParagraph}`,
194
- ])
195
- })
196
-
197
- editor.send({
198
- type: 'history.undo',
199
- })
200
- editor.send({
201
- type: 'history.undo',
202
- })
203
- editor.send({
204
- type: 'history.undo',
205
- })
206
-
207
- await vi.waitFor(() => {
208
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
209
- `${firstParagraph}\n\n${secondParagraph}`,
210
- ])
211
- })
212
- })
213
-
214
- test('undoing out-of-order', async () => {
215
- const firstParagraph = '速ド。'
216
- const secondParagraph = '住ぼ。'
217
- const {editor, editorB, locator, locatorB} = await createTestEditors({
218
- initialValue: createInitialValue(
219
- `${firstParagraph}\n\n${secondParagraph}`,
220
- ),
221
- })
222
-
223
- await userEvent.click(locator)
224
- const selection = getSelectionBeforeText(editor.getSnapshot().context, '速')
225
- editor.send({
226
- type: 'select',
227
- at: selection,
228
- })
229
- await vi.waitFor(() => {
230
- expect(editor.getSnapshot().context.selection).toEqual(selection)
231
- })
232
-
233
- await userEvent.type(locator, 'P1>')
234
-
235
- await vi.waitFor(() => {
236
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
237
- `P1>${firstParagraph}\n\n${secondParagraph}`,
238
- ])
239
- })
240
-
241
- await userEvent.click(locatorB)
242
- const selectionB = getSelectionAfterText(
243
- editorB.getSnapshot().context,
244
- 'ド。',
245
- )
246
- editorB.send({
247
- type: 'select',
248
- at: selectionB,
249
- })
250
- await vi.waitFor(() => {
251
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
252
- })
253
-
254
- await userEvent.type(locatorB, '/P1')
255
-
256
- await vi.waitFor(() => {
257
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
258
- `P1>${firstParagraph}/P1\n\n${secondParagraph}`,
259
- ])
260
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
261
- `P1>${firstParagraph}/P1\n\n${secondParagraph}`,
262
- ])
263
- })
264
-
265
- await userEvent.click(locator)
266
-
267
- const selectionC = getSelectionAfterText(
268
- editor.getSnapshot().context,
269
- 'ぼ。',
270
- )
271
- editor.send({
272
- type: 'select',
273
- at: selectionC,
274
- })
275
- await vi.waitFor(() => {
276
- expect(editor.getSnapshot().context.selection).toEqual(selectionC)
277
- })
278
-
279
- await userEvent.type(locator, '/P2')
280
-
281
- await vi.waitFor(() => {
282
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
283
- `P1>${firstParagraph}/P1\n\n${secondParagraph}/P2`,
284
- ])
285
- })
286
-
287
- editor.send({
288
- type: 'history.undo',
289
- })
290
- editor.send({
291
- type: 'history.undo',
292
- })
293
-
294
- await vi.waitFor(() => {
295
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
296
- `${firstParagraph}/P1\n\n${secondParagraph}`,
297
- ])
298
- })
299
-
300
- editorB.send({
301
- type: 'history.undo',
302
- })
303
-
304
- await vi.waitFor(() => {
305
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
306
- `${firstParagraph}\n\n${secondParagraph}`,
307
- ])
308
- })
309
- })
310
-
311
- test('editor A undo their change after B did an unrelated change (single-line, emoji)', async () => {
312
- const [beginning, middle, end] = [
313
- 'A curious 🦊 named Felix lived in the 🪄🌲 of Willowwood. One day, he discovered a mysterious 🕳️, which lead to a magical 🌌. ',
314
- 'In the Saturn of Celestia, Fox met a friendly Unicorn named Sparkle. ',
315
- 'They had extraordinary adventures together, befriending a 🧚, who gave them so many 📚 that they never lacked for reading material!',
316
- ]
317
- const {editor, locator, editorB, locatorB} = await createTestEditors({
318
- initialValue: createInitialValue(`${beginning}${end}`),
319
- })
320
-
321
- await userEvent.click(locator)
322
-
323
- const selection = getSelectionAfterText(editor.getSnapshot().context, '!')
324
- editor.send({
325
- type: 'select',
326
- at: selection,
327
- })
328
- await vi.waitFor(() => {
329
- expect(editor.getSnapshot().context.selection).toEqual(selection)
330
- })
331
-
332
- await userEvent.keyboard('{Backspace}')
333
-
334
- await vi.waitFor(() => {
335
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
336
- `${beginning}${end.slice(0, -1)}`,
337
- ])
338
- })
339
-
340
- await userEvent.click(locatorB)
341
-
342
- const selectionB = getSelectionAfterText(
343
- editorB.getSnapshot().context,
344
- '🌌. ',
345
- )
346
- editorB.send({
347
- type: 'select',
348
- at: selectionB,
349
- })
350
- await vi.waitFor(() => {
351
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
352
- })
353
-
354
- await userEvent.type(locatorB, middle)
355
-
356
- await vi.waitFor(() => {
357
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
358
- `${beginning}${middle}${end.slice(0, -1)}`,
359
- ])
360
- })
361
-
362
- editor.send({
363
- type: 'history.undo',
364
- })
365
-
366
- await vi.waitFor(() => {
367
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
368
- `${beginning}${middle}${end}`,
369
- ])
370
- })
371
- })
372
-
373
- test('editor A undo their change after B did an unrelated change (multi-line block, emoji)', async () => {
374
- const initialText = `In the 🪐 of Celestia, 🦊 met a friendly 🌈🦄 named Sparkle.\n\nThey had extraordinary adventures together, befriending a 🧚, who gave them so many 📚 that they never lacked for reading material!`
375
- const {editor, locator, editorB, locatorB} = await createTestEditors({
376
- initialValue: createInitialValue(initialText),
377
- })
378
-
379
- await userEvent.click(locator)
380
- const selection = getSelectionAfterText(editor.getSnapshot().context, '!')
381
- editor.send({
382
- type: 'select',
383
- at: selection,
384
- })
385
- await vi.waitFor(() => {
386
- expect(editor.getSnapshot().context.selection).toEqual(selection)
387
- })
388
- await userEvent.keyboard('{Backspace}')
389
-
390
- await vi.waitFor(() => {
391
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
392
- `${initialText.slice(0, -1)}`,
393
- ])
394
- })
395
-
396
- await userEvent.click(locatorB)
397
-
398
- const selectionB = getSelectionBeforeText(
399
- editorB.getSnapshot().context,
400
- 'In',
401
- )
402
- editorB.send({
403
- type: 'select',
404
- at: selectionB,
405
- })
406
- await vi.waitFor(() => {
407
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
408
- })
409
- const newPrefix = 'New prefix.'
410
- await userEvent.type(locatorB, newPrefix)
411
-
412
- await vi.waitFor(() => {
413
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
414
- `${newPrefix}${initialText.slice(0, -1)}`,
415
- ])
416
- })
417
-
418
- await userEvent.click(locatorB)
419
-
420
- const selectionC = getSelectionAfterText(
421
- editorB.getSnapshot().context,
422
- newPrefix,
423
- )
424
- editorB.send({
425
- type: 'select',
426
- at: selectionC,
427
- })
428
- await vi.waitFor(() => {
429
- expect(editorB.getSnapshot().context.selection).toEqual(selectionC)
430
- })
431
-
432
- editorB.send({
433
- type: 'insert.soft break',
434
- })
435
- editorB.send({
436
- type: 'insert.soft break',
437
- })
438
-
439
- await vi.waitFor(() => {
440
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
441
- `${newPrefix}\n\n${initialText.slice(0, -1)}`,
442
- ])
443
- })
444
-
445
- editor.send({
446
- type: 'history.undo',
447
- })
448
-
449
- await vi.waitFor(() => {
450
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
451
- `${newPrefix}\n\n${initialText}`,
452
- ])
453
- })
454
- })
455
-
456
- test('editor A undo their change after B did an unrelated change (multi-line block, kanji)', async () => {
457
- const initialText = `彼は、偉大な番兵がまさに尾根の頂上にいて、裸足では地面から最も低い枝にあることを知っていた。 彼は腹ばいになって雪と泥の中に滑り込み、下の何もない空き地を見下ろした。\n\n彼の心臓は胸の中で止まった。 しばらくの間、彼は息をすることさえできなかった。 月明かりは空き地、キャンプファイヤーの灰、雪に覆われた斜面、大きな岩、半分凍った小さな小川を照らしていました。すべては数1時間前とまったく同じでした。`
458
- const {editor, locator, editorB, locatorB} = await createTestEditors({
459
- initialValue: createInitialValue(initialText),
460
- })
461
-
462
- await userEvent.click(locator)
463
- const selection = getSelectionAfterText(
464
- editor.getSnapshot().context,
465
- 'じでした。',
466
- )
467
- editor.send({
468
- type: 'select',
469
- at: selection,
470
- })
471
- await vi.waitFor(() => {
472
- expect(editor.getSnapshot().context.selection).toEqual(selection)
473
- })
474
-
475
- await userEvent.keyboard('{Backspace}')
476
-
477
- await vi.waitFor(() => {
478
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
479
- `${initialText.slice(0, -1)}`,
480
- ])
481
- })
482
-
483
- const newPrefix = 'new prefix'
484
-
485
- await userEvent.click(locatorB)
486
- const selectionB = getSelectionBeforeText(
487
- editorB.getSnapshot().context,
488
- '彼は、',
489
- )
490
- editorB.send({
491
- type: 'select',
492
- at: selectionB,
493
- })
494
- await vi.waitFor(() => {
495
- expect(editorB.getSnapshot().context.selection).toEqual(selectionB)
496
- })
497
-
498
- await userEvent.type(locatorB, newPrefix)
499
-
500
- await vi.waitFor(() => {
501
- expect(getTersePt(editorB.getSnapshot().context)).toEqual([
502
- `${newPrefix}${initialText.slice(0, -1)}`,
503
- ])
504
- })
505
-
506
- const selectionC = getSelectionAfterText(
507
- editorB.getSnapshot().context,
508
- newPrefix,
509
- )
510
- editorB.send({
511
- type: 'select',
512
- at: selectionC,
513
- })
514
- await vi.waitFor(() => {
515
- expect(editorB.getSnapshot().context.selection).toEqual(selectionC)
516
- })
517
-
518
- editorB.send({
519
- type: 'insert.soft break',
520
- })
521
- editorB.send({
522
- type: 'insert.soft break',
523
- })
524
-
525
- await vi.waitFor(() => {
526
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
527
- `${newPrefix}\n\n${initialText.slice(0, -1)}`,
528
- ])
529
- })
530
-
531
- editor.send({
532
- type: 'history.undo',
533
- })
534
-
535
- await vi.waitFor(() => {
536
- expect(getTersePt(editor.getSnapshot().context)).toEqual([
537
- `${newPrefix}\n\n${initialText}`,
538
- ])
539
- })
540
- })
541
- })
@@ -1,125 +0,0 @@
1
- Feature: Undo/Redo
2
-
3
- Background:
4
- Given a global keymap
5
-
6
- Scenario: Undoing writing two words
7
- Given the text ""
8
- When "foo" is typed
9
- And " bar" is typed
10
- And undo is performed
11
- Then the text is "foo"
12
-
13
- Scenario: Selection change does not affect the undo stack
14
- Given the text ""
15
- When "foo" is typed
16
- And "{ArrowLeft}" is pressed
17
- And "bar" is typed
18
- Then the text is "fobaro"
19
- When undo is performed
20
- Then the text is "foo"
21
-
22
- Scenario: Undoing annotation
23
- Given the text "foo"
24
- When "foo" is selected
25
- And "link" is toggled
26
- And undo is performed
27
- Then the text is "foo"
28
- And "foo" has no marks
29
-
30
- Scenario: Undoing the deletion of the last char of annotated text
31
- Given the text "foo"
32
- And a "comment" "c1" around "foo"
33
- When "{ArrowRight}" is pressed
34
- And "{Backspace}" is pressed
35
- And undo is performed
36
- Then the text is "foo"
37
- And "foo" has marks "c1"
38
-
39
- Scenario: Redoing the deletion of the last char of annotated text
40
- Given the text "foo"
41
- And a "comment" "c1" around "foo"
42
- When "{ArrowRight}" is pressed
43
- And "{Backspace}" is pressed
44
- And undo is performed
45
- When redo is performed
46
- Then the text is "fo"
47
- And "fo" has marks "c1"
48
-
49
- Scenario: Undoing inserting text after annotated text
50
- Given the text "foo"
51
- And a "comment" "c1" around "foo"
52
- When "{ArrowRight}" is pressed
53
- And "{Space}" is pressed
54
- Then the text is "foo, "
55
- And "foo" has marks "c1"
56
- And " " has no marks
57
- When undo is performed
58
- Then the text is "foo"
59
- And "foo" has marks "c1"
60
-
61
- Scenario: Undoing and redoing inserting text after annotated text
62
- Given the text "foo"
63
- And a "comment" "c1" around "foo"
64
- When "{ArrowRight}" is pressed
65
- And "{Space}" is pressed
66
- And undo is performed
67
- Then the text is "foo"
68
- And "foo" has marks "c1"
69
- When redo is performed
70
- Then the text is "foo, "
71
- And "foo" has marks "c1"
72
- And " " has no marks
73
-
74
- Scenario: Undoing the deletion of block with annotation at the end
75
- Given the text "foo bar"
76
- And a "comment" "c1" around "bar"
77
- When "foo bar" is selected
78
- And "{Backspace}" is pressed
79
- And undo is performed
80
- Then the text is "foo ,bar"
81
- And "bar" has marks "c1"
82
-
83
- Scenario: Undoing deletion of annotated block
84
- Given the text "foo"
85
- And a "comment" "c1" around "foo"
86
- When "{Backspace}" is pressed
87
- And undo is performed
88
- Then the text is "foo"
89
- And "foo" has marks "c1"
90
-
91
- Scenario: Undoing annotation across text blocks
92
- Given the text "foo"
93
- When "{Enter}" is pressed
94
- And "bar" is typed
95
- And "foobar" is selected
96
- And "link" is toggled
97
- And undo is performed
98
- Then the text is "foo|bar"
99
- And "foo" has no marks
100
- And "bar" has no marks
101
-
102
- Scenario: Undoing action step
103
- Given the text "-"
104
- When ">" is typed
105
- Then the text is "→"
106
- When undo is performed
107
- Then the text is "->"
108
-
109
- Scenario: Consecutive undo after selection change
110
- Given the text "-"
111
- When ">" is typed
112
- And undo is performed
113
- And "{ArrowLeft}" is pressed
114
- And undo is performed
115
- Then the text is "-"
116
-
117
- Scenario: Undo after transform on expanded selection
118
- Given the text "(cf"
119
- When "f" is selected
120
- And ")" is inserted
121
- Then the text is "©"
122
- When undo is performed
123
- Then the text is "(c)"
124
- When undo is performed
125
- Then the text is "(cf"