@handlewithcare/react-prosemirror 2.0.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 (209) hide show
  1. package/LICENSE.txt +12 -0
  2. package/README.md +705 -0
  3. package/dist/cjs/browser.js +53 -0
  4. package/dist/cjs/components/ChildNodeViews.js +376 -0
  5. package/dist/cjs/components/CursorWrapper.js +91 -0
  6. package/dist/cjs/components/CustomNodeView.js +79 -0
  7. package/dist/cjs/components/DocNodeView.js +104 -0
  8. package/dist/cjs/components/LayoutGroup.js +111 -0
  9. package/dist/cjs/components/MarkView.js +115 -0
  10. package/dist/cjs/components/NativeWidgetView.js +109 -0
  11. package/dist/cjs/components/NodeView.js +196 -0
  12. package/dist/cjs/components/NodeViewComponentProps.js +4 -0
  13. package/dist/cjs/components/OutputSpec.js +88 -0
  14. package/dist/cjs/components/ProseMirror.js +103 -0
  15. package/dist/cjs/components/ProseMirrorDoc.js +92 -0
  16. package/dist/cjs/components/SeparatorHackView.js +100 -0
  17. package/dist/cjs/components/TextNodeView.js +112 -0
  18. package/dist/cjs/components/TrailingHackView.js +90 -0
  19. package/dist/cjs/components/WidgetView.js +95 -0
  20. package/dist/cjs/components/WidgetViewComponentProps.js +4 -0
  21. package/dist/cjs/components/__tests__/ProseMirror.composition.test.js +398 -0
  22. package/dist/cjs/components/__tests__/ProseMirror.domchange.test.js +270 -0
  23. package/dist/cjs/components/__tests__/ProseMirror.draw-decoration.test.js +1010 -0
  24. package/dist/cjs/components/__tests__/ProseMirror.draw.test.js +337 -0
  25. package/dist/cjs/components/__tests__/ProseMirror.node-view.test.js +315 -0
  26. package/dist/cjs/components/__tests__/ProseMirror.selection.test.js +444 -0
  27. package/dist/cjs/components/__tests__/ProseMirror.test.js +382 -0
  28. package/dist/cjs/contexts/ChildDescriptorsContext.js +19 -0
  29. package/dist/cjs/contexts/EditorContext.js +12 -0
  30. package/dist/cjs/contexts/EditorStateContext.js +12 -0
  31. package/dist/cjs/contexts/LayoutGroupContext.js +12 -0
  32. package/dist/cjs/contexts/NodeViewContext.js +12 -0
  33. package/dist/cjs/contexts/SelectNodeContext.js +12 -0
  34. package/dist/cjs/contexts/StopEventContext.js +12 -0
  35. package/dist/cjs/contexts/__tests__/DeferredLayoutEffects.test.js +141 -0
  36. package/dist/cjs/decorations/ReactWidgetType.js +58 -0
  37. package/dist/cjs/decorations/computeDocDeco.js +44 -0
  38. package/dist/cjs/decorations/internalTypes.js +4 -0
  39. package/dist/cjs/decorations/iterDeco.js +79 -0
  40. package/dist/cjs/decorations/viewDecorations.js +163 -0
  41. package/dist/cjs/dom.js +142 -0
  42. package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +108 -0
  43. package/dist/cjs/hooks/useClientOnly.js +18 -0
  44. package/dist/cjs/hooks/useComponentEventListeners.js +39 -0
  45. package/dist/cjs/hooks/useEditor.js +287 -0
  46. package/dist/cjs/hooks/useEditorEffect.js +35 -0
  47. package/dist/cjs/hooks/useEditorEventCallback.js +33 -0
  48. package/dist/cjs/hooks/useEditorEventListener.js +34 -0
  49. package/dist/cjs/hooks/useEditorState.js +16 -0
  50. package/dist/cjs/hooks/useForceUpdate.js +15 -0
  51. package/dist/cjs/hooks/useLayoutGroupEffect.js +19 -0
  52. package/dist/cjs/hooks/useNodeViewDescriptor.js +115 -0
  53. package/dist/cjs/hooks/useReactKeys.js +17 -0
  54. package/dist/cjs/hooks/useSelectNode.js +28 -0
  55. package/dist/cjs/hooks/useStopEvent.js +24 -0
  56. package/dist/cjs/index.js +53 -0
  57. package/dist/cjs/package.json +3 -0
  58. package/dist/cjs/plugins/__tests__/reactKeys.test.js +81 -0
  59. package/dist/cjs/plugins/beforeInputPlugin.js +143 -0
  60. package/dist/cjs/plugins/componentEventListeners.js +35 -0
  61. package/dist/cjs/plugins/componentEventListenersPlugin.js +35 -0
  62. package/dist/cjs/plugins/reactKeys.js +96 -0
  63. package/dist/cjs/props.js +269 -0
  64. package/dist/cjs/selection/SelectionDOMObserver.js +174 -0
  65. package/dist/cjs/selection/hasFocusAndSelection.js +35 -0
  66. package/dist/cjs/selection/selectionFromDOM.js +77 -0
  67. package/dist/cjs/selection/selectionToDOM.js +226 -0
  68. package/dist/cjs/ssr.js +85 -0
  69. package/dist/cjs/testing/editorViewTestHelpers.js +111 -0
  70. package/dist/cjs/testing/setupProseMirrorView.js +94 -0
  71. package/dist/cjs/viewdesc.js +664 -0
  72. package/dist/esm/browser.js +43 -0
  73. package/dist/esm/components/ChildNodeViews.js +318 -0
  74. package/dist/esm/components/CursorWrapper.js +40 -0
  75. package/dist/esm/components/CustomNodeView.js +28 -0
  76. package/dist/esm/components/DocNodeView.js +53 -0
  77. package/dist/esm/components/LayoutGroup.js +66 -0
  78. package/dist/esm/components/MarkView.js +64 -0
  79. package/dist/esm/components/NativeWidgetView.js +58 -0
  80. package/dist/esm/components/NodeView.js +145 -0
  81. package/dist/esm/components/NodeViewComponentProps.js +1 -0
  82. package/dist/esm/components/OutputSpec.js +38 -0
  83. package/dist/esm/components/ProseMirror.js +52 -0
  84. package/dist/esm/components/ProseMirrorDoc.js +34 -0
  85. package/dist/esm/components/SeparatorHackView.js +49 -0
  86. package/dist/esm/components/TextNodeView.js +102 -0
  87. package/dist/esm/components/TrailingHackView.js +39 -0
  88. package/dist/esm/components/WidgetView.js +44 -0
  89. package/dist/esm/components/WidgetViewComponentProps.js +1 -0
  90. package/dist/esm/components/__tests__/ProseMirror.composition.test.js +395 -0
  91. package/dist/esm/components/__tests__/ProseMirror.domchange.test.js +266 -0
  92. package/dist/esm/components/__tests__/ProseMirror.draw-decoration.test.js +967 -0
  93. package/dist/esm/components/__tests__/ProseMirror.draw.test.js +294 -0
  94. package/dist/esm/components/__tests__/ProseMirror.node-view.test.js +272 -0
  95. package/dist/esm/components/__tests__/ProseMirror.selection.test.js +440 -0
  96. package/dist/esm/components/__tests__/ProseMirror.test.js +339 -0
  97. package/dist/esm/contexts/ChildDescriptorsContext.js +9 -0
  98. package/dist/esm/contexts/EditorContext.js +7 -0
  99. package/dist/esm/contexts/EditorStateContext.js +2 -0
  100. package/dist/esm/contexts/LayoutGroupContext.js +2 -0
  101. package/dist/esm/contexts/NodeViewContext.js +2 -0
  102. package/dist/esm/contexts/SelectNodeContext.js +2 -0
  103. package/dist/esm/contexts/StopEventContext.js +2 -0
  104. package/dist/esm/contexts/__tests__/DeferredLayoutEffects.test.js +98 -0
  105. package/dist/esm/decorations/ReactWidgetType.js +40 -0
  106. package/dist/esm/decorations/computeDocDeco.js +44 -0
  107. package/dist/esm/decorations/internalTypes.js +1 -0
  108. package/dist/esm/decorations/iterDeco.js +73 -0
  109. package/dist/esm/decorations/viewDecorations.js +163 -0
  110. package/dist/esm/dom.js +105 -0
  111. package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +99 -0
  112. package/dist/esm/hooks/useClientOnly.js +8 -0
  113. package/dist/esm/hooks/useComponentEventListeners.js +54 -0
  114. package/dist/esm/hooks/useEditor.js +278 -0
  115. package/dist/esm/hooks/useEditorEffect.js +38 -0
  116. package/dist/esm/hooks/useEditorEventCallback.js +35 -0
  117. package/dist/esm/hooks/useEditorEventListener.js +28 -0
  118. package/dist/esm/hooks/useEditorState.js +8 -0
  119. package/dist/esm/hooks/useForceUpdate.js +8 -0
  120. package/dist/esm/hooks/useLayoutGroupEffect.js +9 -0
  121. package/dist/esm/hooks/useNodeViewDescriptor.js +105 -0
  122. package/dist/esm/hooks/useReactKeys.js +7 -0
  123. package/dist/esm/hooks/useSelectNode.js +18 -0
  124. package/dist/esm/hooks/useStopEvent.js +14 -0
  125. package/dist/esm/index.js +11 -0
  126. package/dist/esm/plugins/__tests__/reactKeys.test.js +77 -0
  127. package/dist/esm/plugins/beforeInputPlugin.js +133 -0
  128. package/dist/esm/plugins/componentEventListeners.js +25 -0
  129. package/dist/esm/plugins/componentEventListenersPlugin.js +25 -0
  130. package/dist/esm/plugins/reactKeys.js +81 -0
  131. package/dist/esm/props.js +251 -0
  132. package/dist/esm/selection/SelectionDOMObserver.js +164 -0
  133. package/dist/esm/selection/hasFocusAndSelection.js +17 -0
  134. package/dist/esm/selection/selectionFromDOM.js +59 -0
  135. package/dist/esm/selection/selectionToDOM.js +196 -0
  136. package/dist/esm/ssr.js +82 -0
  137. package/dist/esm/testing/editorViewTestHelpers.js +88 -0
  138. package/dist/esm/testing/setupProseMirrorView.js +76 -0
  139. package/dist/esm/viewdesc.js +654 -0
  140. package/dist/tsconfig.tsbuildinfo +1 -0
  141. package/dist/types/browser.d.ts +15 -0
  142. package/dist/types/components/ChildNodeViews.d.ts +9 -0
  143. package/dist/types/components/CursorWrapper.d.ts +5 -0
  144. package/dist/types/components/CustomNodeView.d.ts +21 -0
  145. package/dist/types/components/DocNodeView.d.ts +20 -0
  146. package/dist/types/components/LayoutGroup.d.ts +12 -0
  147. package/dist/types/components/MarkView.d.ts +9 -0
  148. package/dist/types/components/NativeWidgetView.d.ts +8 -0
  149. package/dist/types/components/NodeView.d.ts +11 -0
  150. package/dist/types/components/NodeViewComponentProps.d.ts +12 -0
  151. package/dist/types/components/OutputSpec.d.ts +8 -0
  152. package/dist/types/components/ProseMirror.d.ts +15 -0
  153. package/dist/types/components/ProseMirrorDoc.d.ts +10 -0
  154. package/dist/types/components/SeparatorHackView.d.ts +6 -0
  155. package/dist/types/components/TextNodeView.d.ts +23 -0
  156. package/dist/types/components/TrailingHackView.d.ts +6 -0
  157. package/dist/types/components/WidgetView.d.ts +8 -0
  158. package/dist/types/components/WidgetViewComponentProps.d.ts +6 -0
  159. package/dist/types/components/__tests__/ProseMirror.composition.test.d.ts +1 -0
  160. package/dist/types/components/__tests__/ProseMirror.domchange.test.d.ts +1 -0
  161. package/dist/types/components/__tests__/ProseMirror.draw-decoration.test.d.ts +1 -0
  162. package/dist/types/components/__tests__/ProseMirror.draw.test.d.ts +1 -0
  163. package/dist/types/components/__tests__/ProseMirror.node-view.test.d.ts +1 -0
  164. package/dist/types/components/__tests__/ProseMirror.selection.test.d.ts +1 -0
  165. package/dist/types/components/__tests__/ProseMirror.test.d.ts +1 -0
  166. package/dist/types/contexts/ChildDescriptorsContext.d.ts +6 -0
  167. package/dist/types/contexts/EditorContext.d.ts +14 -0
  168. package/dist/types/contexts/EditorStateContext.d.ts +2 -0
  169. package/dist/types/contexts/LayoutGroupContext.d.ts +5 -0
  170. package/dist/types/contexts/NodeViewContext.d.ts +6 -0
  171. package/dist/types/contexts/SelectNodeContext.d.ts +3 -0
  172. package/dist/types/contexts/StopEventContext.d.ts +3 -0
  173. package/dist/types/contexts/__tests__/DeferredLayoutEffects.test.d.ts +1 -0
  174. package/dist/types/decorations/ReactWidgetType.d.ts +39 -0
  175. package/dist/types/decorations/computeDocDeco.d.ts +13 -0
  176. package/dist/types/decorations/internalTypes.d.ts +16 -0
  177. package/dist/types/decorations/iterDeco.d.ts +3 -0
  178. package/dist/types/decorations/viewDecorations.d.ts +13 -0
  179. package/dist/types/dom.d.ts +22 -0
  180. package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +1 -0
  181. package/dist/types/hooks/useClientOnly.d.ts +1 -0
  182. package/dist/types/hooks/useComponentEventListeners.d.ts +33 -0
  183. package/dist/types/hooks/useEditor.d.ts +66 -0
  184. package/dist/types/hooks/useEditorEffect.d.ts +17 -0
  185. package/dist/types/hooks/useEditorEventCallback.d.ts +15 -0
  186. package/dist/types/hooks/useEditorEventListener.d.ts +8 -0
  187. package/dist/types/hooks/useEditorState.d.ts +5 -0
  188. package/dist/types/hooks/useForceUpdate.d.ts +5 -0
  189. package/dist/types/hooks/useLayoutGroupEffect.d.ts +3 -0
  190. package/dist/types/hooks/useNodeViewDescriptor.d.ts +11 -0
  191. package/dist/types/hooks/useReactKeys.d.ts +5 -0
  192. package/dist/types/hooks/useSelectNode.d.ts +1 -0
  193. package/dist/types/hooks/useStopEvent.d.ts +2 -0
  194. package/dist/types/index.d.ts +12 -0
  195. package/dist/types/plugins/__tests__/reactKeys.test.d.ts +1 -0
  196. package/dist/types/plugins/beforeInputPlugin.d.ts +3 -0
  197. package/dist/types/plugins/componentEventListeners.d.ts +4 -0
  198. package/dist/types/plugins/componentEventListenersPlugin.d.ts +4 -0
  199. package/dist/types/plugins/reactKeys.d.ts +19 -0
  200. package/dist/types/props.d.ts +1174 -0
  201. package/dist/types/selection/SelectionDOMObserver.d.ts +34 -0
  202. package/dist/types/selection/hasFocusAndSelection.d.ts +3 -0
  203. package/dist/types/selection/selectionFromDOM.d.ts +4 -0
  204. package/dist/types/selection/selectionToDOM.d.ts +9 -0
  205. package/dist/types/ssr.d.ts +19 -0
  206. package/dist/types/testing/editorViewTestHelpers.d.ts +23 -0
  207. package/dist/types/testing/setupProseMirrorView.d.ts +2 -0
  208. package/dist/types/viewdesc.d.ts +131 -0
  209. package/package.json +113 -0
@@ -0,0 +1,337 @@
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
+ });
@@ -0,0 +1,315 @@
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
+ });