@dxos/react-ui-editor 0.3.11-main.668f0ff → 0.3.11-main.68db74e

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/dist/lib/browser/index.mjs +1742 -1382
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +9 -8
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +12 -17
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +6 -3
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/{hooks/automerge → components/TextEditor}/automerge.stories.d.ts +6 -1
  11. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/TextEditor/comments.stories.d.ts +26 -0
  14. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -0
  15. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  16. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  17. package/dist/types/src/{hooks/yjs → components/TextEditor}/yjs.stories.d.ts +1 -1
  18. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -0
  19. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  20. package/dist/types/src/extensions/automerge/automerge.d.ts +9 -0
  21. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -0
  22. package/dist/types/src/extensions/automerge/cursor.d.ts +5 -0
  23. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -0
  24. package/dist/types/src/extensions/automerge/defs.d.ts +26 -0
  25. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -0
  26. package/dist/types/src/extensions/automerge/index.d.ts +4 -0
  27. package/dist/types/src/extensions/automerge/index.d.ts.map +1 -0
  28. package/dist/types/src/{hooks → extensions}/automerge/semaphore.d.ts +4 -4
  29. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -0
  30. package/dist/types/src/extensions/automerge/update-automerge.d.ts +5 -0
  31. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -0
  32. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -0
  33. package/dist/types/src/extensions/awareness.d.ts +46 -0
  34. package/dist/types/src/extensions/awareness.d.ts.map +1 -0
  35. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  36. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  37. package/dist/types/src/extensions/code.d.ts.map +1 -0
  38. package/dist/types/src/{components/TextEditor/extensions → extensions}/comments.d.ts +6 -4
  39. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  40. package/dist/types/src/extensions/cursor.d.ts +25 -0
  41. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  42. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  43. package/dist/types/src/extensions/image.d.ts.map +1 -0
  44. package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +4 -2
  45. package/dist/types/src/extensions/index.d.ts.map +1 -0
  46. package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
  47. package/dist/types/src/extensions/link.d.ts.map +1 -0
  48. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  49. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  50. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  51. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  52. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  53. package/dist/types/src/extensions/table.d.ts.map +1 -0
  54. package/dist/types/src/extensions/tasklist.d.ts +7 -0
  55. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  56. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  57. package/dist/types/src/extensions/yjs/cursor.d.ts +4 -0
  58. package/dist/types/src/extensions/yjs/cursor.d.ts.map +1 -0
  59. package/dist/types/src/extensions/yjs/index.d.ts +2 -0
  60. package/dist/types/src/extensions/yjs/index.d.ts.map +1 -0
  61. package/dist/types/src/extensions/yjs/yjs.d.ts +4 -0
  62. package/dist/types/src/extensions/yjs/yjs.d.ts.map +1 -0
  63. package/dist/types/src/extensions/yjs/yjs.test.d.ts.map +1 -0
  64. package/dist/types/src/hooks/automerge.d.ts +3 -0
  65. package/dist/types/src/hooks/automerge.d.ts.map +1 -0
  66. package/dist/types/src/hooks/awareness-provider.d.ts +28 -0
  67. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -0
  68. package/dist/types/src/hooks/index.d.ts +2 -0
  69. package/dist/types/src/hooks/index.d.ts.map +1 -1
  70. package/dist/types/src/hooks/useTextModel.d.ts +4 -8
  71. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  72. package/dist/types/src/hooks/{yjs/space-provider.d.ts → yjs.d.ts} +8 -8
  73. package/dist/types/src/hooks/yjs.d.ts.map +1 -0
  74. package/dist/types/src/index.d.ts +5 -0
  75. package/dist/types/src/index.d.ts.map +1 -1
  76. package/dist/types/src/styles/cursors.d.ts.map +1 -0
  77. package/dist/types/src/styles/index.d.ts +1 -0
  78. package/dist/types/src/styles/index.d.ts.map +1 -1
  79. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  80. package/dist/types/src/styles/tokens.d.ts +1 -0
  81. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  82. package/dist/types/src/testing/replicator.d.ts +2 -2
  83. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  84. package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +1 -1
  85. package/dist/types/src/themes/default.d.ts.map +1 -0
  86. package/dist/types/src/themes/index.d.ts.map +1 -0
  87. package/dist/types/src/util.d.ts.map +1 -0
  88. package/package.json +24 -22
  89. package/src/components/TextEditor/MarkdownEditor.stories.tsx +36 -36
  90. package/src/components/TextEditor/TextEditor.stories.tsx +13 -34
  91. package/src/components/TextEditor/TextEditor.tsx +71 -67
  92. package/src/{hooks/automerge → components/TextEditor}/automerge.stories.tsx +66 -6
  93. package/src/components/TextEditor/codemirror.stories.ts +3 -2
  94. package/src/components/TextEditor/comments.stories.tsx +315 -0
  95. package/src/components/TextEditor/index.ts +0 -3
  96. package/src/{hooks/yjs → components/TextEditor}/yjs.stories.tsx +1 -1
  97. package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +18 -17
  98. package/src/extensions/automerge/automerge.ts +94 -0
  99. package/src/extensions/automerge/cursor.ts +52 -0
  100. package/src/extensions/automerge/defs.ts +62 -0
  101. package/src/extensions/automerge/index.ts +7 -0
  102. package/src/{hooks → extensions}/automerge/semaphore.ts +14 -12
  103. package/src/{hooks → extensions}/automerge/update-automerge.ts +5 -6
  104. package/src/{hooks → extensions}/automerge/update-codemirror.ts +13 -5
  105. package/src/extensions/awareness.ts +309 -0
  106. package/src/{components/TextEditor/extensions → extensions}/code.ts +14 -7
  107. package/src/{components/TextEditor/extensions → extensions}/comments.ts +49 -113
  108. package/src/extensions/cursor.ts +46 -0
  109. package/src/{components/TextEditor/extensions → extensions}/hr.ts +4 -5
  110. package/src/extensions/image.ts +87 -0
  111. package/src/{components/TextEditor/extensions → extensions}/index.ts +4 -2
  112. package/src/{components/TextEditor/extensions → extensions}/link.ts +116 -62
  113. package/src/extensions/listener.ts +35 -0
  114. package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +4 -13
  115. package/src/{components/TextEditor/extensions → extensions}/table.ts +10 -4
  116. package/src/extensions/tasklist.ts +95 -0
  117. package/src/{components/TextEditor/extensions → extensions}/typewriter.ts +1 -1
  118. package/src/extensions/yjs/cursor.ts +22 -0
  119. package/src/extensions/yjs/index.ts +5 -0
  120. package/src/{hooks → extensions}/yjs/yjs.test.ts +2 -26
  121. package/src/extensions/yjs/yjs.ts +16 -0
  122. package/src/hooks/automerge.ts +52 -0
  123. package/src/hooks/awareness-provider.ts +120 -0
  124. package/src/hooks/index.ts +2 -0
  125. package/src/hooks/useTextModel.ts +20 -96
  126. package/src/hooks/{yjs/space-provider.ts → yjs.ts} +49 -19
  127. package/src/index.ts +5 -0
  128. package/src/styles/index.ts +1 -0
  129. package/src/styles/markdown.ts +0 -2
  130. package/src/styles/tokens.ts +3 -0
  131. package/src/testing/replicator.ts +10 -15
  132. package/src/{components/TextEditor/themes → themes}/default.ts +52 -79
  133. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
  134. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
  135. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  136. package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
  137. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
  138. package/dist/types/src/components/TextEditor/extensions/hr.d.ts.map +0 -1
  139. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  140. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  141. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
  142. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
  143. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  144. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
  145. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  146. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  147. package/dist/types/src/components/TextEditor/extensions/mermaid.d.ts +0 -3
  148. package/dist/types/src/components/TextEditor/extensions/mermaid.d.ts.map +0 -1
  149. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  150. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +0 -3
  151. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
  152. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
  153. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
  154. package/dist/types/src/components/TextEditor/extensions/typewriter.d.ts.map +0 -1
  155. package/dist/types/src/components/TextEditor/extensions/util.d.ts.map +0 -1
  156. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
  157. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
  158. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +0 -1
  159. package/dist/types/src/hooks/automerge/handle.d.ts +0 -9
  160. package/dist/types/src/hooks/automerge/handle.d.ts.map +0 -1
  161. package/dist/types/src/hooks/automerge/index.d.ts +0 -3
  162. package/dist/types/src/hooks/automerge/index.d.ts.map +0 -1
  163. package/dist/types/src/hooks/automerge/plugin.d.ts +0 -26
  164. package/dist/types/src/hooks/automerge/plugin.d.ts.map +0 -1
  165. package/dist/types/src/hooks/automerge/semaphore.d.ts.map +0 -1
  166. package/dist/types/src/hooks/automerge/update-automerge.d.ts +0 -6
  167. package/dist/types/src/hooks/automerge/update-automerge.d.ts.map +0 -1
  168. package/dist/types/src/hooks/automerge/update-codemirror.d.ts.map +0 -1
  169. package/dist/types/src/hooks/yjs/cursors.d.ts.map +0 -1
  170. package/dist/types/src/hooks/yjs/index.d.ts +0 -3
  171. package/dist/types/src/hooks/yjs/index.d.ts.map +0 -1
  172. package/dist/types/src/hooks/yjs/space-provider.d.ts.map +0 -1
  173. package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +0 -1
  174. package/dist/types/src/hooks/yjs/yjs.test.d.ts.map +0 -1
  175. package/src/components/TextEditor/extensions/image.ts +0 -69
  176. package/src/components/TextEditor/extensions/listener.ts +0 -39
  177. package/src/components/TextEditor/extensions/mermaid.ts +0 -11
  178. package/src/components/TextEditor/extensions/tasklist.ts +0 -121
  179. package/src/components/TextEditor/extensions/tooltip.ts +0 -61
  180. package/src/hooks/automerge/handle.ts +0 -14
  181. package/src/hooks/automerge/index.ts +0 -6
  182. package/src/hooks/automerge/plugin.ts +0 -134
  183. package/src/hooks/yjs/index.ts +0 -6
  184. /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
  185. /package/dist/types/src/{hooks → extensions}/automerge/update-codemirror.d.ts +0 -0
  186. /package/dist/types/src/{components/TextEditor/extensions → extensions}/basic.d.ts +0 -0
  187. /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
  188. /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
  189. /package/dist/types/src/{components/TextEditor/extensions → extensions}/hr.d.ts +0 -0
  190. /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
  191. /package/dist/types/src/{components/TextEditor/extensions → extensions}/listener.d.ts +0 -0
  192. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +0 -0
  193. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -0
  194. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
  195. /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
  196. /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
  197. /package/dist/types/src/{components/TextEditor/extensions → extensions}/typewriter.d.ts +0 -0
  198. /package/dist/types/src/{hooks → extensions}/yjs/yjs.test.d.ts +0 -0
  199. /package/dist/types/src/{hooks/yjs → styles}/cursors.d.ts +0 -0
  200. /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
  201. /package/dist/types/src/{components/TextEditor/extensions/util.d.ts → util.d.ts} +0 -0
  202. /package/src/{components/TextEditor/extensions → extensions}/basic.ts +0 -0
  203. /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
  204. /package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +0 -0
  205. /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
  206. /package/src/{components/TextEditor/extensions → extensions}/mention.ts +0 -0
  207. /package/src/{hooks/yjs → styles}/cursors.ts +0 -0
  208. /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
  209. /package/src/{components/TextEditor/extensions/util.ts → util.ts} +0 -0
