@kerebron/extension-autocomplete 0.4.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 (98) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +82 -0
  3. package/assets/autocomplete.css +12 -0
  4. package/esm/editor/src/CoreEditor.d.ts +40 -0
  5. package/esm/editor/src/CoreEditor.d.ts.map +1 -0
  6. package/esm/editor/src/CoreEditor.js +252 -0
  7. package/esm/editor/src/DummyEditorView.d.ts +60 -0
  8. package/esm/editor/src/DummyEditorView.d.ts.map +1 -0
  9. package/esm/editor/src/DummyEditorView.js +277 -0
  10. package/esm/editor/src/Extension.d.ts +31 -0
  11. package/esm/editor/src/Extension.d.ts.map +1 -0
  12. package/esm/editor/src/Extension.js +53 -0
  13. package/esm/editor/src/ExtensionManager.d.ts +32 -0
  14. package/esm/editor/src/ExtensionManager.d.ts.map +1 -0
  15. package/esm/editor/src/ExtensionManager.js +260 -0
  16. package/esm/editor/src/Mark.d.ts +23 -0
  17. package/esm/editor/src/Mark.d.ts.map +1 -0
  18. package/esm/editor/src/Mark.js +51 -0
  19. package/esm/editor/src/Node.d.ts +32 -0
  20. package/esm/editor/src/Node.d.ts.map +1 -0
  21. package/esm/editor/src/Node.js +60 -0
  22. package/esm/editor/src/commands/CommandManager.d.ts +23 -0
  23. package/esm/editor/src/commands/CommandManager.d.ts.map +1 -0
  24. package/esm/editor/src/commands/CommandManager.js +118 -0
  25. package/esm/editor/src/commands/baseCommandFactories.d.ts +3 -0
  26. package/esm/editor/src/commands/baseCommandFactories.d.ts.map +1 -0
  27. package/esm/editor/src/commands/baseCommandFactories.js +836 -0
  28. package/esm/editor/src/commands/createChainableState.d.ts +3 -0
  29. package/esm/editor/src/commands/createChainableState.d.ts.map +1 -0
  30. package/esm/editor/src/commands/createChainableState.js +29 -0
  31. package/esm/editor/src/commands/keyCommandFactories.d.ts +3 -0
  32. package/esm/editor/src/commands/keyCommandFactories.d.ts.map +1 -0
  33. package/esm/editor/src/commands/keyCommandFactories.js +10 -0
  34. package/esm/editor/src/commands/mod.d.ts +7 -0
  35. package/esm/editor/src/commands/mod.d.ts.map +1 -0
  36. package/esm/editor/src/commands/mod.js +76 -0
  37. package/esm/editor/src/commands/replaceCommandFactories.d.ts +3 -0
  38. package/esm/editor/src/commands/replaceCommandFactories.d.ts.map +1 -0
  39. package/esm/editor/src/commands/replaceCommandFactories.js +94 -0
  40. package/esm/editor/src/commands/types.d.ts +18 -0
  41. package/esm/editor/src/commands/types.d.ts.map +1 -0
  42. package/esm/editor/src/commands/types.js +1 -0
  43. package/esm/editor/src/mod.d.ts +9 -0
  44. package/esm/editor/src/mod.d.ts.map +1 -0
  45. package/esm/editor/src/mod.js +8 -0
  46. package/esm/editor/src/nodeToTreeString.d.ts +10 -0
  47. package/esm/editor/src/nodeToTreeString.d.ts.map +1 -0
  48. package/esm/editor/src/nodeToTreeString.js +74 -0
  49. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts +6 -0
  50. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts.map +1 -0
  51. package/esm/editor/src/plugins/TrackSelecionPlugin.js +24 -0
  52. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts +23 -0
  53. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts.map +1 -0
  54. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.js +163 -0
  55. package/esm/editor/src/plugins/keymap/keymap.d.ts +11 -0
  56. package/esm/editor/src/plugins/keymap/keymap.d.ts.map +1 -0
  57. package/esm/editor/src/plugins/keymap/keymap.js +125 -0
  58. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts +4 -0
  59. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts.map +1 -0
  60. package/esm/editor/src/plugins/keymap/w3c-keyname.js +124 -0
  61. package/esm/editor/src/types.d.ts +52 -0
  62. package/esm/editor/src/types.d.ts.map +1 -0
  63. package/esm/editor/src/types.js +1 -0
  64. package/esm/editor/src/ui.d.ts +15 -0
  65. package/esm/editor/src/ui.d.ts.map +1 -0
  66. package/esm/editor/src/ui.js +16 -0
  67. package/esm/editor/src/utilities/SmartOutput.d.ts +41 -0
  68. package/esm/editor/src/utilities/SmartOutput.d.ts.map +1 -0
  69. package/esm/editor/src/utilities/SmartOutput.js +228 -0
  70. package/esm/editor/src/utilities/createNodeFromContent.d.ts +9 -0
  71. package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -0
  72. package/esm/editor/src/utilities/createNodeFromContent.js +32 -0
  73. package/esm/editor/src/utilities/getHtmlAttributes.d.ts +9 -0
  74. package/esm/editor/src/utilities/getHtmlAttributes.d.ts.map +1 -0
  75. package/esm/editor/src/utilities/getHtmlAttributes.js +47 -0
  76. package/esm/extension-autocomplete/src/AutocompletePlugin.d.ts +8 -0
  77. package/esm/extension-autocomplete/src/AutocompletePlugin.d.ts.map +1 -0
  78. package/esm/extension-autocomplete/src/AutocompletePlugin.js +232 -0
  79. package/esm/extension-autocomplete/src/DefaultRenderer.d.ts +17 -0
  80. package/esm/extension-autocomplete/src/DefaultRenderer.d.ts.map +1 -0
  81. package/esm/extension-autocomplete/src/DefaultRenderer.js +137 -0
  82. package/esm/extension-autocomplete/src/ExtensionAutocomplete.d.ts +26 -0
  83. package/esm/extension-autocomplete/src/ExtensionAutocomplete.d.ts.map +1 -0
  84. package/esm/extension-autocomplete/src/ExtensionAutocomplete.js +30 -0
  85. package/esm/extension-autocomplete/src/createDefaultMatcher.d.ts +11 -0
  86. package/esm/extension-autocomplete/src/createDefaultMatcher.d.ts.map +1 -0
  87. package/esm/extension-autocomplete/src/createDefaultMatcher.js +58 -0
  88. package/esm/extension-autocomplete/src/createRegexMatcher.d.ts +4 -0
  89. package/esm/extension-autocomplete/src/createRegexMatcher.d.ts.map +1 -0
  90. package/esm/extension-autocomplete/src/createRegexMatcher.js +50 -0
  91. package/esm/extension-autocomplete/src/mod.d.ts +3 -0
  92. package/esm/extension-autocomplete/src/mod.d.ts.map +1 -0
  93. package/esm/extension-autocomplete/src/mod.js +2 -0
  94. package/esm/extension-autocomplete/src/types.d.ts +60 -0
  95. package/esm/extension-autocomplete/src/types.d.ts.map +1 -0
  96. package/esm/extension-autocomplete/src/types.js +1 -0
  97. package/esm/package.json +3 -0
  98. package/package.json +28 -0
