@kerebron/extension-yjs 0.6.6 → 0.7.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 (90) hide show
  1. package/esm/ExtensionYjs.d.ts +3 -11
  2. package/esm/ExtensionYjs.d.ts.map +1 -1
  3. package/esm/ExtensionYjs.js +38 -45
  4. package/esm/ExtensionYjs.js.map +1 -1
  5. package/esm/WebsocketProvider.d.ts +69 -0
  6. package/esm/WebsocketProvider.d.ts.map +1 -0
  7. package/esm/WebsocketProvider.js +354 -0
  8. package/esm/WebsocketProvider.js.map +1 -0
  9. package/esm/YjsProvider.d.ts +48 -0
  10. package/esm/YjsProvider.d.ts.map +1 -0
  11. package/esm/YjsProvider.js +12 -0
  12. package/esm/YjsProvider.js.map +1 -0
  13. package/esm/_dnt.shims.d.ts +2 -0
  14. package/esm/_dnt.shims.d.ts.map +1 -0
  15. package/esm/_dnt.shims.js +58 -0
  16. package/esm/_dnt.shims.js.map +1 -0
  17. package/esm/binding/BindingMetadata.d.ts +6 -0
  18. package/esm/binding/BindingMetadata.d.ts.map +1 -0
  19. package/esm/binding/BindingMetadata.js +2 -0
  20. package/esm/binding/BindingMetadata.js.map +1 -0
  21. package/esm/binding/PmYjsBinding.d.ts +41 -0
  22. package/esm/binding/PmYjsBinding.d.ts.map +1 -0
  23. package/esm/binding/PmYjsBinding.js +190 -0
  24. package/esm/binding/PmYjsBinding.js.map +1 -0
  25. package/esm/binding/convertUtils.d.ts +48 -0
  26. package/esm/binding/convertUtils.d.ts.map +1 -0
  27. package/esm/binding/convertUtils.js +80 -0
  28. package/esm/binding/convertUtils.js.map +1 -0
  29. package/esm/{createNodeFromYElement.d.ts → binding/createNodeFromYElement.d.ts} +1 -1
  30. package/esm/binding/createNodeFromYElement.d.ts.map +1 -0
  31. package/esm/{createNodeFromYElement.js → binding/createNodeFromYElement.js} +2 -2
  32. package/esm/binding/createNodeFromYElement.js.map +1 -0
  33. package/esm/{updateYFragment.d.ts → binding/updateYFragment.d.ts} +3 -3
  34. package/esm/binding/updateYFragment.d.ts.map +1 -0
  35. package/esm/{updateYFragment.js → binding/updateYFragment.js} +10 -7
  36. package/esm/binding/updateYFragment.js.map +1 -0
  37. package/esm/lib.d.ts +1 -7
  38. package/esm/lib.d.ts.map +1 -1
  39. package/esm/lib.js +1 -200
  40. package/esm/lib.js.map +1 -1
  41. package/esm/position.d.ts +8 -0
  42. package/esm/position.d.ts.map +1 -0
  43. package/esm/position.js +165 -0
  44. package/esm/position.js.map +1 -0
  45. package/esm/ui/selection.d.ts +29 -0
  46. package/esm/ui/selection.d.ts.map +1 -0
  47. package/esm/ui/selection.js +129 -0
  48. package/esm/ui/selection.js.map +1 -0
  49. package/esm/yPositionPlugin.d.ts +6 -1
  50. package/esm/yPositionPlugin.d.ts.map +1 -1
  51. package/esm/yPositionPlugin.js +91 -50
  52. package/esm/yPositionPlugin.js.map +1 -1
  53. package/esm/ySyncPlugin.d.ts +5 -22
  54. package/esm/ySyncPlugin.d.ts.map +1 -1
  55. package/esm/ySyncPlugin.js +54 -116
  56. package/esm/ySyncPlugin.js.map +1 -1
  57. package/esm/yUndoPlugin.d.ts +11 -10
  58. package/esm/yUndoPlugin.d.ts.map +1 -1
  59. package/esm/yUndoPlugin.js +90 -52
  60. package/esm/yUndoPlugin.js.map +1 -1
  61. package/package.json +9 -6
  62. package/src/ExtensionYjs.ts +55 -67
  63. package/src/WebsocketProvider.ts +516 -0
  64. package/src/YjsProvider.ts +75 -0
  65. package/src/_dnt.shims.ts +60 -0
  66. package/src/binding/BindingMetadata.ts +6 -0
  67. package/src/binding/PmYjsBinding.ts +300 -0
  68. package/src/binding/convertUtils.ts +124 -0
  69. package/src/{createNodeFromYElement.ts → binding/createNodeFromYElement.ts} +3 -3
  70. package/src/{updateYFragment.ts → binding/updateYFragment.ts} +15 -8
  71. package/src/lib.ts +4 -230
  72. package/src/position.ts +191 -0
  73. package/src/ui/selection.ts +216 -0
  74. package/src/yPositionPlugin.ts +122 -74
  75. package/src/ySyncPlugin.ts +87 -170
  76. package/src/yUndoPlugin.ts +113 -62
  77. package/esm/ProsemirrorBinding.d.ts +0 -60
  78. package/esm/ProsemirrorBinding.d.ts.map +0 -1
  79. package/esm/ProsemirrorBinding.js +0 -405
  80. package/esm/ProsemirrorBinding.js.map +0 -1
  81. package/esm/createNodeFromYElement.d.ts.map +0 -1
  82. package/esm/createNodeFromYElement.js.map +0 -1
  83. package/esm/updateYFragment.d.ts.map +0 -1
  84. package/esm/updateYFragment.js.map +0 -1
  85. package/esm/userColors.d.ts +0 -5
  86. package/esm/userColors.d.ts.map +0 -1
  87. package/esm/userColors.js +0 -11
  88. package/esm/userColors.js.map +0 -1
  89. package/src/ProsemirrorBinding.ts +0 -607
  90. package/src/userColors.ts +0 -10
