@handlewithcare/react-prosemirror 2.4.11 → 2.5.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/dist/cjs/AbstractEditorView.js +4 -0
- package/dist/cjs/ReactEditorView.js +156 -0
- package/dist/cjs/StaticEditorView.js +86 -0
- package/dist/cjs/components/ChildNodeViews.js +59 -30
- package/dist/cjs/components/CustomNodeView.js +9 -25
- package/dist/cjs/components/DocNodeView.js +6 -15
- package/dist/cjs/components/MarkView.js +1 -2
- package/dist/cjs/components/NativeWidgetView.js +2 -3
- package/dist/cjs/components/NodeView.js +1 -1
- package/dist/cjs/components/ProseMirror.js +11 -14
- package/dist/cjs/components/ReactNodeView.js +3 -4
- package/dist/cjs/components/SeparatorHackView.js +1 -2
- package/dist/cjs/components/TextNodeView.js +4 -5
- package/dist/cjs/components/TrailingHackView.js +1 -2
- package/dist/cjs/components/WidgetView.js +2 -4
- package/dist/cjs/constants.js +33 -0
- package/dist/cjs/hooks/useEditor.js +32 -230
- package/dist/cjs/hooks/useEditorEffect.js +2 -2
- package/dist/cjs/hooks/useEditorEventCallback.js +8 -5
- package/dist/cjs/hooks/useNodeViewDescriptor.js +10 -10
- package/dist/cjs/hooks/useReactKeys.js +1 -1
- package/dist/cjs/testing/editorViewTestHelpers.js +0 -2
- package/dist/cjs/viewdesc.js +10 -9
- package/dist/esm/AbstractEditorView.js +1 -0
- package/dist/esm/ReactEditorView.js +156 -0
- package/dist/esm/StaticEditorView.js +76 -0
- package/dist/esm/components/ChildNodeViews.js +60 -32
- package/dist/esm/components/CustomNodeView.js +9 -25
- package/dist/esm/components/DocNodeView.js +6 -15
- package/dist/esm/components/MarkView.js +1 -2
- package/dist/esm/components/NativeWidgetView.js +2 -3
- package/dist/esm/components/NodeView.js +1 -1
- package/dist/esm/components/ProseMirror.js +11 -14
- package/dist/esm/components/ReactNodeView.js +3 -4
- package/dist/esm/components/SeparatorHackView.js +1 -2
- package/dist/esm/components/TextNodeView.js +4 -5
- package/dist/esm/components/TrailingHackView.js +1 -2
- package/dist/esm/components/WidgetView.js +2 -4
- package/dist/esm/constants.js +15 -0
- package/dist/esm/hooks/useEditor.js +28 -219
- package/dist/esm/hooks/useEditorEffect.js +2 -2
- package/dist/esm/hooks/useEditorEventCallback.js +8 -5
- package/dist/esm/hooks/useNodeViewDescriptor.js +10 -10
- package/dist/esm/hooks/useReactKeys.js +1 -1
- package/dist/esm/testing/editorViewTestHelpers.js +0 -2
- package/dist/esm/viewdesc.js +3 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/AbstractEditorView.d.ts +27 -0
- package/dist/types/ReactEditorView.d.ts +79 -0
- package/dist/types/StaticEditorView.d.ts +24 -0
- package/dist/types/components/ChildNodeViews.d.ts +2 -2
- package/dist/types/components/CustomNodeView.d.ts +2 -2
- package/dist/types/components/DocNodeView.d.ts +2 -5
- package/dist/types/components/MarkView.d.ts +2 -2
- package/dist/types/components/NativeWidgetView.d.ts +2 -2
- package/dist/types/components/NodeView.d.ts +2 -2
- package/dist/types/components/ReactNodeView.d.ts +2 -2
- package/dist/types/components/SeparatorHackView.d.ts +2 -2
- package/dist/types/components/TextNodeView.d.ts +4 -3
- package/dist/types/components/TrailingHackView.d.ts +2 -2
- package/dist/types/components/WidgetView.d.ts +2 -2
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/contexts/EditorContext.d.ts +6 -4
- package/dist/types/decorations/computeDocDeco.d.ts +3 -2
- package/dist/types/decorations/viewDecorations.d.ts +3 -2
- package/dist/types/hooks/useEditor.d.ts +5 -46
- package/dist/types/hooks/useNodeViewDescriptor.d.ts +1 -1
- package/dist/types/hooks/useReactKeys.d.ts +1 -1
- package/dist/types/props.d.ts +26 -26
- package/dist/types/viewdesc.d.ts +6 -5
- package/package.json +6 -2
- package/dist/cjs/components/__tests__/ProseMirror.composition.test.js +0 -398
- package/dist/cjs/components/__tests__/ProseMirror.domchange.test.js +0 -270
- package/dist/cjs/components/__tests__/ProseMirror.draw-decoration.test.js +0 -1010
- package/dist/cjs/components/__tests__/ProseMirror.draw.test.js +0 -337
- package/dist/cjs/components/__tests__/ProseMirror.node-view.test.js +0 -315
- package/dist/cjs/components/__tests__/ProseMirror.selection.test.js +0 -444
- package/dist/cjs/components/__tests__/ProseMirror.test.js +0 -382
- package/dist/cjs/contexts/__tests__/DeferredLayoutEffects.test.js +0 -141
- package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -108
- package/dist/cjs/plugins/__tests__/reactKeys.test.js +0 -81
- package/dist/cjs/selection/SelectionDOMObserver.js +0 -171
- package/dist/cjs/selection/hasFocusAndSelection.js +0 -35
- package/dist/cjs/selection/selectionFromDOM.js +0 -77
- package/dist/cjs/selection/selectionToDOM.js +0 -226
- package/dist/cjs/ssr.js +0 -85
- package/dist/esm/components/__tests__/ProseMirror.composition.test.js +0 -395
- package/dist/esm/components/__tests__/ProseMirror.domchange.test.js +0 -266
- package/dist/esm/components/__tests__/ProseMirror.draw-decoration.test.js +0 -967
- package/dist/esm/components/__tests__/ProseMirror.draw.test.js +0 -294
- package/dist/esm/components/__tests__/ProseMirror.node-view.test.js +0 -272
- package/dist/esm/components/__tests__/ProseMirror.selection.test.js +0 -440
- package/dist/esm/components/__tests__/ProseMirror.test.js +0 -339
- package/dist/esm/contexts/__tests__/DeferredLayoutEffects.test.js +0 -98
- package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -99
- package/dist/esm/plugins/__tests__/reactKeys.test.js +0 -77
- package/dist/esm/selection/SelectionDOMObserver.js +0 -161
- package/dist/esm/selection/hasFocusAndSelection.js +0 -17
- package/dist/esm/selection/selectionFromDOM.js +0 -59
- package/dist/esm/selection/selectionToDOM.js +0 -196
- package/dist/esm/ssr.js +0 -82
- package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +0 -1
- package/dist/types/selection/SelectionDOMObserver.d.ts +0 -33
- package/dist/types/selection/hasFocusAndSelection.d.ts +0 -3
- package/dist/types/selection/selectionFromDOM.d.ts +0 -4
- package/dist/types/selection/selectionToDOM.d.ts +0 -9
- package/dist/types/ssr.d.ts +0 -19
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-non-null-assertion */ "use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _prosemirrorModel = require("prosemirror-model");
|
|
6
|
-
const _prosemirrorState = require("prosemirror-state");
|
|
7
|
-
const _prosemirrorTestBuilder = require("prosemirror-test-builder");
|
|
8
|
-
const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
|
|
9
|
-
const _editorViewTestHelpersJs = require("../../testing/editorViewTestHelpers.js");
|
|
10
|
-
function _extends() {
|
|
11
|
-
_extends = Object.assign || function(target) {
|
|
12
|
-
for(var i = 1; i < arguments.length; i++){
|
|
13
|
-
var source = arguments[i];
|
|
14
|
-
for(var key in source){
|
|
15
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
16
|
-
target[key] = source[key];
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return target;
|
|
21
|
-
};
|
|
22
|
-
return _extends.apply(this, arguments);
|
|
23
|
-
}
|
|
24
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
25
|
-
if (typeof WeakMap !== "function") return null;
|
|
26
|
-
var cacheBabelInterop = new WeakMap();
|
|
27
|
-
var cacheNodeInterop = new WeakMap();
|
|
28
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
29
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
30
|
-
})(nodeInterop);
|
|
31
|
-
}
|
|
32
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
33
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
34
|
-
return obj;
|
|
35
|
-
}
|
|
36
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
37
|
-
return {
|
|
38
|
-
default: obj
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
42
|
-
if (cache && cache.has(obj)) {
|
|
43
|
-
return cache.get(obj);
|
|
44
|
-
}
|
|
45
|
-
var newObj = {};
|
|
46
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
47
|
-
for(var key in obj){
|
|
48
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
49
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
50
|
-
if (desc && (desc.get || desc.set)) {
|
|
51
|
-
Object.defineProperty(newObj, key, desc);
|
|
52
|
-
} else {
|
|
53
|
-
newObj[key] = obj[key];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
newObj.default = obj;
|
|
58
|
-
if (cache) {
|
|
59
|
-
cache.set(obj, newObj);
|
|
60
|
-
}
|
|
61
|
-
return newObj;
|
|
62
|
-
}
|
|
63
|
-
describe("EditorView draw", ()=>{
|
|
64
|
-
it("updates the DOM", async ()=>{
|
|
65
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
66
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"))
|
|
67
|
-
});
|
|
68
|
-
view.dispatch(view.state.tr.insertText("bar"));
|
|
69
|
-
expect(view.dom.textContent).toBe("barfoo");
|
|
70
|
-
});
|
|
71
|
-
it("doesn't redraw nodes after changes", async ()=>{
|
|
72
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
73
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.h1)("foo<a>"), (0, _prosemirrorTestBuilder.p)("bar"))
|
|
74
|
-
});
|
|
75
|
-
const oldP = view.dom.querySelector("p");
|
|
76
|
-
view.dispatch(view.state.tr.insertText("!"));
|
|
77
|
-
expect(view.dom.querySelector("p")).toBe(oldP);
|
|
78
|
-
});
|
|
79
|
-
it("doesn't redraw nodes before changes", async ()=>{
|
|
80
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
81
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.h1)("bar"))
|
|
82
|
-
});
|
|
83
|
-
const oldP = view.dom.querySelector("p");
|
|
84
|
-
view.dispatch(view.state.tr.insertText("!", 2));
|
|
85
|
-
expect(view.dom.querySelector("p")).toBe(oldP);
|
|
86
|
-
});
|
|
87
|
-
it("doesn't redraw nodes between changes", async ()=>{
|
|
88
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
89
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.h1)("bar"), (0, _prosemirrorTestBuilder.pre)("baz"))
|
|
90
|
-
});
|
|
91
|
-
const oldP = view.dom.querySelector("p");
|
|
92
|
-
const oldPre = view.dom.querySelector("pre");
|
|
93
|
-
view.dispatch(view.state.tr.insertText("!", 2));
|
|
94
|
-
expect(view.dom.querySelector("p")).toBe(oldP);
|
|
95
|
-
expect(view.dom.querySelector("pre")).toBe(oldPre);
|
|
96
|
-
});
|
|
97
|
-
it("doesn't redraw siblings of a split node", async ()=>{
|
|
98
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
99
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.h1)("bar"), (0, _prosemirrorTestBuilder.pre)("baz"))
|
|
100
|
-
});
|
|
101
|
-
const oldP = view.dom.querySelector("p");
|
|
102
|
-
const oldPre = view.dom.querySelector("pre");
|
|
103
|
-
view.dispatch(view.state.tr.split(8));
|
|
104
|
-
expect(view.dom.querySelector("p")).toBe(oldP);
|
|
105
|
-
expect(view.dom.querySelector("pre")).toBe(oldPre);
|
|
106
|
-
});
|
|
107
|
-
it("doesn't redraw siblings of a joined node", async ()=>{
|
|
108
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
109
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.h1)("bar"), (0, _prosemirrorTestBuilder.h1)("x"), (0, _prosemirrorTestBuilder.pre)("baz"))
|
|
110
|
-
});
|
|
111
|
-
const oldP = view.dom.querySelector("p");
|
|
112
|
-
const oldPre = view.dom.querySelector("pre");
|
|
113
|
-
view.dispatch(view.state.tr.join(10));
|
|
114
|
-
expect(view.dom.querySelector("p")).toBe(oldP);
|
|
115
|
-
expect(view.dom.querySelector("pre")).toBe(oldPre);
|
|
116
|
-
});
|
|
117
|
-
it("doesn't redraw after a big deletion", async ()=>{
|
|
118
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
119
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.h1)("!"), (0, _prosemirrorTestBuilder.p)(), (0, _prosemirrorTestBuilder.p)())
|
|
120
|
-
});
|
|
121
|
-
const oldH = view.dom.querySelector("h1");
|
|
122
|
-
view.dispatch(view.state.tr.delete(2, 14));
|
|
123
|
-
expect(view.dom.querySelector("h1")).toBe(oldH);
|
|
124
|
-
});
|
|
125
|
-
it("adds classes from the attributes prop", async ()=>{
|
|
126
|
-
const { view , rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
127
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)()),
|
|
128
|
-
attributes: {
|
|
129
|
-
class: "foo bar"
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
expect(view.dom.classList.contains("foo")).toBeTruthy();
|
|
133
|
-
expect(view.dom.classList.contains("bar")).toBeTruthy();
|
|
134
|
-
expect(view.dom.classList.contains("ProseMirror")).toBeTruthy();
|
|
135
|
-
rerender({
|
|
136
|
-
attributes: {
|
|
137
|
-
class: "baz"
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
expect(!view.dom.classList.contains("foo")).toBeTruthy();
|
|
141
|
-
expect(view.dom.classList.contains("baz")).toBeTruthy();
|
|
142
|
-
});
|
|
143
|
-
it("adds style from the attributes prop", async ()=>{
|
|
144
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
145
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)()),
|
|
146
|
-
attributes: {
|
|
147
|
-
style: "border: 1px solid red;"
|
|
148
|
-
},
|
|
149
|
-
plugins: [
|
|
150
|
-
new _prosemirrorState.Plugin({
|
|
151
|
-
props: {
|
|
152
|
-
attributes: {
|
|
153
|
-
style: "background: red;"
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}),
|
|
157
|
-
new _prosemirrorState.Plugin({
|
|
158
|
-
props: {
|
|
159
|
-
attributes: {
|
|
160
|
-
style: "color: red;"
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
]
|
|
165
|
-
});
|
|
166
|
-
expect(view.dom.style.border).toBe("1px solid red");
|
|
167
|
-
expect(view.dom.style.backgroundColor).toBe("red");
|
|
168
|
-
expect(view.dom.style.color).toBe("red");
|
|
169
|
-
});
|
|
170
|
-
it("can set other attributes", async ()=>{
|
|
171
|
-
const { view , rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
172
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)()),
|
|
173
|
-
attributes: {
|
|
174
|
-
spellcheck: "false",
|
|
175
|
-
"aria-label": "hello"
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
expect(view.dom.spellcheck).toBe(false);
|
|
179
|
-
expect(view.dom.getAttribute("aria-label")).toBe("hello");
|
|
180
|
-
rerender({
|
|
181
|
-
attributes: {
|
|
182
|
-
style: "background-color: yellow"
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
expect(view.dom.hasAttribute("aria-label")).toBe(false);
|
|
186
|
-
expect(view.dom.style.backgroundColor).toBe("yellow");
|
|
187
|
-
});
|
|
188
|
-
it("can't set the contenteditable attribute", async ()=>{
|
|
189
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
190
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)()),
|
|
191
|
-
attributes: {
|
|
192
|
-
contenteditable: "false"
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
expect(view.dom.contentEditable).toBe("true");
|
|
196
|
-
});
|
|
197
|
-
it("understands the editable prop", async ()=>{
|
|
198
|
-
const { view , rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
199
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)()),
|
|
200
|
-
editable: ()=>false
|
|
201
|
-
});
|
|
202
|
-
expect(view.dom.contentEditable).toBe("false");
|
|
203
|
-
rerender({
|
|
204
|
-
editable: ()=>true
|
|
205
|
-
});
|
|
206
|
-
expect(view.dom.contentEditable).toBe("true");
|
|
207
|
-
});
|
|
208
|
-
it("doesn't redraw following paragraphs when a paragraph is split", async ()=>{
|
|
209
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
210
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("abcde"), (0, _prosemirrorTestBuilder.p)("fg"))
|
|
211
|
-
});
|
|
212
|
-
const lastPara = view.dom.lastChild;
|
|
213
|
-
view.dispatch(view.state.tr.split(3));
|
|
214
|
-
expect(view.dom.lastChild).toBe(lastPara);
|
|
215
|
-
});
|
|
216
|
-
it("doesn't greedily match nodes that have another match", async ()=>{
|
|
217
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
218
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("a"), (0, _prosemirrorTestBuilder.p)("b"), (0, _prosemirrorTestBuilder.p)())
|
|
219
|
-
});
|
|
220
|
-
const secondPara = view.dom.querySelectorAll("p")[1];
|
|
221
|
-
view.dispatch(view.state.tr.split(2));
|
|
222
|
-
expect(view.dom.querySelectorAll("p")[2]).toBe(secondPara);
|
|
223
|
-
});
|
|
224
|
-
it("creates and destroys plugin views", async ()=>{
|
|
225
|
-
const events = [];
|
|
226
|
-
let PluginView = class PluginView {
|
|
227
|
-
update() {
|
|
228
|
-
events.push("update");
|
|
229
|
-
}
|
|
230
|
-
destroy() {
|
|
231
|
-
events.push("destroy");
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
const plugin = new _prosemirrorState.Plugin({
|
|
235
|
-
view () {
|
|
236
|
-
events.push("create");
|
|
237
|
-
return new PluginView();
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
const { view , unmount } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
241
|
-
plugins: [
|
|
242
|
-
plugin
|
|
243
|
-
]
|
|
244
|
-
});
|
|
245
|
-
view.dispatch(view.state.tr.insertText("u"));
|
|
246
|
-
unmount();
|
|
247
|
-
expect(events.join(" ")).toBe("create update destroy");
|
|
248
|
-
});
|
|
249
|
-
it("redraws changed node views", async ()=>{
|
|
250
|
-
const { view , rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
251
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo"), (0, _prosemirrorTestBuilder.hr)())
|
|
252
|
-
});
|
|
253
|
-
expect(view.dom.querySelector("hr")).toBeTruthy();
|
|
254
|
-
rerender({
|
|
255
|
-
nodeViews: {
|
|
256
|
-
horizontal_rule: /*#__PURE__*/ (0, _react.forwardRef)(function HorizontalRule(param, ref) {
|
|
257
|
-
let { nodeProps , ...props } = param;
|
|
258
|
-
return /*#__PURE__*/ _react.default.createElement("var", _extends({
|
|
259
|
-
ref: ref
|
|
260
|
-
}, props));
|
|
261
|
-
})
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
expect(!view.dom.querySelector("hr")).toBeTruthy();
|
|
265
|
-
expect(view.dom.querySelector("var")).toBeTruthy();
|
|
266
|
-
});
|
|
267
|
-
it("doesn't get confused by merged nodes", async ()=>{
|
|
268
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
269
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.strong)("one"), " two ", (0, _prosemirrorTestBuilder.strong)("three")))
|
|
270
|
-
});
|
|
271
|
-
view.dispatch(view.state.tr.removeMark(1, 4, _prosemirrorTestBuilder.schema.marks.strong));
|
|
272
|
-
expect(view.dom.querySelectorAll("strong")).toHaveLength(1);
|
|
273
|
-
});
|
|
274
|
-
it("doesn't redraw too much when marks are present", async ()=>{
|
|
275
|
-
const s = new _prosemirrorModel.Schema({
|
|
276
|
-
nodes: {
|
|
277
|
-
doc: {
|
|
278
|
-
content: "paragraph+",
|
|
279
|
-
marks: "m"
|
|
280
|
-
},
|
|
281
|
-
text: {
|
|
282
|
-
group: "inline"
|
|
283
|
-
},
|
|
284
|
-
paragraph: _prosemirrorTestBuilder.schema.spec.nodes.get("paragraph")
|
|
285
|
-
},
|
|
286
|
-
marks: {
|
|
287
|
-
m: {
|
|
288
|
-
toDOM: ()=>[
|
|
289
|
-
"div",
|
|
290
|
-
{
|
|
291
|
-
class: "m"
|
|
292
|
-
},
|
|
293
|
-
0
|
|
294
|
-
],
|
|
295
|
-
parseDOM: [
|
|
296
|
-
{
|
|
297
|
-
tag: "div.m"
|
|
298
|
-
}
|
|
299
|
-
]
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
const paragraphs = [];
|
|
304
|
-
for(let i = 1; i <= 10; i++)paragraphs.push(s.node("paragraph", null, [
|
|
305
|
-
s.text("para " + i)
|
|
306
|
-
], [
|
|
307
|
-
s.mark("m")
|
|
308
|
-
]));
|
|
309
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
310
|
-
// @ts-expect-error this is fine
|
|
311
|
-
doc: s.node("doc", null, paragraphs)
|
|
312
|
-
});
|
|
313
|
-
const initialChildren = Array.from(view.dom.querySelectorAll("p"));
|
|
314
|
-
const newParagraphs = [];
|
|
315
|
-
for(let i = -6; i < 0; i++)newParagraphs.push(s.node("paragraph", null, [
|
|
316
|
-
s.text("para " + i)
|
|
317
|
-
], [
|
|
318
|
-
s.mark("m")
|
|
319
|
-
]));
|
|
320
|
-
view.dispatch(view.state.tr.replaceWith(0, 8, newParagraphs));
|
|
321
|
-
const currentChildren = Array.from(view.dom.querySelectorAll("p"));
|
|
322
|
-
let sameAtEnd = 0;
|
|
323
|
-
while(sameAtEnd < currentChildren.length && sameAtEnd < initialChildren.length && currentChildren[currentChildren.length - sameAtEnd - 1] == initialChildren[initialChildren.length - sameAtEnd - 1])sameAtEnd++;
|
|
324
|
-
expect(sameAtEnd).toBe(9);
|
|
325
|
-
});
|
|
326
|
-
it("correctly wraps inline nodes with marks", async ()=>{
|
|
327
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
328
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)((0, _prosemirrorTestBuilder.strong)((0, _prosemirrorTestBuilder.img)(), " two")))
|
|
329
|
-
});
|
|
330
|
-
const docDom = view.dom;
|
|
331
|
-
const paragraphDom = docDom.firstElementChild;
|
|
332
|
-
const strongDom = paragraphDom.firstElementChild;
|
|
333
|
-
expect(strongDom?.tagName).toBe("STRONG");
|
|
334
|
-
expect(strongDom?.firstElementChild?.tagName).toBe("IMG");
|
|
335
|
-
expect(strongDom?.childNodes.item(1).textContent).toBe(" two");
|
|
336
|
-
});
|
|
337
|
-
});
|
|
@@ -1,315 +0,0 @@
|
|
|
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 _prosemirrorView = require("prosemirror-view");
|
|
9
|
-
const _react1 = /*#__PURE__*/ _interopRequireWildcard(require("react"));
|
|
10
|
-
const _useEditorStateJs = require("../../hooks/useEditorState.js");
|
|
11
|
-
const _useStopEventJs = require("../../hooks/useStopEvent.js");
|
|
12
|
-
const _editorViewTestHelpersJs = require("../../testing/editorViewTestHelpers.js");
|
|
13
|
-
function _extends() {
|
|
14
|
-
_extends = Object.assign || function(target) {
|
|
15
|
-
for(var i = 1; i < arguments.length; i++){
|
|
16
|
-
var source = arguments[i];
|
|
17
|
-
for(var key in source){
|
|
18
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
19
|
-
target[key] = source[key];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return target;
|
|
24
|
-
};
|
|
25
|
-
return _extends.apply(this, arguments);
|
|
26
|
-
}
|
|
27
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
28
|
-
if (typeof WeakMap !== "function") return null;
|
|
29
|
-
var cacheBabelInterop = new WeakMap();
|
|
30
|
-
var cacheNodeInterop = new WeakMap();
|
|
31
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
32
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
33
|
-
})(nodeInterop);
|
|
34
|
-
}
|
|
35
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
36
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
37
|
-
return obj;
|
|
38
|
-
}
|
|
39
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
40
|
-
return {
|
|
41
|
-
default: obj
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
45
|
-
if (cache && cache.has(obj)) {
|
|
46
|
-
return cache.get(obj);
|
|
47
|
-
}
|
|
48
|
-
var newObj = {};
|
|
49
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
50
|
-
for(var key in obj){
|
|
51
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
52
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
53
|
-
if (desc && (desc.get || desc.set)) {
|
|
54
|
-
Object.defineProperty(newObj, key, desc);
|
|
55
|
-
} else {
|
|
56
|
-
newObj[key] = obj[key];
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
newObj.default = obj;
|
|
61
|
-
if (cache) {
|
|
62
|
-
cache.set(obj, newObj);
|
|
63
|
-
}
|
|
64
|
-
return newObj;
|
|
65
|
-
}
|
|
66
|
-
describe("nodeViews prop", ()=>{
|
|
67
|
-
it("can replace a node's representation", async ()=>{
|
|
68
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
69
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.br)())),
|
|
70
|
-
nodeViews: {
|
|
71
|
-
hard_break: /*#__PURE__*/ (0, _react1.forwardRef)(function Var(props, ref) {
|
|
72
|
-
return /*#__PURE__*/ _react1.default.createElement("var", {
|
|
73
|
-
ref: ref
|
|
74
|
-
}, props.children);
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
expect(view.dom.querySelector("var")).not.toBeNull();
|
|
79
|
-
});
|
|
80
|
-
it("can override drawing of a node's content", async ()=>{
|
|
81
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
82
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
83
|
-
nodeViews: {
|
|
84
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(props, ref) {
|
|
85
|
-
return /*#__PURE__*/ _react1.default.createElement("p", {
|
|
86
|
-
ref: ref
|
|
87
|
-
}, props.nodeProps.node.textContent.toUpperCase());
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
expect(view.dom.querySelector("p").textContent).toBe("FOO");
|
|
92
|
-
view.dispatch(view.state.tr.insertText("a"));
|
|
93
|
-
expect(view.dom.querySelector("p").textContent).toBe("AFOO");
|
|
94
|
-
});
|
|
95
|
-
// React makes this more or less trivial; the render
|
|
96
|
-
// method of the component _is_ the update (and create)
|
|
97
|
-
// method
|
|
98
|
-
// eslint-disable-next-line jest/no-disabled-tests
|
|
99
|
-
it.skip("can register its own update method", async ()=>{
|
|
100
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
101
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
102
|
-
nodeViews: {
|
|
103
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(props, ref) {
|
|
104
|
-
return /*#__PURE__*/ _react1.default.createElement("p", {
|
|
105
|
-
ref: ref
|
|
106
|
-
}, props.nodeProps.node.textContent.toUpperCase());
|
|
107
|
-
})
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
const para = view.dom.querySelector("p");
|
|
111
|
-
view.dispatch(view.state.tr.insertText("a"));
|
|
112
|
-
expect(view.dom.querySelector("p")).toBe(para);
|
|
113
|
-
expect(para.textContent).toBe("AFOO");
|
|
114
|
-
});
|
|
115
|
-
it("allows decoration updates for node views with an update method", async ()=>{
|
|
116
|
-
const { view , rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
117
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
118
|
-
nodeViews: {
|
|
119
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(param, ref) {
|
|
120
|
-
let { children , nodeProps , ...props } = param;
|
|
121
|
-
return /*#__PURE__*/ _react1.default.createElement("p", _extends({
|
|
122
|
-
ref: ref
|
|
123
|
-
}, props), children);
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
rerender({
|
|
128
|
-
decorations (state) {
|
|
129
|
-
return _prosemirrorView.DecorationSet.create(state.doc, [
|
|
130
|
-
_prosemirrorView.Decoration.inline(2, 3, {
|
|
131
|
-
someattr: "ok"
|
|
132
|
-
}),
|
|
133
|
-
_prosemirrorView.Decoration.node(0, 5, {
|
|
134
|
-
otherattr: "ok"
|
|
135
|
-
})
|
|
136
|
-
]);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
expect(view.dom.querySelector("[someattr]")).not.toBeNull();
|
|
140
|
-
expect(view.dom.querySelector("[otherattr]")).not.toBeNull();
|
|
141
|
-
});
|
|
142
|
-
it("can provide a contentDOM property", async ()=>{
|
|
143
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
144
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
145
|
-
nodeViews: {
|
|
146
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(props, ref) {
|
|
147
|
-
return(// ContentDOM is inferred from where props.children is rendered
|
|
148
|
-
/*#__PURE__*/ _react1.default.createElement("p", {
|
|
149
|
-
ref: ref
|
|
150
|
-
}, props.children));
|
|
151
|
-
})
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
const para = view.dom.querySelector("p");
|
|
155
|
-
view.dispatch(view.state.tr.insertText("a"));
|
|
156
|
-
expect(view.dom.querySelector("p")).toBe(para);
|
|
157
|
-
expect(para.textContent).toBe("afoo");
|
|
158
|
-
});
|
|
159
|
-
it("has its destroy method called", async ()=>{
|
|
160
|
-
let destroyed = false;
|
|
161
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
162
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.br)())),
|
|
163
|
-
nodeViews: {
|
|
164
|
-
hard_break: /*#__PURE__*/ (0, _react1.forwardRef)(function BR(_props, ref) {
|
|
165
|
-
// React implements "destroy methods" with effect
|
|
166
|
-
// hooks
|
|
167
|
-
(0, _react1.useEffect)(()=>{
|
|
168
|
-
return ()=>{
|
|
169
|
-
destroyed = true;
|
|
170
|
-
};
|
|
171
|
-
}, []);
|
|
172
|
-
return /*#__PURE__*/ _react1.default.createElement("br", {
|
|
173
|
-
ref: ref
|
|
174
|
-
});
|
|
175
|
-
})
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
expect(destroyed).toBeFalsy();
|
|
179
|
-
view.dispatch(view.state.tr.delete(3, 5));
|
|
180
|
-
expect(destroyed).toBeTruthy();
|
|
181
|
-
});
|
|
182
|
-
it("can query its own position", async ()=>{
|
|
183
|
-
let pos;
|
|
184
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
185
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.blockquote)((0, _prosemirrorTestBuilder.p)("abc"), (0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.br)()))),
|
|
186
|
-
nodeViews: {
|
|
187
|
-
hard_break: /*#__PURE__*/ (0, _react1.forwardRef)(function BR(param, ref) {
|
|
188
|
-
let { nodeProps , children , ...props } = param;
|
|
189
|
-
// trigger a re-render on every updated, otherwise we won't
|
|
190
|
-
// re-render when an updated doesn't directly affect us
|
|
191
|
-
(0, _useEditorStateJs.useEditorState)();
|
|
192
|
-
pos = nodeProps.getPos();
|
|
193
|
-
return /*#__PURE__*/ _react1.default.createElement("br", _extends({
|
|
194
|
-
ref: ref
|
|
195
|
-
}, props));
|
|
196
|
-
})
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
expect(pos).toBe(10);
|
|
200
|
-
view.dispatch(view.state.tr.insertText("a"));
|
|
201
|
-
expect(pos).toBe(11);
|
|
202
|
-
});
|
|
203
|
-
it("has access to outer decorations", async ()=>{
|
|
204
|
-
const plugin = new _prosemirrorState.Plugin({
|
|
205
|
-
state: {
|
|
206
|
-
init () {
|
|
207
|
-
return null;
|
|
208
|
-
},
|
|
209
|
-
apply (tr, prev) {
|
|
210
|
-
return tr.getMeta("setDeco") || prev;
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
props: {
|
|
214
|
-
decorations (state) {
|
|
215
|
-
const deco = this.getState(state);
|
|
216
|
-
return deco && _prosemirrorView.DecorationSet.create(state.doc, [
|
|
217
|
-
_prosemirrorView.Decoration.inline(0, state.doc.content.size, {}, {
|
|
218
|
-
name: deco
|
|
219
|
-
})
|
|
220
|
-
]);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
const { view } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
225
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo", (0, _prosemirrorTestBuilder.br)())),
|
|
226
|
-
plugins: [
|
|
227
|
-
plugin
|
|
228
|
-
],
|
|
229
|
-
nodeViews: {
|
|
230
|
-
hard_break: /*#__PURE__*/ (0, _react1.forwardRef)(function Var(props, ref) {
|
|
231
|
-
return /*#__PURE__*/ _react1.default.createElement("var", {
|
|
232
|
-
ref: ref
|
|
233
|
-
}, props.nodeProps.decorations.length ? props.nodeProps.decorations[0].spec.name : "[]");
|
|
234
|
-
})
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
expect(view.dom.querySelector("var").textContent).toBe("[]");
|
|
238
|
-
view.dispatch(view.state.tr.setMeta("setDeco", "foo"));
|
|
239
|
-
expect(view.dom.querySelector("var").textContent).toBe("foo");
|
|
240
|
-
view.dispatch(view.state.tr.setMeta("setDeco", "bar"));
|
|
241
|
-
expect(view.dom.querySelector("var").textContent).toBe("bar");
|
|
242
|
-
});
|
|
243
|
-
it("provides access to inner decorations in the constructor", async ()=>{
|
|
244
|
-
(0, _editorViewTestHelpersJs.tempEditor)({
|
|
245
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
246
|
-
nodeViews: {
|
|
247
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(props, ref) {
|
|
248
|
-
expect(props.nodeProps.innerDecorations.find().map((d)=>`${d.from}-${d.to}`).join()).toBe("1-2");
|
|
249
|
-
return /*#__PURE__*/ _react1.default.createElement("p", {
|
|
250
|
-
ref: ref
|
|
251
|
-
}, props.children);
|
|
252
|
-
})
|
|
253
|
-
},
|
|
254
|
-
decorations (state) {
|
|
255
|
-
return _prosemirrorView.DecorationSet.create(state.doc, [
|
|
256
|
-
_prosemirrorView.Decoration.inline(2, 3, {
|
|
257
|
-
someattr: "ok"
|
|
258
|
-
}),
|
|
259
|
-
_prosemirrorView.Decoration.node(0, 5, {
|
|
260
|
-
otherattr: "ok"
|
|
261
|
-
})
|
|
262
|
-
]);
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
it("provides access to inner decorations in the update method", async ()=>{
|
|
267
|
-
let innerDecos = [];
|
|
268
|
-
const { rerender } = (0, _editorViewTestHelpersJs.tempEditor)({
|
|
269
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("foo")),
|
|
270
|
-
nodeViews: {
|
|
271
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function Paragraph(props, ref) {
|
|
272
|
-
innerDecos = props.nodeProps.innerDecorations.find().map((d)=>`${d.from}-${d.to}`);
|
|
273
|
-
return /*#__PURE__*/ _react1.default.createElement("p", {
|
|
274
|
-
ref: ref
|
|
275
|
-
}, props.children);
|
|
276
|
-
})
|
|
277
|
-
}
|
|
278
|
-
});
|
|
279
|
-
rerender({
|
|
280
|
-
decorations (state) {
|
|
281
|
-
return _prosemirrorView.DecorationSet.create(state.doc, [
|
|
282
|
-
_prosemirrorView.Decoration.inline(2, 3, {
|
|
283
|
-
someattr: "ok"
|
|
284
|
-
}),
|
|
285
|
-
_prosemirrorView.Decoration.node(0, 5, {
|
|
286
|
-
otherattr: "ok"
|
|
287
|
-
})
|
|
288
|
-
]);
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
expect(innerDecos.join()).toBe("1-2");
|
|
292
|
-
});
|
|
293
|
-
it("can provide a stopEvent hook", async ()=>{
|
|
294
|
-
(0, _editorViewTestHelpersJs.tempEditor)({
|
|
295
|
-
doc: (0, _prosemirrorTestBuilder.doc)((0, _prosemirrorTestBuilder.p)("input value")),
|
|
296
|
-
nodeViews: {
|
|
297
|
-
paragraph: /*#__PURE__*/ (0, _react1.forwardRef)(function ParagraphInput(param, ref) {
|
|
298
|
-
let { nodeProps , children , ...props } = param;
|
|
299
|
-
(0, _useStopEventJs.useStopEvent)(()=>{
|
|
300
|
-
return true;
|
|
301
|
-
});
|
|
302
|
-
return /*#__PURE__*/ _react1.default.createElement("input", _extends({
|
|
303
|
-
ref: ref,
|
|
304
|
-
type: "text",
|
|
305
|
-
defaultValue: nodeProps.node.textContent
|
|
306
|
-
}, props));
|
|
307
|
-
})
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
const input = _react.screen.getByDisplayValue("input value");
|
|
311
|
-
input.focus();
|
|
312
|
-
await browser.keys("z");
|
|
313
|
-
expect(await $(input).getValue()).toBe("input valuez");
|
|
314
|
-
});
|
|
315
|
-
});
|