@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.
Files changed (107) hide show
  1. package/dist/cjs/AbstractEditorView.js +4 -0
  2. package/dist/cjs/ReactEditorView.js +156 -0
  3. package/dist/cjs/StaticEditorView.js +86 -0
  4. package/dist/cjs/components/ChildNodeViews.js +59 -30
  5. package/dist/cjs/components/CustomNodeView.js +9 -25
  6. package/dist/cjs/components/DocNodeView.js +6 -15
  7. package/dist/cjs/components/MarkView.js +1 -2
  8. package/dist/cjs/components/NativeWidgetView.js +2 -3
  9. package/dist/cjs/components/NodeView.js +1 -1
  10. package/dist/cjs/components/ProseMirror.js +11 -14
  11. package/dist/cjs/components/ReactNodeView.js +3 -4
  12. package/dist/cjs/components/SeparatorHackView.js +1 -2
  13. package/dist/cjs/components/TextNodeView.js +4 -5
  14. package/dist/cjs/components/TrailingHackView.js +1 -2
  15. package/dist/cjs/components/WidgetView.js +2 -4
  16. package/dist/cjs/constants.js +33 -0
  17. package/dist/cjs/hooks/useEditor.js +32 -230
  18. package/dist/cjs/hooks/useEditorEffect.js +2 -2
  19. package/dist/cjs/hooks/useEditorEventCallback.js +8 -5
  20. package/dist/cjs/hooks/useNodeViewDescriptor.js +10 -10
  21. package/dist/cjs/hooks/useReactKeys.js +1 -1
  22. package/dist/cjs/testing/editorViewTestHelpers.js +0 -2
  23. package/dist/cjs/viewdesc.js +10 -9
  24. package/dist/esm/AbstractEditorView.js +1 -0
  25. package/dist/esm/ReactEditorView.js +156 -0
  26. package/dist/esm/StaticEditorView.js +76 -0
  27. package/dist/esm/components/ChildNodeViews.js +60 -32
  28. package/dist/esm/components/CustomNodeView.js +9 -25
  29. package/dist/esm/components/DocNodeView.js +6 -15
  30. package/dist/esm/components/MarkView.js +1 -2
  31. package/dist/esm/components/NativeWidgetView.js +2 -3
  32. package/dist/esm/components/NodeView.js +1 -1
  33. package/dist/esm/components/ProseMirror.js +11 -14
  34. package/dist/esm/components/ReactNodeView.js +3 -4
  35. package/dist/esm/components/SeparatorHackView.js +1 -2
  36. package/dist/esm/components/TextNodeView.js +4 -5
  37. package/dist/esm/components/TrailingHackView.js +1 -2
  38. package/dist/esm/components/WidgetView.js +2 -4
  39. package/dist/esm/constants.js +15 -0
  40. package/dist/esm/hooks/useEditor.js +28 -219
  41. package/dist/esm/hooks/useEditorEffect.js +2 -2
  42. package/dist/esm/hooks/useEditorEventCallback.js +8 -5
  43. package/dist/esm/hooks/useNodeViewDescriptor.js +10 -10
  44. package/dist/esm/hooks/useReactKeys.js +1 -1
  45. package/dist/esm/testing/editorViewTestHelpers.js +0 -2
  46. package/dist/esm/viewdesc.js +3 -2
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/dist/types/AbstractEditorView.d.ts +27 -0
  49. package/dist/types/ReactEditorView.d.ts +79 -0
  50. package/dist/types/StaticEditorView.d.ts +24 -0
  51. package/dist/types/components/ChildNodeViews.d.ts +2 -2
  52. package/dist/types/components/CustomNodeView.d.ts +2 -2
  53. package/dist/types/components/DocNodeView.d.ts +2 -5
  54. package/dist/types/components/MarkView.d.ts +2 -2
  55. package/dist/types/components/NativeWidgetView.d.ts +2 -2
  56. package/dist/types/components/NodeView.d.ts +2 -2
  57. package/dist/types/components/ReactNodeView.d.ts +2 -2
  58. package/dist/types/components/SeparatorHackView.d.ts +2 -2
  59. package/dist/types/components/TextNodeView.d.ts +4 -3
  60. package/dist/types/components/TrailingHackView.d.ts +2 -2
  61. package/dist/types/components/WidgetView.d.ts +2 -2
  62. package/dist/types/constants.d.ts +4 -0
  63. package/dist/types/contexts/EditorContext.d.ts +6 -4
  64. package/dist/types/decorations/computeDocDeco.d.ts +3 -2
  65. package/dist/types/decorations/viewDecorations.d.ts +3 -2
  66. package/dist/types/hooks/useEditor.d.ts +5 -46
  67. package/dist/types/hooks/useNodeViewDescriptor.d.ts +1 -1
  68. package/dist/types/hooks/useReactKeys.d.ts +1 -1
  69. package/dist/types/props.d.ts +26 -26
  70. package/dist/types/viewdesc.d.ts +6 -5
  71. package/package.json +6 -2
  72. package/dist/cjs/components/__tests__/ProseMirror.composition.test.js +0 -398
  73. package/dist/cjs/components/__tests__/ProseMirror.domchange.test.js +0 -270
  74. package/dist/cjs/components/__tests__/ProseMirror.draw-decoration.test.js +0 -1010
  75. package/dist/cjs/components/__tests__/ProseMirror.draw.test.js +0 -337
  76. package/dist/cjs/components/__tests__/ProseMirror.node-view.test.js +0 -315
  77. package/dist/cjs/components/__tests__/ProseMirror.selection.test.js +0 -444
  78. package/dist/cjs/components/__tests__/ProseMirror.test.js +0 -382
  79. package/dist/cjs/contexts/__tests__/DeferredLayoutEffects.test.js +0 -141
  80. package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -108
  81. package/dist/cjs/plugins/__tests__/reactKeys.test.js +0 -81
  82. package/dist/cjs/selection/SelectionDOMObserver.js +0 -171
  83. package/dist/cjs/selection/hasFocusAndSelection.js +0 -35
  84. package/dist/cjs/selection/selectionFromDOM.js +0 -77
  85. package/dist/cjs/selection/selectionToDOM.js +0 -226
  86. package/dist/cjs/ssr.js +0 -85
  87. package/dist/esm/components/__tests__/ProseMirror.composition.test.js +0 -395
  88. package/dist/esm/components/__tests__/ProseMirror.domchange.test.js +0 -266
  89. package/dist/esm/components/__tests__/ProseMirror.draw-decoration.test.js +0 -967
  90. package/dist/esm/components/__tests__/ProseMirror.draw.test.js +0 -294
  91. package/dist/esm/components/__tests__/ProseMirror.node-view.test.js +0 -272
  92. package/dist/esm/components/__tests__/ProseMirror.selection.test.js +0 -440
  93. package/dist/esm/components/__tests__/ProseMirror.test.js +0 -339
  94. package/dist/esm/contexts/__tests__/DeferredLayoutEffects.test.js +0 -98
  95. package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -99
  96. package/dist/esm/plugins/__tests__/reactKeys.test.js +0 -77
  97. package/dist/esm/selection/SelectionDOMObserver.js +0 -161
  98. package/dist/esm/selection/hasFocusAndSelection.js +0 -17
  99. package/dist/esm/selection/selectionFromDOM.js +0 -59
  100. package/dist/esm/selection/selectionToDOM.js +0 -196
  101. package/dist/esm/ssr.js +0 -82
  102. package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +0 -1
  103. package/dist/types/selection/SelectionDOMObserver.d.ts +0 -33
  104. package/dist/types/selection/hasFocusAndSelection.d.ts +0 -3
  105. package/dist/types/selection/selectionFromDOM.d.ts +0 -4
  106. package/dist/types/selection/selectionToDOM.d.ts +0 -9
  107. package/dist/types/ssr.d.ts +0 -19
