@portabletext/editor 3.3.3 → 3.3.5

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 (309) hide show
  1. package/lib/_chunks-dts/index.d.ts +21 -1667
  2. package/lib/index.js +511 -9010
  3. package/lib/index.js.map +1 -1
  4. package/package.json +14 -15
  5. package/src/behaviors/_exports/index.ts +0 -1
  6. package/src/behaviors/behavior.abstract.annotation.ts +0 -77
  7. package/src/behaviors/behavior.abstract.decorator.ts +0 -39
  8. package/src/behaviors/behavior.abstract.delete.ts +0 -273
  9. package/src/behaviors/behavior.abstract.deserialize.ts +0 -232
  10. package/src/behaviors/behavior.abstract.insert.ts +0 -525
  11. package/src/behaviors/behavior.abstract.keyboard.ts +0 -189
  12. package/src/behaviors/behavior.abstract.list-item.ts +0 -70
  13. package/src/behaviors/behavior.abstract.move.ts +0 -79
  14. package/src/behaviors/behavior.abstract.select.ts +0 -118
  15. package/src/behaviors/behavior.abstract.serialize.ts +0 -96
  16. package/src/behaviors/behavior.abstract.split.ts +0 -170
  17. package/src/behaviors/behavior.abstract.style.ts +0 -55
  18. package/src/behaviors/behavior.abstract.ts +0 -139
  19. package/src/behaviors/behavior.config.ts +0 -7
  20. package/src/behaviors/behavior.core.annotations.ts +0 -62
  21. package/src/behaviors/behavior.core.block-element.ts +0 -116
  22. package/src/behaviors/behavior.core.block-objects.ts +0 -285
  23. package/src/behaviors/behavior.core.decorators.ts +0 -44
  24. package/src/behaviors/behavior.core.dnd.ts +0 -356
  25. package/src/behaviors/behavior.core.insert-break.ts +0 -266
  26. package/src/behaviors/behavior.core.insert.ts +0 -52
  27. package/src/behaviors/behavior.core.lists.ts +0 -691
  28. package/src/behaviors/behavior.core.ts +0 -44
  29. package/src/behaviors/behavior.perform-event.ts +0 -354
  30. package/src/behaviors/behavior.types.action.ts +0 -102
  31. package/src/behaviors/behavior.types.behavior.ts +0 -83
  32. package/src/behaviors/behavior.types.event.ts +0 -667
  33. package/src/behaviors/behavior.types.guard.ts +0 -11
  34. package/src/behaviors/index.ts +0 -17
  35. package/src/converters/converter.json.ts +0 -53
  36. package/src/converters/converter.portable-text.deserialize.test.ts +0 -680
  37. package/src/converters/converter.portable-text.ts +0 -75
  38. package/src/converters/converter.text-html.deserialize.test.ts +0 -406
  39. package/src/converters/converter.text-html.serialize.test.ts +0 -246
  40. package/src/converters/converter.text-html.ts +0 -87
  41. package/src/converters/converter.text-markdown.ts +0 -67
  42. package/src/converters/converter.text-plain.test.ts +0 -245
  43. package/src/converters/converter.text-plain.ts +0 -126
  44. package/src/converters/converter.types.ts +0 -72
  45. package/src/converters/converters.core.ts +0 -18
  46. package/src/editor/Editable.tsx +0 -1012
  47. package/src/editor/PortableTextEditor.tsx +0 -791
  48. package/src/editor/components/drop-indicator.tsx +0 -17
  49. package/src/editor/components/render-block-object.tsx +0 -121
  50. package/src/editor/components/render-default-object.tsx +0 -21
  51. package/src/editor/components/render-element.tsx +0 -88
  52. package/src/editor/components/render-inline-object.tsx +0 -129
  53. package/src/editor/components/render-leaf.tsx +0 -64
  54. package/src/editor/components/render-span.tsx +0 -303
  55. package/src/editor/components/render-text-block.tsx +0 -265
  56. package/src/editor/components/render-text.tsx +0 -18
  57. package/src/editor/components/use-core-block-element-behaviors.ts +0 -39
  58. package/src/editor/create-editor.ts +0 -323
  59. package/src/editor/create-slate-editor.tsx +0 -64
  60. package/src/editor/editor-actor-context.ts +0 -4
  61. package/src/editor/editor-context.tsx +0 -7
  62. package/src/editor/editor-dom.ts +0 -220
  63. package/src/editor/editor-machine.ts +0 -751
  64. package/src/editor/editor-provider.tsx +0 -111
  65. package/src/editor/editor-schema.ts +0 -6
  66. package/src/editor/editor-selector.ts +0 -89
  67. package/src/editor/editor-snapshot.ts +0 -68
  68. package/src/editor/event-to-change.tsx +0 -49
  69. package/src/editor/hooks/usePortableTextEditor.ts +0 -25
  70. package/src/editor/hooks/usePortableTextEditorSelection.tsx +0 -28
  71. package/src/editor/mutation-machine.ts +0 -322
  72. package/src/editor/plugins/create-with-event-listeners.ts +0 -271
  73. package/src/editor/plugins/createWithEditableAPI.ts +0 -529
  74. package/src/editor/plugins/createWithHotKeys.ts +0 -68
  75. package/src/editor/plugins/createWithObjectKeys.ts +0 -289
  76. package/src/editor/plugins/createWithPatches.ts +0 -272
  77. package/src/editor/plugins/createWithPortableTextMarkModel.ts +0 -559
  78. package/src/editor/plugins/createWithSchemaTypes.ts +0 -121
  79. package/src/editor/plugins/slate-plugin.update-selection.ts +0 -51
  80. package/src/editor/plugins/slate-plugin.update-value.ts +0 -46
  81. package/src/editor/plugins/with-plugins.ts +0 -69
  82. package/src/editor/range-decorations-machine.ts +0 -421
  83. package/src/editor/relay-actor-context.ts +0 -4
  84. package/src/editor/relay-machine.ts +0 -152
  85. package/src/editor/sync-machine.ts +0 -961
  86. package/src/editor/use-editor.ts +0 -27
  87. package/src/editor/validate-selection-machine.test.ts +0 -47
  88. package/src/editor/validate-selection-machine.ts +0 -149
  89. package/src/editor/weakMaps.ts +0 -15
  90. package/src/editor/with-normalizing-node.ts +0 -14
  91. package/src/editor/with-performing-behavior-operation.ts +0 -21
  92. package/src/editor/withChanges.ts +0 -13
  93. package/src/editor/without-normalizing-conditional.ts +0 -13
  94. package/src/editor/withoutPatching.ts +0 -14
  95. package/src/editor.ts +0 -59
  96. package/src/history/behavior.operation.history.redo.ts +0 -67
  97. package/src/history/behavior.operation.history.undo.ts +0 -71
  98. package/src/history/event.history.undo.test.tsx +0 -672
  99. package/src/history/history.preserving-keys.test.tsx +0 -112
  100. package/src/history/remote-patches.ts +0 -20
  101. package/src/history/slate-plugin.history.ts +0 -142
  102. package/src/history/slate-plugin.redoing.ts +0 -21
  103. package/src/history/slate-plugin.undoing.ts +0 -21
  104. package/src/history/slate-plugin.without-history.ts +0 -23
  105. package/src/history/transform-operation.ts +0 -245
  106. package/src/history/undo-redo-collaboration.test.tsx +0 -541
  107. package/src/history/undo-redo.feature +0 -125
  108. package/src/history/undo-redo.test.tsx +0 -195
  109. package/src/history/undo-step.ts +0 -148
  110. package/src/index.ts +0 -107
  111. package/src/internal-utils/__tests__/ranges.test.ts +0 -23
  112. package/src/internal-utils/__tests__/values.test.ts +0 -110
  113. package/src/internal-utils/apply-operation-to-portable-text.test.ts +0 -1861
  114. package/src/internal-utils/apply-operation-to-portable-text.ts +0 -615
  115. package/src/internal-utils/applyPatch.ts +0 -644
  116. package/src/internal-utils/block-keys.ts +0 -9
  117. package/src/internal-utils/build-index-maps.test.ts +0 -464
  118. package/src/internal-utils/build-index-maps.ts +0 -131
  119. package/src/internal-utils/collapse-selection.ts +0 -36
  120. package/src/internal-utils/compound-client-rect.ts +0 -28
  121. package/src/internal-utils/create-placeholder-block.ts +0 -21
  122. package/src/internal-utils/create-test-snapshot.ts +0 -28
  123. package/src/internal-utils/debug.ts +0 -12
  124. package/src/internal-utils/editor-selection.test.ts +0 -44
  125. package/src/internal-utils/editor-selection.ts +0 -56
  126. package/src/internal-utils/event-position.ts +0 -318
  127. package/src/internal-utils/global-scope.ts +0 -27
  128. package/src/internal-utils/globally-scoped-context.ts +0 -39
  129. package/src/internal-utils/is-hotkey.test.ts +0 -114
  130. package/src/internal-utils/is-hotkey.ts +0 -209
  131. package/src/internal-utils/mime-type.ts +0 -1
  132. package/src/internal-utils/move-range-by-operation.ts +0 -19
  133. package/src/internal-utils/operation-to-patches.test.ts +0 -522
  134. package/src/internal-utils/operation-to-patches.ts +0 -571
  135. package/src/internal-utils/portable-text-node.ts +0 -209
  136. package/src/internal-utils/schema.ts +0 -8
  137. package/src/internal-utils/selection-block-keys.ts +0 -20
  138. package/src/internal-utils/selection-focus-text.ts +0 -40
  139. package/src/internal-utils/selection-text.test.ts +0 -32
  140. package/src/internal-utils/selection-text.ts +0 -21
  141. package/src/internal-utils/selection.ts +0 -77
  142. package/src/internal-utils/sibling-utils.ts +0 -55
  143. package/src/internal-utils/slate-utils.test.tsx +0 -121
  144. package/src/internal-utils/slate-utils.ts +0 -417
  145. package/src/internal-utils/split-string.ts +0 -12
  146. package/src/internal-utils/stop-actor.ts +0 -43
  147. package/src/internal-utils/string-overlap.test.ts +0 -14
  148. package/src/internal-utils/string-overlap.ts +0 -28
  149. package/src/internal-utils/string-utils.ts +0 -7
  150. package/src/internal-utils/text-block-key.test.ts +0 -41
  151. package/src/internal-utils/text-block-key.ts +0 -26
  152. package/src/internal-utils/text-marks.test.ts +0 -41
  153. package/src/internal-utils/text-marks.ts +0 -22
  154. package/src/internal-utils/text-selection.test.ts +0 -211
  155. package/src/internal-utils/text-selection.ts +0 -121
  156. package/src/internal-utils/to-slate-range.test.ts +0 -278
  157. package/src/internal-utils/to-slate-range.ts +0 -171
  158. package/src/internal-utils/validateValue.ts +0 -443
  159. package/src/internal-utils/value-annotations.ts +0 -33
  160. package/src/internal-utils/values.test.ts +0 -282
  161. package/src/internal-utils/values.ts +0 -266
  162. package/src/keyboard-shortcuts/default-keyboard-shortcuts.ts +0 -146
  163. package/src/operations/behavior.operation.annotation.add.ts +0 -99
  164. package/src/operations/behavior.operation.annotation.remove.ts +0 -150
  165. package/src/operations/behavior.operation.block.set.ts +0 -104
  166. package/src/operations/behavior.operation.block.unset.ts +0 -54
  167. package/src/operations/behavior.operation.child.set.ts +0 -107
  168. package/src/operations/behavior.operation.child.unset.ts +0 -116
  169. package/src/operations/behavior.operation.decorator.add.ts +0 -131
  170. package/src/operations/behavior.operation.delete.ts +0 -294
  171. package/src/operations/behavior.operation.insert.block.ts +0 -495
  172. package/src/operations/behavior.operation.insert.child.ts +0 -129
  173. package/src/operations/behavior.operation.insert.text.ts +0 -8
  174. package/src/operations/behavior.operation.move.backward.ts +0 -12
  175. package/src/operations/behavior.operation.move.block.ts +0 -44
  176. package/src/operations/behavior.operation.move.forward.ts +0 -11
  177. package/src/operations/behavior.operation.select.ts +0 -27
  178. package/src/operations/behavior.operations.ts +0 -221
  179. package/src/plugins/_exports/index.ts +0 -1
  180. package/src/plugins/index.ts +0 -3
  181. package/src/plugins/plugin.behavior.tsx +0 -24
  182. package/src/plugins/plugin.editor-ref.tsx +0 -17
  183. package/src/plugins/plugin.event-listener.tsx +0 -68
  184. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +0 -71
  185. package/src/plugins/plugin.internal.auto-close-brackets.ts +0 -62
  186. package/src/plugins/plugin.internal.change-ref.tsx +0 -19
  187. package/src/plugins/plugin.internal.portable-text-editor-ref.tsx +0 -16
  188. package/src/plugins/plugin.internal.slate-editor-ref.tsx +0 -15
  189. package/src/priority/priority.core.ts +0 -3
  190. package/src/priority/priority.sort.test.ts +0 -319
  191. package/src/priority/priority.sort.ts +0 -123
  192. package/src/priority/priority.types.ts +0 -24
  193. package/src/selectors/_exports/index.ts +0 -1
  194. package/src/selectors/drag-selection.test.ts +0 -578
  195. package/src/selectors/drag-selection.ts +0 -118
  196. package/src/selectors/index.ts +0 -54
  197. package/src/selectors/selector.get-active-annotation-marks.ts +0 -12
  198. package/src/selectors/selector.get-active-annotations.ts +0 -36
  199. package/src/selectors/selector.get-active-decorators.ts +0 -29
  200. package/src/selectors/selector.get-active-list-item.ts +0 -38
  201. package/src/selectors/selector.get-active-style.ts +0 -38
  202. package/src/selectors/selector.get-anchor-block.ts +0 -22
  203. package/src/selectors/selector.get-anchor-child.ts +0 -36
  204. package/src/selectors/selector.get-anchor-span.ts +0 -17
  205. package/src/selectors/selector.get-anchor-text-block.ts +0 -18
  206. package/src/selectors/selector.get-block-offsets.ts +0 -34
  207. package/src/selectors/selector.get-caret-word-selection.test.ts +0 -284
  208. package/src/selectors/selector.get-caret-word-selection.ts +0 -134
  209. package/src/selectors/selector.get-first-block.ts +0 -14
  210. package/src/selectors/selector.get-focus-block-object.ts +0 -18
  211. package/src/selectors/selector.get-focus-block.ts +0 -23
  212. package/src/selectors/selector.get-focus-child.ts +0 -36
  213. package/src/selectors/selector.get-focus-inline-object.ts +0 -17
  214. package/src/selectors/selector.get-focus-list-block.ts +0 -18
  215. package/src/selectors/selector.get-focus-span.ts +0 -18
  216. package/src/selectors/selector.get-focus-text-block.ts +0 -18
  217. package/src/selectors/selector.get-last-block.ts +0 -16
  218. package/src/selectors/selector.get-mark-state.test.ts +0 -325
  219. package/src/selectors/selector.get-mark-state.ts +0 -263
  220. package/src/selectors/selector.get-next-block.ts +0 -29
  221. package/src/selectors/selector.get-next-inline-object.ts +0 -53
  222. package/src/selectors/selector.get-next-inline-objects.ts +0 -50
  223. package/src/selectors/selector.get-next-span.ts +0 -56
  224. package/src/selectors/selector.get-previous-block.ts +0 -29
  225. package/src/selectors/selector.get-previous-inline-object.ts +0 -50
  226. package/src/selectors/selector.get-previous-inline-objects.ts +0 -47
  227. package/src/selectors/selector.get-previous-span.ts +0 -53
  228. package/src/selectors/selector.get-selected-blocks.ts +0 -61
  229. package/src/selectors/selector.get-selected-spans.test.ts +0 -347
  230. package/src/selectors/selector.get-selected-spans.ts +0 -155
  231. package/src/selectors/selector.get-selected-text-blocks.ts +0 -73
  232. package/src/selectors/selector.get-selected-value.test.ts +0 -834
  233. package/src/selectors/selector.get-selected-value.ts +0 -66
  234. package/src/selectors/selector.get-selection-end-block.ts +0 -33
  235. package/src/selectors/selector.get-selection-end-child.ts +0 -33
  236. package/src/selectors/selector.get-selection-end-point.ts +0 -17
  237. package/src/selectors/selector.get-selection-start-block.ts +0 -33
  238. package/src/selectors/selector.get-selection-start-child.ts +0 -33
  239. package/src/selectors/selector.get-selection-start-point.ts +0 -17
  240. package/src/selectors/selector.get-selection-text.test.ts +0 -421
  241. package/src/selectors/selector.get-selection-text.ts +0 -27
  242. package/src/selectors/selector.get-selection.ts +0 -9
  243. package/src/selectors/selector.get-text-after.ts +0 -46
  244. package/src/selectors/selector.get-text-before.ts +0 -46
  245. package/src/selectors/selector.get-value.ts +0 -11
  246. package/src/selectors/selector.is-active-annotation.test.ts +0 -320
  247. package/src/selectors/selector.is-active-annotation.ts +0 -52
  248. package/src/selectors/selector.is-active-decorator.test.ts +0 -136
  249. package/src/selectors/selector.is-active-decorator.ts +0 -24
  250. package/src/selectors/selector.is-active-list-item.ts +0 -13
  251. package/src/selectors/selector.is-active-style.ts +0 -13
  252. package/src/selectors/selector.is-at-the-end-of-block.ts +0 -30
  253. package/src/selectors/selector.is-at-the-start-of-block.ts +0 -30
  254. package/src/selectors/selector.is-overlapping-selection.test.ts +0 -304
  255. package/src/selectors/selector.is-overlapping-selection.ts +0 -181
  256. package/src/selectors/selector.is-point-after-selection.ts +0 -97
  257. package/src/selectors/selector.is-point-before-selection.ts +0 -97
  258. package/src/selectors/selector.is-selecting-entire-blocks.ts +0 -43
  259. package/src/selectors/selector.is-selection-collapsed.ts +0 -17
  260. package/src/selectors/selector.is-selection-expanded.test.ts +0 -63
  261. package/src/selectors/selector.is-selection-expanded.ts +0 -9
  262. package/src/test/_exports/index.ts +0 -1
  263. package/src/test/gherkin-parameter-types.ts +0 -112
  264. package/src/test/index.ts +0 -1
  265. package/src/test/vitest/_exports/index.ts +0 -1
  266. package/src/test/vitest/index.ts +0 -3
  267. package/src/test/vitest/step-context.ts +0 -13
  268. package/src/test/vitest/step-definitions.tsx +0 -960
  269. package/src/test/vitest/test-editor.tsx +0 -198
  270. package/src/type-utils.ts +0 -29
  271. package/src/types/block-offset.ts +0 -9
  272. package/src/types/block-with-optional-key.ts +0 -25
  273. package/src/types/editor.ts +0 -509
  274. package/src/types/options.ts +0 -13
  275. package/src/types/paths.ts +0 -35
  276. package/src/types/slate-editor.ts +0 -50
  277. package/src/types/slate.ts +0 -27
  278. package/src/utils/_exports/index.ts +0 -1
  279. package/src/utils/asserters.ts +0 -9
  280. package/src/utils/index.ts +0 -24
  281. package/src/utils/key-generator.ts +0 -33
  282. package/src/utils/parse-blocks.test.ts +0 -836
  283. package/src/utils/parse-blocks.ts +0 -504
  284. package/src/utils/util.at-the-beginning-of-block.ts +0 -32
  285. package/src/utils/util.block-offset-to-block-selection-point.ts +0 -28
  286. package/src/utils/util.block-offset-to-selection-point.ts +0 -33
  287. package/src/utils/util.block-offset.test.ts +0 -375
  288. package/src/utils/util.block-offset.ts +0 -136
  289. package/src/utils/util.block-offsets-to-selection.ts +0 -38
  290. package/src/utils/util.child-selection-point-to-block-offset.ts +0 -51
  291. package/src/utils/util.get-block-end-point.ts +0 -35
  292. package/src/utils/util.get-block-start-point.ts +0 -31
  293. package/src/utils/util.get-selection-end-point.ts +0 -20
  294. package/src/utils/util.get-selection-start-point.ts +0 -20
  295. package/src/utils/util.get-text-block-text.ts +0 -8
  296. package/src/utils/util.is-empty-text-block.ts +0 -21
  297. package/src/utils/util.is-equal-selection-points.ts +0 -13
  298. package/src/utils/util.is-equal-selections.ts +0 -20
  299. package/src/utils/util.is-keyed-segment.ts +0 -8
  300. package/src/utils/util.is-selection-collapsed.ts +0 -16
  301. package/src/utils/util.is-selection-expanded.ts +0 -13
  302. package/src/utils/util.merge-text-blocks.ts +0 -40
  303. package/src/utils/util.reverse-selection.ts +0 -26
  304. package/src/utils/util.selection-point-to-block-offset.ts +0 -30
  305. package/src/utils/util.selection-point.ts +0 -22
  306. package/src/utils/util.slice-blocks.ts +0 -221
  307. package/src/utils/util.slice-text-block.test.ts +0 -190
  308. package/src/utils/util.slice-text-block.ts +0 -89
  309. package/src/utils/util.split-text-block.ts +0 -54
