@handlewithcare/react-prosemirror 2.5.2 → 2.6.0-tiptap.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.
- package/README.md +2 -3
- package/dist/cjs/ReactEditorView.js +12 -0
- package/dist/cjs/components/CustomNodeView.js +11 -23
- package/dist/cjs/components/ReactNodeView.js +16 -18
- package/dist/cjs/components/__tests__/ProseMirror.composition.test.js +398 -0
- package/dist/cjs/components/__tests__/ProseMirror.domchange.test.js +270 -0
- package/dist/cjs/components/__tests__/ProseMirror.draw-decoration.test.js +1010 -0
- package/dist/cjs/components/__tests__/ProseMirror.draw.test.js +337 -0
- package/dist/cjs/components/__tests__/ProseMirror.node-view.test.js +315 -0
- package/dist/cjs/components/__tests__/ProseMirror.selection.test.js +444 -0
- package/dist/cjs/components/__tests__/ProseMirror.test.js +382 -0
- package/dist/cjs/contexts/__tests__/DeferredLayoutEffects.test.js +141 -0
- package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +108 -0
- package/dist/cjs/hooks/useClientOnly.js +19 -0
- package/dist/cjs/plugins/__tests__/reactKeys.test.js +81 -0
- package/dist/cjs/selection/SelectionDOMObserver.js +171 -0
- package/dist/cjs/selection/hasFocusAndSelection.js +35 -0
- package/dist/cjs/selection/selectionFromDOM.js +77 -0
- package/dist/cjs/selection/selectionToDOM.js +226 -0
- package/dist/cjs/ssr.js +85 -0
- package/dist/cjs/tiptap/TiptapEditorContent.js +93 -0
- package/dist/cjs/tiptap/TiptapEditorView.js +84 -0
- package/dist/cjs/tiptap/hooks/useTiptapEditorEffect.js +27 -0
- package/dist/cjs/tiptap/hooks/useTiptapEditorEventCallback.js +26 -0
- package/dist/cjs/tiptap/index.js +32 -0
- package/dist/cjs/tiptap/tiptapNodeView.js +181 -0
- package/dist/esm/ReactEditorView.js +12 -0
- package/dist/esm/components/CustomNodeView.js +12 -24
- package/dist/esm/components/ReactNodeView.js +16 -18
- package/dist/esm/components/__tests__/ProseMirror.composition.test.js +395 -0
- package/dist/esm/components/__tests__/ProseMirror.domchange.test.js +266 -0
- package/dist/esm/components/__tests__/ProseMirror.draw-decoration.test.js +967 -0
- package/dist/esm/components/__tests__/ProseMirror.draw.test.js +294 -0
- package/dist/esm/components/__tests__/ProseMirror.node-view.test.js +272 -0
- package/dist/esm/components/__tests__/ProseMirror.selection.test.js +440 -0
- package/dist/esm/components/__tests__/ProseMirror.test.js +339 -0
- package/dist/esm/contexts/__tests__/DeferredLayoutEffects.test.js +98 -0
- package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +99 -0
- package/dist/esm/hooks/useClientOnly.js +9 -0
- package/dist/esm/hooks/useEditorEffect.js +4 -0
- package/dist/esm/hooks/useEditorEventCallback.js +3 -5
- package/dist/esm/plugins/__tests__/reactKeys.test.js +77 -0
- package/dist/esm/selection/SelectionDOMObserver.js +161 -0
- package/dist/esm/selection/hasFocusAndSelection.js +17 -0
- package/dist/esm/selection/selectionFromDOM.js +59 -0
- package/dist/esm/selection/selectionToDOM.js +196 -0
- package/dist/esm/ssr.js +82 -0
- package/dist/esm/tiptap/TiptapEditorContent.js +42 -0
- package/dist/esm/tiptap/TiptapEditorView.js +35 -0
- package/dist/esm/tiptap/hooks/useTiptapEditorEffect.js +34 -0
- package/dist/esm/tiptap/hooks/useTiptapEditorEventCallback.js +26 -0
- package/dist/esm/tiptap/index.js +5 -0
- package/dist/esm/tiptap/tiptapNodeView.js +149 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ReactEditorView.d.ts +1 -0
- package/dist/types/constants.d.ts +1 -1
- package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +1 -0
- package/dist/types/hooks/useClientOnly.d.ts +1 -0
- package/dist/types/hooks/useEditorEffect.d.ts +4 -0
- package/dist/types/hooks/useEditorEventCallback.d.ts +3 -5
- package/dist/types/props.d.ts +26 -26
- package/dist/types/selection/SelectionDOMObserver.d.ts +33 -0
- package/dist/types/selection/hasFocusAndSelection.d.ts +3 -0
- package/dist/types/selection/selectionFromDOM.d.ts +4 -0
- package/dist/types/selection/selectionToDOM.d.ts +9 -0
- package/dist/types/ssr.d.ts +19 -0
- package/dist/types/tiptap/TiptapEditorContent.d.ts +7 -0
- package/dist/types/tiptap/TiptapEditorView.d.ts +13 -0
- package/dist/types/tiptap/hooks/useTiptapEditorEffect.d.ts +21 -0
- package/dist/types/tiptap/hooks/useTiptapEditorEventCallback.d.ts +13 -0
- package/dist/types/tiptap/index.d.ts +5 -0
- package/dist/types/tiptap/tiptapNodeView.d.ts +48 -0
- package/package.json +8 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ "use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _react = require("@testing-library/react");
|
|
6
|
+
const _prosemirrorState = require("prosemirror-state");
|
|
7
|
+
const _prosemirrorTestBuilder = require("prosemirror-test-builder");
|
|
8
|
+
const _webdriverio = require("webdriverio");
|
|
9
|
+
const _editorViewTestHelpersJs = require("../../testing/editorViewTestHelpers.js");
|
|
10
|
+
describe("DOM change", ()=>{
|
|
11
|
+
it("notices when text is added", async ()=>{
|
|
12
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
13
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("he<a>llo"))
|
|
14
|
+
});
|
|
15
|
+
view.focus();
|
|
16
|
+
await browser.keys([
|
|
17
|
+
_webdriverio.Key.Shift,
|
|
18
|
+
"l"
|
|
19
|
+
]);
|
|
20
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("heLllo")));
|
|
21
|
+
});
|
|
22
|
+
it("notices when text is removed", async ()=>{
|
|
23
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
24
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("hell<a>o"))
|
|
25
|
+
});
|
|
26
|
+
view.focus();
|
|
27
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
28
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
29
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("heo")));
|
|
30
|
+
});
|
|
31
|
+
it("respects stored marks", async ()=>{
|
|
32
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
33
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("hello<a>"))
|
|
34
|
+
});
|
|
35
|
+
view.dispatch(view.state.tr.addStoredMark(view.state.schema.marks.em.create()));
|
|
36
|
+
view.focus();
|
|
37
|
+
await browser.keys("o");
|
|
38
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("hello", (0, _prosemirrorTestBuilder.em)("o"))));
|
|
39
|
+
});
|
|
40
|
+
it("support inserting repeated text", async ()=>{
|
|
41
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
42
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("hello"))
|
|
43
|
+
});
|
|
44
|
+
view.focus();
|
|
45
|
+
await browser.keys("h");
|
|
46
|
+
await browser.keys("e");
|
|
47
|
+
await browser.keys("l");
|
|
48
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("helhello")));
|
|
49
|
+
});
|
|
50
|
+
it("detects an enter press", async ()=>{
|
|
51
|
+
let enterPressed = false;
|
|
52
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
53
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.blockquote)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.p)("<a>"))),
|
|
54
|
+
handleKeyDown: (_, event)=>{
|
|
55
|
+
if (event.key === "Enter") return enterPressed = true;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
view.focus();
|
|
60
|
+
await browser.keys(_webdriverio.Key.Enter);
|
|
61
|
+
expect(enterPressed).toBeTruthy();
|
|
62
|
+
});
|
|
63
|
+
it("detects a simple backspace press", async ()=>{
|
|
64
|
+
let backspacePressed = false;
|
|
65
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
66
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.blockquote)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.p)("<a>"))),
|
|
67
|
+
handleKeyDown: (_, event)=>{
|
|
68
|
+
if (event.key === "Backspace") return backspacePressed = true;
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
view.focus();
|
|
73
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
74
|
+
expect(backspacePressed).toBeTruthy();
|
|
75
|
+
});
|
|
76
|
+
it("correctly adjusts the selection", async ()=>{
|
|
77
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
78
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("abc<a>"))
|
|
79
|
+
});
|
|
80
|
+
view.focus();
|
|
81
|
+
await browser.keys("d");
|
|
82
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("abcd")));
|
|
83
|
+
expect(view.state.selection.anchor).toBe(5);
|
|
84
|
+
expect(view.state.selection.head).toBe(5);
|
|
85
|
+
});
|
|
86
|
+
// todoit("can read a simple composition", () => {
|
|
87
|
+
// let view = tempEditor({ doc: doc(p("hello")) });
|
|
88
|
+
// findTextNode(view.dom, "hello")!.nodeValue = "hellox";
|
|
89
|
+
// flush(view);
|
|
90
|
+
// ist(view.state.doc, doc(p("hellox")), eq);
|
|
91
|
+
// });
|
|
92
|
+
// $$FORK: We _do_ repaint text nodes when they're typed into.
|
|
93
|
+
// Unlike prosemirror-view, we prevent user inputs from modifying
|
|
94
|
+
// the dom until after we've turned them into transactions.
|
|
95
|
+
// This test instead ensures that we only modify the character data,
|
|
96
|
+
// rather than replacing entire nodes.
|
|
97
|
+
it("does not replace a text node when it's typed into", async ()=>{
|
|
98
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
99
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("fo<a>o"))
|
|
100
|
+
});
|
|
101
|
+
let mutated = false;
|
|
102
|
+
const observer = new MutationObserver(()=>mutated = true);
|
|
103
|
+
observer.observe(view.dom, {
|
|
104
|
+
subtree: true,
|
|
105
|
+
characterData: false,
|
|
106
|
+
childList: true
|
|
107
|
+
});
|
|
108
|
+
view.focus();
|
|
109
|
+
await browser.keys("j");
|
|
110
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("fojo")));
|
|
111
|
+
expect(mutated).toBeFalsy();
|
|
112
|
+
observer.disconnect();
|
|
113
|
+
});
|
|
114
|
+
it("understands text typed into an empty paragraph", async ()=>{
|
|
115
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
116
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("<a>"))
|
|
117
|
+
});
|
|
118
|
+
view.focus();
|
|
119
|
+
await browser.keys("i");
|
|
120
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("i")));
|
|
121
|
+
});
|
|
122
|
+
it("fixes text changes when input is ignored", async ()=>{
|
|
123
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
124
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo<a>")),
|
|
125
|
+
controlled: true,
|
|
126
|
+
dispatchTransaction () {
|
|
127
|
+
// intentionally do nothing
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
view.focus();
|
|
131
|
+
await browser.keys("i");
|
|
132
|
+
expect(view.dom.textContent).toBe("foo");
|
|
133
|
+
});
|
|
134
|
+
it("aborts when an incompatible state is set", async ()=>{
|
|
135
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
136
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("<a>abcde"))
|
|
137
|
+
});
|
|
138
|
+
view.dispatchEvent({
|
|
139
|
+
type: "input"
|
|
140
|
+
});
|
|
141
|
+
view.focus();
|
|
142
|
+
await browser.keys("x");
|
|
143
|
+
view.updateState(_prosemirrorState.EditorState.create({
|
|
144
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("uvw"))
|
|
145
|
+
}));
|
|
146
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("uvw")));
|
|
147
|
+
});
|
|
148
|
+
it("preserves marks on deletion", async ()=>{
|
|
149
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
150
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("one", (0, _prosemirrorTestBuilder.em)("x<a>")))
|
|
151
|
+
});
|
|
152
|
+
view.focus();
|
|
153
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
154
|
+
view.dispatchEvent({
|
|
155
|
+
type: "input"
|
|
156
|
+
});
|
|
157
|
+
view.dispatch(view.state.tr.insertText("y"));
|
|
158
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("one", (0, _prosemirrorTestBuilder.em)("y"))));
|
|
159
|
+
});
|
|
160
|
+
it("works when a node's contentDOM is deleted", async ()=>{
|
|
161
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
162
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("one"), (0, _prosemirrorTestBuilder.pre)("two<a>"))
|
|
163
|
+
});
|
|
164
|
+
view.focus();
|
|
165
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
166
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
167
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
168
|
+
view.dispatchEvent({
|
|
169
|
+
type: "input"
|
|
170
|
+
});
|
|
171
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("one"), (0, _prosemirrorTestBuilder.pre)()));
|
|
172
|
+
expect(view.state.selection.head).toBe(6);
|
|
173
|
+
});
|
|
174
|
+
it("doesn't redraw content with marks when typing in front", async ()=>{
|
|
175
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
176
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("f<a>oo", (0, _prosemirrorTestBuilder.em)("bar"), (0, _prosemirrorTestBuilder.strong)("baz")))
|
|
177
|
+
});
|
|
178
|
+
const bar = await _react.screen.findByText("bar");
|
|
179
|
+
const foo = await _react.screen.findByText("foo");
|
|
180
|
+
view.focus();
|
|
181
|
+
await browser.keys("r");
|
|
182
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("froo", (0, _prosemirrorTestBuilder.em)("bar"), (0, _prosemirrorTestBuilder.strong)("baz"))));
|
|
183
|
+
expect(bar.parentNode).toBeTruthy();
|
|
184
|
+
expect(view.dom.contains(bar.parentNode)).toBeTruthy();
|
|
185
|
+
expect(foo.parentNode).toBeTruthy();
|
|
186
|
+
expect(view.dom.contains(foo.parentNode)).toBeTruthy();
|
|
187
|
+
});
|
|
188
|
+
it("doesn't redraw content with marks when typing inside mark", async ()=>{
|
|
189
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
190
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.em)("b<a>ar"), (0, _prosemirrorTestBuilder.strong)("baz")))
|
|
191
|
+
});
|
|
192
|
+
const bar = await _react.screen.findByText("bar");
|
|
193
|
+
const foo = await _react.screen.findByText("foo");
|
|
194
|
+
view.focus();
|
|
195
|
+
await browser.keys("a");
|
|
196
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.em)("baar"), (0, _prosemirrorTestBuilder.strong)("baz"))));
|
|
197
|
+
expect(bar.parentNode).toBeTruthy();
|
|
198
|
+
expect(view.dom.contains(bar.parentNode)).toBeTruthy();
|
|
199
|
+
expect(foo.parentNode).toBeTruthy();
|
|
200
|
+
expect(view.dom.contains(foo.parentNode)).toBeTruthy();
|
|
201
|
+
});
|
|
202
|
+
it("maps input to coordsAtPos through pending changes", async ()=>{
|
|
203
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
204
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"))
|
|
205
|
+
});
|
|
206
|
+
view.dispatchEvent({
|
|
207
|
+
type: "input"
|
|
208
|
+
});
|
|
209
|
+
view.dispatch(view.state.tr.insertText("more text"));
|
|
210
|
+
expect(view.coordsAtPos(13)).toBeTruthy();
|
|
211
|
+
});
|
|
212
|
+
it("notices text added to a cursor wrapper at the start of a mark", async ()=>{
|
|
213
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
214
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.strong)((0, _prosemirrorTestBuilder.a)("foo<a>"), "bar")))
|
|
215
|
+
});
|
|
216
|
+
view.focus();
|
|
217
|
+
await browser.keys("xy");
|
|
218
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.strong)((0, _prosemirrorTestBuilder.a)("foo"), "xybar"))));
|
|
219
|
+
});
|
|
220
|
+
it("removes cursor wrapper text when the wrapper otherwise remains valid", async ()=>{
|
|
221
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
222
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.a)((0, _prosemirrorTestBuilder.strong)("foo<a>"), "bar")))
|
|
223
|
+
});
|
|
224
|
+
view.focus();
|
|
225
|
+
await browser.keys("q");
|
|
226
|
+
expect(view.state.doc).toEqualNode((0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.a)((0, _prosemirrorTestBuilder.strong)("fooq"), "bar"))));
|
|
227
|
+
const found = _react.screen.queryByText("\uFEFFq");
|
|
228
|
+
expect(found).toBeNull();
|
|
229
|
+
});
|
|
230
|
+
it("creates a correct step for an ambiguous selection-deletion", async ()=>{
|
|
231
|
+
let steps;
|
|
232
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
233
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("la<a>la<b>la")),
|
|
234
|
+
dispatchTransaction (tr) {
|
|
235
|
+
steps = tr.steps;
|
|
236
|
+
view.updateState(view.state.apply(tr));
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
view.input.lastKeyCode = 8;
|
|
240
|
+
view.input.lastKeyCodeTime = Date.now();
|
|
241
|
+
view.focus();
|
|
242
|
+
await browser.keys(_webdriverio.Key.Backspace);
|
|
243
|
+
expect(steps).toHaveLength(1);
|
|
244
|
+
expect(steps[0].from).toBe(3);
|
|
245
|
+
expect(steps[0].to).toBe(5);
|
|
246
|
+
});
|
|
247
|
+
it("creates a step that covers the entire selection for partially-matching replacement", async ()=>{
|
|
248
|
+
let steps;
|
|
249
|
+
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
250
|
+
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("one <a>two<b> three")),
|
|
251
|
+
dispatchTransaction (tr) {
|
|
252
|
+
steps = tr.steps;
|
|
253
|
+
view.updateState(view.state.apply(tr));
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
view.focus();
|
|
257
|
+
await browser.keys("t");
|
|
258
|
+
expect(steps).toHaveLength(1);
|
|
259
|
+
expect(steps[0].from).toBe(5);
|
|
260
|
+
expect(steps[0].to).toBe(8);
|
|
261
|
+
expect(steps[0].slice.content.toString()).toBe('<"t">');
|
|
262
|
+
view.dispatch(view.state.tr.setSelection(_prosemirrorState.TextSelection.create(view.state.doc, 7, 12)));
|
|
263
|
+
view.focus();
|
|
264
|
+
await browser.keys("e");
|
|
265
|
+
expect(steps).toHaveLength(1);
|
|
266
|
+
expect(steps[0].from).toBe(7);
|
|
267
|
+
expect(steps[0].to).toBe(12);
|
|
268
|
+
expect(steps[0].slice.content.toString()).toBe('<"e">');
|
|
269
|
+
});
|
|
270
|
+
});
|