@@ -0,0 +1,277 @@
1
+ // Headless View to be used on Server-side
2
+ // TODO: remove all unnecessary props and methods
3
+ /// An editor view manages the DOM structure that represents an
4
+ /// editable document. Its state and behavior are determined by its
5
+ /// [props](#view.DirectEditorProps).
6
+ export class DummyEditorView {
7
+ /// Create a view. `place` may be a DOM node that the editor should
8
+ /// be appended to, a function that will place it into the document,
9
+ /// or an object whose `mount` property holds the node to use as the
10
+ /// document container. If it is `null`, the editor will not be
11
+ /// added to the document.
12
+ constructor(props) {
13
+ /// @internal
14
+ Object.defineProperty(this, "_props", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: void 0
19
+ });
20
+ Object.defineProperty(this, "directPlugins", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ /// @internal
27
+ Object.defineProperty(this, "nodeViews", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: void 0
32
+ });
33
+ Object.defineProperty(this, "prevDirectPlugins", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: []
38
+ });
39
+ Object.defineProperty(this, "pluginViews", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: []
44
+ });
45
+ /// The view's current [state](#state.EditorState).
46
+ Object.defineProperty(this, "state", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: void 0
51
+ });
52
+ /// Indicates whether the editor is currently [editable](#view.EditorProps.editable).
53
+ Object.defineProperty(this, "editable", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: void 0
58
+ });
59
+ this._props = props;
60
+ this.state = props.state;
61
+ this.directPlugins = props.plugins || [];
62
+ this.directPlugins.forEach(checkStateComponent);
63
+ this.dispatch = this.dispatch.bind(this);
64
+ this.editable = getEditable(this);
65
+ this.nodeViews = buildNodeViews(this);
66
+ // TODO initInput(this)
67
+ this.updatePluginViews();
68
+ }
69
+ /// Holds `true` when a
70
+ /// [composition](https://w3c.github.io/uievents/#events-compositionevents)
71
+ /// is active.
72
+ get composing() {
73
+ return false;
74
+ }
75
+ get dom() {
76
+ return {
77
+ addEventListener() { },
78
+ removeEventListener() { },
79
+ };
80
+ }
81
+ /// The view's current [props](#view.EditorProps).
82
+ get props() {
83
+ if (this._props.state != this.state) {
84
+ let prev = this._props;
85
+ this._props = {};
86
+ for (let name in prev)
87
+ this._props[name] = prev[name];
88
+ this._props.state = this.state;
89
+ }
90
+ return this._props;
91
+ }
92
+ /// Update the view's props. Will immediately cause an update to
93
+ /// the DOM.
94
+ update(props) {
95
+ let prevProps = this._props;
96
+ this._props = props;
97
+ if (props.plugins) {
98
+ props.plugins.forEach(checkStateComponent);
99
+ this.directPlugins = props.plugins;
100
+ }
101
+ this.updateStateInner(props.state, prevProps);
102
+ }
103
+ /// Update the view by updating existing props object with the object
104
+ /// given as argument. Equivalent to `view.update(Object.assign({},
105
+ /// view.props, props))`.
106
+ setProps(props) {
107
+ let updated = {};
108
+ for (let name in this._props) {
109
+ updated[name] = this._props[name];
110
+ }
111
+ updated.state = this.state;
112
+ for (let name in props)
113
+ updated[name] = props[name];
114
+ this.update(updated);
115
+ }
116
+ /// Update the editor's `state` prop, without touching any of the
117
+ /// other props.
118
+ updateState(state) {
119
+ this.updateStateInner(state, this._props);
120
+ }
121
+ updateStateInner(state, prevProps) {
122
+ let prev = this.state, redraw = false, updateSel = false;
123
+ // When stored marks are added, stop composition, so that they can
124
+ // be displayed.
125
+ if (state.storedMarks && this.composing) {
126
+ // TODO clearComposition(this)
127
+ updateSel = true;
128
+ }
129
+ this.state = state;
130
+ let pluginsChanged = prev.plugins != state.plugins ||
131
+ this._props.plugins != prevProps.plugins;
132
+ if (pluginsChanged || this._props.plugins != prevProps.plugins ||
133
+ this._props.nodeViews != prevProps.nodeViews) {
134
+ let nodeViews = buildNodeViews(this);
135
+ if (changedNodeViews(nodeViews, this.nodeViews)) {
136
+ this.nodeViews = nodeViews;
137
+ redraw = true;
138
+ }
139
+ }
140
+ this.editable = getEditable(this);
141
+ let updateDoc = redraw;
142
+ if (updateDoc || !state.selection.eq(prev.selection))
143
+ updateSel = true;
144
+ if (updateSel) {
145
+ // Work around an issue in Chrome, IE, and Edge where changing
146
+ // the DOM around an active selection puts it into a broken
147
+ // state where the thing the user sees differs from the
148
+ // selection reported by the Selection object (#710, #973,
149
+ // #1011, #1013, #1035).
150
+ let forceSelUpdate = false;
151
+ if (updateDoc) {
152
+ // If the node that the selection points into is written to,
153
+ // Chrome sometimes starts misreporting the selection, so this
154
+ // tracks that and forces a selection reset when our update
155
+ // did write to the node.
156
+ // TODO if (this.composing) this.input.compositionNode = findCompositionNode(this)
157
+ }
158
+ }
159
+ this.updatePluginViews(prev);
160
+ }
161
+ /// @internal
162
+ scrollToSelection() {
163
+ }
164
+ destroyPluginViews() {
165
+ let view;
166
+ while (view = this.pluginViews.pop())
167
+ if (view.destroy)
168
+ view.destroy();
169
+ }
170
+ updatePluginViews(prevState) {
171
+ if (!prevState || prevState.plugins != this.state.plugins ||
172
+ this.directPlugins != this.prevDirectPlugins) {
173
+ this.prevDirectPlugins = this.directPlugins;
174
+ this.destroyPluginViews();
175
+ for (let i = 0; i < this.directPlugins.length; i++) {
176
+ let plugin = this.directPlugins[i];
177
+ if (plugin.spec.view) {
178
+ this.pluginViews.push(plugin.spec.view(this));
179
+ }
180
+ }
181
+ for (let i = 0; i < this.state.plugins.length; i++) {
182
+ let plugin = this.state.plugins[i];
183
+ if (plugin.spec.view) {
184
+ this.pluginViews.push(plugin.spec.view(this));
185
+ }
186
+ }
187
+ }
188
+ else {
189
+ for (let i = 0; i < this.pluginViews.length; i++) {
190
+ let pluginView = this.pluginViews[i];
191
+ if (pluginView.update)
192
+ pluginView.update(this, prevState);
193
+ }
194
+ }
195
+ }
196
+ someProp(propName, f) {
197
+ let prop = this._props && this._props[propName], value;
198
+ if (prop != null && (value = f ? f(prop) : prop)) {
199
+ return value;
200
+ }
201
+ for (let i = 0; i < this.directPlugins.length; i++) {
202
+ let prop = this.directPlugins[i].props[propName];
203
+ if (prop != null && (value = f ? f(prop) : prop)) {
204
+ return value;
205
+ }
206
+ }
207
+ let plugins = this.state.plugins;
208
+ if (plugins) {
209
+ for (let i = 0; i < plugins.length; i++) {
210
+ let prop = plugins[i].props[propName];
211
+ if (prop != null && (value = f ? f(prop) : prop))
212
+ return value;
213
+ }
214
+ }
215
+ }
216
+ /// Query whether the view has focus.
217
+ hasFocus() {
218
+ return false;
219
+ }
220
+ /// Focus the editor.
221
+ focus() {
222
+ }
223
+ /// Removes the editor from the DOM and destroys all [node
224
+ /// views](#view.NodeView).
225
+ destroy() {
226
+ this.destroyPluginViews();
227
+ }
228
+ /// This is true when the view has been
229
+ /// [destroyed](#view.DummyEditorView.destroy) (and thus should not be
230
+ /// used anymore).
231
+ get isDestroyed() {
232
+ return false;
233
+ }
234
+ /// Used for testing.
235
+ dispatchEvent(event) {
236
+ }
237
+ }
238
+ DummyEditorView.prototype.dispatch = function (tr) {
239
+ let dispatchTransaction = this.props.dispatchTransaction;
240
+ if (dispatchTransaction)
241
+ dispatchTransaction.call(this, tr);
242
+ else
243
+ this.updateState(this.state.apply(tr));
244
+ };
245
+ function getEditable(view) {
246
+ return !view.someProp('editable', (value) => value(view.state) === false);
247
+ }
248
+ function buildNodeViews(view) {
249
+ let result = Object.create(null);
250
+ function add(obj) {
251
+ for (let prop in obj) {
252
+ if (!Object.prototype.hasOwnProperty.call(result, prop)) {
253
+ result[prop] = obj[prop];
254
+ }
255
+ }
256
+ }
257
+ view.someProp('nodeViews', add);
258
+ view.someProp('markViews', add);
259
+ return result;
260
+ }
261
+ function changedNodeViews(a, b) {
262
+ let nA = 0, nB = 0;
263
+ for (let prop in a) {
264
+ if (a[prop] != b[prop])
265
+ return true;
266
+ nA++;
267
+ }
268
+ for (let _ in b)
269
+ nB++;
270
+ return nA != nB;
271
+ }
272
+ function checkStateComponent(plugin) {
273
+ if (plugin.spec.state || plugin.spec.filterTransaction ||
274
+ plugin.spec.appendTransaction) {
275
+ throw new RangeError('Plugins passed directly to the view must not have a state component');
276
+ }
277
+ }
@@ -0,0 +1,31 @@
1
+ import type { Plugin } from 'prosemirror-state';
2
+ import type { Node, Schema, SchemaSpec } from 'prosemirror-model';
3
+ import { type CoreEditor } from './CoreEditor.js';
4
+ import type { InputRule } from './plugins/input-rules/InputRulesPlugin.js';
5
+ import { CommandFactories, CommandShortcuts } from './commands/mod.js';
6
+ export interface ExtensionConfig {
7
+ [key: string]: any;
8
+ requires: Array<Extension | string>;
9
+ }
10
+ export interface Converter {
11
+ fromDoc(document: Node): Promise<Uint8Array>;
12
+ toDoc(content: Uint8Array): Promise<Node>;
13
+ }
14
+ export declare abstract class Extension {
15
+ protected config: Partial<ExtensionConfig>;
16
+ readonly type = "extension";
17
+ abstract name: string;
18
+ protected editor: CoreEditor;
19
+ readonly conflicts?: Array<string>;
20
+ constructor(config?: Partial<ExtensionConfig>);
21
+ setEditor(editor: CoreEditor): void;
22
+ getEditor(): CoreEditor;
23
+ created(): void;
24
+ getInputRules(): InputRule[];
25
+ getProseMirrorPlugins(): Plugin[];
26
+ getCommandFactories(editor: CoreEditor): Partial<CommandFactories>;
27
+ getKeyboardShortcuts(editor: CoreEditor): Partial<CommandShortcuts>;
28
+ getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter>;
29
+ setupSpec(spec: SchemaSpec): void;
30
+ }
31
+ //# sourceMappingURL=Extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Extension.d.ts","sourceRoot":"","sources":["../../../src/editor/src/Extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,eAAe;IAE9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAEnB,QAAQ,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,8BAAsB,SAAS;IAOV,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC;IAN7D,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,MAAM,EAAG,UAAU,CAAC;IAE9B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEN,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAGlE,SAAS,CAAC,MAAM,EAAE,UAAU;IAI5B,SAAS;IAIT,OAAO;IAGP,aAAa,IAAI,SAAS,EAAE;IAI5B,qBAAqB,IAAI,MAAM,EAAE;IAIjC,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIlE,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAInE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAI5E,SAAS,CAAC,IAAI,EAAE,UAAU;CAE3B"}
@@ -0,0 +1,53 @@
1
+ export class Extension {
2
+ constructor(config = {}) {
3
+ Object.defineProperty(this, "config", {
4
+ enumerable: true,
5
+ configurable: true,
6
+ writable: true,
7
+ value: config
8
+ });
9
+ Object.defineProperty(this, "type", {
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true,
13
+ value: 'extension'
14
+ });
15
+ Object.defineProperty(this, "editor", {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value: void 0
20
+ });
21
+ Object.defineProperty(this, "conflicts", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: void 0
26
+ });
27
+ }
28
+ setEditor(editor) {
29
+ this.editor = editor;
30
+ }
31
+ getEditor() {
32
+ return this.editor;
33
+ }
34
+ created() {
35
+ }
36
+ getInputRules() {
37
+ return [];
38
+ }
39
+ getProseMirrorPlugins() {
40
+ return [];
41
+ }
42
+ getCommandFactories(editor) {
43
+ return {};
44
+ }
45
+ getKeyboardShortcuts(editor) {
46
+ return {};
47
+ }
48
+ getConverters(editor, schema) {
49
+ return {};
50
+ }
51
+ setupSpec(spec) {
52
+ }
53
+ }
@@ -0,0 +1,32 @@
1
+ import { Schema } from 'prosemirror-model';
2
+ import { Plugin } from 'prosemirror-state';
3
+ import { NodeViewConstructor } from 'prosemirror-view';
4
+ import { Converter, Extension } from './Extension.js';
5
+ import { AnyExtension, AnyExtensionOrReq } from './types.js';
6
+ import { CoreEditor } from './CoreEditor.js';
7
+ import { Mark } from './Mark.js';
8
+ import { Node } from './Node.js';
9
+ import { type CommandManager } from './commands/CommandManager.js';
10
+ export declare function findDuplicates(items: any[]): any[];
11
+ export declare function splitExtensions(extensions: Iterable<AnyExtension>): {
12
+ baseExtensions: Extension[];
13
+ nodeExtensions: Node[];
14
+ markExtensions: Mark[];
15
+ };
16
+ export declare class ExtensionManager {
17
+ private editor;
18
+ private commandManager;
19
+ readonly schema: Schema;
20
+ private extensions;
21
+ readonly plugins: Plugin[];
22
+ readonly nodeViews: Record<string, NodeViewConstructor>;
23
+ converters: Record<string, Converter>;
24
+ private debug;
25
+ constructor(extensions: AnyExtensionOrReq[], editor: CoreEditor, commandManager: CommandManager);
26
+ getExtension<T extends Extension>(name: string): T | undefined;
27
+ private initPlugins;
28
+ private setupExtensions;
29
+ getSchemaByResolvedExtensions(editor: CoreEditor): Schema;
30
+ created(): void;
31
+ }
32
+ //# sourceMappingURL=ExtensionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionManager.d.ts","sourceRoot":"","sources":["../../../src/editor/src/ExtensionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAIlD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC;;;;EAgBjE;AAED,qBAAa,gBAAgB;IAazB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IAbxB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,UAAU,CAAgC;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAM;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAM;IAEtD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAM;IAElD,OAAO,CAAC,KAAK,CAAQ;gBAGnB,UAAU,EAAE,iBAAiB,EAAE,EACvB,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,cAAc;IAcxC,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAY9D,OAAO,CAAC,WAAW;IAkHnB,OAAO,CAAC,eAAe;IAwEvB,6BAA6B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAkDzD,OAAO;CAOR"}
@@ -0,0 +1,260 @@
1
+ import { Schema } from 'prosemirror-model';
2
+ import { InputRulesPlugin, } from './plugins/input-rules/InputRulesPlugin.js';
3
+ import { KeymapPlugin } from './plugins/keymap/keymap.js';
4
+ import { firstCommand } from './commands/mod.js';
5
+ import { addAttributesToSchema } from './utilities/getHtmlAttributes.js';
6
+ import { TrackSelecionPlugin } from './plugins/TrackSelecionPlugin.js';
7
+ export function findDuplicates(items) {
8
+ const filtered = items.filter((el, index) => items.indexOf(el) !== index);
9
+ return Array.from(new Set(filtered));
10
+ }
11
+ export function splitExtensions(extensions) {
12
+ const baseExtensions = Array.from(extensions).filter((extension) => extension.type === 'extension');
13
+ const nodeExtensions = Array.from(extensions).filter((extension) => extension.type === 'node');
14
+ const markExtensions = Array.from(extensions).filter((extension) => extension.type === 'mark');
15
+ return {
16
+ baseExtensions,
17
+ nodeExtensions,
18
+ markExtensions,
19
+ };
20
+ }
21
+ export class ExtensionManager {
22
+ constructor(extensions, editor, commandManager) {
23
+ Object.defineProperty(this, "editor", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: editor
28
+ });
29
+ Object.defineProperty(this, "commandManager", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: commandManager
34
+ });
35
+ Object.defineProperty(this, "schema", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: void 0
40
+ });
41
+ Object.defineProperty(this, "extensions", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: new Set()
46
+ });
47
+ Object.defineProperty(this, "plugins", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: []
52
+ });
53
+ Object.defineProperty(this, "nodeViews", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: {}
58
+ });
59
+ Object.defineProperty(this, "converters", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: {}
64
+ });
65
+ Object.defineProperty(this, "debug", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: true
70
+ });
71
+ this.setupExtensions(new Set(extensions));
72
+ this.schema = this.getSchemaByResolvedExtensions(editor);
73
+ const event = new CustomEvent('schema:ready', {
74
+ detail: {
75
+ editor,
76
+ schema: this.schema,
77
+ },
78
+ });
79
+ editor.dispatchEvent(event);
80
+ }
81
+ getExtension(name) {
82
+ const { nodeExtensions, markExtensions, baseExtensions } = splitExtensions(this.extensions);
83
+ for (const extension of baseExtensions) {
84
+ if (extension.name === name) {
85
+ return extension;
86
+ }
87
+ }
88
+ }
89
+ initPlugins() {
90
+ const inputRules = [];
91
+ const keyBindings = new Map();
92
+ const mergeShortcuts = (toInsert, extName) => {
93
+ for (const key in toInsert) {
94
+ if (!toInsert[key]) {
95
+ continue;
96
+ }
97
+ const commandFactory = this.commandManager.commandFactories[toInsert[key]];
98
+ if (!commandFactory) {
99
+ console.warn(`No command constructor: ${toInsert[key]}`);
100
+ continue;
101
+ }
102
+ const command = commandFactory();
103
+ const keyBinding = keyBindings.get(key);
104
+ if (keyBinding) {
105
+ keyBindings.set(key, firstCommand(command, keyBinding));
106
+ }
107
+ else {
108
+ keyBindings.set(key, command);
109
+ }
110
+ }
111
+ };
112
+ let converters = {};
113
+ for (const extension of this.extensions) {
114
+ extension.setEditor(this.editor);
115
+ if (extension.type === 'node') {
116
+ const nodeType = this.schema.nodes[extension.name];
117
+ inputRules.push(...extension.getInputRules(nodeType));
118
+ this.plugins.push(...extension.getProseMirrorPlugins());
119
+ this.commandManager.mergeCommandFactories(extension.getCommandFactories(this.editor, nodeType), extension.name);
120
+ mergeShortcuts(extension.getKeyboardShortcuts(this.editor), extension.name);
121
+ converters = {
122
+ ...converters,
123
+ ...extension.getConverters(this.editor, this.schema),
124
+ };
125
+ const nodeView = extension.getNodeView(this.editor);
126
+ if (nodeView) {
127
+ this.nodeViews[extension.name] = nodeView;
128
+ }
129
+ }
130
+ if (extension.type === 'mark') {
131
+ const markType = this.schema.marks[extension.name];
132
+ inputRules.push(...extension.getInputRules(markType));
133
+ this.commandManager.mergeCommandFactories(extension.getCommandFactories(this.editor, markType), extension.name);
134
+ mergeShortcuts(extension.getKeyboardShortcuts(this.editor), extension.name);
135
+ }
136
+ if (extension.type === 'extension') {
137
+ this.plugins.push(...extension.getProseMirrorPlugins());
138
+ this.commandManager.mergeCommandFactories(extension.getCommandFactories(this.editor), extension.name);
139
+ mergeShortcuts(extension.getKeyboardShortcuts(this.editor), extension.name);
140
+ converters = {
141
+ ...converters,
142
+ ...extension.getConverters(this.editor, this.schema),
143
+ };
144
+ }
145
+ }
146
+ if (this.debug) {
147
+ for (const key in keyBindings) {
148
+ const keyBinding = keyBindings.get(key);
149
+ if (!keyBinding) {
150
+ continue;
151
+ }
152
+ const wrapperCommand = (state, dispatch, view) => {
153
+ console.debug(`Key: ${key}`);
154
+ return true;
155
+ };
156
+ keyBindings.set(key, firstCommand(wrapperCommand, keyBinding));
157
+ }
158
+ }
159
+ this.converters = converters;
160
+ this.plugins.push(new InputRulesPlugin(inputRules));
161
+ this.plugins.push(new KeymapPlugin(Object.fromEntries(keyBindings)));
162
+ this.plugins.push(new TrackSelecionPlugin(this.editor));
163
+ }
164
+ setupExtensions(extensions) {
165
+ const allExtensions = new Map();
166
+ const createMap = (extensions) => {
167
+ for (const extension of extensions) {
168
+ if ('name' in extension) {
169
+ allExtensions.set(extension.name, extension);
170
+ }
171
+ if ('requires' in extension) {
172
+ const childExtensions = Array.from(extension.requires).filter((e) => typeof e !== 'string');
173
+ createMap(new Set(childExtensions));
174
+ }
175
+ }
176
+ };
177
+ createMap(extensions);
178
+ const initialized = new Set();
179
+ const initializeExtension = (extension) => {
180
+ console.info(`Initialize ${extension.type} ${extension.name}`);
181
+ this.extensions.add(extension);
182
+ };
183
+ function recursiveInitializeExtension(extension) {
184
+ if ('name' in extension && initialized.has(extension.name)) {
185
+ return;
186
+ }
187
+ if ('requires' in extension) {
188
+ const requires = extension.requires || [];
189
+ const requireNames = requires.map((e) => typeof e === 'string' ? e : ('name' in e ? e.name : ''));
190
+ for (const require of requireNames) {
191
+ if (!initialized.has(require)) {
192
+ const requiredExtension = allExtensions.get(require);
193
+ if (!requiredExtension) {
194
+ throw new Error(`Required extension for (${'name' in extension ? extension.name : extension}) not found: ${require}`);
195
+ }
196
+ recursiveInitializeExtension(requiredExtension);
197
+ }
198
+ }
199
+ }
200
+ if ('name' in extension) {
201
+ initializeExtension(extension);
202
+ initialized.add(extension.name);
203
+ allExtensions.delete(extension.name);
204
+ }
205
+ }
206
+ for (const extension of allExtensions.values()) {
207
+ recursiveInitializeExtension(extension);
208
+ }
209
+ if (allExtensions.size > 0) {
210
+ throw new Error('Not all extensions initialized: ' +
211
+ Array.from(allExtensions.keys()).join(', '));
212
+ }
213
+ }
214
+ getSchemaByResolvedExtensions(editor) {
215
+ const { nodeExtensions, markExtensions, baseExtensions } = splitExtensions(this.extensions);
216
+ for (const extension of baseExtensions) {
217
+ if (Array.isArray(extension.conflicts)) {
218
+ for (const name of extension.conflicts) {
219
+ if (this.getExtension(name)) {
220
+ throw new Error(`Extension conflict: ${extension.name} vs ${name}`);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ const nodes = {};
226
+ for (const extension of nodeExtensions) {
227
+ nodes[extension.name] = extension.getNodeSpec();
228
+ addAttributesToSchema(nodes[extension.name], extension);
229
+ }
230
+ const marks = {};
231
+ for (const extension of markExtensions) {
232
+ marks[extension.name] = extension.getMarkSpec();
233
+ addAttributesToSchema(marks[extension.name], extension);
234
+ }
235
+ const spec = {
236
+ topNode: this.editor.config.topNode || 'doc',
237
+ nodes,
238
+ marks,
239
+ };
240
+ for (const extension of baseExtensions) {
241
+ if ('setupSpec' in baseExtensions) {
242
+ extension.setupSpec(spec);
243
+ }
244
+ }
245
+ const event = new CustomEvent('schema:spec', {
246
+ detail: {
247
+ editor,
248
+ spec,
249
+ },
250
+ });
251
+ editor.dispatchEvent(event);
252
+ return new Schema(spec);
253
+ }
254
+ created() {
255
+ this.initPlugins();
256
+ for (const extension of this.extensions) {
257
+ extension.created();
258
+ }
259
+ }
260
+ }
@@ -0,0 +1,23 @@
1
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
2
+ import type { InputRule } from './plugins/input-rules/InputRulesPlugin.js';
3
+ import type { CoreEditor } from './CoreEditor.js';
4
+ import type { CommandFactories, CommandShortcuts } from './commands/mod.js';
5
+ import { Attribute } from './types.js';
6
+ export interface MarkConfig {
7
+ [key: string]: any;
8
+ }
9
+ export declare abstract class Mark {
10
+ protected config: Partial<MarkConfig>;
11
+ readonly type = "mark";
12
+ name: string;
13
+ protected editor: CoreEditor;
14
+ readonly attributes: Record<string, Attribute<any>>;
15
+ constructor(config?: Partial<MarkConfig>);
16
+ setEditor(editor: CoreEditor): void;
17
+ created(): void;
18
+ getMarkSpec(): MarkSpec;
19
+ getInputRules(type: MarkType): InputRule[];
20
+ getCommandFactories(editor: CoreEditor, type: MarkType): Partial<CommandFactories>;
21
+ getKeyboardShortcuts(editor: CoreEditor): Partial<CommandShortcuts>;
22
+ }
23
+ //# sourceMappingURL=Mark.d.ts.map