@remirror/extension-yjs 1.0.20 → 1.0.24

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.
@@ -1,11 +1,105 @@
1
1
  import _applyDecoratedDescriptor from '@babel/runtime/helpers/esm/applyDecoratedDescriptor';
2
- import { defaultCursorBuilder, ySyncPluginKey, defaultDeleteFilter, ySyncPlugin, yCursorPlugin, yUndoPlugin, yUndoPluginKey, undo, redo, absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from 'y-prosemirror';
3
- import { UndoManager } from 'yjs';
2
+ import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';
3
+ import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
4
+ import { defaultCursorBuilder, ySyncPluginKey, ySyncPlugin, yCursorPlugin, defaultDeleteFilter, yUndoPlugin, yUndoPluginKey, undo, redo, absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from 'y-prosemirror';
5
+ import { UndoManager, transact } from 'yjs';
4
6
  import { extension, invariant, ErrorConstant, ExtensionPriority, command, keyBinding, NamedShortcut, PlainExtension, isFunction, isEmptyObject, nonChainable, convertCommand } from '@remirror/core';
5
7
  import { AnnotationExtension } from '@remirror/extension-annotation';
6
8
  import { ExtensionHistoryMessages } from '@remirror/messages';
7
9
 
8
10
  var _dec, _dec2, _dec3, _dec4, _dec5, _class, _class2;
11
+
12
+ var _excluded = ["from", "to"],
13
+ _excluded2 = ["from", "to"];
14
+
15
+ class YjsAnnotationStore {
16
+ constructor(doc, pmName, mapName, getMapping) {
17
+ this.doc = doc;
18
+ this.getMapping = getMapping;
19
+ this.type = doc.getXmlFragment(pmName);
20
+ this.map = doc.getMap(mapName);
21
+ }
22
+
23
+ addAnnotation(_ref) {
24
+ var from = _ref.from,
25
+ to = _ref.to,
26
+ data = _objectWithoutProperties(_ref, _excluded);
27
+
28
+ // XXX: Why is this cast needed?
29
+ var storedData = _objectSpread(_objectSpread({}, data), {}, {
30
+ from: this.absolutePositionToRelativePosition(from),
31
+ to: this.absolutePositionToRelativePosition(to)
32
+ });
33
+
34
+ this.map.set(data.id, storedData);
35
+ }
36
+
37
+ updateAnnotation(id, updateData) {
38
+ var existing = this.map.get(id);
39
+
40
+ if (!existing) {
41
+ return;
42
+ }
43
+
44
+ this.map.set(id, _objectSpread(_objectSpread({}, updateData), {}, {
45
+ from: existing.from,
46
+ to: existing.to
47
+ }));
48
+ }
49
+
50
+ removeAnnotations(ids) {
51
+ transact(this.doc, () => {
52
+ ids.forEach(id => this.map.delete(id));
53
+ });
54
+ }
55
+
56
+ setAnnotations(annotations) {
57
+ transact(this.doc, () => {
58
+ this.map.clear();
59
+ annotations.forEach(annotation => this.addAnnotation(annotation));
60
+ });
61
+ }
62
+
63
+ formatAnnotations() {
64
+ var result = [];
65
+ this.map.forEach(_ref2 => {
66
+ var relFrom = _ref2.from,
67
+ relTo = _ref2.to,
68
+ data = _objectWithoutProperties(_ref2, _excluded2);
69
+
70
+ var from = this.relativePositionToAbsolutePosition(relFrom);
71
+ var to = this.relativePositionToAbsolutePosition(relTo);
72
+
73
+ if (!from || !to) {
74
+ return;
75
+ } // XXX: Why is this cast needed?
76
+
77
+
78
+ result.push(_objectSpread(_objectSpread({}, data), {}, {
79
+ from,
80
+ to
81
+ }));
82
+ });
83
+ return result;
84
+ }
85
+
86
+ absolutePositionToRelativePosition(pos) {
87
+ var mapping = this.getMapping();
88
+ return absolutePositionToRelativePosition(pos, this.type, mapping);
89
+ }
90
+
91
+ relativePositionToAbsolutePosition(relPos) {
92
+ var mapping = this.getMapping();
93
+ return relativePositionToAbsolutePosition(this.doc, this.type, relPos, mapping);
94
+ }
95
+
96
+ }
97
+ /**
98
+ * The YJS extension is the recommended extension for creating a collaborative
99
+ * editor.
100
+ */
101
+
102
+
9
103
  var YjsExtension = (_dec = extension({
10
104
  defaultOptions: {
11
105
  getProvider: () => {
@@ -19,29 +113,31 @@ var YjsExtension = (_dec = extension({
19
113
  cursorBuilder: defaultCursorBuilder,
20
114
  cursorStateField: 'cursor',
21
115
  getSelection: state => state.selection,
116
+ disableUndo: false,
22
117
  protectedNodes: new Set('paragraph'),
23
118
  trackedOrigins: []
24
119
  },
120
+ staticKeys: ['disableUndo', 'protectedNodes', 'trackedOrigins'],
25
121
  defaultPriority: ExtensionPriority.High
26
122
  }), _dec2 = command({
27
123
  disableChaining: true,
28
- description: _ref => {
29
- var t = _ref.t;
124
+ description: _ref3 => {
125
+ var t = _ref3.t;
30
126
  return t(ExtensionHistoryMessages.UNDO_DESCRIPTION);
31
127
  },
32
- label: _ref2 => {
33
- var t = _ref2.t;
128
+ label: _ref4 => {
129
+ var t = _ref4.t;
34
130
  return t(ExtensionHistoryMessages.UNDO_LABEL);
35
131
  },
36
132
  icon: 'arrowGoBackFill'
37
133
  }), _dec3 = command({
38
134
  disableChaining: true,
39
- description: _ref3 => {
40
- var t = _ref3.t;
135
+ description: _ref5 => {
136
+ var t = _ref5.t;
41
137
  return t(ExtensionHistoryMessages.REDO_DESCRIPTION);
42
138
  },
43
- label: _ref4 => {
44
- var t = _ref4.t;
139
+ label: _ref6 => {
140
+ var t = _ref6.t;
45
141
  return t(ExtensionHistoryMessages.REDO_LABEL);
46
142
  },
47
143
  icon: 'arrowGoForwardFill'
@@ -66,12 +162,24 @@ var YjsExtension = (_dec = extension({
66
162
  return (_this$_provider = this._provider) !== null && _this$_provider !== void 0 ? _this$_provider : this._provider = getLazyValue(getProvider);
67
163
  }
68
164
 
165
+ getBinding() {
166
+ var state = this.store.getState();
167
+
168
+ var _ySyncPluginKey$getSt = ySyncPluginKey.getState(state),
169
+ binding = _ySyncPluginKey$getSt.binding;
170
+
171
+ return binding;
172
+ }
173
+
69
174
  onView() {
70
175
  try {
176
+ var annotationStore = new YjsAnnotationStore(this.provider.doc, 'prosemirror', 'annotations', () => {
177
+ var _this$getBinding;
178
+
179
+ return (_this$getBinding = this.getBinding()) === null || _this$getBinding === void 0 ? void 0 : _this$getBinding.mapping;
180
+ });
71
181
  this.store.manager.getExtension(AnnotationExtension).setOptions({
72
- getMap: () => this.provider.doc.getMap('annotations'),
73
- transformPosition: this.absolutePositionToRelativePosition.bind(this),
74
- transformPositionBeforeRender: this.relativePositionToAbsolutePosition.bind(this)
182
+ getStore: () => annotationStore
75
183
  });
76
184
 
77
185
  var handler = (_update, _origin, _doc, yjsTr) => {
@@ -103,21 +211,28 @@ var YjsExtension = (_dec = extension({
103
211
  cursorBuilder = _this$options.cursorBuilder,
104
212
  getSelection = _this$options.getSelection,
105
213
  cursorStateField = _this$options.cursorStateField,
214
+ disableUndo = _this$options.disableUndo,
106
215
  protectedNodes = _this$options.protectedNodes,
107
216
  trackedOrigins = _this$options.trackedOrigins;
108
217
  var yDoc = this.provider.doc;
109
218
  var type = yDoc.getXmlFragment('prosemirror');
110
- var undoManager = new UndoManager(type, {
111
- trackedOrigins: new Set([ySyncPluginKey, ...trackedOrigins]),
112
- deleteFilter: item => defaultDeleteFilter(item, protectedNodes)
113
- });
114
- return [ySyncPlugin(type, syncPluginOptions), yCursorPlugin(this.provider.awareness, {
219
+ var plugins = [ySyncPlugin(type, syncPluginOptions), yCursorPlugin(this.provider.awareness, {
115
220
  cursorBuilder,
116
221
  cursorStateField,
117
222
  getSelection
118
- }, cursorStateField), yUndoPlugin({
119
- undoManager
120
- })];
223
+ }, cursorStateField)];
224
+
225
+ if (!disableUndo) {
226
+ var undoManager = new UndoManager(type, {
227
+ trackedOrigins: new Set([ySyncPluginKey, ...trackedOrigins]),
228
+ deleteFilter: item => defaultDeleteFilter(item, protectedNodes)
229
+ });
230
+ plugins.push(yUndoPlugin({
231
+ undoManager
232
+ }));
233
+ }
234
+
235
+ return plugins;
121
236
  }
122
237
  /**
123
238
  * This managers the updates of the collaboration provider.
@@ -127,14 +242,7 @@ var YjsExtension = (_dec = extension({
127
242
  onSetOptions(props) {
128
243
  var changes = props.changes,
129
244
  pickChanged = props.pickChanged;
130
- var changedPluginOptions = pickChanged(['cursorBuilder', 'cursorStateField', 'getProvider', 'getSelection', 'syncPluginOptions', 'protectedNodes', 'trackedOrigins']);
131
-
132
- if (changes.protectedNodes.changed || changes.trackedOrigins.changed) {
133
- // Cannot change these, as we would need a new undo manager instance, and for that
134
- // we would need to unregister the previous instance from the document to avoid
135
- // memory leaks.
136
- throw new Error("Cannot change \"protectedNodes\" or \"trackedOrigins\" options");
137
- }
245
+ var changedPluginOptions = pickChanged(['cursorBuilder', 'cursorStateField', 'getProvider', 'getSelection', 'syncPluginOptions']);
138
246
 
139
247
  if (changes.getProvider.changed) {
140
248
  this._provider = undefined;
@@ -167,16 +275,19 @@ var YjsExtension = (_dec = extension({
167
275
  this._provider = undefined;
168
276
  }
169
277
  /**
170
- * Undo within a collaborative editor.
171
- *
172
- * This should be used instead of the built in `undo` command.
278
+ * Undo that last Yjs transaction(s)
173
279
  *
174
280
  * This command does **not** support chaining.
281
+ * This command is a no-op and always returns `false` when the `disableUndo` option is set.
175
282
  */
176
283
 
177
284
 
178
285
  yUndo() {
179
286
  return nonChainable(props => {
287
+ if (this.options.disableUndo) {
288
+ return false;
289
+ }
290
+
180
291
  var state = props.state,
181
292
  dispatch = props.dispatch;
182
293
  var undoManager = yUndoPluginKey.getState(state).undoManager;
@@ -193,16 +304,19 @@ var YjsExtension = (_dec = extension({
193
304
  });
194
305
  }
195
306
  /**
196
- * Redo, within a collaborative editor.
197
- *
198
- * This should be used instead of the built in `redo` command.
307
+ * Redo the last transaction undone with a previous `yUndo` command.
199
308
  *
200
309
  * This command does **not** support chaining.
310
+ * This command is a no-op and always returns `false` when the `disableUndo` option is set.
201
311
  */
202
312
 
203
313
 
204
314
  yRedo() {
205
315
  return nonChainable(props => {
316
+ if (this.options.disableUndo) {
317
+ return false;
318
+ }
319
+
206
320
  var state = props.state,
207
321
  dispatch = props.dispatch;
208
322
  var undoManager = yUndoPluginKey.getState(state).undoManager;
@@ -235,26 +349,6 @@ var YjsExtension = (_dec = extension({
235
349
  return this.yRedo()(props);
236
350
  }
237
351
 
238
- absolutePositionToRelativePosition(pos) {
239
- var state = this.store.getState();
240
-
241
- var _ySyncPluginKey$getSt = ySyncPluginKey.getState(state),
242
- type = _ySyncPluginKey$getSt.type,
243
- binding = _ySyncPluginKey$getSt.binding;
244
-
245
- return absolutePositionToRelativePosition(pos, type, binding.mapping);
246
- }
247
-
248
- relativePositionToAbsolutePosition(relPos) {
249
- var state = this.store.getState();
250
-
251
- var _ySyncPluginKey$getSt2 = ySyncPluginKey.getState(state),
252
- type = _ySyncPluginKey$getSt2.type,
253
- binding = _ySyncPluginKey$getSt2.binding;
254
-
255
- return relativePositionToAbsolutePosition(this.provider.doc, type, relPos, binding.mapping);
256
- }
257
-
258
352
  }, (_applyDecoratedDescriptor(_class2.prototype, "yUndo", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "yUndo"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "yRedo", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "yRedo"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "undoShortcut", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "undoShortcut"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "redoShortcut", [_dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "redoShortcut"), _class2.prototype)), _class2)) || _class);
259
353
  /**
260
354
  * The default destroy provider method.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remirror/extension-yjs",
3
- "version": "1.0.20",
3
+ "version": "1.0.24",
4
4
  "description": "Realtime collaboration with yjs",
5
5
  "keywords": [
6
6
  "remirror",
@@ -44,8 +44,8 @@
44
44
  ],
45
45
  "dependencies": {
46
46
  "@babel/runtime": "^7.13.10",
47
- "@remirror/core": "^1.3.3",
48
- "@remirror/extension-annotation": "^1.1.11",
47
+ "@remirror/core": "^1.3.5",
48
+ "@remirror/extension-annotation": "^1.1.15",
49
49
  "@remirror/messages": "^1.0.6",
50
50
  "y-prosemirror": "^1.0.14",
51
51
  "y-protocols": "^1.0.5"