@@ -1,38 +1,48 @@
1
1
  import { EditorState, Plugin } from 'prosemirror-state';
2
2
  import { ContentType, Item, Text, UndoManager, XmlElement } from 'yjs';
3
+ import * as Y from 'yjs';
3
4
 
4
5
  import type { Command } from '@kerebron/editor/commands';
5
6
 
6
7
  import { ySyncPluginKey, yUndoPluginKey } from './keys.js';
7
- import { getRelativeSelection } from './ProsemirrorBinding.js';
8
+ import { getRelativeSelection } from './ui/selection.js';
9
+ import { YjsData } from './binding/PmYjsBinding.js';
10
+ import { YSyncPluginState } from './ySyncPlugin.js';
8
11
 
9
12
  export interface UndoPluginState {
10
- undoManager: UndoManager;
11
- prevSel: ReturnType<typeof getRelativeSelection> | null;
13
+ xmlFragment?: Y.XmlFragment;
14
+ undoManager?: UndoManager;
15
+ prevSel?: ReturnType<typeof getRelativeSelection>;
12
16
  hasUndoOps: boolean;
13
17
  hasRedoOps: boolean;
14
18
  }
15
19
 
16
- export const undo = (state: EditorState): boolean =>
17
- yUndoPluginKey.getState(state)?.undoManager?.undo() != null;
20
+ export const undo: Command = (state: EditorState): boolean => {
21
+ const tr = state.tr;
22
+ tr.setMeta('preventDispatch', true);
23
+ return !!(yUndoPluginKey.getState(state)?.undoManager?.undo());
24
+ };
18
25
 
19
- export const redo = (state: EditorState): boolean =>
20
- yUndoPluginKey.getState(state)?.undoManager?.redo() != null;
26
+ export const redo: Command = (state: EditorState): boolean => {
27
+ const tr = state.tr;
28
+ tr.setMeta('preventDispatch', true);
29
+ return !!(yUndoPluginKey.getState(state)?.undoManager?.redo());
30
+ };
21
31
 
22
32
  export const undoCommand: Command = (state, dispatch) =>
23
- dispatch == null
24
- ? yUndoPluginKey.getState(state)?.undoManager?.canUndo()
33
+ !dispatch
34
+ ? !!(yUndoPluginKey.getState(state)?.undoManager?.canUndo())
25
35
  : undo(state);