@@ -1,112 +0,0 @@
1
- import {createTestKeyGenerator} from '@portabletext/test'
2
- import {describe, expect, test, vi} from 'vitest'
3
- import {createTestEditor} from '../test/vitest'
4
-
5
- describe('Feature: History (Preserving Keys)', () => {
6
- const keyGenerator = createTestKeyGenerator()
7
- const blockAKey = keyGenerator()
8
- const spanAKey = keyGenerator()
9
- const blockBKey = keyGenerator()
10
- const spanBKey = keyGenerator()
11
-
12
- const initialValue = [
13
- {
14
- _key: blockAKey,
15
- _type: 'block',
16
- children: [{_key: spanAKey, _type: 'span', marks: [], text: 'Block A'}],
17
- markDefs: [],
18
- style: 'normal',
19
- },
20
- {
21
- _key: blockBKey,
22
- _type: 'block',
23
- children: [{_key: spanBKey, _type: 'span', marks: [], text: 'Block B'}],
24
- markDefs: [],
25
- style: 'normal',
26
- },
27
- ]
28
- const initialSelection = {
29
- focus: {path: [{_key: blockBKey}, 'children', {_key: spanBKey}], offset: 7},
30
- anchor: {
31
- path: [{_key: blockBKey}, 'children', {_key: spanBKey}],
32
- offset: 7,
33
- },
34
- }
35
-
36
- test('Scenario: Preserving keys when undoing ', async () => {
37
- const {editor} = await createTestEditor({
38
- initialValue,
39
- })
40
-
41
- editor.send({
42
- type: 'delete',
43
- at: initialSelection,
44
- direction: 'backward',
45
- unit: 'block',
46
- })
47
-
48
- await vi.waitFor(() => {
49
- expect(editor.getSnapshot().context.value).toEqual([initialValue.at(0)])
50
- })
51
-
52
- editor.send({
53
- type: 'history.undo',
54
- })
55
-
56
- await vi.waitFor(() => {
57
- expect(editor.getSnapshot().context.value).toEqual(initialValue)
58
- })
59
- })
60
-
61
- test('Scenario: Preserving keys when redoing ', async () => {
62
- const {editor} = await createTestEditor({
63
- initialValue,
64
- })
65
-
66
- const blockCKey = keyGenerator()
67
- const spanCKey = keyGenerator()
68
- const blockC = {
69
- _key: blockCKey,
70
- _type: 'block',
71
- children: [{_key: spanCKey, _type: 'span', marks: [], text: 'Block C'}],
72
- markDefs: [],
73
- style: 'normal',
74
- }
75
-
76
- editor.send({
77
- type: 'insert.block',
78
- block: blockC,
79
- at: {
80
- anchor: {path: [{_key: blockBKey}], offset: 0},
81
- focus: {path: [{_key: blockBKey}], offset: 0},
82
- },
83
- placement: 'after',
84
- })
85
-
86
- await vi.waitFor(() => {
87
- expect(editor.getSnapshot().context.value).toEqual([
88
- ...initialValue,
89
- blockC,
90
- ])
91
- })
92
-
93
- editor.send({
94
- type: 'history.undo',
95
- })
96
-
97
- await vi.waitFor(() => {
98
- expect(editor.getSnapshot().context.value).toEqual(initialValue)
99
- })
100
-
101
- editor.send({
102
- type: 'history.redo',
103
- })
104
-
105
- await vi.waitFor(() => {
106
- expect(editor.getSnapshot().context.value).toEqual([
107
- ...initialValue,
108
- blockC,
109
- ])
110
- })
111
- })
112
- })
@@ -1,20 +0,0 @@
1
- import type {Patch} from '@portabletext/patches'
2
- import type {PortableTextBlock} from '@portabletext/schema'
3
- import type {Editor} from 'slate'
4
-
5
- const REMOTE_PATCHES = new WeakMap<
6
- Editor,
7
- {
8
- patch: Patch
9
- time: Date
10
- snapshot: PortableTextBlock[] | undefined
11
- previousSnapshot: PortableTextBlock[] | undefined
12
- }[]
13
- >()
14
-
15
- export const getRemotePatches = (editor: Editor) => {
16
- if (!REMOTE_PATCHES.get(editor)) {
17
- REMOTE_PATCHES.set(editor, [])
18
- }
19
- return REMOTE_PATCHES.get(editor) ?? []
20
- }
@@ -1,142 +0,0 @@
1
- /**
2
- * This plugin will make the editor support undo/redo on the local state only.
3
- * The undo/redo steps are rebased against incoming patches since the step occurred.
4
- */
5
-
6
- import type {PortableTextBlock} from '@portabletext/schema'
7
- import type {Operation} from 'slate'
8
- import type {EditorActor} from '../editor/editor-machine'
9
- import {isChangingRemotely} from '../editor/withChanges'
10
- import {debugWithName} from '../internal-utils/debug'
11
- import type {PortableTextSlateEditor} from '../types/slate-editor'
12
- import {getRemotePatches} from './remote-patches'
13
- import {isRedoing} from './slate-plugin.redoing'
14
- import {isUndoing} from './slate-plugin.undoing'
15
- import {isWithHistory, setWithHistory} from './slate-plugin.without-history'
16
- import {createUndoSteps, getCurrentUndoStepId} from './undo-step'
17
-
18
- const debug = debugWithName('plugin:history')
19
-
20
- const UNDO_STEP_LIMIT = 1000
21
-
22
- export function pluginHistory({
23
- editorActor,
24
- subscriptions,
25
- }: {
26
- editorActor: EditorActor
27
- subscriptions: Array<() => () => void>
28
- }): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {
29
- return (editor: PortableTextSlateEditor) => {
30
- const remotePatches = getRemotePatches(editor)
31
- let previousSnapshot: Array<PortableTextBlock> | undefined = editor.value
32
- let previousUndoStepId = getCurrentUndoStepId(editor)
33
-
34
- subscriptions.push(() => {
35
- const subscription = editorActor.on('patches', ({patches, snapshot}) => {
36
- let reset = false
37
-
38
- for (const patch of patches) {
39
- if (reset) {
40
- continue
41
- }
42
-
43
- if (patch.origin === 'local') {
44
- continue
45
- }
46
-
47
- if (patch.type === 'unset' && patch.path.length === 0) {
48
- debug(
49
- 'Someone else cleared the content, resetting undo/redo history',
50
- )
51
-
52
- editor.history = {undos: [], redos: []}
53
- remotePatches.splice(0, remotePatches.length)
54
- setWithHistory(editor, true)
55
- reset = true
56
- return
57
- }
58
-
59
- remotePatches.push({
60
- patch,
61
- time: new Date(),
62
- snapshot,
63
- previousSnapshot,
64
- })
65
- }
66
-
67
- previousSnapshot = snapshot
68
- })
69
-
70
- return () => {
71
- subscription.unsubscribe()
72
- }
73
- })
74
-
75
- editor.history = {undos: [], redos: []}
76
-
77
- const {apply} = editor
78
-
79
- editor.apply = (op: Operation) => {
80
- if (editorActor.getSnapshot().matches({'edit mode': 'read only'})) {
81
- apply(op)
82
- return
83
- }
84
-
85
- /**
86
- * We don't want to run any side effects when the editor is processing
87
- * remote changes.
88
- */
89
- if (isChangingRemotely(editor)) {
90
- apply(op)
91
- return
92
- }
93
-
94
- /**
95
- * We don't want to run any side effects when the editor is undoing or
96
- * redoing operations.
97
- */
98
- if (isUndoing(editor) || isRedoing(editor)) {
99
- apply(op)
100
- return
101
- }
102
-
103
- const withHistory = isWithHistory(editor)
104
- const currentUndoStepId = getCurrentUndoStepId(editor)
105
-
106
- if (!withHistory) {
107
- // If we are bypassing saving undo steps, then we can just move along.
108
-
109
- previousUndoStepId = currentUndoStepId
110
-
111
- apply(op)
112
-
113
- return
114
- }
115
-
116
- if (op.type !== 'set_selection') {
117
- // Clear the repo steps if any actual changes are made
118
- editor.history.redos = []
119
- }
120
-
121
- editor.history.undos = createUndoSteps({
122
- steps: editor.history.undos,
123
- op,
124
- editor,
125
- currentUndoStepId,
126
- previousUndoStepId,
127
- })
128
-
129
- // Make sure we don't exceed the maximum number of undo steps we want
130
- // to store.
131
- while (editor.history.undos.length > UNDO_STEP_LIMIT) {
132
- editor.history.undos.shift()
133
- }
134
-
135
- previousUndoStepId = currentUndoStepId
136
-
137
- apply(op)
138
- }
139
-
140
- return editor
141
- }
142
- }
@@ -1,21 +0,0 @@
1
- import type {Editor} from 'slate'
2
-
3
- const IS_REDOING: WeakMap<Editor, boolean | undefined> = new WeakMap()
4
-
5
- export function pluginRedoing(editor: Editor, fn: () => void) {
6
- const prev = isRedoing(editor)
7
-
8
- IS_REDOING.set(editor, true)
9
-
10
- fn()
11
-
12
- IS_REDOING.set(editor, prev)
13
- }
14
-
15
- export function isRedoing(editor: Editor) {
16
- return IS_REDOING.get(editor) ?? false
17
- }
18
-
19
- export function setIsRedoing(editor: Editor, isRedoing: boolean) {
20
- IS_REDOING.set(editor, isRedoing)
21
- }
@@ -1,21 +0,0 @@
1
- import type {Editor} from 'slate'
2
-
3
- const IS_UDOING: WeakMap<Editor, boolean | undefined> = new WeakMap()
4
-
5
- export function pluginUndoing(editor: Editor, fn: () => void) {
6
- const prev = isUndoing(editor)
7
-
8
- IS_UDOING.set(editor, true)
9
-
10
- fn()
11
-
12
- IS_UDOING.set(editor, prev)
13
- }
14
-
15
- export function isUndoing(editor: Editor) {
16
- return IS_UDOING.get(editor) ?? false
17
- }
18
-
19
- export function setIsUndoing(editor: Editor, isUndoing: boolean) {
20
- IS_UDOING.set(editor, isUndoing)
21
- }
@@ -1,23 +0,0 @@
1
- import type {Editor} from 'slate'
2
-
3
- const WITH_HISTORY = new WeakMap<Editor, boolean | undefined>()
4
-
5
- export function isWithHistory(editor: Editor): boolean {
6
- const withHistory = WITH_HISTORY.get(editor)
7
-
8
- return withHistory ?? true
9
- }
10
-
11
- export function pluginWithoutHistory(editor: Editor, fn: () => void): void {
12
- const withHistory = isWithHistory(editor)
13
-
14
- WITH_HISTORY.set(editor, false)
15
-
16
- fn()
17
-
18
- WITH_HISTORY.set(editor, withHistory)
19
- }
20
-
21
- export function setWithHistory(editor: Editor, withHistory: boolean): void {
22
- WITH_HISTORY.set(editor, withHistory)
23
- }
@@ -1,245 +0,0 @@
1
- import type {Patch} from '@portabletext/patches'
2
- import type {PortableTextBlock} from '@portabletext/schema'
3
- import {
4
- DIFF_DELETE,
5
- DIFF_EQUAL,
6
- DIFF_INSERT,
7
- parsePatch,
8
- } from '@sanity/diff-match-patch'
9
- import {isEqual} from 'lodash'
10
- import type {Descendant, Operation} from 'slate'
11
- import {debugWithName} from '../internal-utils/debug'
12
- import type {PortableTextSlateEditor} from '../types/slate-editor'
13
-
14
- const debug = debugWithName('transformOperation')
15
- const debugVerbose = debug.enabled && false
16
-
17
- /**
18
- * This will adjust the operation paths and offsets according to the
19
- * remote patches by other editors since the step operations was performed.
20
- */
21
- export function transformOperation(
22
- editor: PortableTextSlateEditor,
23
- patch: Patch,
24
- operation: Operation,
25
- snapshot: PortableTextBlock[] | undefined,
26
- previousSnapshot: PortableTextBlock[] | undefined,
27
- ): Operation[] {
28
- if (debugVerbose) {
29
- debug(
30
- `Adjusting '${operation.type}' operation paths for '${patch.type}' patch`,
31
- )
32
- debug(`Operation ${JSON.stringify(operation)}`)
33
- debug(`Patch ${JSON.stringify(patch)}`)
34
- }
35
-
36
- const transformedOperation = {...operation}
37
-
38
- if (patch.type === 'insert' && patch.path.length === 1) {
39
- const insertBlockIndex = (snapshot || []).findIndex((blk) =>
40
- isEqual({_key: blk._key}, patch.path[0]),
41
- )
42
- debug(
43
- `Adjusting block path (+${patch.items.length}) for '${transformedOperation.type}' operation and patch '${patch.type}'`,
44
- )
45
- return [
46
- adjustBlockPath(
47
- transformedOperation,
48
- patch.items.length,
49
- insertBlockIndex,
50
- ),
51
- ]
52
- }
53
-
54
- if (patch.type === 'unset' && patch.path.length === 1) {
55
- const unsetBlockIndex = (previousSnapshot || []).findIndex((blk) =>
56
- isEqual({_key: blk._key}, patch.path[0]),
57
- )
58
- // If this operation is targeting the same block that got removed, return empty
59
- if (
60
- 'path' in transformedOperation &&
61
- Array.isArray(transformedOperation.path) &&
62
- transformedOperation.path[0] === unsetBlockIndex
63
- ) {
64
- debug('Skipping transformation that targeted removed block')
65
- return []
66
- }
67
- if (debugVerbose) {
68
- debug(`Selection ${JSON.stringify(editor.selection)}`)
69
- debug(
70
- `Adjusting block path (-1) for '${transformedOperation.type}' operation and patch '${patch.type}'`,
71
- )
72
- }
73
- return [adjustBlockPath(transformedOperation, -1, unsetBlockIndex)]
74
- }
75
-
76
- // Someone reset the whole value
77
- if (patch.type === 'unset' && patch.path.length === 0) {
78
- debug(
79
- `Adjusting selection for unset everything patch and ${operation.type} operation`,
80
- )
81
- return []
82
- }
83
-
84
- if (patch.type === 'diffMatchPatch') {
85
- const operationTargetBlock = findOperationTargetBlock(
86
- editor,
87
- transformedOperation,
88
- )
89
- if (
90
- !operationTargetBlock ||
91
- !isEqual({_key: operationTargetBlock._key}, patch.path[0])
92
- ) {
93
- return [transformedOperation]
94
- }
95
- const diffPatches = parsePatch(patch.value)
96
- diffPatches.forEach((diffPatch) => {
97
- let adjustOffsetBy = 0
98
- let changedOffset = diffPatch.utf8Start1
99
- const {diffs} = diffPatch
100
- diffs.forEach((diff, index) => {
101
- const [diffType, text] = diff
102
- if (diffType === DIFF_INSERT) {
103
- adjustOffsetBy += text.length
104
- changedOffset += text.length
105
- } else if (diffType === DIFF_DELETE) {
106
- adjustOffsetBy -= text.length
107
- changedOffset -= text.length
108
- } else if (diffType === DIFF_EQUAL) {
109
- // Only up to the point where there are no other changes
110
- if (!diffs.slice(index).every(([dType]) => dType === DIFF_EQUAL)) {
111
- changedOffset += text.length
112
- }
113
- }
114
- })
115
- // Adjust accordingly if someone inserted text in the same node before us
116
- if (transformedOperation.type === 'insert_text') {
117
- if (changedOffset < transformedOperation.offset) {
118
- transformedOperation.offset += adjustOffsetBy
119
- }
120
- }
121
- // Adjust accordingly if someone removed text in the same node before us
122
- if (transformedOperation.type === 'remove_text') {
123
- if (
124
- changedOffset <=
125
- transformedOperation.offset - transformedOperation.text.length
126
- ) {
127
- transformedOperation.offset += adjustOffsetBy
128
- }
129
- }
130
- // Adjust set_selection operation's points to new offset
131
- if (transformedOperation.type === 'set_selection') {
132
- const currentFocus = transformedOperation.properties?.focus
133
- ? {...transformedOperation.properties.focus}
134
- : undefined
135
- const currentAnchor = transformedOperation?.properties?.anchor
136
- ? {...transformedOperation.properties.anchor}
137
- : undefined
138
- const newFocus = transformedOperation?.newProperties?.focus
139
- ? {...transformedOperation.newProperties.focus}
140
- : undefined
141
- const newAnchor = transformedOperation?.newProperties?.anchor
142
- ? {...transformedOperation.newProperties.anchor}
143
- : undefined
144
- if ((currentFocus && currentAnchor) || (newFocus && newAnchor)) {
145
- const points = [currentFocus, currentAnchor, newFocus, newAnchor]
146
- points.forEach((point) => {
147
- if (point && changedOffset < point.offset) {
148
- point.offset += adjustOffsetBy
149
- }
150
- })
151
- if (currentFocus && currentAnchor) {
152
- transformedOperation.properties = {
153
- focus: currentFocus,
154
- anchor: currentAnchor,
155
- }
156
- }
157
- if (newFocus && newAnchor) {
158
- transformedOperation.newProperties = {
159
- focus: newFocus,
160
- anchor: newAnchor,
161
- }
162
- }
163
- }
164
- }
165
- })
166
- return [transformedOperation]
167
- }
168
- return [transformedOperation]
169
- }
170
- /**
171
- * Adjust the block path for a operation
172
- */
173
- function adjustBlockPath(
174
- operation: Operation,
175
- level: number,
176
- blockIndex: number,
177
- ): Operation {
178
- const transformedOperation = {...operation}
179
- if (
180
- blockIndex >= 0 &&
181
- transformedOperation.type !== 'set_selection' &&
182
- Array.isArray(transformedOperation.path) &&
183
- transformedOperation.path[0] >= blockIndex + level &&
184
- transformedOperation.path[0] + level > -1
185
- ) {
186
- const newPath = [
187
- transformedOperation.path[0] + level,
188
- ...transformedOperation.path.slice(1),
189
- ]
190
- transformedOperation.path = newPath
191
- }
192
- if (transformedOperation.type === 'set_selection') {
193
- const currentFocus = transformedOperation.properties?.focus
194
- ? {...transformedOperation.properties.focus}
195
- : undefined
196
- const currentAnchor = transformedOperation?.properties?.anchor
197
- ? {...transformedOperation.properties.anchor}
198
- : undefined
199
- const newFocus = transformedOperation?.newProperties?.focus
200
- ? {...transformedOperation.newProperties.focus}
201
- : undefined
202
- const newAnchor = transformedOperation?.newProperties?.anchor
203
- ? {...transformedOperation.newProperties.anchor}
204
- : undefined
205
- if ((currentFocus && currentAnchor) || (newFocus && newAnchor)) {
206
- const points = [currentFocus, currentAnchor, newFocus, newAnchor]
207
- points.forEach((point) => {
208
- if (
209
- point &&
210
- point.path[0] >= blockIndex + level &&
211
- point.path[0] + level > -1
212
- ) {
213
- point.path = [point.path[0] + level, ...point.path.slice(1)]
214
- }
215
- })
216
- if (currentFocus && currentAnchor) {
217
- transformedOperation.properties = {
218
- focus: currentFocus,
219
- anchor: currentAnchor,
220
- }
221
- }
222
- if (newFocus && newAnchor) {
223
- transformedOperation.newProperties = {
224
- focus: newFocus,
225
- anchor: newAnchor,
226
- }
227
- }
228
- }
229
- }
230
- // // Assign fresh point objects (we don't want to mutate the original ones)
231
- return transformedOperation
232
- }
233
-
234
- function findOperationTargetBlock(
235
- editor: PortableTextSlateEditor,
236
- operation: Operation,
237
- ): Descendant | undefined {
238
- let block: Descendant | undefined
239
- if (operation.type === 'set_selection' && editor.selection) {
240
- block = editor.children[editor.selection.focus.path[0]]
241
- } else if ('path' in operation) {
242
- block = editor.children[operation.path[0]]
243
- }
244
- return block
245
- }