@@ -1,81 +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 _reactKeysJs = require("../reactKeys.js");
8
- const schema = new _prosemirrorModel.Schema({
9
- nodes: {
10
- doc: {
11
- content: "block+"
12
- },
13
- paragraph: {
14
- group: "block",
15
- content: "inline*"
16
- },
17
- list: {
18
- group: "block",
19
- content: "list_item+"
20
- },
21
- list_item: {
22
- content: "inline*"
23
- },
24
- text: {
25
- group: "inline"
26
- }
27
- }
28
- });
29
- describe("reactNodeViewPlugin", ()=>{
30
- it("should create a unique key for each node", ()=>{
31
- const editorState = _prosemirrorState.EditorState.create({
32
- doc: schema.topNodeType.create(null, [
33
- schema.nodes.paragraph.create(),
34
- schema.nodes.paragraph.create(),
35
- schema.nodes.paragraph.create()
36
- ]),
37
- plugins: [
38
- (0, _reactKeysJs.reactKeys)()
39
- ]
40
- });
41
- const pluginState = _reactKeysJs.reactKeysPluginKey.getState(editorState);
42
- expect(pluginState.posToKey.size).toBe(3);
43
- });
44
- it("should maintain key stability when possible", ()=>{
45
- const initialEditorState = _prosemirrorState.EditorState.create({
46
- doc: schema.topNodeType.create(null, [
47
- schema.nodes.paragraph.create({}, schema.text("Hello")),
48
- schema.nodes.paragraph.create(),
49
- schema.nodes.paragraph.create()
50
- ]),
51
- plugins: [
52
- (0, _reactKeysJs.reactKeys)()
53
- ]
54
- });
55
- const initialPluginState = _reactKeysJs.reactKeysPluginKey.getState(initialEditorState);
56
- const nextEditorState = initialEditorState.apply(initialEditorState.tr.insertText(", world!", 6));
57
- const nextPluginState = _reactKeysJs.reactKeysPluginKey.getState(nextEditorState);
58
- expect(Array.from(initialPluginState.keyToPos.keys())).toEqual(Array.from(nextPluginState.keyToPos.keys()));
59
- });
60
- it("should create unique keys for new nodes", ()=>{
61
- const initialEditorState = _prosemirrorState.EditorState.create({
62
- doc: schema.topNodeType.create(null, [
63
- schema.nodes.paragraph.create(),
64
- schema.nodes.paragraph.create(),
65
- schema.nodes.paragraph.create()
66
- ]),
67
- plugins: [
68
- (0, _reactKeysJs.reactKeys)()
69
- ]
70
- });
71
- const initialPluginState = _reactKeysJs.reactKeysPluginKey.getState(initialEditorState);
72
- const nextEditorState = initialEditorState.apply(initialEditorState.tr.insert(0, schema.nodes.list.createAndFill()));
73
- const nextPluginState = _reactKeysJs.reactKeysPluginKey.getState(nextEditorState);
74
- // Adds new keys for new nodes
75
- expect(nextPluginState.keyToPos.size).toBe(5);
76
- // Maintains keys for previous nodes that are still there
77
- Array.from(initialPluginState.keyToPos.keys()).forEach((key)=>{
78
- expect(Array.from(nextPluginState.keyToPos.keys())).toContain(key);
79
- });
80
- });
81
- });
@@ -1,171 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "SelectionDOMObserver", {
6
- enumerable: true,
7
- get: function() {
8
- return SelectionDOMObserver;
9
- }
10
- });
11
- const _prosemirrorstate = require("prosemirror-state");
12
- const _browser = require("../browser.js");
13
- const _dom = require("../dom.js");
14
- const _hasFocusAndSelection = require("./hasFocusAndSelection.js");
15
- const _selectionFromDOM = require("./selectionFromDOM.js");
16
- const _selectionToDOM = require("./selectionToDOM.js");
17
- let SelectionState = class SelectionState {
18
- anchorNode = null;
19
- anchorOffset = 0;
20
- focusNode = null;
21
- focusOffset = 0;
22
- set(sel) {
23
- this.anchorNode = sel.anchorNode;
24
- this.anchorOffset = sel.anchorOffset;
25
- this.focusNode = sel.focusNode;
26
- this.focusOffset = sel.focusOffset;
27
- }
28
- clear() {
29
- this.anchorNode = this.focusNode = null;
30
- }
31
- eq(sel) {
32
- return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;
33
- }
34
- };
35
- let SelectionDOMObserver = class SelectionDOMObserver {
36
- view;
37
- flushingSoon;
38
- currentSelection;
39
- suppressingSelectionUpdates;
40
- constructor(view){
41
- this.view = view;
42
- this.flushingSoon = -1;
43
- this.currentSelection = new SelectionState();
44
- this.suppressingSelectionUpdates = false;
45
- this.view = view;
46
- this.onSelectionChange = this.onSelectionChange.bind(this);
47
- }
48
- connectSelection() {
49
- this.view.dom.ownerDocument.addEventListener("selectionchange", this.onSelectionChange);
50
- }
51
- disconnectSelection() {
52
- this.view.dom.ownerDocument.removeEventListener("selectionchange", this.onSelectionChange);
53
- }
54
- stop() {
55
- this.disconnectSelection();
56
- }
57
- start() {
58
- this.connectSelection();
59
- }
60
- suppressSelectionUpdates() {
61
- this.suppressingSelectionUpdates = true;
62
- setTimeout(()=>this.suppressingSelectionUpdates = false, 50);
63
- }
64
- setCurSelection() {
65
- // @ts-expect-error Internal method
66
- this.currentSelection.set(this.view.domSelectionRange());
67
- }
68
- ignoreSelectionChange(sel) {
69
- if (!sel.focusNode) return true;
70
- const ancestors = new Set();
71
- let container;
72
- for(let scan = sel.focusNode; scan; scan = (0, _dom.parentNode)(scan))ancestors.add(scan);
73
- for(let scan = sel.anchorNode; scan; scan = (0, _dom.parentNode)(scan))if (ancestors.has(scan)) {
74
- container = scan;
75
- break;
76
- }
77
- // @ts-expect-error Internal property (docView)
78
- const desc = container && this.view.docView.nearestDesc(container);
79
- if (desc && desc.ignoreMutation({
80
- type: "selection",
81
- target: container?.nodeType == 3 ? container?.parentNode : container
82
- })) {
83
- this.setCurSelection();
84
- return true;
85
- }
86
- return;
87
- }
88
- registerMutation() {
89
- // pass
90
- }
91
- flushSoon() {
92
- if (this.flushingSoon < 0) this.flushingSoon = window.setTimeout(()=>{
93
- this.flushingSoon = -1;
94
- this.flush();
95
- }, 20);
96
- }
97
- updateSelection() {
98
- const { view } = this;
99
- const compositionID = // @ts-expect-error Internal property (input)
100
- view.input.compositionPendingChanges || // @ts-expect-error Internal property (input)
101
- (view.composing ? view.input.compositionID : 0);
102
- // @ts-expect-error Internal property (input)
103
- view.input.compositionPendingChanges = 0;
104
- const origin = // @ts-expect-error Internal property (input)
105
- view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;
106
- const newSel = (0, _selectionFromDOM.selectionFromDOM)(view, origin);
107
- if (newSel && !view.state.selection.eq(newSel)) {
108
- const tr = view.state.tr.setSelection(newSel);
109
- if (origin == "pointer") tr.setMeta("pointer", true);
110
- else if (origin == "key") tr.scrollIntoView();
111
- if (compositionID) tr.setMeta("composition", compositionID);
112
- view.dispatch(tr);
113
- }
114
- }
115
- selectionToDOM() {
116
- const { view } = this;
117
- (0, _selectionToDOM.selectionToDOM)(view);
118
- // @ts-expect-error Internal property (domSelectionRange)
119
- const sel = view.domSelectionRange();
120
- this.currentSelection.set(sel);
121
- }
122
- flush() {
123
- const { view } = this;
124
- // @ts-expect-error Internal property (docView)
125
- if (!view.docView || this.flushingSoon > -1) return;
126
- // @ts-expect-error Internal property (domSelectionRange)
127
- const sel = view.domSelectionRange();
128
- const newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && (0, _hasFocusAndSelection.hasFocusAndSelection)(view) && !this.ignoreSelectionChange(sel);
129
- let readSel = null;
130
- // If it looks like the browser has reset the selection to the
131
- // start of the document after focus, restore the selection from
132
- // the state
133
- if (newSel && // @ts-expect-error Internal property (input)
134
- view.input.lastFocus > Date.now() - 200 && // @ts-expect-error Internal property (input)
135
- Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && (0, _dom.selectionCollapsed)(sel) && (readSel = (0, _selectionFromDOM.selectionFromDOM)(view)) && readSel.eq(_prosemirrorstate.Selection.near(view.state.doc.resolve(0), 1))) {
136
- // @ts-expect-error Internal property (input)
137
- view.input.lastFocus = 0;
138
- (0, _selectionToDOM.selectionToDOM)(view);
139
- this.currentSelection.set(sel);
140
- // @ts-expect-error Internal property (scrollToSelection)
141
- view.scrollToSelection();
142
- } else if (newSel) {
143
- this.updateSelection();
144
- if (!this.currentSelection.eq(sel)) (0, _selectionToDOM.selectionToDOM)(view);
145
- this.currentSelection.set(sel);
146
- }
147
- }
148
- forceFlush() {
149
- if (this.flushingSoon > -1) {
150
- window.clearTimeout(this.flushingSoon);
151
- this.flushingSoon = -1;
152
- this.flush();
153
- }
154
- }
155
- onSelectionChange() {
156
- if (!(0, _hasFocusAndSelection.hasFocusAndSelection)(this.view)) return;
157
- if (this.view.composing) return;
158
- if (this.suppressingSelectionUpdates) return (0, _selectionToDOM.selectionToDOM)(this.view);
159
- // Deletions on IE11 fire their events in the wrong order, giving
160
- // us a selection change event before the DOM changes are
161
- // reported.
162
- if (_browser.browser.ie && _browser.browser.ie_version <= 11 && !this.view.state.selection.empty) {
163
- // @ts-expect-error Internal method
164
- const sel = this.view.domSelectionRange();
165
- // Selection.isCollapsed isn't reliable on IE
166
- if (sel.focusNode && (0, _selectionToDOM.isEquivalentPosition)(sel.focusNode, sel.focusOffset, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
167
- sel.anchorNode, sel.anchorOffset)) return this.flushSoon();
168
- }
169
- this.flush();
170
- }
171
- };
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- hasFocusAndSelection: function() {
13
- return hasFocusAndSelection;
14
- },
15
- hasSelection: function() {
16
- return hasSelection;
17
- }
18
- });
19
- function hasFocusAndSelection(view) {
20
- if (view.editable && !view.hasFocus()) return false;
21
- return hasSelection(view);
22
- }
23
- function hasSelection(view) {
24
- // @ts-expect-error Internal method
25
- const sel = view.domSelectionRange();
26
- if (!sel.anchorNode) return false;
27
- try {
28
- // Firefox will raise 'permission denied' errors when accessing
29
- // properties of `sel.anchorNode` when it's in a generated CSS
30
- // element.
31
- return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (view.editable || view.dom.contains(sel.focusNode?.nodeType == 3 ? sel.focusNode?.parentNode : sel.focusNode));
32
- } catch (_) {
33
- return false;
34
- }
35
- }
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- selectionBetween: function() {
13
- return selectionBetween;
14
- },
15
- selectionFromDOM: function() {
16
- return selectionFromDOM;
17
- }
18
- });
19
- const _prosemirrorstate = require("prosemirror-state");
20
- const _dom = require("../dom.js");
21
- function selectionBetween(view, $anchor, $head, bias) {
22
- return view.someProp("createSelectionBetween", (f)=>f(view, $anchor, $head)) || _prosemirrorstate.TextSelection.between($anchor, $head, bias);
23
- }
24
- function selectionFromDOM(view) {
25
- let origin = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
26
- // @ts-expect-error Internal method
27
- const domSel = view.domSelectionRange(), doc = view.state.doc;
28
- if (!domSel.focusNode) return null;
29
- // @ts-expect-error Internal method
30
- let nearestDesc = view.docView.nearestDesc(domSel.focusNode);
31
- const inWidget = nearestDesc && nearestDesc.size == 0;
32
- // @ts-expect-error Internal method
33
- let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);
34
- if (head < 0) return null;
35
- let $head = doc.resolve(head), anchor, selection;
36
- if ((0, _dom.selectionCollapsed)(domSel)) {
37
- anchor = head;
38
- while(nearestDesc && !nearestDesc.node)nearestDesc = nearestDesc.parent;
39
- const nearestDescNode = nearestDesc.node;
40
- if (nearestDesc && nearestDescNode.isAtom && _prosemirrorstate.NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent && !(nearestDescNode.isInline && (0, _dom.isOnEdge)(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
41
- const pos = nearestDesc.posBefore;
42
- selection = new _prosemirrorstate.NodeSelection(head == pos ? $head : doc.resolve(pos));
43
- }
44
- } else {
45
- if (// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
46
- domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {
47
- let min = head, max = head;
48
- for(let i = 0; i < domSel.rangeCount; i++){
49
- const range = domSel.getRangeAt(i);
50
- min = Math.min(min, // @ts-expect-error Internal method
51
- view.docView.posFromDOM(range.startContainer, range.startOffset, 1));
52
- max = Math.max(max, // @ts-expect-error Internal method
53
- view.docView.posFromDOM(range.endContainer, range.endOffset, -1));
54
- }
55
- if (min < 0) return null;
56
- [anchor, head] = max == view.state.selection.anchor ? [
57
- max,
58
- min
59
- ] : [
60
- min,
61
- max
62
- ];
63
- $head = doc.resolve(head);
64
- } else {
65
- // @ts-expect-error Internal method
66
- anchor = view.docView.posFromDOM(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
67
- domSel.anchorNode, domSel.anchorOffset, 1);
68
- }
69
- if (anchor < 0) return null;
70
- }
71
- const $anchor = doc.resolve(anchor);
72
- if (!selection) {
73
- const bias = origin == "pointer" || view.state.selection.head < $head.pos && !inWidget ? 1 : -1;
74
- selection = selectionBetween(view, $anchor, $head, bias);
75
- }
76
- return selection;
77
- }
@@ -1,226 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- domIndex: function() {
13
- return domIndex;
14
- },
15
- hasBlockDesc: function() {
16
- return hasBlockDesc;
17
- },
18
- hasSelection: function() {
19
- return hasSelection;
20
- },
21
- isEquivalentPosition: function() {
22
- return isEquivalentPosition;
23
- },
24
- nodeSize: function() {
25
- return nodeSize;
26
- },
27
- selectionToDOM: function() {
28
- return selectionToDOM;
29
- },
30
- syncNodeSelection: function() {
31
- return syncNodeSelection;
32
- }
33
- });
34
- const _prosemirrorstate = require("prosemirror-state");
35
- const _browser = require("../browser.js");
36
- const isEquivalentPosition = function(node, off, targetNode, targetOff) {
37
- return targetNode && (scanFor(node, off, targetNode, targetOff, -1) || scanFor(node, off, targetNode, targetOff, 1));
38
- };
39
- function hasBlockDesc(dom) {
40
- let desc;
41
- for(let cur = dom; cur; cur = cur.parentNode)if (desc = cur.pmViewDesc) break;
42
- return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);
43
- }
44
- const atomElements = /^(img|br|input|textarea|hr)$/i;
45
- function scanFor(node, off, targetNode, targetOff, dir) {
46
- for(;;){
47
- if (node == targetNode && off == targetOff) return true;
48
- if (off == (dir < 0 ? 0 : nodeSize(node))) {
49
- const parent = node.parentNode;
50
- if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == "false") return false;
51
- off = domIndex(node) + (dir < 0 ? 0 : 1);
52
- node = parent;
53
- } else if (node.nodeType == 1) {
54
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
55
- node = node.childNodes[off + (dir < 0 ? -1 : 0)];
56
- if (node.contentEditable == "false") return false;
57
- off = dir < 0 ? nodeSize(node) : 0;
58
- } else {
59
- return false;
60
- }
61
- }
62
- }
63
- const domIndex = function(node) {
64
- let n = node;
65
- for(let index = 0;; index++){
66
- n = n.previousSibling;
67
- if (!n) return index;
68
- }
69
- };
70
- function nodeSize(node) {
71
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
72
- return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;
73
- }
74
- function syncNodeSelection(view, sel) {
75
- const v = view;
76
- if (sel instanceof _prosemirrorstate.NodeSelection) {
77
- const desc = v.docView.descAt(sel.from);
78
- if (desc != v.lastSelectedViewDesc) {
79
- clearNodeSelection(v);
80
- if (desc) desc.selectNode();
81
- v.lastSelectedViewDesc = desc;
82
- }
83
- } else {
84
- clearNodeSelection(v);
85
- }
86
- }
87
- // Clear all DOM statefulness of the last node selection.
88
- function clearNodeSelection(view) {
89
- const v = view;
90
- if (v.lastSelectedViewDesc) {
91
- if (v.lastSelectedViewDesc.parent) v.lastSelectedViewDesc.deselectNode();
92
- v.lastSelectedViewDesc = undefined;
93
- }
94
- }
95
- function hasSelection(view) {
96
- const v = view;
97
- const sel = v.domSelectionRange();
98
- if (!sel.anchorNode) return false;
99
- try {
100
- // Firefox will raise 'permission denied' errors when accessing
101
- // properties of `sel.anchorNode` when it's in a generated CSS
102
- // element.
103
- return v.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (v.editable || v.dom.contains(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104
- sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));
105
- } catch (_) {
106
- return false;
107
- }
108
- }
109
- function editorOwnsSelection(view) {
110
- return view.editable ? view.hasFocus() : hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);
111
- }
112
- function selectCursorWrapper(view) {
113
- const v = view;
114
- const domSel = v.domSelection(), range = document.createRange();
115
- if (!domSel) return;
116
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
117
- const node = v.cursorWrapper.dom, img = node.nodeName == "IMG";
118
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
119
- if (img) range.setStart(node.parentNode, domIndex(node) + 1);
120
- else range.setStart(node, 0);
121
- range.collapse(true);
122
- domSel.removeAllRanges();
123
- domSel.addRange(range);
124
- // Kludge to kill 'control selection' in IE11 when selecting an
125
- // invisible cursor wrapper, since that would result in those weird
126
- // resize handles and a selection that considers the absolutely
127
- // positioned wrapper, rather than the root editable node, the
128
- // focused element.
129
- if (!img && !v.state.selection.visible && _browser.browser.ie && _browser.browser.ie_version <= 11) {
130
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
- node.disabled = true;
132
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
- node.disabled = false;
134
- }
135
- }
136
- function temporarilyEditableNear(view, pos) {
137
- const v = view;
138
- const { node, offset } = v.docView.domFromPos(pos, 0);
139
- const after = offset < node.childNodes.length ? node.childNodes[offset] : null;
140
- const before = offset ? node.childNodes[offset - 1] : null;
141
- if (_browser.browser.safari && after && after.contentEditable == "false") return setEditable(after);
142
- if ((!after || after.contentEditable == "false") && (!before || before.contentEditable == "false")) {
143
- if (after) return setEditable(after);
144
- else if (before) return setEditable(before);
145
- }
146
- return;
147
- }
148
- function setEditable(element) {
149
- element.contentEditable = "true";
150
- if (_browser.browser.safari && element.draggable) {
151
- element.draggable = false;
152
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
- element.wasDraggable = true;
154
- }
155
- return element;
156
- }
157
- function resetEditable(element) {
158
- element.contentEditable = "false";
159
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
- if (element.wasDraggable) {
161
- element.draggable = true;
162
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
163
- element.wasDraggable = null;
164
- }
165
- }
166
- function removeClassOnSelectionChange(view) {
167
- const v = view;
168
- const doc = v.dom.ownerDocument;
169
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
170
- doc.removeEventListener("selectionchange", v.input.hideSelectionGuard);
171
- const domSel = v.domSelectionRange();
172
- const node = domSel.anchorNode, offset = domSel.anchorOffset;
173
- doc.addEventListener("selectionchange", v.input.hideSelectionGuard = ()=>{
174
- if (domSel.anchorNode != node || domSel.anchorOffset != offset) {
175
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
176
- doc.removeEventListener("selectionchange", v.input.hideSelectionGuard);
177
- setTimeout(()=>{
178
- if (!editorOwnsSelection(v) || v.state.selection.visible) v.dom.classList.remove("ProseMirror-hideselection");
179
- }, 20);
180
- }
181
- });
182
- }
183
- const brokenSelectBetweenUneditable = _browser.browser.safari || _browser.browser.chrome && _browser.browser.chrome_version < 63;
184
- function selectionToDOM(view) {
185
- let force = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
186
- const v = view;
187
- const sel = v.state.selection;
188
- syncNodeSelection(v, sel);
189
- if (!editorOwnsSelection(v)) return;
190
- // The delayed drag selection causes issues with Cell Selections
191
- // in Safari. And the drag selection delay is to workarond issues
192
- // which only present in Chrome.
193
- if (!force && v.input.mouseDown && v.input.mouseDown.allowDefault && _browser.browser.chrome) {
194
- const domSel = v.domSelectionRange(), curSel = v.domObserver.currentSelection;
195
- if (domSel.anchorNode && curSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {
196
- v.input.mouseDown.delayedSelectionSync = true;
197
- v.domObserver.setCurSelection();
198
- return;
199
- }
200
- }
201
- v.domObserver.disconnectSelection();
202
- if (v.cursorWrapper) {
203
- selectCursorWrapper(v);
204
- } else {
205
- const { anchor, head } = sel;
206
- let resetEditableFrom;
207
- let resetEditableTo;
208
- if (brokenSelectBetweenUneditable && !(sel instanceof _prosemirrorstate.TextSelection)) {
209
- if (!sel.$from.parent.inlineContent) resetEditableFrom = temporarilyEditableNear(v, sel.from);
210
- if (!sel.empty && !sel.$from.parent.inlineContent) resetEditableTo = temporarilyEditableNear(v, sel.to);
211
- }
212
- v.docView.setSelection(anchor, head, v, force);
213
- if (brokenSelectBetweenUneditable) {
214
- if (resetEditableFrom) resetEditable(resetEditableFrom);
215
- if (resetEditableTo) resetEditable(resetEditableTo);
216
- }
217
- if (sel.visible) {
218
- v.dom.classList.remove("ProseMirror-hideselection");
219
- } else {
220
- v.dom.classList.add("ProseMirror-hideselection");
221
- if ("onselectionchange" in document) removeClassOnSelectionChange(v);
222
- }
223
- }
224
- v.domObserver.setCurSelection();
225
- v.domObserver.connectSelection();
226
- }
package/dist/cjs/ssr.js DELETED
@@ -1,85 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-empty-function */ /**
2
- * @fileoverview
3
- *
4
- * Stubs for ProseMirror View during SSR. These are extremely
5
- * barebones, because they _do not need to actually work_. They
6
- * just need to prevent errors from being thrown when ProseMirror
7
- * View attemps to access these APIs while constructing the
8
- * initial EditorView. None of these APIs are necessary for SSR to
9
- * work properly, so it's fine that they're all no-ops.
10
- */ "use strict";
11
- Object.defineProperty(exports, "__esModule", {
12
- value: true
13
- });
14
- Object.defineProperty(exports, "setSsrStubs", {
15
- enumerable: true,
16
- get: function() {
17
- return setSsrStubs;
18
- }
19
- });
20
- let ClassList = class ClassList {
21
- add() {}
22
- remove() {}
23
- };
24
- let ElementStub = class ElementStub {
25
- get parent() {
26
- return new ElementStub();
27
- }
28
- get parentNode() {
29
- return new ElementStub();
30
- }
31
- nodeName = "div";
32
- appendChild() {
33
- return new ElementStub();
34
- }
35
- setAttribute() {}
36
- hasAttribute() {
37
- return false;
38
- }
39
- insertBefore() {}
40
- get classList() {
41
- return new ClassList();
42
- }
43
- get ownerDocument() {
44
- return new DocumentStub();
45
- }
46
- style = {};
47
- addEventListener() {}
48
- removeEventListener() {}
49
- replaceChildren() {}
50
- };
51
- let DocumentStub = class DocumentStub {
52
- createElement() {
53
- return new ElementStub();
54
- }
55
- addEventListener() {}
56
- removeEventListener() {}
57
- get documentElement() {
58
- return new ElementStub();
59
- }
60
- };
61
- function setSsrStubs() {
62
- const prevWindow = globalThis.window;
63
- // @ts-expect-error HACK - EditorView checks for window.MutationObserver
64
- // in its constructor, which breaks SSR. We temporarily set window
65
- // to an empty object to prevent an error from being thrown, and then
66
- // clean it up so that other isomorphic code doesn't get confused about
67
- // whether there's a functioning global window object
68
- globalThis.window ??= {
69
- visualViewport: null
70
- };
71
- const prevDocument = globalThis.document;
72
- // @ts-expect-error HACK: This is only used during SSR, and only
73
- // to prevent outright errors when ProseMirror View attempts to
74
- // access document properties either on import or when constructing
75
- // the EditorView.
76
- globalThis.document ??= new DocumentStub();
77
- return function cleanupSsrStubs() {
78
- if (globalThis.window !== prevWindow) {
79
- globalThis.window = prevWindow;
80
- }
81
- if (globalThis.document !== prevDocument) {
82
- globalThis.document = prevDocument;
83
- }
84
- };
85
- }