26
36
 
27
37
  export const redoCommand: Command = (state, dispatch) =>
28
- dispatch == null
29
- ? yUndoPluginKey.getState(state)?.undoManager?.canRedo()
38
+ !dispatch
39
+ ? !!(yUndoPluginKey.getState(state)?.undoManager?.canRedo())
30
40
  : redo(state);
31
41
 
32
42
  export const defaultProtectedNodes = new Set(['paragraph']);
33
43
 
34
44
  export const defaultDeleteFilter = (
35
- item: import('yjs').Item,
45
+ item: Y.Item,
36
46
  protectedNodes: Set<string>,
37
47
  ): boolean =>
38
48
  !(item instanceof Item) ||
@@ -45,78 +55,119 @@ export const defaultDeleteFilter = (
45
55
  export const yUndoPlugin = ({
46
56
  protectedNodes = defaultProtectedNodes,
47
57
  trackedOrigins = [],
48
- undoManager = null,
49
58
  }: {
50
59
  protectedNodes?: Set<string>;
51
60
  trackedOrigins?: any[];
52
- undoManager?: import('yjs').UndoManager | null;
53
61
  } = {}) =>
54
- new Plugin({
62
+ new Plugin<UndoPluginState>({
55
63
  key: yUndoPluginKey,
56
64
  state: {
57
- init: (initargs, state) => {
58
- // TODO: check if plugin order matches and fix
59
- const ystate = ySyncPluginKey.getState(state);
60
- const _undoManager = undoManager || new UndoManager(ystate.type, {
61
- trackedOrigins: new Set([ySyncPluginKey].concat(trackedOrigins)),
62
- deleteFilter: (item) => defaultDeleteFilter(item, protectedNodes),
63
- captureTransaction: (tr) => tr.meta.get('addToHistory') !== false,
64
- });
65
+ init: (_initargs, _state) => {
65
66
  return {
66
- undoManager: _undoManager,
67
- prevSel: null,
68
- hasUndoOps: _undoManager.undoStack.length > 0,
69
- hasRedoOps: _undoManager.redoStack.length > 0,
67
+ xmlFragment: undefined,
68
+ undoManager: undefined,
69
+ prevSel: undefined,
70
+ hasUndoOps: false,
71
+ hasRedoOps: false,
70
72
  };
71
73
  },
72
- apply: (tr, val, oldState, state) => {
73
- const binding = ySyncPluginKey.getState(state).binding;
74
- const undoManager = val.undoManager;
75
- const hasUndoOps = undoManager.undoStack.length > 0;
76
- const hasRedoOps = undoManager.redoStack.length > 0;
77
- if (binding) {
74
+ apply: (tr, val: UndoPluginState, oldState, state) => {
75
+ const clearYjs = tr.getMeta('clearYjs');
76
+ if (clearYjs) {
77
+ const undoManager = val.undoManager;
78
+ if (undoManager) {
79
+ undoManager?.destroy();
80
+ }
81
+
82
+ return {
83
+ xmlFragment: undefined,
84
+ undoManager: undefined,
85
+ prevSel: undefined,
86
+ hasUndoOps: false,
87
+ hasRedoOps: false,
88
+ };
89
+ }
90
+
91
+ const setYjs: YjsData | undefined = tr.getMeta('setYjs');
92
+ if (setYjs) {
93
+ const { xmlFragment } = setYjs;
94
+ const undoManager = new UndoManager(xmlFragment, {
95
+ trackedOrigins: new Set([ySyncPluginKey].concat(trackedOrigins)),
96
+ deleteFilter: (item) => defaultDeleteFilter(item, protectedNodes),
97
+ captureTransaction: (ytr) => {
98
+ return ytr.meta.get('addToYjsHistory') !== false;
99
+ },
100
+ });
101
+
102
+ const ystate: YSyncPluginState = ySyncPluginKey.getState(oldState)!;
103
+ undoManager.on('stack-item-added', ({ stackItem }) => {
104
+ const yUndoPluginState = yUndoPluginKey.getState(oldState);
105
+ const binding = ystate.binding;
106
+ if (binding && yUndoPluginState) {
107
+ stackItem.meta.set(
108
+ binding,
109
+ yUndoPluginState.prevSel,
110
+ );
111
+ }
112
+ });
113
+ undoManager.on('stack-item-popped', ({ stackItem }) => {
114
+ const binding = ystate.binding;
115
+ if (binding) {
116
+ const beforeTransactionSelection = stackItem.meta.get(binding);
117
+ if (beforeTransactionSelection) {
118
+ const selectionStash = binding.getSelectionStash();
119
+ if (selectionStash) {
120
+ selectionStash.overwrite(beforeTransactionSelection);
121
+ }
122
+ }
123
+ }
124
+ });
125
+
78
126
  return {
79
127
  undoManager,
80
- prevSel: getRelativeSelection(binding, oldState),
81
- hasUndoOps,
82
- hasRedoOps,
128
+ xmlFragment,
129
+ prevSel: undefined,
130
+ hasUndoOps: undoManager.undoStack.length > 0,
131
+ hasRedoOps: undoManager.redoStack.length > 0,
83
132
  };
84
- } else {
133
+ }
134
+
135
+ if (val.undoManager && val.xmlFragment) {
136
+ const undoManager = val.undoManager;
137
+ const hasUndoOps = undoManager.undoStack.length > 0;
138
+ const hasRedoOps = undoManager.redoStack.length > 0;
139
+
140
+ const ystate = ySyncPluginKey.getState(state)!;
141
+ const binding = ystate.binding;
142
+ if (binding) {
143
+ return {
144
+ ...val,
145
+ prevSel: getRelativeSelection(
146
+ val.xmlFragment,
147
+ binding.getMapping(),
148
+ oldState,
149
+ ),
150
+ hasUndoOps,
151
+ hasRedoOps,
152
+ };
153
+ }
154
+
85
155
  if (hasUndoOps !== val.hasUndoOps || hasRedoOps !== val.hasRedoOps) {
86
- return Object.assign({}, val, {
156
+ return {
157
+ ...val,
87
158
  hasUndoOps: undoManager.undoStack.length > 0,
88
159
  hasRedoOps: undoManager.redoStack.length > 0,
89
- });
90
- } else { // nothing changed
91
- return val;
160
+ };
92
161
  }
93
162
  }
163
+ return val;
94
164
  },
95
165
  },
96
166
  view: (view) => {
97
- const ystate = ySyncPluginKey.getState(view.state);
98
- const yUndoPlugin = yUndoPluginKey.getState(view.state);
99
- const undoManager = yUndoPlugin?.undoManager;
100
- if (undoManager) {
101
- undoManager.on('stack-item-added', ({ stackItem }) => {
102
- const binding = ystate.binding;
103
- if (binding) {
104
- stackItem.meta.set(
105
- binding,
106
- yUndoPlugin.prevSel,
107
- );
108
- }
109
- });
110
- undoManager.on('stack-item-popped', ({ stackItem }) => {
111
- const binding = ystate.binding;
112
- if (binding) {
113
- binding.beforeTransactionSelection = stackItem.meta.get(binding) ||
114
- binding.beforeTransactionSelection;
115
- }
116
- });
117
- }
118
167
  return {
119
168
  destroy: () => {
169
+ const yUndoPluginState = yUndoPluginKey.getState(view.state);
170
+ const undoManager = yUndoPluginState?.undoManager;
120
171
  undoManager?.destroy();
121
172
  },
122
173
  };
@@ -1,60 +0,0 @@
1
- import { mutex } from 'lib0/mutex';
2
- import { Node } from 'prosemirror-model';
3
- import { EditorState, Transaction } from 'prosemirror-state';
4
- import * as Y from 'yjs';
5
- import { ProsemirrorMapping } from './lib.js';
6
- import { type ColorDef, type YSyncPluginState } from './ySyncPlugin.js';
7
- export declare const defaultColors: Array<ColorDef>;
8
- export interface BindingMetadata {
9
- mapping: ProsemirrorMapping;
10
- isOMark: Map<string, boolean>;
11
- }
12
- interface TransactionSelection {
13
- type: string;
14
- anchor: Y.RelativePosition;
15
- head: Y.RelativePosition;
16
- }
17
- export declare const getRelativeSelection: (pmbinding: ProsemirrorBinding, state: EditorState) => TransactionSelection;
18
- interface IEditorView {
19
- state: EditorState;
20
- dispatch(tr: Transaction): void;
21
- fake?: boolean;
22
- }
23
- /**
24
- * Binding for prosemirror.
25
- *
26
- * @protected
27
- */
28
- export declare class ProsemirrorBinding implements BindingMetadata {
29
- readonly mapping: ProsemirrorMapping;
30
- ydoc: Y.Doc;
31
- isOMark: Map<string, boolean>;
32
- type: Y.XmlFragment;
33
- readonly mux: mutex;
34
- prosemirrorView?: IEditorView;
35
- private _beforeTransactionSelection;
36
- private readonly beforeAllTransactions;
37
- private readonly afterAllTransactions;
38
- private _observeFunction;
39
- private _domSelectionInView;
40
- get beforeTransactionSelection(): TransactionSelection | null;
41
- set beforeTransactionSelection(value: TransactionSelection);
42
- constructor(yXmlFragment: Y.XmlFragment, mapping?: ProsemirrorMapping);
43
- changeRoom(yXmlFragment: Y.XmlFragment): void;
44
- debug(msg?: string): void;
45
- _isLocalCursorInView(): boolean;
46
- _isDomSelectionInView(): boolean;
47
- renderSnapshot(snapshot: Y.Snapshot | undefined, prevSnapshot: Y.Snapshot | undefined): void;
48
- unrenderSnapshot(): void;
49
- _forceRerender(): void;
50
- _renderSnapshot(snapshot: Y.Snapshot | Uint8Array | undefined, prevSnapshot: Y.Snapshot | Uint8Array, pluginState: YSyncPluginState): void;
51
- yXmlChanged(events: Array<Y.YEvent<any>>, transaction: Y.Transaction): void;
52
- prosemirrorChanged(doc: Node): void;
53
- /**
54
- * View is ready to listen to changes. Register observers.
55
- */
56
- initView(prosemirrorView?: IEditorView): void;
57
- destroy(): void;
58
- }
59
- export {};
60
- //# sourceMappingURL=ProsemirrorBinding.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProsemirrorBinding.d.ts","sourceRoot":"","sources":["../src/ProsemirrorBinding.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAC;AAIhD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAEL,WAAW,EAIX,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,OAAO,EAEL,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAMlB,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,QAAQ,CAGxC,CAAC;AAmBH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,CAAC,gBAAgB,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC;CAC1B;AAyDD,eAAO,MAAM,oBAAoB,GAC/B,WAAW,kBAAkB,EAC7B,OAAO,WAAW,KACjB,oBAYD,CAAC;AAEH,UAAU,WAAW;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,eAAe;aAsBtC,OAAO,EAAE,kBAAkB;IArBtC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;IAC3B,SAAgB,GAAG,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,WAAW,CAAC;IAErC,OAAO,CAAC,2BAA2B,CAAqC;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAa;IAElD,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,IAAI,0BAA0B,IAAI,oBAAoB,GAAG,IAAI,CAE5D;IACD,IAAI,0BAA0B,CAAC,KAAK,EAAE,oBAAoB,EAEzD;gBAGC,YAAY,EAAE,CAAC,CAAC,WAAW,EACX,OAAO,GAAE,kBAA8B;IAsCzD,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,WAAW;IAUtC,KAAK,CAAC,GAAG,SAAqB;IAI9B,oBAAoB,IAAI,OAAO;IAY/B,qBAAqB,IAAI,OAAO;IA6BhC,cAAc,CACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,SAAS,EAChC,YAAY,EAAE,CAAC,CAAC,QAAQ,GAAG,SAAS;IAgBtC,gBAAgB;IA+BhB,cAAc;IAsDd,eAAe,CACb,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,UAAU,GAAG,SAAS,EAC7C,YAAY,EAAE,CAAC,CAAC,QAAQ,GAAG,UAAU,EACrC,WAAW,EAAE,gBAAgB;IA+H/B,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW;IAiEpE,kBAAkB,CAAC,GAAG,EAAE,IAAI;IAa5B;;OAEG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW;IAUtC,OAAO;CAcR"}