@@ -1,121 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import {
6
- EditorView,
7
- Decoration,
8
- WidgetType,
9
- MatchDecorator,
10
- ViewPlugin,
11
- type DecorationSet,
12
- type ViewUpdate,
13
- } from '@codemirror/view';
14
-
15
- // TODO(burdon): Reconcile with theme.
16
- const styles = EditorView.baseTheme({
17
- '& .cm-task-item': {
18
- paddingLeft: '4px',
19
- paddingRight: '8px',
20
- },
21
- });
22
-
23
- class CheckboxWidget extends WidgetType {
24
- constructor(
25
- private readonly _pos: number,
26
- private _checked: boolean,
27
- private readonly _indent: number,
28
- private readonly _onCheck?: (check: boolean) => void,
29
- ) {
30
- super();
31
- }
32
-
33
- override eq(other: CheckboxWidget) {
34
- return this._pos === other._pos && this._checked === other._checked && this._indent === other._indent;
35
- }
36
-
37
- toDOM(view: EditorView) {
38
- const wrap = document.createElement('span');
39
- wrap.className = 'cm-task-item';
40
- wrap.setAttribute('aria-hidden', 'true');
41
- wrap.style.setProperty('margin-left', this._indent * 24 + 'px');
42
-
43
- const input = wrap.appendChild(document.createElement('input'));
44
- input.type = 'checkbox';
45
- input.checked = this._checked;
46
- if (!this._onCheck) {
47
- input.setAttribute('disabled', 'true');
48
- }
49
- if (this._onCheck) {
50
- input.onchange = (event: Event) => {
51
- this._onCheck?.((event.target as any).checked);
52
- return true;
53
- };
54
- }
55
-
56
- return wrap;
57
- }
58
-
59
- override ignoreEvent() {
60
- return false;
61
- }
62
- }
63
-
64
- export type TasklistOptions = {};
65
-
66
- export const tasklist = (options: TasklistOptions = {}) => {
67
- // TODO(burdon): Matcher isn't as precise as syntax tree.
68
- // Allows for indents to be greater than AST would allow.
69
- const taskMatcher = new MatchDecorator({
70
- regexp: /^(\s*)- \[([ xX])\]\s/g,
71
- decoration: (match, view, pos) => {
72
- const indent = Math.floor(match[1].length / 2);
73
- const checked = match[2] === 'x' || match[2] === 'X';
74
- return Decoration.replace({
75
- widget: new CheckboxWidget(
76
- pos,
77
- checked,
78
- indent,
79
- view.state.readOnly
80
- ? undefined
81
- : (checked) => {
82
- const idx = pos + match[0].indexOf('[') + 1;
83
- view.dispatch({
84
- changes: {
85
- from: idx,
86
- to: idx + 1,
87
- insert: checked ? 'x' : ' ',
88
- },
89
- // TODO(burdon): Restore cursor position? More useful to move to end of line (can indent).
90
- selection: {
91
- anchor: idx + 3,
92
- },
93
- });
94
- },
95
- ),
96
- });
97
- },
98
- });
99
-
100
- const tasks = ViewPlugin.fromClass(
101
- class {
102
- tasks: DecorationSet;
103
- constructor(view: EditorView) {
104
- this.tasks = taskMatcher.createDeco(view);
105
- }
106
-
107
- update(update: ViewUpdate) {
108
- this.tasks = taskMatcher.updateDeco(update, this.tasks);
109
- }
110
- },
111
- {
112
- decorations: (value) => value.tasks,
113
- provide: (plugin) =>
114
- EditorView.atomicRanges.of((view) => {
115
- return view.plugin(plugin)?.tasks || Decoration.none;
116
- }),
117
- },
118
- );
119
-
120
- return [tasks, styles];
121
- };
@@ -1,61 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { type Extension } from '@codemirror/state';
6
- import { hoverTooltip } from '@codemirror/view';
7
-
8
- import { tooltipContent } from '@dxos/react-ui-theme';
9
-
10
- const markdownLinkRegexp = /\[([^\]]+)]\(([^)]+)\)/;
11
-
12
- export type TooltipOptions = {
13
- onHover: (el: Element, url: string) => void;
14
- regexp?: RegExp;
15
- };
16
-
17
- /**
18
- * https://codemirror.net/examples/tooltip
19
- * https://codemirror.net/docs/ref/#view.hoverTooltip
20
- * https://github.com/codemirror/view/blob/main/src/tooltip.ts
21
- */
22
- export const tooltip = ({ onHover, regexp = markdownLinkRegexp }: TooltipOptions): Extension =>
23
- hoverTooltip((view, pos) => {
24
- const { from, text } = view.state.doc.lineAt(pos);
25
- const p = pos - from;
26
-
27
- let idx = 0;
28
- let match;
29
- do {
30
- match = text.substring(idx).match(regexp);
31
- if (!match) {
32
- match = undefined;
33
- break;
34
- }
35
-
36
- idx = text.indexOf(match[0]);
37
- if (p >= idx && p < idx + match[0].length) {
38
- break;
39
- }
40
-
41
- idx += match[0].length;
42
- } while (true);
43
-
44
- if (!match) {
45
- return null;
46
- }
47
-
48
- const [, , url] = match ?? [];
49
-
50
- return {
51
- pos: idx + from,
52
- end: idx + from + match[0].length,
53
- above: true,
54
- create: () => {
55
- const el = document.createElement('div');
56
- el.className = tooltipContent({}, 'pli-2 plb-1');
57
- onHover(el, url);
58
- return { dom: el, offset: { x: 0, y: 4 } };
59
- },
60
- };
61
- });
@@ -1,14 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import type * as A from '@dxos/automerge/automerge';
6
-
7
- export type IDocHandle<T = any> = {
8
- docSync(): A.Doc<T> | undefined;
9
- change(callback: A.ChangeFn<T>, options?: A.ChangeOptions<T>): void;
10
- changeAt(heads: A.Heads, callback: A.ChangeFn<T>, options?: A.ChangeOptions<T>): string[] | undefined;
11
-
12
- addListener(event: 'change', listener: () => void): void;
13
- removeListener(event: 'change', listener: () => void): void;
14
- };
@@ -1,6 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export { type IDocHandle } from './handle';
6
- export { automergePlugin, type AutomergePlugin } from './plugin';
@@ -1,134 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import {
6
- Annotation,
7
- type EditorState,
8
- type Extension,
9
- Facet,
10
- StateEffect,
11
- StateField,
12
- type Transaction,
13
- type TransactionSpec,
14
- } from '@codemirror/state';
15
- import { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';
16
-
17
- import * as automerge from '@dxos/automerge/automerge';
18
- import { type Heads, type Prop } from '@dxos/automerge/automerge';
19
-
20
- import { type IDocHandle } from './handle';
21
- import { PatchSemaphore } from './semaphore';
22
-
23
- export type Value = {
24
- lastHeads: Heads;
25
- path: Prop[];
26
- unreconciledTransactions: Transaction[];
27
- };
28
-
29
- type UpdateHeads = {
30
- newHeads: Heads;
31
- };
32
-
33
- export const effectType = StateEffect.define<UpdateHeads>({});
34
-
35
- export const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => effectType.of({ newHeads });
36
-
37
- export const getLastHeads = (state: EditorState, field: Field): Heads => state.field(field).lastHeads;
38
-
39
- export const getPath = (state: EditorState, field: Field): Prop[] => state.field(field).path;
40
-
41
- export type Field = StateField<Value>;
42
-
43
- const semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({
44
- combine: (values) => values.at(-1)!, // Take last.
45
- });
46
-
47
- export type AutomergePlugin = {
48
- extension: Extension;
49
- };
50
-
51
- export const automergePlugin = (handle: IDocHandle, path: Prop[]): AutomergePlugin => {
52
- const stateField: StateField<Value> = StateField.define({
53
- create: () => ({
54
- lastHeads: automerge.getHeads(handle.docSync()!),
55
- unreconciledTransactions: [],
56
- path: path.slice(),
57
- }),
58
- update: (value: Value, tr: Transaction) => {
59
- const result: Value = {
60
- lastHeads: value.lastHeads,
61
- unreconciledTransactions: value.unreconciledTransactions.slice(),
62
- path: path.slice(),
63
- };
64
- let clearUnreconciled = false;
65
- for (const effect of tr.effects) {
66
- if (effect.is(effectType)) {
67
- result.lastHeads = effect.value.newHeads;
68
- clearUnreconciled = true;
69
- }
70
- }
71
- if (clearUnreconciled) {
72
- result.unreconciledTransactions = [];
73
- } else {
74
- if (!isReconcileTx(tr)) {
75
- result.unreconciledTransactions.push(tr);
76
- }
77
- }
78
- return result;
79
- },
80
- });
81
-
82
- const semaphore = new PatchSemaphore(stateField);
83
-
84
- const viewPlugin = ViewPlugin.fromClass(
85
- class AutomergeCodemirrorViewPlugin implements PluginValue {
86
- private _view: EditorView;
87
-
88
- constructor(view: EditorView) {
89
- this._view = view;
90
- handle.addListener('change', this._handleChange);
91
- }
92
-
93
- update(update: ViewUpdate) {
94
- if (update.transactions.length > 0 && update.transactions.some((t) => !isReconcileTx(t))) {
95
- queueMicrotask(() => {
96
- this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);
97
- });
98
- }
99
- }
100
-
101
- destroy() {
102
- handle.addListener('change', this._handleChange);
103
- }
104
-
105
- private _handleChange = () => {
106
- this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);
107
- };
108
- },
109
- );
110
-
111
- return {
112
- extension: [stateField, semaphoreFacet.of(semaphore), viewPlugin],
113
- };
114
- };
115
-
116
- export const reconcileAnnotationType = Annotation.define<unknown>();
117
-
118
- export const isReconcileTx = (tr: Transaction): boolean => !!tr.annotation(reconcileAnnotationType);
119
-
120
- export const makeReconcile = (tr: TransactionSpec) => {
121
- if (tr.annotations != null) {
122
- if (tr.annotations instanceof Array) {
123
- tr.annotations = [...tr.annotations, reconcileAnnotationType.of({})];
124
- } else {
125
- tr.annotations = [tr.annotations, reconcileAnnotationType.of({})];
126
- }
127
- } else {
128
- tr.annotations = [reconcileAnnotationType.of({})];
129
- }
130
- // return {
131
- // ...tr,
132
- // annotations: reconcileAnnotationType.of({})
133
- // }
134
- };
@@ -1,6 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export * from './cursors';
6
- export * from './space-provider';
File without changes