@portabletext/editor 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +57 -118
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/plugin.event-listener.cjs +53 -71
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
  10. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
  11. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
  12. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  13. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  14. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  15. package/lib/_chunks-es/behavior.core.js +57 -118
  16. package/lib/_chunks-es/behavior.core.js.map +1 -1
  17. package/lib/_chunks-es/behavior.markdown.js +27 -67
  18. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  19. package/lib/_chunks-es/plugin.event-listener.js +53 -71
  20. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  21. package/lib/_chunks-es/selector.get-text-before.js +5 -7
  22. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  23. package/lib/_chunks-es/selector.is-active-style.js +22 -36
  24. package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
  25. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
  26. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  27. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
  28. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  29. package/lib/behaviors/index.cjs +18 -48
  30. package/lib/behaviors/index.cjs.map +1 -1
  31. package/lib/behaviors/index.d.cts +28 -16
  32. package/lib/behaviors/index.d.ts +28 -16
  33. package/lib/behaviors/index.js +18 -48
  34. package/lib/behaviors/index.js.map +1 -1
  35. package/lib/index.d.cts +132 -71
  36. package/lib/index.d.ts +132 -71
  37. package/lib/plugins/index.cjs +182 -186
  38. package/lib/plugins/index.cjs.map +1 -1
  39. package/lib/plugins/index.d.cts +147 -82
  40. package/lib/plugins/index.d.ts +147 -82
  41. package/lib/plugins/index.js +182 -186
  42. package/lib/plugins/index.js.map +1 -1
  43. package/lib/selectors/index.cjs +22 -50
  44. package/lib/selectors/index.cjs.map +1 -1
  45. package/lib/selectors/index.d.cts +9 -200
  46. package/lib/selectors/index.d.ts +9 -200
  47. package/lib/selectors/index.js +22 -50
  48. package/lib/selectors/index.js.map +1 -1
  49. package/lib/utils/index.cjs.map +1 -1
  50. package/lib/utils/index.d.cts +15 -7
  51. package/lib/utils/index.d.ts +15 -7
  52. package/lib/utils/index.js.map +1 -1
  53. package/package.json +6 -6
  54. package/src/behaviors/behavior.code-editor.ts +6 -6
  55. package/src/behaviors/behavior.core.annotations.ts +5 -4
  56. package/src/behaviors/behavior.core.block-objects.ts +17 -17
  57. package/src/behaviors/behavior.core.decorators.ts +12 -8
  58. package/src/behaviors/behavior.core.insert-break.ts +27 -29
  59. package/src/behaviors/behavior.core.lists.ts +19 -19
  60. package/src/behaviors/behavior.decorator-pair.ts +200 -0
  61. package/src/behaviors/behavior.default.ts +35 -30
  62. package/src/behaviors/behavior.emoji-picker.ts +12 -12
  63. package/src/behaviors/behavior.links.ts +7 -7
  64. package/src/behaviors/behavior.markdown.ts +41 -42
  65. package/src/behaviors/behavior.types.ts +15 -18
  66. package/src/behaviors/index.ts +0 -1
  67. package/src/converters/converter.json.ts +6 -6
  68. package/src/converters/converter.portable-text.deserialize.test.ts +28 -26
  69. package/src/converters/converter.portable-text.ts +6 -6
  70. package/src/converters/converter.text-html.deserialize.test.ts +17 -15
  71. package/src/converters/converter.text-html.serialize.test.ts +57 -53
  72. package/src/converters/converter.text-html.ts +14 -10
  73. package/src/converters/converter.text-plain.test.ts +17 -15
  74. package/src/converters/converter.text-plain.ts +15 -11
  75. package/src/converters/converter.types.ts +8 -7
  76. package/src/editor/editor-machine.ts +6 -1
  77. package/src/editor/plugins/create-with-event-listeners.ts +0 -5
  78. package/src/index.ts +3 -3
  79. package/src/internal-utils/get-text-to-emphasize.ts +29 -7
  80. package/src/plugins/plugin.decorator-shortcut.ts +235 -0
  81. package/src/plugins/plugin.markdown.tsx +56 -8
  82. package/src/plugins/plugin.one-line.tsx +17 -17
  83. package/src/selectors/selector.get-active-list-item.ts +4 -4
  84. package/src/selectors/selector.get-active-style.ts +6 -6
  85. package/src/selectors/selector.get-anchor-block.ts +5 -5
  86. package/src/selectors/selector.get-anchor-child.ts +5 -5
  87. package/src/selectors/selector.get-anchor-span.ts +2 -2
  88. package/src/selectors/selector.get-anchor-text-block.ts +2 -2
  89. package/src/selectors/selector.get-block-offsets.ts +8 -7
  90. package/src/selectors/selector.get-caret-word-selection.ts +19 -16
  91. package/src/selectors/selector.get-next-inline-object.ts +4 -4
  92. package/src/selectors/selector.get-previous-inline-object.ts +4 -4
  93. package/src/selectors/selector.get-selected-slice.ts +7 -4
  94. package/src/selectors/selector.get-selected-spans.ts +9 -9
  95. package/src/selectors/selector.get-selection-end-point.ts +5 -5
  96. package/src/selectors/selector.get-selection-start-point.ts +5 -5
  97. package/src/selectors/selector.get-selection-text.ts +2 -2
  98. package/src/selectors/selector.get-selection.ts +2 -2
  99. package/src/selectors/selector.get-text-before.ts +8 -8
  100. package/src/selectors/selector.get-trimmed-selection.ts +15 -13
  101. package/src/selectors/selector.get-value.ts +4 -4
  102. package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
  103. package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
  104. package/src/selectors/selector.is-overlapping-selection.ts +8 -6
  105. package/src/selectors/selector.is-selection-collapsed.ts +6 -5
  106. package/src/selectors/selector.is-selection-expanded.ts +2 -2
  107. package/src/selectors/selectors.ts +59 -59
  108. package/src/types/block-offset.ts +9 -0
  109. package/src/utils/index.ts +0 -1
  110. package/src/utils/util.block-offset.ts +1 -1
  111. package/src/utils/util.block-offsets-to-selection.ts +1 -1
  112. package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
  113. package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
