You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
4.4 KiB
234 lines
4.4 KiB
import * as Automerge from 'automerge'
|
|
|
|
import { createDoc, toJS, createNode, createText } from '../utils'
|
|
|
|
import { applySlateOps } from './'
|
|
|
|
const transforms = [
|
|
[
|
|
'insert_text',
|
|
[createNode('paragraph', '')],
|
|
[
|
|
{
|
|
marks: [],
|
|
offset: 0,
|
|
path: [0, 0],
|
|
text: 'Hello ',
|
|
type: 'insert_text'
|
|
},
|
|
{
|
|
marks: [],
|
|
offset: 6,
|
|
path: [0, 0],
|
|
text: 'collaborator',
|
|
type: 'insert_text'
|
|
},
|
|
{
|
|
marks: [],
|
|
offset: 18,
|
|
path: [0, 0],
|
|
text: '!',
|
|
type: 'insert_text'
|
|
}
|
|
],
|
|
[createNode('paragraph', 'Hello collaborator!')]
|
|
],
|
|
[
|
|
'remove_text',
|
|
[createNode('paragraph', 'Hello collaborator!')],
|
|
[
|
|
{
|
|
offset: 11,
|
|
path: [0, 0],
|
|
text: 'borator',
|
|
type: 'remove_text'
|
|
},
|
|
{
|
|
offset: 5,
|
|
path: [0, 0],
|
|
text: ' colla',
|
|
type: 'remove_text'
|
|
}
|
|
],
|
|
[createNode('paragraph', 'Hello!')]
|
|
],
|
|
[
|
|
'insert_node',
|
|
null,
|
|
[
|
|
{
|
|
type: 'insert_node',
|
|
path: [1],
|
|
node: { type: 'paragraph', children: [] }
|
|
},
|
|
{
|
|
type: 'insert_node',
|
|
path: [1, 0],
|
|
node: { text: 'Hello collaborator!' }
|
|
}
|
|
],
|
|
[createNode(), createNode('paragraph', 'Hello collaborator!')]
|
|
],
|
|
[
|
|
'merge_node',
|
|
[
|
|
createNode('paragraph', 'Hello '),
|
|
createNode('paragraph', 'collaborator!')
|
|
],
|
|
[
|
|
{
|
|
path: [1],
|
|
position: 1,
|
|
properties: { type: 'paragraph' },
|
|
target: null,
|
|
type: 'merge_node'
|
|
},
|
|
{
|
|
path: [0, 1],
|
|
position: 6,
|
|
properties: {},
|
|
target: null,
|
|
type: 'merge_node'
|
|
}
|
|
],
|
|
[createNode('paragraph', 'Hello collaborator!')]
|
|
],
|
|
[
|
|
'move_node',
|
|
[
|
|
createNode('paragraph', 'first'),
|
|
createNode('paragraph', 'second'),
|
|
createNode('paragraph', 'third'),
|
|
createNode('paragraph', 'fourth')
|
|
],
|
|
[
|
|
{
|
|
newPath: [0],
|
|
path: [1],
|
|
type: 'move_node'
|
|
},
|
|
{
|
|
newPath: [3, 0],
|
|
path: [2, 0],
|
|
type: 'move_node'
|
|
}
|
|
],
|
|
[
|
|
createNode('paragraph', 'second'),
|
|
createNode('paragraph', 'first'),
|
|
{
|
|
type: 'paragraph',
|
|
children: []
|
|
},
|
|
{
|
|
type: 'paragraph',
|
|
children: [createText('third'), createText('fourth')]
|
|
}
|
|
]
|
|
],
|
|
[
|
|
'remove_node',
|
|
[
|
|
createNode('paragraph', 'first'),
|
|
createNode('paragraph', 'second'),
|
|
createNode('paragraph', 'third')
|
|
],
|
|
[
|
|
{
|
|
path: [1, 0],
|
|
type: 'remove_node'
|
|
},
|
|
{
|
|
path: [0],
|
|
type: 'remove_node'
|
|
}
|
|
],
|
|
[
|
|
{
|
|
type: 'paragraph',
|
|
children: []
|
|
},
|
|
createNode('paragraph', 'third')
|
|
]
|
|
],
|
|
[
|
|
'set_node',
|
|
[
|
|
createNode('paragraph', 'first', { test: '1234' }),
|
|
createNode('paragraph', 'second')
|
|
],
|
|
[
|
|
{
|
|
path: [0],
|
|
type: 'set_node',
|
|
properties: {
|
|
test: '1234'
|
|
},
|
|
newProperties: {
|
|
test: '4567'
|
|
}
|
|
},
|
|
{
|
|
path: [1, 0],
|
|
type: 'set_node',
|
|
newProperties: {
|
|
data: '4567'
|
|
}
|
|
}
|
|
],
|
|
[
|
|
createNode('paragraph', 'first', { test: '4567' }),
|
|
{
|
|
type: 'paragraph',
|
|
children: [
|
|
{
|
|
data: '4567',
|
|
text: 'second'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
],
|
|
[
|
|
'split_node',
|
|
[createNode('paragraph', 'Hello collaborator!')],
|
|
[
|
|
{
|
|
path: [0, 0],
|
|
position: 6,
|
|
target: null,
|
|
type: 'split_node'
|
|
},
|
|
{
|
|
path: [0],
|
|
position: 1,
|
|
properties: {
|
|
type: 'paragraph'
|
|
},
|
|
target: 6,
|
|
type: 'split_node'
|
|
}
|
|
],
|
|
[
|
|
createNode('paragraph', 'Hello '),
|
|
createNode('paragraph', 'collaborator!')
|
|
]
|
|
]
|
|
]
|
|
|
|
describe('apply slate operations to Automerge document', () => {
|
|
transforms.forEach(([op, input, operations, output]) => {
|
|
it(`apply ${op} operations`, () => {
|
|
const doc = createDoc(input)
|
|
|
|
const updated = Automerge.change(doc, (d: any) => {
|
|
applySlateOps(d.children, operations as any)
|
|
})
|
|
|
|
const expected = createDoc(output)
|
|
|
|
expect(toJS(expected)).toStrictEqual(toJS(updated))
|
|
})
|
|
})
|
|
})
|