@@ -1,7 +1,6 @@
1
1
  import {isPortableTextTextBlock} from '@sanity/types'
2
2
  import type {EditorSchema} from '../editor/define-schema'
3
3
  import * as selectors from '../selectors'
4
- import {getBlockTextBefore} from '../selectors/selector.get-text-before'
5
4
  import {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'
6
5
  import {getTextBlockText} from '../utils/util.get-text-block-text'
7
6
  import {defineBehavior} from './behavior.types'
@@ -71,31 +70,31 @@ export type MarkdownBehaviorsConfig = {
71
70
  export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
72
71
  const automaticBlockquoteOnSpace = defineBehavior({
73
72
  on: 'insert.text',
74
- guard: ({context, event}) => {
73
+ guard: ({snapshot, event}) => {
75
74
  const isSpace = event.text === ' '
76
75
 
77
76
  if (!isSpace) {
78
77
  return false
79
78
  }
80
79
 
81
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
82
- const focusTextBlock = selectors.getFocusTextBlock({context})
83
- const focusSpan = selectors.getFocusSpan({context})
80
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
81
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
82
+ const focusSpan = selectors.getFocusSpan(snapshot)
84
83
 
85
84
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
86
85
  return false
87
86
  }
88
87
 
89
- const previousInlineObject = selectors.getPreviousInlineObject({context})
88
+ const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
90
89
  const blockOffset = spanSelectionPointToBlockOffset({
91
- value: context.value,
90
+ value: snapshot.context.value,
92
91
  selectionPoint: {
93
92
  path: [
94
93
  {_key: focusTextBlock.node._key},
95
94
  'children',
96
95
  {_key: focusSpan.node._key},
97
96
  ],
98
- offset: context.selection?.focus.offset ?? 0,
97
+ offset: snapshot.context.selection?.focus.offset ?? 0,
99
98
  },
100
99
  })
101
100
 
@@ -106,7 +105,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
106
105
  const blockText = getTextBlockText(focusTextBlock.node)
107
106
  const caretAtTheEndOfQuote = blockOffset.offset === 1
108
107
  const looksLikeMarkdownQuote = /^>/.test(blockText)
109
- const blockquoteStyle = config.blockquoteStyle?.(context)
108
+ const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)
110
109
 
111
110
  if (
112
111
  caretAtTheEndOfQuote &&
@@ -152,7 +151,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
152
151
  })
153
152
  const automaticHr = defineBehavior({
154
153
  on: 'insert.text',
155
- guard: ({context, event}) => {
154
+ guard: ({snapshot, event}) => {
156
155
  const hrCharacter =
157
156
  event.text === '-'
158
157
  ? '-'
@@ -166,16 +165,16 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
166
165
  return false
167
166
  }
168
167
 
169
- const hrObject = config.horizontalRuleObject?.(context)
170
- const focusBlock = selectors.getFocusTextBlock({context})
171
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
168
+ const hrObject = config.horizontalRuleObject?.(snapshot.context)
169
+ const focusBlock = selectors.getFocusTextBlock(snapshot)
170
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
172
171
 
173
172
  if (!hrObject || !focusBlock || !selectionCollapsed) {
174
173
  return false
175
174
  }
176
175
 
177
- const previousInlineObject = selectors.getPreviousInlineObject({context})
178
- const textBefore = getBlockTextBefore({context})
176
+ const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
177
+ const textBefore = selectors.getBlockTextBefore(snapshot)
179
178
  const hrBlockOffsets = {
180
179
  anchor: {
181
180
  path: focusBlock.path,
@@ -218,12 +217,12 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
218
217
  })
219
218
  const automaticHrOnPaste = defineBehavior({
220
219
  on: 'paste',
221
- guard: ({context, event}) => {
220
+ guard: ({snapshot, event}) => {
222
221
  const text = event.data.getData('text/plain')
223
222
  const hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm
224
223
  const hrCharacters = text.match(hrRegExp)?.[0]
225
- const hrObject = config.horizontalRuleObject?.(context)
226
- const focusBlock = selectors.getFocusBlock({context})
224
+ const hrObject = config.horizontalRuleObject?.(snapshot.context)
225
+ const focusBlock = selectors.getFocusBlock(snapshot)
227
226
 
228
227
  if (!hrCharacters || !hrObject || !focusBlock) {
229
228
  return false
@@ -264,30 +263,30 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
264
263
  })
265
264
  const automaticHeadingOnSpace = defineBehavior({
266
265
  on: 'insert.text',
267
- guard: ({context, event}) => {
266
+ guard: ({snapshot, event}) => {
268
267
  const isSpace = event.text === ' '
269
268
 
270
269
  if (!isSpace) {
271
270
  return false
272
271
  }
273
272
 
274
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
275
- const focusTextBlock = selectors.getFocusTextBlock({context})
276
- const focusSpan = selectors.getFocusSpan({context})
273
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
274
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
275
+ const focusSpan = selectors.getFocusSpan(snapshot)
277
276
 
278
277
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
279
278
  return false
280
279
  }
281
280
 
282
281
  const blockOffset = spanSelectionPointToBlockOffset({
283
- value: context.value,
282
+ value: snapshot.context.value,
284
283
  selectionPoint: {
285
284
  path: [
286
285
  {_key: focusTextBlock.node._key},
287
286
  'children',
288
287
  {_key: focusSpan.node._key},
289
288
  ],
290
- offset: context.selection?.focus.offset ?? 0,
289
+ offset: snapshot.context.selection?.focus.offset ?? 0,
291
290
  },
292
291
  })
293
292
 
@@ -295,7 +294,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
295
294
  return false
296
295
  }
297
296
 
298
- const previousInlineObject = selectors.getPreviousInlineObject({context})
297
+ const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
299
298
  const blockText = getTextBlockText(focusTextBlock.node)
300
299
  const markdownHeadingSearch = /^#+/.exec(blockText)
301
300
  const level = markdownHeadingSearch
@@ -309,7 +308,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
309
308
 
310
309
  const style =
311
310
  level !== undefined
312
- ? config.headingStyle?.({schema: context.schema, level})
311
+ ? config.headingStyle?.({schema: snapshot.context.schema, level})
313
312
  : undefined
314
313
 
315
314
  if (level !== undefined && style !== undefined) {
@@ -351,10 +350,10 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
351
350
  })
352
351
  const clearStyleOnBackspace = defineBehavior({
353
352
  on: 'delete.backward',
354
- guard: ({context}) => {
355
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
356
- const focusTextBlock = selectors.getFocusTextBlock({context})
357
- const focusSpan = selectors.getFocusSpan({context})
353
+ guard: ({snapshot}) => {
354
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
355
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
356
+ const focusSpan = selectors.getFocusSpan(snapshot)
358
357
 
359
358
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
360
359
  return false
@@ -362,9 +361,9 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
362
361
 
363
362
  const atTheBeginningOfBLock =
364
363
  focusTextBlock.node.children[0]._key === focusSpan.node._key &&
365
- context.selection?.focus.offset === 0
364
+ snapshot.context.selection?.focus.offset === 0
366
365
 
367
- const defaultStyle = config.defaultStyle?.(context)
366
+ const defaultStyle = config.defaultStyle?.(snapshot.context)
368
367
 
369
368
  if (
370
369
  atTheBeginningOfBLock &&
@@ -388,31 +387,31 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
388
387
  })
389
388
  const automaticListOnSpace = defineBehavior({
390
389
  on: 'insert.text',
391
- guard: ({context, event}) => {
390
+ guard: ({snapshot, event}) => {
392
391
  const isSpace = event.text === ' '
393
392
 
394
393
  if (!isSpace) {
395
394
  return false
396
395
  }
397
396
 
398
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
399
- const focusTextBlock = selectors.getFocusTextBlock({context})
400
- const focusSpan = selectors.getFocusSpan({context})
397
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
398
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
399
+ const focusSpan = selectors.getFocusSpan(snapshot)
401
400
 
402
401
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
403
402
  return false
404
403
  }
405
404
 
406
- const previousInlineObject = selectors.getPreviousInlineObject({context})
405
+ const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
407
406
  const blockOffset = spanSelectionPointToBlockOffset({
408
- value: context.value,
407
+ value: snapshot.context.value,
409
408
  selectionPoint: {
410
409
  path: [
411
410
  {_key: focusTextBlock.node._key},
412
411
  'children',
413
412
  {_key: focusSpan.node._key},
414
413
  ],
415
- offset: context.selection?.focus.offset ?? 0,
414
+ offset: snapshot.context.selection?.focus.offset ?? 0,
416
415
  },
417
416
  })
418
417
 
@@ -421,9 +420,9 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
421
420
  }
422
421
 
423
422
  const blockText = getTextBlockText(focusTextBlock.node)
424
- const defaultStyle = config.defaultStyle?.(context)
423
+ const defaultStyle = config.defaultStyle?.(snapshot.context)
425
424
  const looksLikeUnorderedList = /^(-|\*)/.test(blockText)
426
- const unorderedListStyle = config.unorderedListStyle?.(context)
425
+ const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)
427
426
  const caretAtTheEndOfUnorderedList = blockOffset.offset === 1
428
427
 
429
428
  if (
@@ -441,7 +440,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
441
440
  }
442
441
 
443
442
  const looksLikeOrderedList = /^1\./.test(blockText)
444
- const orderedListStyle = config.orderedListStyle?.(context)
443
+ const orderedListStyle = config.orderedListStyle?.(snapshot.context)
445
444
  const caretAtTheEndOfOrderedList = blockOffset.offset === 2
446
445
 
447
446
  if (
@@ -6,9 +6,10 @@ import type {
6
6
  import type {TextUnit} from 'slate'
7
7
  import type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'
8
8
  import type {ConverterEvent} from '../converters/converter.types'
9
- import type {EditorContext} from '../editor/editor-snapshot'
9
+ import type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'
10
10
  import type {MIMEType} from '../internal-utils/mime-type'
11
11
  import type {OmitFromUnion, PickFromUnion} from '../type-utils'
12
+ import type {BlockOffset} from '../types/block-offset'
12
13
  import type {EditorSelection, PortableTextSlateEditor} from '../types/editor'
13
14
 
14
15
  /**
@@ -236,7 +237,7 @@ export type NativeBehaviorEvent =
236
237
  }
237
238
  | {
238
239
  type: 'serialize'
239
- originEvent: 'copy' | 'cut' | 'unknown'
240
+ originEvent: 'copy' | 'cut' | 'drag' | 'unknown'
240
241
  dataTransfer: DataTransfer
241
242
  }
242
243
 
@@ -333,11 +334,13 @@ export type Behavior<
333
334
  /**
334
335
  * @beta
335
336
  */
336
- export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({
337
- context,
338
- event,
339
- }: {
337
+ export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {
338
+ /**
339
+ * @deprecated
340
+ * Use `snapshot` instead
341
+ */
340
342
  context: EditorContext
343
+ snapshot: EditorSnapshot
341
344
  event: TBehaviorEvent
342
345
  }) => TGuardResponse | false
343
346
 
@@ -345,11 +348,13 @@ export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({
345
348
  * @beta
346
349
  */
347
350
  export type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (
348
- {
349
- context,
350
- event,
351
- }: {
351
+ payload: {
352
+ /**
353
+ * @deprecated
354
+ * Use `snapshot` instead
355
+ */
352
356
  context: EditorContext
357
+ snapshot: EditorSnapshot
353
358
  event: TBehaviorEvent
354
359
  },
355
360
  guardResponse: TGuardResponse,
@@ -400,11 +405,3 @@ export function defineBehavior<
400
405
  ): Behavior {
401
406
  return behavior as unknown as Behavior
402
407
  }
403
-
404
- /**
405
- * @beta
406
- */
407
- export type BlockOffset = {
408
- path: [KeyedSegment]
409
- offset: number
410
- }
@@ -28,7 +28,6 @@ export {
28
28
  type BehaviorActionIntendSet,
29
29
  type BehaviorEvent,
30
30
  type BehaviorGuard,
31
- type BlockOffset,
32
31
  type CustomBehaviorEvent,
33
32
  type NativeBehaviorEvent,
34
33
  type SyntheticBehaviorEvent,
@@ -2,8 +2,8 @@ import {defineConverter} from './converter.types'
2
2
 
3
3
  export const converterJson = defineConverter({
4
4
  mimeType: 'application/json',
5
- serialize: ({context, event}) => {
6
- const portableTextConverter = context.converters.find(
5
+ serialize: ({snapshot, event}) => {
6
+ const portableTextConverter = snapshot.context.converters.find(
7
7
  (converter) => converter.mimeType === 'application/x-portable-text',
8
8
  )
9
9
 
@@ -17,7 +17,7 @@ export const converterJson = defineConverter({
17
17
  }
18
18
 
19
19
  const serializationEvent = portableTextConverter.serialize({
20
- context,
20
+ snapshot,
21
21
  event,
22
22
  })
23
23
 
@@ -27,8 +27,8 @@ export const converterJson = defineConverter({
27
27
  originEvent: event.originEvent,
28
28
  }
29
29
  },
30
- deserialize: ({context, event}) => {
31
- const portableTextConverter = context.converters.find(
30
+ deserialize: ({snapshot, event}) => {
31
+ const portableTextConverter = snapshot.context.converters.find(
32
32
  (converter) => converter.mimeType === 'application/x-portable-text',
33
33
  )
34
34
 
@@ -41,7 +41,7 @@ export const converterJson = defineConverter({
41
41
  }
42
42
 
43
43
  const deserializationEvent = portableTextConverter.deserialize({
44
- context,
44
+ snapshot,
45
45
  event,
46
46
  })
47
47
 
@@ -8,14 +8,16 @@ import {createTestKeyGenerator} from '../internal-utils/test-key-generator'
8
8
  import {converterPortableText} from './converter.portable-text'
9
9
  import {coreConverters} from './converters.core'
10
10
 
11
- function createContext(schema: SchemaDefinition) {
11
+ function createSnapshot(schema: SchemaDefinition) {
12
12
  return {
13
- converters: coreConverters,
14
- activeDecorators: [],
15
- keyGenerator: createTestKeyGenerator(),
16
- schema: compileSchemaDefinition(schema),
17
- value: [],
18
- selection: null,
13
+ context: {
14
+ converters: coreConverters,
15
+ activeDecorators: [],
16
+ keyGenerator: createTestKeyGenerator(),
17
+ schema: compileSchemaDefinition(schema),
18
+ value: [],
19
+ selection: null,
20
+ },
19
21
  }
20
22
  }
21
23
 
@@ -23,7 +25,7 @@ describe(converterPortableText.deserialize, () => {
23
25
  test('non-array', () => {
24
26
  expect(
25
27
  converterPortableText.deserialize({
26
- context: createContext(defineSchema({})),
28
+ snapshot: createSnapshot(defineSchema({})),
27
29
  event: {
28
30
  type: 'deserialize',
29
31
  data: JSON.stringify(''),
@@ -37,7 +39,7 @@ describe(converterPortableText.deserialize, () => {
37
39
  test('empty array', () => {
38
40
  expect(
39
41
  converterPortableText.deserialize({
40
- context: createContext(defineSchema({})),
42
+ snapshot: createSnapshot(defineSchema({})),
41
43
  event: {
42
44
  type: 'deserialize',
43
45
  data: JSON.stringify([]),
@@ -51,7 +53,7 @@ describe(converterPortableText.deserialize, () => {
51
53
  test('no known array entries', () => {
52
54
  expect(
53
55
  converterPortableText.deserialize({
54
- context: createContext(defineSchema({})),
56
+ snapshot: createSnapshot(defineSchema({})),
55
57
  event: {
56
58
  type: 'deserialize',
57
59
  data: JSON.stringify([{foo: 'bar'}]),
@@ -65,7 +67,7 @@ describe(converterPortableText.deserialize, () => {
65
67
  test('some known array entries', () => {
66
68
  expect(
67
69
  converterPortableText.deserialize({
68
- context: createContext(defineSchema({})),
70
+ snapshot: createSnapshot(defineSchema({})),
69
71
  event: {
70
72
  type: 'deserialize',
71
73
  data: JSON.stringify([{_type: 'block', children: []}, {foo: 'bar'}]),
@@ -93,7 +95,7 @@ describe(converterPortableText.deserialize, () => {
93
95
  test('no marks or markDefs', () => {
94
96
  expect(
95
97
  converterPortableText.deserialize({
96
- context: createContext(defineSchema({})),
98
+ snapshot: createSnapshot(defineSchema({})),
97
99
  event: {
98
100
  type: 'deserialize',
99
101
  data: JSON.stringify([
@@ -129,7 +131,7 @@ describe(converterPortableText.deserialize, () => {
129
131
  test('unknown block object', () => {
130
132
  expect(
131
133
  converterPortableText.deserialize({
132
- context: createContext(defineSchema({})),
134
+ snapshot: createSnapshot(defineSchema({})),
133
135
  event: {
134
136
  type: 'deserialize',
135
137
  data: JSON.stringify([{_type: 'foo'}]),
@@ -143,7 +145,7 @@ describe(converterPortableText.deserialize, () => {
143
145
  test('known block object', () => {
144
146
  expect(
145
147
  converterPortableText.deserialize({
146
- context: createContext(
148
+ snapshot: createSnapshot(
147
149
  defineSchema({
148
150
  blockObjects: [{name: 'image'}],
149
151
  }),
@@ -173,7 +175,7 @@ describe(converterPortableText.deserialize, () => {
173
175
  test('unknown inline object', () => {
174
176
  expect(
175
177
  converterPortableText.deserialize({
176
- context: createContext(defineSchema({})),
178
+ snapshot: createSnapshot(defineSchema({})),
177
179
  event: {
178
180
  type: 'deserialize',
179
181
  data: JSON.stringify([
@@ -204,7 +206,7 @@ describe(converterPortableText.deserialize, () => {
204
206
  test('known inline object', () => {
205
207
  expect(
206
208
  converterPortableText.deserialize({
207
- context: createContext(
209
+ snapshot: createSnapshot(
208
210
  defineSchema({
209
211
  inlineObjects: [{name: 'stock-ticker'}],
210
212
  }),
@@ -231,7 +233,7 @@ describe(converterPortableText.deserialize, () => {
231
233
 
232
234
  test('no style', () => {
233
235
  const deserializedEvent = converterPortableText.deserialize({
234
- context: createContext(defineSchema({})),
236
+ snapshot: createSnapshot(defineSchema({})),
235
237
  event: {
236
238
  type: 'deserialize',
237
239
  data: JSON.stringify([
@@ -267,7 +269,7 @@ describe(converterPortableText.deserialize, () => {
267
269
 
268
270
  test('default style', () => {
269
271
  const deserializedEvent = converterPortableText.deserialize({
270
- context: createContext(defineSchema({styles: [{name: 'h1'}]})),
272
+ snapshot: createSnapshot(defineSchema({styles: [{name: 'h1'}]})),
271
273
  event: {
272
274
  type: 'deserialize',
273
275
  data: JSON.stringify([
@@ -303,7 +305,7 @@ describe(converterPortableText.deserialize, () => {
303
305
 
304
306
  test('unknown style', () => {
305
307
  const deserializedEvent = converterPortableText.deserialize({
306
- context: createContext(defineSchema({})),
308
+ snapshot: createSnapshot(defineSchema({})),
307
309
  event: {
308
310
  type: 'deserialize',
309
311
  data: JSON.stringify([
@@ -340,7 +342,7 @@ describe(converterPortableText.deserialize, () => {
340
342
 
341
343
  test('known style', () => {
342
344
  const deserializedEvent = converterPortableText.deserialize({
343
- context: createContext(
345
+ snapshot: createSnapshot(
344
346
  defineSchema({
345
347
  styles: [{name: 'h1'}],
346
348
  }),
@@ -381,7 +383,7 @@ describe(converterPortableText.deserialize, () => {
381
383
 
382
384
  test('unknown listItem', () => {
383
385
  const deserializedEvent = converterPortableText.deserialize({
384
- context: createContext(defineSchema({})),
386
+ snapshot: createSnapshot(defineSchema({})),
385
387
  event: {
386
388
  type: 'deserialize',
387
389
  data: JSON.stringify([
@@ -420,7 +422,7 @@ describe(converterPortableText.deserialize, () => {
420
422
 
421
423
  test('known listItem', () => {
422
424
  const deserializedEvent = converterPortableText.deserialize({
423
- context: createContext(
425
+ snapshot: createSnapshot(
424
426
  defineSchema({
425
427
  lists: [{name: 'bullet'}],
426
428
  }),
@@ -465,7 +467,7 @@ describe(converterPortableText.deserialize, () => {
465
467
  test('unknown annotations', () => {
466
468
  expect(
467
469
  converterPortableText.deserialize({
468
- context: createContext(defineSchema({})),
470
+ snapshot: createSnapshot(defineSchema({})),
469
471
  event: {
470
472
  type: 'deserialize',
471
473
  data: JSON.stringify([
@@ -523,7 +525,7 @@ describe(converterPortableText.deserialize, () => {
523
525
  test('known annotations', () => {
524
526
  expect(
525
527
  converterPortableText.deserialize({
526
- context: createContext(
528
+ snapshot: createSnapshot(
527
529
  defineSchema({
528
530
  annotations: [{name: 'link'}],
529
531
  }),
@@ -592,7 +594,7 @@ describe(converterPortableText.deserialize, () => {
592
594
  test('unknown decorators', () => {
593
595
  expect(
594
596
  converterPortableText.deserialize({
595
- context: createContext(defineSchema({})),
597
+ snapshot: createSnapshot(defineSchema({})),
596
598
  event: {
597
599
  type: 'deserialize',
598
600
  data: JSON.stringify([
@@ -638,7 +640,7 @@ describe(converterPortableText.deserialize, () => {
638
640
  test('known decorators', () => {
639
641
  expect(
640
642
  converterPortableText.deserialize({
641
- context: createContext(
643
+ snapshot: createSnapshot(
642
644
  defineSchema({
643
645
  decorators: [{name: 'strong'}],
644
646
  }),
@@ -4,8 +4,8 @@ import {defineConverter} from './converter.types'
4
4
 
5
5
  export const converterPortableText = defineConverter({
6
6
  mimeType: 'application/x-portable-text',
7
- serialize: ({context, event}) => {
8
- if (!context.selection) {
7
+ serialize: ({snapshot, event}) => {
8
+ if (!snapshot.context.selection) {
9
9
  return {
10
10
  type: 'serialization.failure',
11
11
  mimeType: 'application/x-portable-text',
@@ -15,8 +15,8 @@ export const converterPortableText = defineConverter({
15
15
  }
16
16
 
17
17
  const blocks = sliceBlocks({
18
- blocks: context.value,
19
- selection: context.selection,
18
+ blocks: snapshot.context.value,
19
+ selection: snapshot.context.selection,
20
20
  })
21
21
 
22
22
  return {
@@ -26,7 +26,7 @@ export const converterPortableText = defineConverter({
26
26
  originEvent: event.originEvent,
27
27
  }
28
28
  },
29
- deserialize: ({context, event}) => {
29
+ deserialize: ({snapshot, event}) => {
30
30
  const blocks = JSON.parse(event.data)
31
31
 
32
32
  if (!Array.isArray(blocks)) {
@@ -39,7 +39,7 @@ export const converterPortableText = defineConverter({
39
39
 
40
40
  const parsedBlocks = blocks.flatMap((block) => {
41
41
  const parsedBlock = parseBlock({
42
- context,
42
+ context: snapshot.context,
43
43
  block,
44
44
  options: {refreshKeys: true},
45
45
  })
@@ -8,14 +8,16 @@ import {createTestKeyGenerator} from '../internal-utils/test-key-generator'
8
8
  import {converterTextHtml} from './converter.text-html'
9
9
  import {coreConverters} from './converters.core'
10
10
 
11
- function createContext(schema: SchemaDefinition) {
11
+ function createSnapshot(schema: SchemaDefinition) {
12
12
  return {
13
- converters: coreConverters,
14
- activeDecorators: [],
15
- keyGenerator: createTestKeyGenerator(),
16
- schema: compileSchemaDefinition(schema),
17
- selection: null,
18
- value: [],
13
+ context: {
14
+ converters: coreConverters,
15
+ activeDecorators: [],
16
+ keyGenerator: createTestKeyGenerator(),
17
+ schema: compileSchemaDefinition(schema),
18
+ selection: null,
19
+ value: [],
20
+ },
19
21
  }
20
22
  }
21
23
 
@@ -31,7 +33,7 @@ describe(converterTextHtml.deserialize.name, () => {
31
33
  test('paragraph with unknown decorators', () => {
32
34
  expect(
33
35
  converterTextHtml.deserialize({
34
- context: createContext(defineSchema({})),
36
+ snapshot: createSnapshot(defineSchema({})),
35
37
  event: {
36
38
  type: 'deserialize',
37
39
  data: decoratedParagraph,
@@ -60,7 +62,7 @@ describe(converterTextHtml.deserialize.name, () => {
60
62
  test('paragraph with known decorators', () => {
61
63
  expect(
62
64
  converterTextHtml.deserialize({
63
- context: createContext(
65
+ snapshot: createSnapshot(
64
66
  defineSchema({
65
67
  decorators: [{name: 'strong'}, {name: 'em'}, {name: 'code'}],
66
68
  }),
@@ -105,7 +107,7 @@ describe(converterTextHtml.deserialize.name, () => {
105
107
  test('image', () => {
106
108
  expect(
107
109
  converterTextHtml.deserialize({
108
- context: createContext(
110
+ snapshot: createSnapshot(
109
111
  defineSchema({
110
112
  blockObjects: [{name: 'image'}],
111
113
  }),
@@ -123,7 +125,7 @@ describe(converterTextHtml.deserialize.name, () => {
123
125
  test('paragraph with unknown link', () => {
124
126
  expect(
125
127
  converterTextHtml.deserialize({
126
- context: createContext(defineSchema({})),
128
+ snapshot: createSnapshot(defineSchema({})),
127
129
  event: {
128
130
  type: 'deserialize',
129
131
  data: paragraphWithLink,
@@ -152,7 +154,7 @@ describe(converterTextHtml.deserialize.name, () => {
152
154
  test('paragraph with known link', () => {
153
155
  expect(
154
156
  converterTextHtml.deserialize({
155
- context: createContext(
157
+ snapshot: createSnapshot(
156
158
  defineSchema({
157
159
  annotations: [{name: 'link'}],
158
160
  }),
@@ -197,7 +199,7 @@ describe(converterTextHtml.deserialize.name, () => {
197
199
  test('unordered list', () => {
198
200
  expect(
199
201
  converterTextHtml.deserialize({
200
- context: createContext(
202
+ snapshot: createSnapshot(
201
203
  defineSchema({
202
204
  lists: [{name: 'bullet'}],
203
205
  }),
@@ -248,7 +250,7 @@ describe(converterTextHtml.deserialize.name, () => {
248
250
  test('ordered list', () => {
249
251
  expect(
250
252
  converterTextHtml.deserialize({
251
- context: createContext(
253
+ snapshot: createSnapshot(
252
254
  defineSchema({
253
255
  lists: [{name: 'number'}],
254
256
  }),
@@ -299,7 +301,7 @@ describe(converterTextHtml.deserialize.name, () => {
299
301
  test('nested list', () => {
300
302
  expect(
301
303
  converterTextHtml.deserialize({
302
- context: createContext(
304
+ snapshot: createSnapshot(
303
305
  defineSchema({
304
306
  lists: [{name: 'bullet'}, {name: 'number'}],
305
307
  }),