@prosekit/core 0.10.0 → 0.11.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.
- package/dist/{editor-BULC1zqX.d.ts → editor.d.ts} +48 -8
- package/dist/editor.d.ts.map +1 -0
- package/dist/{editor-g-Rqn-ZE.js → editor.js} +19 -60
- package/dist/editor.js.map +1 -0
- package/dist/prosekit-core-test.d.ts +1 -1
- package/dist/prosekit-core-test.js +2 -4
- package/dist/prosekit-core-test.js.map +1 -1
- package/dist/prosekit-core.d.ts +69 -68
- package/dist/prosekit-core.d.ts.map +1 -1
- package/dist/prosekit-core.js +100 -135
- package/dist/prosekit-core.js.map +1 -1
- package/package.json +8 -7
- package/src/commands/add-mark.ts +2 -2
- package/src/commands/expand-mark.ts +1 -1
- package/src/commands/insert-default-block.spec.ts +3 -3
- package/src/commands/insert-default-block.ts +1 -1
- package/src/commands/insert-node.ts +3 -3
- package/src/commands/remove-mark.ts +2 -2
- package/src/commands/remove-node.ts +2 -2
- package/src/commands/select-block.spec.ts +2 -2
- package/src/commands/select-block.ts +1 -1
- package/src/commands/set-block-type.ts +2 -2
- package/src/commands/set-node-attrs-between.spec.ts +2 -2
- package/src/commands/set-node-attrs-between.ts +1 -1
- package/src/commands/set-node-attrs.spec.ts +2 -2
- package/src/commands/set-node-attrs.ts +2 -2
- package/src/commands/toggle-mark.ts +2 -2
- package/src/commands/toggle-node.ts +2 -2
- package/src/commands/toggle-wrap.spec.ts +1 -1
- package/src/commands/toggle-wrap.ts +2 -2
- package/src/commands/unset-block-type.spec.ts +1 -1
- package/src/commands/unset-block-type.ts +1 -1
- package/src/commands/unset-mark.spec.ts +1 -1
- package/src/commands/unset-mark.ts +1 -1
- package/src/commands/wrap.ts +1 -1
- package/src/editor/action.spec.ts +3 -3
- package/src/editor/action.ts +6 -6
- package/src/editor/editor.spec.ts +5 -5
- package/src/editor/editor.ts +13 -13
- package/src/editor/union.spec.ts +7 -7
- package/src/editor/union.ts +4 -4
- package/src/editor/with-priority.ts +3 -3
- package/src/error.ts +8 -1
- package/src/extensions/clipboard-serializer.ts +17 -9
- package/src/extensions/command.ts +19 -19
- package/src/extensions/default-state.spec.ts +3 -3
- package/src/extensions/default-state.ts +5 -5
- package/src/extensions/events/doc-change.ts +2 -2
- package/src/extensions/events/dom-event.spec.ts +3 -3
- package/src/extensions/events/dom-event.ts +7 -7
- package/src/extensions/events/editor-event.ts +6 -6
- package/src/extensions/events/focus.spec.ts +4 -4
- package/src/extensions/events/focus.ts +2 -2
- package/src/extensions/events/plugin-view.ts +4 -4
- package/src/extensions/history.ts +6 -6
- package/src/extensions/keymap-base.spec.ts +5 -5
- package/src/extensions/keymap-base.ts +6 -6
- package/src/extensions/keymap.spec.ts +5 -5
- package/src/extensions/keymap.ts +4 -4
- package/src/extensions/mark-spec.spec.ts +3 -3
- package/src/extensions/mark-spec.ts +8 -8
- package/src/extensions/mark-view-effect.ts +4 -4
- package/src/extensions/mark-view.ts +4 -4
- package/src/extensions/node-spec.spec.ts +5 -5
- package/src/extensions/node-spec.ts +8 -8
- package/src/extensions/node-view-effect.ts +4 -4
- package/src/extensions/node-view.ts +4 -4
- package/src/extensions/plugin.spec.ts +5 -5
- package/src/extensions/plugin.ts +5 -5
- package/src/facets/base-extension.ts +7 -7
- package/src/facets/command.ts +3 -3
- package/src/facets/facet-extension.spec.ts +6 -6
- package/src/facets/facet-extension.ts +12 -8
- package/src/facets/facet-node.spec.ts +3 -3
- package/src/facets/facet-node.ts +24 -14
- package/src/facets/facet.spec.ts +1 -1
- package/src/facets/facet.ts +14 -7
- package/src/facets/root.ts +2 -2
- package/src/facets/schema-spec.ts +2 -2
- package/src/facets/schema.ts +3 -3
- package/src/facets/state.spec.ts +6 -6
- package/src/facets/state.ts +3 -3
- package/src/facets/union-extension.ts +9 -6
- package/src/index.ts +74 -74
- package/src/test/index.ts +1 -1
- package/src/test/test-builder.ts +2 -2
- package/src/test/test-editor.spec.ts +1 -1
- package/src/test/test-editor.ts +6 -6
- package/src/testing/index.ts +10 -10
- package/src/types/extension-mark.ts +1 -1
- package/src/types/extension-node.ts +1 -1
- package/src/types/extension.spec.ts +2 -2
- package/src/types/extension.ts +8 -8
- package/src/types/pick-string-literal.spec.ts +2 -2
- package/src/types/pick-string-literal.ts +1 -1
- package/src/types/pick-sub-type.spec.ts +2 -2
- package/src/types/priority.ts +50 -7
- package/src/types/simplify-deeper.spec.ts +2 -2
- package/src/types/simplify-union.spec.ts +2 -2
- package/src/utils/array-grouping.spec.ts +1 -1
- package/src/utils/assert.ts +1 -1
- package/src/utils/can-use-regex-lookbehind.ts +2 -8
- package/src/utils/clsx.spec.ts +1 -1
- package/src/utils/combine-event-handlers.spec.ts +1 -1
- package/src/utils/editor-content.spec.ts +2 -2
- package/src/utils/editor-content.ts +4 -4
- package/src/utils/find-parent-node-of-type.ts +2 -2
- package/src/utils/find-parent-node.spec.ts +2 -2
- package/src/utils/get-dom-api.ts +1 -1
- package/src/utils/get-mark-type.ts +1 -1
- package/src/utils/get-node-type.ts +1 -1
- package/src/utils/get-node-types.ts +1 -1
- package/src/utils/includes-mark.ts +1 -1
- package/src/utils/is-mark-absent.spec.ts +2 -2
- package/src/utils/is-mark-absent.ts +1 -1
- package/src/utils/is-mark-active.ts +3 -3
- package/src/utils/is-node-active.spec.ts +2 -2
- package/src/utils/is-node-active.ts +3 -3
- package/src/utils/is-subset.spec.ts +1 -1
- package/src/utils/maybe-run.spec.ts +1 -1
- package/src/utils/merge-objects.spec.ts +1 -1
- package/src/utils/merge-objects.ts +1 -1
- package/src/utils/merge-specs.ts +1 -1
- package/src/utils/object-equal.spec.ts +1 -1
- package/src/utils/output-spec.test.ts +1 -1
- package/src/utils/parse.spec.ts +3 -3
- package/src/utils/parse.ts +3 -3
- package/src/utils/remove-undefined-values.spec.ts +1 -1
- package/src/utils/unicode.spec.ts +1 -1
- package/src/utils/with-skip-code-block.ts +1 -1
- package/dist/editor-BULC1zqX.d.ts.map +0 -1
- package/dist/editor-g-Rqn-ZE.js.map +0 -1
|
@@ -161,15 +161,55 @@ type PickStringLiteral<T> = PickSubType<T, string>;
|
|
|
161
161
|
/**
|
|
162
162
|
* ProseKit extension priority.
|
|
163
163
|
*
|
|
164
|
+
* There are five priority levels available:
|
|
165
|
+
*
|
|
166
|
+
* - `Priority.lowest`
|
|
167
|
+
* - `Priority.low`
|
|
168
|
+
* - `Priority.default`
|
|
169
|
+
* - `Priority.high`
|
|
170
|
+
* - `Priority.highest`
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
*
|
|
174
|
+
* ```ts
|
|
175
|
+
* import { withPriority, Priority } from 'prosekit/core'
|
|
176
|
+
* import { myExtension } from './my-extension.js'
|
|
177
|
+
*
|
|
178
|
+
* const myExtensionWithHighPriority = withPriority(myExtension, Priority.high)
|
|
179
|
+
* ```
|
|
180
|
+
*
|
|
164
181
|
* @public
|
|
165
182
|
*/
|
|
166
|
-
declare
|
|
167
|
-
lowest
|
|
168
|
-
low
|
|
169
|
-
default
|
|
170
|
-
high
|
|
171
|
-
highest
|
|
172
|
-
}
|
|
183
|
+
declare const Priority: {
|
|
184
|
+
readonly lowest: 0;
|
|
185
|
+
readonly low: 1;
|
|
186
|
+
readonly default: 2;
|
|
187
|
+
readonly high: 3;
|
|
188
|
+
readonly highest: 4;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* ProseKit extension priority.
|
|
192
|
+
*
|
|
193
|
+
* There are five priority levels available:
|
|
194
|
+
*
|
|
195
|
+
* - `Priority.lowest`
|
|
196
|
+
* - `Priority.low`
|
|
197
|
+
* - `Priority.default`
|
|
198
|
+
* - `Priority.high`
|
|
199
|
+
* - `Priority.highest`
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
*
|
|
203
|
+
* ```ts
|
|
204
|
+
* import { withPriority, Priority } from 'prosekit/core'
|
|
205
|
+
* import { myExtension } from './my-extension.js'
|
|
206
|
+
*
|
|
207
|
+
* const myExtensionWithHighPriority = withPriority(myExtension, Priority.high)
|
|
208
|
+
* ```
|
|
209
|
+
*
|
|
210
|
+
* @public
|
|
211
|
+
*/
|
|
212
|
+
type Priority = typeof Priority[keyof typeof Priority];
|
|
173
213
|
//#endregion
|
|
174
214
|
//#region src/types/simplify-deeper.d.ts
|
|
175
215
|
/**
|
|
@@ -679,4 +719,4 @@ declare class Editor<E extends Extension = any> {
|
|
|
679
719
|
}
|
|
680
720
|
//#endregion
|
|
681
721
|
export { ExtractMarks as A, NodeTyping as B, StepJSON as C, ExtractCommandCreators as D, ExtractCommandActions as E, Union as F, CommandCreator as G, MarkTyping as H, SimplifyUnion as I, NodeAction as J, CommandTyping as K, SimplifyDeeper as L, ExtractNodes as M, ExtractTyping as N, ExtractCommands as O, PlainExtension as P, Priority as R, StateJSON as S, ExtensionTyping as T, ToMarkAction as U, ToNodeAction as V, CommandAction as W, AnyAttrs as X, NodeChild as Y, AttrSpec as Z, nodeFromHTML as _, DOMDocumentOptions as a, NodeJSON as b, JSONParserOptions as c, htmlFromJSON as d, htmlFromNode as f, nodeFromElement as g, jsonFromState as h, createEditor as i, ExtractNodeActions as j, ExtractMarkActions as k, elementFromJSON as l, jsonFromNode as m, EditorInstance as n, DOMParserOptions as o, jsonFromHTML as p, MarkAction as q, EditorOptions as r, DOMSerializerOptions as s, Editor as t, elementFromNode as u, nodeFromJSON as v, Extension as w, SelectionJSON as x, stateFromJSON as y, PickSubType as z };
|
|
682
|
-
//# sourceMappingURL=editor
|
|
722
|
+
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","names":[],"sources":["../src/types/attrs.ts","../src/editor/action.ts","../src/types/extension-command.ts","../src/types/extension-mark.ts","../src/types/extension-node.ts","../src/types/pick-sub-type.ts","../src/types/pick-string-literal.ts","../src/types/priority.ts","../src/types/simplify-deeper.ts","../src/types/simplify-union.ts","../src/types/extension.ts","../src/types/model.ts","../src/types/dom-node.ts","../src/utils/parse.ts","../src/editor/editor.ts"],"mappings":"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"}
|
|
@@ -2,14 +2,18 @@ import { AllSelection, EditorState, NodeSelection, Selection, TextSelection } fr
|
|
|
2
2
|
import { DOMParser, DOMSerializer, Fragment, Mark, ProseMirrorNode, Schema, Slice } from "@prosekit/pm/model";
|
|
3
3
|
import { isDeepEqual, isElementLike, isNotNullish, mapValues } from "@ocavue/utils";
|
|
4
4
|
import { EditorView } from "@prosekit/pm/view";
|
|
5
|
-
|
|
6
5
|
//#region src/error.ts
|
|
7
6
|
/**
|
|
8
7
|
* Base class for all ProseKit errors.
|
|
9
8
|
*
|
|
10
9
|
* @internal
|
|
11
10
|
*/
|
|
12
|
-
var ProseKitError = class extends Error {
|
|
11
|
+
var ProseKitError = class extends Error {
|
|
12
|
+
constructor(message, options) {
|
|
13
|
+
if (typeof message === "string" && !message.startsWith("[")) message = `[prosekit] ${message}`;
|
|
14
|
+
super(message, options);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
13
17
|
/**
|
|
14
18
|
* @internal
|
|
15
19
|
*/
|
|
@@ -26,7 +30,6 @@ var DOMDocumentNotFoundError = class extends ProseKitError {
|
|
|
26
30
|
super("Unable to find browser Document. When not in the browser environment, you need to pass a DOM Document.");
|
|
27
31
|
}
|
|
28
32
|
};
|
|
29
|
-
|
|
30
33
|
//#endregion
|
|
31
34
|
//#region src/utils/get-mark-type.ts
|
|
32
35
|
/**
|
|
@@ -40,7 +43,6 @@ function getMarkType(schema, type) {
|
|
|
40
43
|
}
|
|
41
44
|
return type;
|
|
42
45
|
}
|
|
43
|
-
|
|
44
46
|
//#endregion
|
|
45
47
|
//#region src/utils/assert.ts
|
|
46
48
|
/**
|
|
@@ -49,7 +51,6 @@ function getMarkType(schema, type) {
|
|
|
49
51
|
function assert(condition, message = "Assertion failed") {
|
|
50
52
|
if (!condition) throw new ProseKitError(message);
|
|
51
53
|
}
|
|
52
|
-
|
|
53
54
|
//#endregion
|
|
54
55
|
//#region src/utils/get-node-type.ts
|
|
55
56
|
/**
|
|
@@ -63,7 +64,6 @@ function getNodeType(schema, type) {
|
|
|
63
64
|
}
|
|
64
65
|
return type;
|
|
65
66
|
}
|
|
66
|
-
|
|
67
67
|
//#endregion
|
|
68
68
|
//#region src/utils/type-assertion.ts
|
|
69
69
|
/**
|
|
@@ -128,7 +128,6 @@ function isNodeSelection(value) {
|
|
|
128
128
|
function isAllSelection(value) {
|
|
129
129
|
return value instanceof AllSelection;
|
|
130
130
|
}
|
|
131
|
-
|
|
132
131
|
//#endregion
|
|
133
132
|
//#region src/utils/attrs-match.ts
|
|
134
133
|
function attrsMatch(nodeOrMark, attrs) {
|
|
@@ -136,7 +135,6 @@ function attrsMatch(nodeOrMark, attrs) {
|
|
|
136
135
|
for (const [key, value] of Object.entries(attrs)) if (currentAttrs[key] !== value) return false;
|
|
137
136
|
return true;
|
|
138
137
|
}
|
|
139
|
-
|
|
140
138
|
//#endregion
|
|
141
139
|
//#region src/utils/is-node-active.ts
|
|
142
140
|
/**
|
|
@@ -153,23 +151,6 @@ function isNodeActive(state, type, attrs) {
|
|
|
153
151
|
function checkNode(node, nodeType, attrs) {
|
|
154
152
|
return node.type === nodeType && (!attrs || attrsMatch(node, attrs));
|
|
155
153
|
}
|
|
156
|
-
|
|
157
|
-
//#endregion
|
|
158
|
-
//#region src/types/priority.ts
|
|
159
|
-
/**
|
|
160
|
-
* ProseKit extension priority.
|
|
161
|
-
*
|
|
162
|
-
* @public
|
|
163
|
-
*/
|
|
164
|
-
let Priority = /* @__PURE__ */ function(Priority) {
|
|
165
|
-
Priority[Priority["lowest"] = 0] = "lowest";
|
|
166
|
-
Priority[Priority["low"] = 1] = "low";
|
|
167
|
-
Priority[Priority["default"] = 2] = "default";
|
|
168
|
-
Priority[Priority["high"] = 3] = "high";
|
|
169
|
-
Priority[Priority["highest"] = 4] = "highest";
|
|
170
|
-
return Priority;
|
|
171
|
-
}({});
|
|
172
|
-
|
|
173
154
|
//#endregion
|
|
174
155
|
//#region src/facets/facet.ts
|
|
175
156
|
let facetCount = 0;
|
|
@@ -180,17 +161,17 @@ var Facet = class {
|
|
|
180
161
|
/**
|
|
181
162
|
* @internal
|
|
182
163
|
*/
|
|
183
|
-
constructor(parent, singleton,
|
|
184
|
-
this._reducer = _reducer;
|
|
185
|
-
this._reduce = _reduce;
|
|
164
|
+
constructor(parent, singleton, reducer, reduce) {
|
|
186
165
|
this.index = facetCount++;
|
|
187
|
-
|
|
166
|
+
if (reduce && !reducer) this.reduce = reduce;
|
|
167
|
+
else if (reducer && !reduce) this.reduce = () => reducer;
|
|
168
|
+
else throw new ProseKitError("Incorrect reducer");
|
|
188
169
|
this.parent = parent;
|
|
189
170
|
this.singleton = singleton;
|
|
190
171
|
this.path = parent ? [...parent.path, this.index] : [];
|
|
191
172
|
}
|
|
192
173
|
get reducer() {
|
|
193
|
-
return this.
|
|
174
|
+
return this.reduce();
|
|
194
175
|
}
|
|
195
176
|
};
|
|
196
177
|
/**
|
|
@@ -199,7 +180,6 @@ var Facet = class {
|
|
|
199
180
|
function defineFacet(options) {
|
|
200
181
|
return new Facet(options.parent, options.singleton ?? false, options.reducer, options.reduce);
|
|
201
182
|
}
|
|
202
|
-
|
|
203
183
|
//#endregion
|
|
204
184
|
//#region src/facets/root.ts
|
|
205
185
|
function rootReducer(inputs) {
|
|
@@ -222,7 +202,6 @@ function rootReducer(inputs) {
|
|
|
222
202
|
};
|
|
223
203
|
}
|
|
224
204
|
const rootFacet = new Facet(null, true, rootReducer);
|
|
225
|
-
|
|
226
205
|
//#endregion
|
|
227
206
|
//#region src/facets/schema.ts
|
|
228
207
|
const schemaFacet = defineFacet({
|
|
@@ -234,7 +213,6 @@ const schemaFacet = defineFacet({
|
|
|
234
213
|
parent: rootFacet,
|
|
235
214
|
singleton: true
|
|
236
215
|
});
|
|
237
|
-
|
|
238
216
|
//#endregion
|
|
239
217
|
//#region src/facets/base-extension.ts
|
|
240
218
|
/**
|
|
@@ -254,7 +232,7 @@ var BaseExtension = class {
|
|
|
254
232
|
* @internal
|
|
255
233
|
*/
|
|
256
234
|
getTree(priority) {
|
|
257
|
-
const pri = priority ?? this.priority ??
|
|
235
|
+
const pri = priority ?? this.priority ?? 2;
|
|
258
236
|
return this.trees[pri] ||= this.createTree(pri);
|
|
259
237
|
}
|
|
260
238
|
/**
|
|
@@ -269,7 +247,6 @@ var BaseExtension = class {
|
|
|
269
247
|
return this.findFacetOutput(schemaFacet)?.find(Boolean)?.schema ?? null;
|
|
270
248
|
}
|
|
271
249
|
};
|
|
272
|
-
|
|
273
250
|
//#endregion
|
|
274
251
|
//#region src/utils/array.ts
|
|
275
252
|
function uniqPush(prev, next) {
|
|
@@ -283,7 +260,6 @@ function uniqPush(prev, next) {
|
|
|
283
260
|
function arraySubtract(a, b) {
|
|
284
261
|
return a.filter((x) => !b.includes(x));
|
|
285
262
|
}
|
|
286
|
-
|
|
287
263
|
//#endregion
|
|
288
264
|
//#region src/facets/facet-node.ts
|
|
289
265
|
function zip5(a, b, mapper) {
|
|
@@ -358,11 +334,11 @@ var FacetNode = class {
|
|
|
358
334
|
null,
|
|
359
335
|
null
|
|
360
336
|
]) {
|
|
337
|
+
this.output = null;
|
|
361
338
|
this.facet = facet;
|
|
362
339
|
this.inputs = inputs;
|
|
363
340
|
this.children = children;
|
|
364
341
|
this.reducers = reducers;
|
|
365
|
-
this.output = null;
|
|
366
342
|
}
|
|
367
343
|
calcOutput() {
|
|
368
344
|
const inputs = [
|
|
@@ -387,11 +363,8 @@ var FacetNode = class {
|
|
|
387
363
|
const childOutput = child.getOutput();
|
|
388
364
|
for (let pri = 0; pri < 5; pri++) if (childOutput[pri]) (inputs[pri] ||= []).push(childOutput[pri]);
|
|
389
365
|
}
|
|
390
|
-
if (this.facet.singleton)
|
|
391
|
-
|
|
392
|
-
const input = inputs.filter(isNotNullish).flat();
|
|
393
|
-
output[Priority.default] = reducer(input);
|
|
394
|
-
} else for (let pri = 0; pri < 5; pri++) {
|
|
366
|
+
if (this.facet.singleton) output[2] = (this.reducers[2] ||= this.facet.reducer)(inputs.filter(isNotNullish).flat());
|
|
367
|
+
else for (let pri = 0; pri < 5; pri++) {
|
|
395
368
|
const input = inputs[pri];
|
|
396
369
|
if (input) output[pri] = (this.reducers[pri] ||= this.facet.reducer)(input);
|
|
397
370
|
}
|
|
@@ -403,7 +376,7 @@ var FacetNode = class {
|
|
|
403
376
|
}
|
|
404
377
|
getSingletonOutput() {
|
|
405
378
|
assert(this.facet.singleton);
|
|
406
|
-
return this.getOutput()[
|
|
379
|
+
return this.getOutput()[2];
|
|
407
380
|
}
|
|
408
381
|
getRootOutput() {
|
|
409
382
|
assert(this.isRoot());
|
|
@@ -415,7 +388,6 @@ var FacetNode = class {
|
|
|
415
388
|
return !this.facet.parent;
|
|
416
389
|
}
|
|
417
390
|
};
|
|
418
|
-
|
|
419
391
|
//#endregion
|
|
420
392
|
//#region src/facets/facet-extension.ts
|
|
421
393
|
/**
|
|
@@ -457,7 +429,6 @@ var FacetExtensionImpl = class extends BaseExtension {
|
|
|
457
429
|
function defineFacetPayload(facet, payloads) {
|
|
458
430
|
return new FacetExtensionImpl(facet, payloads);
|
|
459
431
|
}
|
|
460
|
-
|
|
461
432
|
//#endregion
|
|
462
433
|
//#region src/facets/state.ts
|
|
463
434
|
const stateFacet = defineFacet({
|
|
@@ -496,7 +467,6 @@ const stateFacet = defineFacet({
|
|
|
496
467
|
singleton: true,
|
|
497
468
|
parent: rootFacet
|
|
498
469
|
});
|
|
499
|
-
|
|
500
470
|
//#endregion
|
|
501
471
|
//#region src/utils/get-dom-api.ts
|
|
502
472
|
function findGlobalBrowserDocument() {
|
|
@@ -523,7 +493,6 @@ function getBrowserWindow(options) {
|
|
|
523
493
|
if (win) return win;
|
|
524
494
|
throw new DOMDocumentNotFoundError();
|
|
525
495
|
}
|
|
526
|
-
|
|
527
496
|
//#endregion
|
|
528
497
|
//#region src/utils/parse.ts
|
|
529
498
|
/**
|
|
@@ -726,7 +695,6 @@ function jsonFromHTML(html, options) {
|
|
|
726
695
|
function htmlFromJSON(json, options) {
|
|
727
696
|
return htmlFromElement(elementFromJSON(json, options));
|
|
728
697
|
}
|
|
729
|
-
|
|
730
698
|
//#endregion
|
|
731
699
|
//#region src/utils/editor-content.ts
|
|
732
700
|
function getEditorContentJSON(schema, content) {
|
|
@@ -753,7 +721,6 @@ function getEditorSelection(doc, selection) {
|
|
|
753
721
|
if (selection === "end") return Selection.atEnd(doc);
|
|
754
722
|
return Selection.fromJSON(doc, selection);
|
|
755
723
|
}
|
|
756
|
-
|
|
757
724
|
//#endregion
|
|
758
725
|
//#region src/extensions/default-state.ts
|
|
759
726
|
/**
|
|
@@ -774,7 +741,6 @@ function defineDefaultState({ defaultSelection, defaultContent }) {
|
|
|
774
741
|
return config;
|
|
775
742
|
}]);
|
|
776
743
|
}
|
|
777
|
-
|
|
778
744
|
//#endregion
|
|
779
745
|
//#region src/utils/is-subset.ts
|
|
780
746
|
/**
|
|
@@ -785,7 +751,6 @@ function defineDefaultState({ defaultSelection, defaultContent }) {
|
|
|
785
751
|
function isSubset(subset, superset) {
|
|
786
752
|
return Object.keys(subset).every((key) => subset[key] === superset[key]);
|
|
787
753
|
}
|
|
788
|
-
|
|
789
754
|
//#endregion
|
|
790
755
|
//#region src/utils/includes-mark.ts
|
|
791
756
|
function includesMark(marks, markType, attrs) {
|
|
@@ -794,7 +759,6 @@ function includesMark(marks, markType, attrs) {
|
|
|
794
759
|
return mark.type === markType && isSubset(attrs, mark.attrs);
|
|
795
760
|
});
|
|
796
761
|
}
|
|
797
|
-
|
|
798
762
|
//#endregion
|
|
799
763
|
//#region src/utils/is-mark-absent.ts
|
|
800
764
|
/**
|
|
@@ -816,7 +780,6 @@ function isMarkAbsent(node, from, to, markType, attrs) {
|
|
|
816
780
|
});
|
|
817
781
|
return available ? missing : true;
|
|
818
782
|
}
|
|
819
|
-
|
|
820
783
|
//#endregion
|
|
821
784
|
//#region src/utils/is-mark-active.ts
|
|
822
785
|
/**
|
|
@@ -828,7 +791,6 @@ function isMarkActive(state, type, attrs) {
|
|
|
828
791
|
if (empty) return includesMark(state.storedMarks || $from.marks(), markType, attrs);
|
|
829
792
|
else return !isMarkAbsent(state.doc, from, to, markType, attrs);
|
|
830
793
|
}
|
|
831
|
-
|
|
832
794
|
//#endregion
|
|
833
795
|
//#region src/editor/action.ts
|
|
834
796
|
/**
|
|
@@ -896,7 +858,6 @@ function isNodeChild(value) {
|
|
|
896
858
|
if (!value) return false;
|
|
897
859
|
return typeof value === "string" || Array.isArray(value) || isProseMirrorNode(value);
|
|
898
860
|
}
|
|
899
|
-
|
|
900
861
|
//#endregion
|
|
901
862
|
//#region src/facets/union-extension.ts
|
|
902
863
|
var UnionExtensionImpl = class extends BaseExtension {
|
|
@@ -921,7 +882,6 @@ var UnionExtensionImpl = class extends BaseExtension {
|
|
|
921
882
|
return node;
|
|
922
883
|
}
|
|
923
884
|
};
|
|
924
|
-
|
|
925
885
|
//#endregion
|
|
926
886
|
//#region src/editor/union.ts
|
|
927
887
|
function union(...exts) {
|
|
@@ -929,7 +889,6 @@ function union(...exts) {
|
|
|
929
889
|
assert(extensions.length > 0, "At least one extension is required");
|
|
930
890
|
return new UnionExtensionImpl(extensions);
|
|
931
891
|
}
|
|
932
|
-
|
|
933
892
|
//#endregion
|
|
934
893
|
//#region src/editor/editor.ts
|
|
935
894
|
/**
|
|
@@ -1204,7 +1163,7 @@ var Editor = class {
|
|
|
1204
1163
|
return this.instance.marks;
|
|
1205
1164
|
}
|
|
1206
1165
|
};
|
|
1207
|
-
|
|
1208
1166
|
//#endregion
|
|
1209
|
-
export {
|
|
1210
|
-
|
|
1167
|
+
export { isMark as A, ProseKitError as B, defineFacetPayload as C, isNodeActive as D, defineFacet as E, isTextSelection as F, getNodeType as I, assert as L, isProseMirrorNode as M, isSelection as N, isAllSelection as O, isSlice as P, getMarkType as R, stateFacet as S, rootFacet as T, jsonFromState as _, union as a, nodeFromJSON as b, isMarkActive as c, elementFromJSON as d, elementFromNode as f, jsonFromNode as g, jsonFromHTML as h, setupEditorExtension as i, isNodeSelection as j, isFragment as k, isMarkAbsent as l, htmlFromNode as m, EditorInstance as n, createMarkActions as o, htmlFromJSON as p, createEditor as r, createNodeActions as s, Editor as t, defineDefaultState as u, nodeFromElement as v, schemaFacet as w, stateFromJSON as x, nodeFromHTML as y, EditorNotFoundError as z };
|
|
1168
|
+
|
|
1169
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","names":[],"sources":["../src/error.ts","../src/utils/get-mark-type.ts","../src/utils/assert.ts","../src/utils/get-node-type.ts","../src/utils/type-assertion.ts","../src/utils/attrs-match.ts","../src/utils/is-node-active.ts","../src/facets/facet.ts","../src/facets/root.ts","../src/facets/schema.ts","../src/facets/base-extension.ts","../src/utils/array.ts","../src/facets/facet-node.ts","../src/facets/facet-extension.ts","../src/facets/state.ts","../src/utils/get-dom-api.ts","../src/utils/parse.ts","../src/utils/editor-content.ts","../src/extensions/default-state.ts","../src/utils/is-subset.ts","../src/utils/includes-mark.ts","../src/utils/is-mark-absent.ts","../src/utils/is-mark-active.ts","../src/editor/action.ts","../src/facets/union-extension.ts","../src/editor/union.ts","../src/editor/editor.ts"],"sourcesContent":["/**\n * Base class for all ProseKit errors.\n *\n * @internal\n */\nexport class ProseKitError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n if (typeof message === 'string' && !message.startsWith('[')) {\n message = `[prosekit] ${message}`\n }\n super(message, options)\n }\n}\n\n/**\n * @internal\n */\nexport class EditorNotFoundError extends ProseKitError {\n constructor() {\n super(\n 'Unable to find editor. Pass it as an argument or call this function inside a ProseKit component.',\n )\n }\n}\n\n/**\n * @internal\n */\nexport class DOMDocumentNotFoundError extends ProseKitError {\n constructor() {\n super(\n 'Unable to find browser Document. When not in the browser environment, you need to pass a DOM Document.',\n )\n }\n}\n","import type { MarkType, Schema } from '@prosekit/pm/model'\n\nimport { ProseKitError } from '../error.ts'\n\n/**\n * @internal\n */\nexport function getMarkType(schema: Schema, type: string | MarkType): MarkType {\n if (typeof type === 'string') {\n const markType = schema.marks[type]\n if (!markType) {\n throw new ProseKitError(`Cannot find mark type \"${type}\"`)\n }\n return markType\n }\n return type\n}\n","import { ProseKitError } from '../error.ts'\n\n/**\n * @internal\n */\nexport function assert(\n condition: unknown,\n message = 'Assertion failed',\n): asserts condition {\n if (!condition) {\n throw new ProseKitError(message)\n }\n}\n","import type { NodeType, Schema } from '@prosekit/pm/model'\n\nimport { ProseKitError } from '../error.ts'\n\n/**\n * @internal\n */\nexport function getNodeType(schema: Schema, type: string | NodeType): NodeType {\n if (typeof type === 'string') {\n const nodeType = schema.nodes[type]\n if (!nodeType) {\n throw new ProseKitError(`Cannot find ProseMirror node type \"${type}\"`)\n }\n return nodeType\n }\n return type\n}\n","import { Fragment, Mark, ProseMirrorNode, Slice } from '@prosekit/pm/model'\nimport { AllSelection, NodeSelection, Selection, TextSelection } from '@prosekit/pm/state'\n\n/**\n * Checks if the given object is a {@link ProseMirrorNode} instance.\n */\nexport function isProseMirrorNode(value: unknown): value is ProseMirrorNode {\n return value instanceof ProseMirrorNode\n}\n\n/**\n * Checks if the given object is a {@link Mark} instance.\n *\n * @public\n */\nexport function isMark(value: unknown): value is Mark {\n return value instanceof Mark\n}\n\n/**\n * Checks if the given object is a {@link Fragment} instance.\n *\n * @public\n */\nexport function isFragment(value: unknown): value is Fragment {\n return value instanceof Fragment\n}\n\n/**\n * Checks if the given object is a {@link Slice} instance.\n *\n * @public\n */\nexport function isSlice(value: unknown): value is Slice {\n return value instanceof Slice\n}\n\n/**\n * Checks if the given object is a {@link Selection} instance.\n *\n * @public\n */\nexport function isSelection(value: unknown): value is Selection {\n return value instanceof Selection\n}\n\n/**\n * Checks if the given object is a {@link TextSelection} instance.\n *\n * @public\n */\nexport function isTextSelection(value: Selection): value is TextSelection {\n return value instanceof TextSelection\n}\n\n/**\n * Checks if the given object is a {@link NodeSelection} instance.\n *\n * @public\n */\nexport function isNodeSelection(value: Selection): value is NodeSelection {\n return value instanceof NodeSelection\n}\n\n/**\n * Checks if the given object is a {@link AllSelection} instance.\n *\n * @public\n */\nexport function isAllSelection(value: Selection): value is AllSelection {\n return value instanceof AllSelection\n}\n","import type { Attrs, Mark, ProseMirrorNode } from '@prosekit/pm/model'\n\nexport function attrsMatch(\n nodeOrMark: ProseMirrorNode | Mark,\n attrs: Attrs,\n): boolean {\n const currentAttrs = nodeOrMark.attrs\n\n for (const [key, value] of Object.entries(attrs)) {\n if (currentAttrs[key] !== value) {\n return false\n }\n }\n\n return true\n}\n","import type { Attrs, NodeType, ProseMirrorNode } from '@prosekit/pm/model'\nimport type { EditorState } from '@prosekit/pm/state'\n\nimport { attrsMatch } from './attrs-match.ts'\nimport { getNodeType } from './get-node-type.ts'\nimport { isNodeSelection } from './type-assertion.ts'\n\n/**\n * @internal\n */\nexport function isNodeActive(\n state: EditorState,\n type: string | NodeType,\n attrs?: Attrs | null,\n): boolean {\n const { selection, schema } = state\n const $pos = selection.$from\n const nodeType = getNodeType(schema, type)\n\n if (isNodeSelection(selection) && checkNode(selection.node, nodeType, attrs)) {\n return true\n }\n\n for (let depth = $pos.depth; depth >= 0; depth--) {\n if (checkNode($pos.node(depth), nodeType, attrs)) {\n return true\n }\n }\n return false\n}\n\nfunction checkNode(node: ProseMirrorNode, nodeType: NodeType, attrs?: Attrs | null): boolean {\n return node.type === nodeType && (!attrs || attrsMatch(node, attrs))\n}\n","import { ProseKitError } from '../error.ts'\n\nimport type { FacetReducer } from './facet-types.ts'\n\nlet facetCount = 0\n\n/**\n * @internal\n */\nexport class Facet<Input, Output> {\n /**\n * @internal\n */\n readonly index: number = facetCount++\n /**\n * @internal\n */\n readonly parent: Facet<Output, any> | null\n /**\n * @internal\n */\n readonly singleton: boolean\n /**\n * A index path to retrieve the current facet in a tree from the root.\n *\n * @internal\n */\n readonly path: number[]\n\n private reduce: () => FacetReducer<Input, Output>\n\n /**\n * @internal\n */\n constructor(\n parent: Facet<Output, any> | null,\n singleton: boolean,\n reducer?: FacetReducer<Input, Output>,\n reduce?: () => FacetReducer<Input, Output>,\n ) {\n if (reduce && !reducer) {\n this.reduce = reduce\n } else if (reducer && !reduce) {\n this.reduce = () => reducer\n } else {\n throw new ProseKitError('Incorrect reducer')\n }\n\n this.parent = parent\n this.singleton = singleton\n this.path = parent ? [...parent.path, this.index] : []\n }\n\n get reducer(): FacetReducer<Input, Output> {\n return this.reduce()\n }\n}\n\n/**\n * @internal\n */\nexport function defineFacet<Input, Output>(options: {\n /**\n * The parent facet in the tree.\n */\n parent: Facet<Output, any>\n\n /**\n * Set this to true if you only want to keep one facet payload. For example,\n * this facet corresponds to a ProseMirror plugin with a key.\n */\n singleton?: boolean\n\n /**\n * A reducer is a function that accepts an array of input and produce a single\n * output.\n */\n reducer?: FacetReducer<Input, Output>\n /**\n * A callback function that returns a reducer. This is useful if you want to\n * store something in the closure.\n */\n reduce?: () => FacetReducer<Input, Output>\n}): Facet<Input, Output> {\n return new Facet(\n options.parent,\n options.singleton ?? false,\n options.reducer,\n options.reduce,\n )\n}\n","import type { Schema } from '@prosekit/pm/model'\nimport type { EditorStateConfig } from '@prosekit/pm/state'\nimport type { DirectEditorProps } from '@prosekit/pm/view'\n\nimport type { CommandCreators } from '../types/extension-command.ts'\n\nimport { Facet } from './facet.ts'\n\nexport type RootPayload = {\n schema?: Schema | null\n commands?: CommandCreators\n state?: (ctx: { schema: Schema }) => EditorStateConfig\n view?: Omit<DirectEditorProps, 'state'>\n}\n\nexport type RootOutput = {\n schema?: Schema | null\n commands?: CommandCreators\n state?: EditorStateConfig\n view?: Omit<DirectEditorProps, 'state'>\n}\n\nfunction rootReducer(inputs: RootPayload[]): RootOutput {\n let schema: Schema | undefined\n let commands: CommandCreators | undefined\n let stateFunc: ((ctx: { schema: Schema }) => EditorStateConfig) | undefined\n let view: Omit<DirectEditorProps, 'state'> | undefined\n\n for (const input of inputs) {\n schema = input.schema || schema\n commands = input.commands || commands\n stateFunc = input.state || stateFunc\n view = input.view || view\n }\n\n const state = schema && (stateFunc?.({ schema }) ?? { schema })\n\n return { schema, state, commands, view }\n}\n\nexport const rootFacet: Facet<RootPayload, RootOutput> = new Facet<\n RootPayload,\n RootOutput\n>(null, true, rootReducer)\n","import { Schema, type SchemaSpec } from '@prosekit/pm/model'\n\nimport { assert } from '../utils/assert.ts'\n\nimport { defineFacet, type Facet } from './facet.ts'\nimport { rootFacet, type RootPayload } from './root.ts'\n\nexport const schemaFacet: Facet<SchemaSpec, RootPayload> = defineFacet({\n reducer: (specs) => {\n assert(specs.length <= 1)\n const spec = specs[0]\n const schema = spec ? new Schema(spec) : null\n return { schema }\n },\n parent: rootFacet,\n singleton: true,\n})\n","import type { Schema } from '@prosekit/pm/model'\n\nimport type { Extension, ExtensionTyping } from '../types/extension.ts'\nimport type { Priority } from '../types/priority.ts'\n\nimport type { FacetNode } from './facet-node.ts'\nimport type { Tuple5 } from './facet-types.ts'\nimport type { Facet } from './facet.ts'\nimport { schemaFacet } from './schema.ts'\n\n/**\n * @internal\n */\nexport abstract class BaseExtension<T extends ExtensionTyping = ExtensionTyping> implements Extension<T> {\n abstract extension: Extension | Extension[]\n priority?: Priority\n _type?: T\n\n private trees: Tuple5<FacetNode | null> = [null, null, null, null, null]\n\n /**\n * @internal\n */\n abstract createTree(priority: Priority): FacetNode\n\n /**\n * @internal\n */\n getTree(priority?: Priority): FacetNode {\n const pri = priority ?? this.priority ?? (2 satisfies typeof Priority.default)\n return (this.trees[pri] ||= this.createTree(pri))\n }\n\n /**\n * @internal\n */\n findFacetOutput<I, O>(facet: Facet<I, O>): Tuple5<O | null> | null {\n let node: FacetNode | undefined = this.getTree()\n\n for (const index of facet.path) {\n node = node?.children.get(index)\n }\n\n return node?.getOutput() ?? null\n }\n\n get schema(): Schema | null {\n const output = this.findFacetOutput(schemaFacet)\n return output?.find(Boolean)?.schema ?? null\n }\n}\n","export function uniqPush<T>(prev: readonly T[], next: readonly T[]): T[] {\n const result = [...prev]\n\n for (const item of next) {\n if (!result.includes(item)) {\n result.push(item)\n }\n }\n return result\n}\n\n/**\n * @internal\n */\nexport function arraySubtract<T>(a: T[], b: T[]): T[] {\n return a.filter((x) => !b.includes(x))\n}\n","import { isNotNullish } from '@ocavue/utils'\n\nimport type { Priority } from '../types/priority.ts'\nimport { arraySubtract, uniqPush } from '../utils/array.ts'\nimport { assert } from '../utils/assert.ts'\n\nimport type { FacetReducer, Tuple5 } from './facet-types.ts'\nimport type { Facet } from './facet.ts'\nimport type { RootOutput } from './root.ts'\n\nfunction zip5<T>(\n a: Tuple5<T>,\n b: Tuple5<T>,\n mapper: (a: T, b: T) => T,\n): Tuple5<T> {\n return [\n mapper(a[0], b[0]),\n mapper(a[1], b[1]),\n mapper(a[2], b[2]),\n mapper(a[3], b[3]),\n mapper(a[4], b[4]),\n ]\n}\n\nfunction unionInput<T>(a: T[] | null, b: T[] | null): T[] | null {\n if (!a && !b) return null\n return uniqPush(a ?? [], b ?? [])\n}\n\nfunction subtractInput<T>(a: T[] | null, b: T[] | null): T[] | null {\n if (!a) return null\n if (!b) return [...a]\n return arraySubtract(a, b)\n}\n\nfunction unionChildren(\n a: Map<number, FacetNode>,\n b: Map<number, FacetNode>,\n): Map<number, FacetNode> {\n const merged = new Map(a)\n for (const [key, valueB] of b.entries()) {\n const valueA = a.get(key)\n merged.set(key, valueA ? unionFacetNode(valueA, valueB) : valueB)\n }\n return merged\n}\n\nfunction subtractChildren(\n a: Map<number, FacetNode>,\n b: Map<number, FacetNode>,\n): Map<number, FacetNode> {\n const merged = new Map(a)\n for (const [key, valueB] of b.entries()) {\n const valueA = a.get(key)\n if (valueA) {\n merged.set(key, subtractFacetNode(valueA, valueB))\n }\n }\n return merged\n}\n\n/**\n * Takes two facet nodes and returns a new facet node containing inputs and\n * children from both nodes.\n *\n * The reducers of the first facet node will be reused.\n *\n * @internal\n */\nexport function unionFacetNode<I, O>(\n a: FacetNode<I, O>,\n b: FacetNode<I, O>,\n): FacetNode<I, O> {\n assert(a.facet === b.facet)\n return new FacetNode(\n a.facet,\n zip5(a.inputs, b.inputs, unionInput),\n unionChildren(a.children, b.children),\n a.reducers,\n )\n}\n\n/**\n * Takes two facet nodes and returns a new facet node containing inputs and\n * children from the first node but not the second.\n *\n * The reducers of the first facet node will be reused.\n *\n * @internal\n */\nexport function subtractFacetNode<I, O>(\n a: FacetNode<I, O>,\n b: FacetNode<I, O>,\n): FacetNode<I, O> {\n assert(a.facet === b.facet)\n return new FacetNode(\n a.facet,\n zip5(a.inputs, b.inputs, subtractInput),\n subtractChildren(a.children, b.children),\n a.reducers,\n )\n}\n\nexport class FacetNode<I = any, O = any> {\n output: Tuple5<O | null> | null = null\n\n readonly facet: Facet<I, O>\n readonly inputs: Tuple5<I[] | null>\n readonly children: Map<number, FacetNode>\n readonly reducers: Tuple5<FacetReducer<I, O> | null>\n\n constructor(\n facet: Facet<I, O>,\n inputs: Tuple5<I[] | null> = [null, null, null, null, null],\n children: Map<number, FacetNode> = new Map<number, FacetNode>(),\n reducers: Tuple5<FacetReducer<I, O> | null> = [\n null,\n null,\n null,\n null,\n null,\n ],\n ) {\n this.facet = facet\n this.inputs = inputs\n this.children = children\n this.reducers = reducers\n }\n\n private calcOutput(): Tuple5<O | null> {\n const inputs: Tuple5<I[] | null> = [null, null, null, null, null]\n const output: Tuple5<O | null> = [null, null, null, null, null]\n\n for (let pri = 0; pri < 5; pri++) {\n const input = this.inputs[pri]\n if (input) {\n inputs[pri] = [...input]\n }\n }\n\n for (const child of this.children.values()) {\n const childOutput = child.getOutput()\n for (let pri = 0; pri < 5; pri++) {\n if (childOutput[pri]) {\n const input = (inputs[pri] ||= [])\n input.push(childOutput[pri] as I)\n }\n }\n }\n\n if (this.facet.singleton) {\n const reducer = (this.reducers[2 satisfies typeof Priority.default] ||= this.facet.reducer)\n const input: I[] = inputs.filter(isNotNullish).flat()\n output[2 satisfies typeof Priority.default] = reducer(input)\n } else {\n for (let pri = 0; pri < 5; pri++) {\n const input = inputs[pri]\n if (input) {\n const reducer = (this.reducers[pri] ||= this.facet.reducer)\n output[pri] = reducer(input)\n }\n }\n }\n\n return output\n }\n\n getOutput(): Tuple5<O | null> {\n if (!this.output) {\n this.output = this.calcOutput()\n }\n return this.output\n }\n\n getSingletonOutput(): O | null {\n assert(this.facet.singleton)\n return this.getOutput()[2 satisfies typeof Priority.default]\n }\n\n getRootOutput(): RootOutput {\n assert(this.isRoot())\n const output = this.getSingletonOutput()\n assert(output)\n return output\n }\n\n isRoot(): boolean {\n return !this.facet.parent\n }\n}\n","import type { Extension } from '../types/extension.ts'\nimport type { Priority } from '../types/priority.ts'\n\nimport { BaseExtension } from './base-extension.ts'\nimport { FacetNode } from './facet-node.ts'\nimport type { Tuple5 } from './facet-types.ts'\nimport type { Facet } from './facet.ts'\n\n/**\n * @internal\n */\nexport class FacetExtensionImpl<Input, Output> extends BaseExtension {\n declare extension: Extension\n readonly facet: Facet<Input, Output>\n readonly payloads: Input[]\n\n /**\n * @internal\n */\n constructor(\n facet: Facet<Input, Output>,\n payloads: Input[],\n ) {\n super()\n this.facet = facet\n this.payloads = payloads\n }\n\n /**\n * @internal\n */\n createTree(priority: Priority): FacetNode {\n const pri = this.priority ?? priority\n\n const inputs: Tuple5<Input[] | null> = [null, null, null, null, null]\n inputs[pri] = [...this.payloads]\n\n let node: FacetNode = new FacetNode(this.facet, inputs)\n\n while (node.facet.parent) {\n const children = new Map([[node.facet.index, node]])\n node = new FacetNode(node.facet.parent, undefined, children)\n }\n\n return node\n }\n}\n\n/**\n * @internal\n */\nexport function defineFacetPayload<Input>(\n facet: Facet<Input, any>,\n payloads: Input[],\n): Extension {\n return new FacetExtensionImpl(facet, payloads)\n}\n","import type { Mark, ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport type { EditorStateConfig, Plugin, Selection } from '@prosekit/pm/state'\n\nimport { assert } from '../utils/assert.ts'\n\nimport { defineFacet, type Facet } from './facet.ts'\nimport { rootFacet, type RootPayload } from './root.ts'\n\nexport type StatePayload = (ctx: { schema: Schema }) => EditorStateConfig\n\nexport const stateFacet: Facet<StatePayload, RootPayload> = defineFacet({\n reduce: () => {\n // An array of state payloads from lower to higher priority.\n let callbacks: StatePayload[] = []\n\n const state: StatePayload = (ctx) => {\n let doc: ProseMirrorNode | undefined\n let selection: Selection | undefined\n let schema: Schema | undefined = ctx.schema\n const markSet = new Set<Mark>()\n const pluginSet = new Set<Plugin>()\n\n // An array of state payloads from higher to lower priority. This matches the\n // order of plugins required by ProseMirror.\n const reversedCallbacks = [...callbacks].reverse()\n\n for (const callback of reversedCallbacks) {\n const config = callback(ctx)\n\n doc ||= config.doc\n selection ||= config.selection\n schema ||= config.schema\n\n for (const mark of (config.storedMarks ?? [])) {\n markSet.add(mark)\n }\n\n for (const plugin of (config.plugins ?? [])) {\n // `config.plugins` is an array of plugins from higher to lower priority.\n pluginSet.add(plugin)\n }\n }\n\n // If both doc and schema are provided, the schema is not needed.\n if (doc && schema) {\n schema = undefined\n }\n\n assert(\n doc || schema,\n \"Can't create state without a schema nor a document\",\n )\n\n return {\n doc,\n selection,\n schema,\n storedMarks: Array.from(markSet),\n plugins: Array.from(pluginSet),\n }\n }\n\n return function reducer(inputs) {\n callbacks = inputs\n return { state }\n }\n },\n singleton: true,\n parent: rootFacet,\n})\n","import { DOMDocumentNotFoundError } from '../error.ts'\n\nfunction findGlobalBrowserDocument() {\n if (typeof document !== 'undefined') {\n return document\n }\n\n if (typeof globalThis !== 'undefined' && globalThis.document) {\n return globalThis.document\n }\n}\n\nfunction findGlobalBrowserWindow() {\n if (typeof window !== 'undefined') {\n return window\n }\n\n if (typeof globalThis !== 'undefined' && globalThis.window) {\n return globalThis.window\n }\n}\n\nfunction findBrowserDocument(options?: { document?: Document }): Document | undefined {\n return (\n options?.document\n ?? findGlobalBrowserDocument()\n ?? findGlobalBrowserWindow()?.document\n )\n}\n\nfunction findBrowserWindow(options?: {\n document?: Document\n}): (Window & typeof globalThis) | undefined {\n return (\n options?.document?.defaultView\n ?? findGlobalBrowserWindow()\n ?? findBrowserDocument(options)?.defaultView\n ?? undefined\n )\n}\n\nexport function getBrowserDocument(options?: {\n document?: Document\n}): Document {\n const doc = findBrowserDocument(options)\n if (doc) return doc\n throw new DOMDocumentNotFoundError()\n}\n\nexport function getBrowserWindow(options?: {\n document?: Document\n}): Window & typeof globalThis {\n const win = findBrowserWindow(options)\n if (win) return win\n throw new DOMDocumentNotFoundError()\n}\n","import { DOMParser, DOMSerializer, type ParseOptions, type ProseMirrorNode, type Schema } from '@prosekit/pm/model'\nimport { EditorState } from '@prosekit/pm/state'\n\nimport type { DOMNode } from '../types/dom-node.ts'\nimport type { NodeJSON, StateJSON } from '../types/model.ts'\n\nimport { getBrowserDocument, getBrowserWindow } from './get-dom-api.ts'\n\n/** @public */\nexport interface DOMParserOptions extends ParseOptions {\n DOMParser?: typeof DOMParser\n}\n\n/** @public */\nexport interface DOMSerializerOptions {\n DOMSerializer?: { fromSchema: typeof DOMSerializer.fromSchema }\n}\n\n/** @public */\nexport interface DOMDocumentOptions {\n /**\n * The Document object to use for DOM operations. If not provided, defaults to\n * the current browser's document object. Useful for server-side rendering or\n * testing environments.\n */\n document?: Document\n}\n\n/** @public */\nexport interface JSONParserOptions {\n /**\n * The editor schema to use.\n */\n schema: Schema\n}\n\n/////////////// JSON <=> State ///////////////\n\n/**\n * Return a JSON object representing this state.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const state = editor.state\n * const json = jsonFromState(state)\n * ```\n */\nexport function jsonFromState(state: EditorState): StateJSON {\n return state.toJSON() as StateJSON\n}\n\n/**\n * Parse a JSON object to a ProseMirror state.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const json = { state: { type: 'doc', content: [{ type: 'paragraph' }], selection: { type: 'text', from: 1, to: 1 } } }\n * const state = stateFromJSON(json, { schema: editor.schema })\n * ```\n */\nexport function stateFromJSON(\n json: StateJSON,\n options: JSONParserOptions,\n): EditorState {\n return EditorState.fromJSON({ schema: options.schema }, json)\n}\n\n/////////////// JSON <=> Node ///////////////\n\n/**\n * Return a JSON object representing this node.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const node = editor.state.doc\n * const json = jsonFromNode(node)\n * ```\n */\nexport function jsonFromNode(node: ProseMirrorNode): NodeJSON {\n return node.toJSON() as NodeJSON\n}\n\n/**\n * Parse a JSON object to a ProseMirror node.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const json = { type: 'doc', content: [{ type: 'paragraph' }] }\n * const node = nodeFromJSON(json, { schema: editor.schema })\n * ```\n */\nexport function nodeFromJSON(\n json: NodeJSON,\n options: JSONParserOptions,\n): ProseMirrorNode {\n return options.schema.nodeFromJSON(json)\n}\n\n/////////////// Node <=> Element ///////////////\n\n/**\n * Parse a DOM node to a ProseMirror node.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const element = document.getElementById('content')\n * const node = nodeFromElement(element, { schema: editor.schema })\n * ```\n */\nexport function nodeFromElement(\n element: DOMNode,\n options: DOMParserOptions & JSONParserOptions,\n): ProseMirrorNode {\n const { DOMParser: CustomDOMParser, schema, ...parseOptions } = options\n return (CustomDOMParser || DOMParser)\n .fromSchema(schema)\n .parse(element, parseOptions)\n}\n\n/**\n * Serialize a ProseMirror node to an HTML element.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const node = editor.state.doc\n * const element = elementFromNode(node)\n * ```\n */\nexport function elementFromNode(\n node: ProseMirrorNode,\n options?: DOMSerializerOptions & DOMDocumentOptions,\n): HTMLElement {\n const Serializer = options?.DOMSerializer || DOMSerializer\n const document = getBrowserDocument(options)\n const schema = node.type.schema\n const serializer = Serializer.fromSchema(schema)\n\n if (schema.topNodeType !== node.type) {\n return serializer.serializeNode(node, { document }) as HTMLElement\n } else {\n return serializer.serializeFragment(\n node.content,\n { document },\n document.createElement('div'),\n ) as HTMLElement\n }\n}\n\n/////////////// Element <=> HTML ///////////////\n\n/**\n * Parse an HTML string to an HTML element.\n *\n * @internal\n */\nexport function elementFromHTML(\n html: string,\n options?: DOMDocumentOptions,\n): HTMLElement {\n const win = getBrowserWindow(options)\n const parser = new win.DOMParser()\n return parser.parseFromString(`<body><div>${html}</div></body>`, 'text/html')\n .body.firstElementChild as HTMLElement\n}\n\n/**\n * @internal\n */\nfunction htmlFromElement(element: HTMLElement): string {\n return element.outerHTML\n}\n\n/////////////// Node <=> HTML ///////////////\n\n/**\n * Parse an HTML string to a ProseMirror node.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const html = '<p>Hello, world!</p>'\n * const node = nodeFromHTML(html, { schema: editor.schema })\n * ```\n */\nexport function nodeFromHTML(\n html: string,\n options: DOMParserOptions & JSONParserOptions & DOMDocumentOptions,\n): ProseMirrorNode {\n return nodeFromElement(elementFromHTML(html, options), options)\n}\n\n/**\n * Serialize a ProseMirror node to an HTML string\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const node = document.getElementById('content')\n * const html = htmlFromNode(node)\n * ```\n */\nexport function htmlFromNode(\n node: ProseMirrorNode,\n options?: DOMSerializerOptions & DOMDocumentOptions,\n): string {\n return elementFromNode(node, options).outerHTML\n}\n\n/////////////// JSON <=> Element ///////////////\n\n/**\n * Serialize an HTML element to a ProseMirror document JSON object.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const element = document.getElementById('content')\n * const json = jsonFromElement(element, { schema: editor.schema })\n * ```\n */\nexport function jsonFromElement(\n element: DOMNode,\n options: DOMParserOptions & JSONParserOptions,\n): NodeJSON {\n return jsonFromNode(nodeFromElement(element, options))\n}\n\n/**\n * Parse a ProseMirror document JSON object to an HTML element.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const json = { type: 'doc', content: [{ type: 'paragraph' }] }\n * const element = elementFromJSON(json, { schema: editor.schema })\n * ```\n */\nexport function elementFromJSON(\n json: NodeJSON,\n options: JSONParserOptions & DOMSerializerOptions & DOMDocumentOptions,\n): HTMLElement {\n return elementFromNode(nodeFromJSON(json, options), options)\n}\n\n/////////////// JSON <=> HTML ///////////////\n\n/**\n * Parse an HTML string to a ProseMirror document JSON object.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const html = '<p>Hello, world!</p>'\n * const json = jsonFromHTML(html, { schema: editor.schema })\n * ```\n */\nexport function jsonFromHTML(\n html: string,\n options: DOMDocumentOptions & DOMParserOptions & JSONParserOptions,\n): NodeJSON {\n return jsonFromElement(elementFromHTML(html, options), options)\n}\n\n/**\n * Parse a ProseMirror document JSON object to an HTML string.\n *\n * @public\n *\n * @example\n *\n * ```ts\n * const json = { type: 'doc', content: [{ type: 'paragraph' }] }\n * const html = htmlFromJSON(json, { schema: editor.schema })\n * ```\n */\nexport function htmlFromJSON(\n json: NodeJSON,\n options: JSONParserOptions & DOMSerializerOptions & DOMDocumentOptions,\n): string {\n return htmlFromElement(elementFromJSON(json, options))\n}\n","import { isElementLike } from '@ocavue/utils'\nimport type { ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport { Selection } from '@prosekit/pm/state'\n\nimport type { NodeJSON, SelectionJSON } from '../types/model.ts'\n\nimport { assert } from './assert.ts'\nimport { jsonFromElement, jsonFromHTML } from './parse.ts'\nimport { isProseMirrorNode, isSelection } from './type-assertion.ts'\n\nexport function getEditorContentJSON(\n schema: Schema,\n content: NodeJSON | string | Element,\n): NodeJSON {\n if (typeof content === 'string') {\n return jsonFromHTML(content, { schema })\n } else if (isElementLike(content)) {\n return jsonFromElement(content, { schema })\n } else {\n return content\n }\n}\n\nfunction getEditorContentNode(\n schema: Schema,\n content: NodeJSON | string | Element | ProseMirrorNode,\n): ProseMirrorNode {\n if (isProseMirrorNode(content)) {\n return content\n }\n return schema.nodeFromJSON(getEditorContentJSON(schema, content))\n}\n\nexport function getEditorContentDoc(\n schema: Schema,\n content: NodeJSON | string | Element | ProseMirrorNode,\n): ProseMirrorNode {\n const doc = getEditorContentNode(schema, content)\n assert(\n doc.type.schema === schema,\n 'Document schema does not match editor schema',\n )\n assert(\n doc.type === schema.topNodeType,\n `Document type does not match editor top node type. Expected ${schema.topNodeType.name}, got ${doc.type.name}`,\n )\n return doc\n}\n\nexport function getEditorSelection(\n doc: ProseMirrorNode,\n selection: SelectionJSON | Selection | 'start' | 'end',\n): Selection {\n if (isSelection(selection)) {\n assert(selection.$head.doc === doc, 'Selection and doc do not match')\n return selection\n }\n if (selection === 'start') {\n return Selection.atStart(doc)\n }\n if (selection === 'end') {\n return Selection.atEnd(doc)\n }\n return Selection.fromJSON(doc, selection)\n}\n","import { Selection, type EditorStateConfig } from '@prosekit/pm/state'\n\nimport { defineFacetPayload } from '../facets/facet-extension.ts'\nimport { stateFacet } from '../facets/state.ts'\nimport type { PlainExtension } from '../types/extension.ts'\nimport type { NodeJSON, SelectionJSON } from '../types/model.ts'\nimport { getEditorContentJSON } from '../utils/editor-content.ts'\n\n/**\n * @public\n */\nexport interface DefaultStateOptions {\n /**\n * The starting document to use when creating the editor. It can be a\n * ProseMirror node JSON object, an HTML string, or a DOM element instance.\n */\n defaultContent?: NodeJSON | string | Element\n\n /**\n * A JSON object representing the starting selection to use when creating the\n * editor. It's only used when `defaultContent` is also provided.\n */\n defaultSelection?: SelectionJSON\n}\n\n/**\n * Define a default state for the editor.\n *\n * @param options\n *\n * @public\n */\nexport function defineDefaultState({\n defaultSelection,\n defaultContent,\n}: DefaultStateOptions): PlainExtension {\n return defineFacetPayload(stateFacet, [\n ({ schema }) => {\n const config: EditorStateConfig = {}\n if (defaultContent) {\n const json = getEditorContentJSON(schema, defaultContent)\n config.doc = schema.nodeFromJSON(json)\n if (defaultSelection) {\n config.selection = Selection.fromJSON(config.doc, defaultSelection)\n }\n }\n return config\n },\n ]) as PlainExtension\n}\n","/**\n * Check if `subset` is a subset of `superset`.\n *\n * @internal\n */\nexport function isSubset(\n subset: Record<string, unknown>,\n superset: Record<string, unknown>,\n): boolean {\n return Object.keys(subset).every((key) => subset[key] === superset[key])\n}\n","import type { Attrs, Mark, MarkType } from '@prosekit/pm/model'\n\nimport { isSubset } from './is-subset.ts'\n\nexport function includesMark(\n marks: readonly Mark[],\n markType: MarkType,\n attrs?: Attrs | null,\n): boolean {\n attrs = attrs || {}\n return marks.some((mark) => {\n return mark.type === markType && isSubset(attrs, mark.attrs)\n })\n}\n","import type { Attrs, MarkType, ProseMirrorNode } from '@prosekit/pm/model'\n\nimport { includesMark } from './includes-mark.ts'\n\n/**\n * Returns true if the given mark is missing in some part of the range.\n * Returns false if the entire range has the given mark.\n * Returns true if the mark is not allowed in the range.\n *\n * @internal\n */\nexport function isMarkAbsent(\n node: ProseMirrorNode,\n from: number,\n to: number,\n markType: MarkType,\n attrs?: Attrs | null,\n): boolean {\n let missing = false\n let available = false\n\n node.nodesBetween(from, to, (node, pos, parent) => {\n if (missing) {\n return false\n }\n\n const allowed = parent?.type.allowsMarkType(markType)\n && !node.marks.some((m) => m.type !== markType && m.type.excludes(markType))\n\n if (allowed) {\n available = true\n if (!includesMark(node.marks, markType, attrs)) {\n missing = true\n }\n }\n })\n return available ? missing : true\n}\n","import type { Attrs, MarkType } from '@prosekit/pm/model'\nimport type { EditorState } from '@prosekit/pm/state'\n\nimport { getMarkType } from './get-mark-type.ts'\nimport { includesMark } from './includes-mark.ts'\nimport { isMarkAbsent } from './is-mark-absent.ts'\n\n/**\n * @internal\n */\nexport function isMarkActive(\n state: EditorState,\n type: string | MarkType,\n attrs?: Attrs | null,\n): boolean {\n const { from, $from, to, empty } = state.selection\n const markType = getMarkType(state.schema, type)\n if (empty) {\n const marks = state.storedMarks || $from.marks()\n return includesMark(marks, markType, attrs)\n } else {\n return !isMarkAbsent(state.doc, from, to, markType, attrs)\n }\n}\n","import { mapValues } from '@ocavue/utils'\nimport type { Attrs, Mark, MarkType, NodeType, ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport type { EditorState } from '@prosekit/pm/state'\n\nimport { ProseKitError } from '../error.ts'\nimport type { AnyAttrs } from '../types/attrs.ts'\nimport { assert } from '../utils/assert.ts'\nimport { isMarkActive } from '../utils/is-mark-active.ts'\nimport { isNodeActive } from '../utils/is-node-active.ts'\nimport { isProseMirrorNode } from '../utils/type-assertion.ts'\n\n/**\n * Available children parameters for {@link NodeAction} and {@link MarkAction}.\n *\n * @public\n */\nexport type NodeChild = ProseMirrorNode | string | NodeChild[]\n\n/**\n * A function for creating a node with optional attributes and any number of\n * children.\n *\n * It also has a `isActive` method for checking if the node is active in the\n * current editor selection.\n *\n * @public\n */\nexport interface NodeAction<Attrs extends AnyAttrs = AnyAttrs> {\n /**\n * Creates a node with attributes and any number of children.\n */\n (attrs: Attrs | null, ...children: NodeChild[]): ProseMirrorNode\n\n /**\n * Creates a node with any number of children.\n */\n (...children: NodeChild[]): ProseMirrorNode\n\n /**\n * Checks if the node is active in the current editor selection. If the\n * optional `attrs` parameter is provided, it will check if the node is active\n * with the given attributes.\n */\n isActive: (attrs?: Attrs) => boolean\n}\n\n/**\n * A function for applying a mark with optional attributes and any number of\n * children.\n *\n * It also has a `isActive` method for checking if the mark is active in the\n * current editor selection.\n *\n * @public\n */\nexport interface MarkAction<Attrs extends AnyAttrs = AnyAttrs> {\n /**\n * Applies a mark with attributes and any number of children.\n */\n (attrs: Attrs | null, ...children: NodeChild[]): ProseMirrorNode[]\n\n /**\n * Applies a mark with any number of children.\n */\n (...children: NodeChild[]): ProseMirrorNode[]\n\n /**\n * Checks if the mark is active in the current editor selection. If the\n * optional `attrs` parameter is provided, it will check if the mark is active\n * with the given attributes.\n */\n isActive: (attrs?: Attrs) => boolean\n}\n\n/**\n * @internal\n */\nexport function createNodeActions(\n schema: Schema,\n getState: GetStateFunction,\n createNode: CreateNodeFunction = defaultCreateNode,\n): Record<string, NodeAction> {\n return mapValues(schema.nodes, (type) => createNodeAction(type, getState, createNode))\n}\n\nfunction createNodeAction(\n type: NodeType,\n getState: GetStateFunction,\n createNode: CreateNodeFunction,\n): NodeAction {\n const action = (\n ...args: [Attrs | NodeChild | null | undefined, ...NodeChild[]]\n ) => buildNode(type, args, createNode)\n action.isActive = (attrs?: Attrs) => {\n const state = getState()\n return state ? isNodeActive(state, type, attrs) : false\n }\n return action\n}\n\n/**\n * @internal\n */\nexport function createMarkActions(\n schema: Schema,\n getState: GetStateFunction,\n applyMark: ApplyMarkFunction = defaultApplyMark,\n): Record<string, MarkAction> {\n return mapValues(schema.marks, (type) => createMarkAction(type, getState, applyMark))\n}\n\nfunction createMarkAction(\n type: MarkType,\n getState: GetStateFunction,\n applyMark: ApplyMarkFunction,\n): MarkAction {\n const action = (\n ...args: [Attrs | NodeChild | null | undefined, ...NodeChild[]]\n ) => buildMark(type, args, applyMark)\n action.isActive = (attrs?: Attrs) => {\n const state = getState()\n return state ? isMarkActive(state, type, attrs) : false\n }\n return action\n}\n\nfunction buildMark(\n type: MarkType,\n args: [Attrs | NodeChild | null | undefined, ...NodeChild[]],\n applyMark: ApplyMarkFunction,\n): ProseMirrorNode[] {\n const [attrs, children] = normalizeArgs(args)\n const mark = type.create(attrs)\n return applyMark(mark, flattenChildren(type.schema, children))\n}\n\n/**\n * @internal\n */\nexport type ApplyMarkFunction = (\n mark: Mark,\n children: ProseMirrorNode[],\n) => ProseMirrorNode[]\n\nconst defaultApplyMark: ApplyMarkFunction = (\n mark: Mark,\n children: ProseMirrorNode[],\n): ProseMirrorNode[] => {\n return children.map((node) => node.mark(mark.addToSet(node.marks)))\n}\n\nfunction buildNode(\n type: NodeType,\n args: [Attrs | NodeChild | null | undefined, ...NodeChild[]],\n createNode: CreateNodeFunction,\n): ProseMirrorNode {\n const [attrs, children] = normalizeArgs(args)\n return createNode(type, attrs, flattenChildren(type.schema, children))\n}\n\n/**\n * @internal\n */\nexport type CreateNodeFunction = (\n type: NodeType,\n attrs: Attrs | null,\n children: ProseMirrorNode[],\n) => ProseMirrorNode\n\ntype GetStateFunction = () => EditorState | null | undefined\n\nconst defaultCreateNode: CreateNodeFunction = (\n type: NodeType,\n attrs: Attrs | null,\n children: ProseMirrorNode[],\n) => {\n const node = type.createAndFill(attrs, children)\n assert(node, `Failed to create node ${type.name}`)\n return node\n}\n\nfunction flattenChildren(\n schema: Schema,\n children: NodeChild[],\n): Array<ProseMirrorNode> {\n const nodes: Array<ProseMirrorNode> = []\n\n for (const child of children) {\n if (typeof child === 'string') {\n if (child) {\n nodes.push(schema.text(child, null))\n }\n } else if (Array.isArray(child)) {\n nodes.push(...flattenChildren(schema, child))\n } else if (isProseMirrorNode(child)) {\n nodes.push(child)\n } else {\n throw new ProseKitError(`Invalid node child: ${typeof child}`)\n }\n }\n\n return nodes\n}\n\nfunction normalizeArgs(\n args: [Attrs | NodeChild | null | undefined, ...NodeChild[]],\n): [Attrs | null, NodeChild[]] {\n const [attrs, ...children] = args\n if (isNodeChild(attrs)) {\n children.unshift(attrs)\n return [null, children]\n } else if (typeof attrs === 'object') {\n return [attrs, children]\n } else {\n return [null, children]\n }\n}\n\nfunction isNodeChild(\n value: Attrs | NodeChild | null | undefined,\n): value is NodeChild {\n if (!value) {\n return false\n }\n\n return (\n typeof value === 'string'\n || Array.isArray(value)\n || isProseMirrorNode(value)\n )\n}\n","import type { Extension, ExtensionTyping } from '../types/extension.ts'\nimport type { Priority } from '../types/priority.ts'\nimport { assert } from '../utils/assert.ts'\n\nimport { BaseExtension } from './base-extension.ts'\nimport { unionFacetNode, type FacetNode } from './facet-node.ts'\n\nexport class UnionExtensionImpl<T extends ExtensionTyping = ExtensionTyping> extends BaseExtension<T> implements Extension<T> {\n readonly extension: BaseExtension[]\n\n /**\n * @internal\n */\n constructor(extension: BaseExtension[] = []) {\n super()\n this.extension = extension\n }\n\n /**\n * @internal\n */\n createTree(priority: Priority): FacetNode {\n const pri = this.priority ?? priority\n\n const extensions = [...this.extension]\n extensions.sort((a, b) => (a.priority ?? pri) - (b.priority ?? pri))\n\n const children: FacetNode[] = extensions.map((ext) => ext.getTree(pri))\n\n assert(children.length > 0)\n\n let node = children[0]\n for (let i = 1; i < children.length; i++) {\n node = unionFacetNode(node, children[i])\n }\n return node\n }\n}\n","import type { BaseExtension } from '../facets/base-extension.ts'\nimport { UnionExtensionImpl } from '../facets/union-extension.ts'\nimport type { Extension, Union } from '../types/extension.ts'\nimport { assert } from '../utils/assert.ts'\n\n/**\n * Merges multiple extensions into one. You can pass multiple extensions as\n * arguments or a single array containing multiple extensions.\n *\n * @throws If no extensions are provided.\n *\n * @example\n *\n * ```ts\n * function defineFancyNodes() {\n * return union(\n * defineFancyParagraph(),\n * defineFancyHeading(),\n * )\n * }\n * ```\n *\n * @example\n *\n * ```ts\n * function defineFancyNodes() {\n * return union([\n * defineFancyParagraph(),\n * defineFancyHeading(),\n * ])\n * }\n * ```\n *\n * @public\n */\nfunction union<const E extends readonly Extension[]>(...exts: E): Union<E>\nfunction union<const E extends readonly Extension[]>(exts: E): Union<E>\nfunction union(...exts: Array<Extension | Extension[]>): Extension {\n const extensions: Extension[] = exts.flat()\n assert(extensions.length > 0, 'At least one extension is required')\n return new UnionExtensionImpl(extensions as BaseExtension[]) as Extension\n}\n\nexport { union }\n","import { isDeepEqual } from '@ocavue/utils'\nimport type { ProseMirrorNode, Schema } from '@prosekit/pm/model'\nimport { EditorState, type Command, type Plugin, type Selection, type Transaction } from '@prosekit/pm/state'\nimport { EditorView, type DirectEditorProps, type EditorProps } from '@prosekit/pm/view'\n\nimport { ProseKitError } from '../error.ts'\nimport { defineDefaultState } from '../extensions/default-state.ts'\nimport type { BaseExtension } from '../facets/base-extension.ts'\nimport { subtractFacetNode, unionFacetNode, type FacetNode } from '../facets/facet-node.ts'\nimport type { CommandAction, CommandCreator } from '../types/extension-command.ts'\nimport type {\n Extension,\n ExtractCommandActions,\n ExtractMarkActions,\n ExtractMarkNames,\n ExtractNodeActions,\n ExtractNodeNames,\n} from '../types/extension.ts'\nimport type { NodeJSON, SelectionJSON } from '../types/model.ts'\nimport { assert } from '../utils/assert.ts'\nimport { getEditorContentDoc, getEditorSelection } from '../utils/editor-content.ts'\nimport { htmlFromNode, jsonFromNode, type DOMDocumentOptions } from '../utils/parse.ts'\n\nimport { createMarkActions, createNodeActions, type MarkAction, type NodeAction } from './action.ts'\nimport { union } from './union.ts'\n\n/**\n * @public\n */\nexport interface EditorOptions<E extends Extension> {\n /**\n * The extension to use when creating the editor.\n */\n extension: E\n\n /**\n * The starting document to use when creating the editor. It can be a\n * ProseMirror node JSON object, an HTML string, or a DOM element instance.\n */\n defaultContent?: NodeJSON | string | Element\n\n /**\n * A JSON object representing the starting selection to use when creating the\n * editor. It's only used when `defaultContent` is also provided.\n */\n defaultSelection?: SelectionJSON\n}\n\n/**\n * @public\n */\nexport interface getDocHTMLOptions extends DOMDocumentOptions {}\n\n/**\n * @internal\n */\nexport function setupEditorExtension<E extends Extension>(\n options: EditorOptions<E>,\n): E {\n if (options.defaultContent) {\n return union(\n options.extension,\n defineDefaultState(options),\n ) as Extension as E\n }\n return options.extension\n}\n\n/**\n * @public\n */\nexport function createEditor<E extends Extension>(\n options: EditorOptions<E>,\n): Editor<E> {\n const extension = setupEditorExtension(options)\n const instance = new EditorInstance(extension)\n return new Editor(instance)\n}\n\n/**\n * An internal class to make TypeScript generic type easier to use.\n *\n * @internal\n */\nexport class EditorInstance {\n view: EditorView | null = null\n schema: Schema\n nodes: Record<string, NodeAction>\n marks: Record<string, MarkAction>\n commands: Record<string, CommandAction> = {}\n\n private tree: FacetNode\n private directEditorProps: DirectEditorProps\n private afterMounted: Array<VoidFunction> = []\n\n constructor(extension: Extension) {\n this.tree = (extension as BaseExtension).getTree()\n\n const payload = this.tree.getRootOutput()\n const schema = payload.schema\n const stateConfig = payload.state\n\n assert(schema && stateConfig, 'Schema must be defined')\n\n const state = EditorState.create(stateConfig)\n\n if (payload.commands) {\n for (const [name, commandCreator] of Object.entries(payload.commands)) {\n this.defineCommand(name, commandCreator)\n }\n }\n\n this.nodes = createNodeActions(state.schema, this.getState)\n this.marks = createMarkActions(state.schema, this.getState)\n\n this.schema = state.schema\n this.directEditorProps = { state, ...payload.view }\n }\n\n public getState = (): EditorState => {\n return this.view?.state || this.directEditorProps.state\n }\n\n private getDoc(): ProseMirrorNode {\n return this.getState().doc\n }\n\n private getProp<PropName extends keyof EditorProps>(propName: PropName): Partial<EditorProps>[PropName] {\n return this.view?.someProp(propName) ?? this.directEditorProps[propName]\n }\n\n public updateState(state: EditorState): void {\n if (this.view) {\n this.view.updateState(state)\n } else {\n this.directEditorProps.state = state\n }\n }\n\n private dispatch = (tr: Transaction): void => {\n if (this.view) {\n this.view.dispatch(tr)\n } else {\n this.directEditorProps.state = this.directEditorProps.state.apply(tr)\n }\n }\n\n public setContent(\n content: NodeJSON | string | Element | ProseMirrorNode,\n selection?: SelectionJSON | Selection | 'start' | 'end',\n ): void {\n const doc = getEditorContentDoc(this.schema, content)\n doc.check()\n const sel = getEditorSelection(doc, selection || 'start')\n\n const oldState = this.getState()\n if (doc.eq(oldState.doc) && (!selection || sel.eq(oldState.selection))) {\n return\n }\n\n const newState = EditorState.create({\n doc,\n selection: sel,\n plugins: oldState.plugins,\n })\n this.updateState(newState)\n }\n\n /**\n * Return a JSON object representing the editor's current document.\n */\n public getDocJSON = (): NodeJSON => {\n const state = this.getState()\n return jsonFromNode(state.doc)\n }\n\n /**\n * Return an HTML string representing the editor's current document.\n */\n public getDocHTML = (options?: getDocHTMLOptions): string => {\n const serializer = this.getProp('clipboardSerializer')\n const DOMSerializer = serializer ? { fromSchema: () => serializer } : undefined\n const doc = this.getDoc()\n return htmlFromNode(doc, { ...options, DOMSerializer })\n }\n\n private updateExtension(extension: Extension, add: boolean): void {\n const view = this.view\n\n // Don't update the extension if the editor is already unmounted\n if (!view || view.isDestroyed) {\n return\n }\n\n const tree = (extension as BaseExtension).getTree()\n const payload = tree.getRootOutput()\n\n if (payload?.schema) {\n throw new ProseKitError('Schema cannot be changed')\n }\n\n if (payload?.view) {\n throw new ProseKitError('View cannot be changed')\n }\n\n const oldPayload = this.tree.getRootOutput()\n const oldPlugins = [...(view.state?.plugins ?? [])]\n\n this.tree = add\n ? unionFacetNode(this.tree, tree)\n : subtractFacetNode(this.tree, tree)\n\n const newPayload = this.tree.getRootOutput()\n const newPlugins = [...(newPayload?.state?.plugins ?? [])]\n\n if (!isDeepEqual(oldPlugins, newPlugins)) {\n const state = view.state.reconfigure({ plugins: newPlugins })\n view.updateState(state)\n }\n\n if (\n newPayload?.commands\n && !isDeepEqual(oldPayload?.commands, newPayload?.commands)\n ) {\n const commands = newPayload.commands\n const names = Object.keys(commands)\n for (const name of names) {\n this.defineCommand(name, commands[name])\n }\n }\n }\n\n public use(extension: Extension): VoidFunction {\n if (!this.mounted) {\n let canceled = false\n let lazyRemove: VoidFunction | null = null\n\n const lazyCreate = () => {\n if (!canceled) {\n lazyRemove = this.use(extension)\n }\n }\n\n this.afterMounted.push(lazyCreate)\n\n return () => {\n canceled = true\n lazyRemove?.()\n }\n }\n\n this.updateExtension(extension, true)\n return () => this.updateExtension(extension, false)\n }\n\n public mount(place: HTMLElement): void {\n if (this.view) {\n // If the editor is already mounted to the same DOM element, do nothing\n if (this.view.dom === place) return\n // If the editor is already mounted to a different element, throw an error\n throw new ProseKitError('Editor is already mounted')\n }\n this.view = new EditorView({ mount: place }, this.directEditorProps)\n this.afterMounted.forEach((callback) => callback())\n this.afterMounted.length = 0\n }\n\n public unmount(): void {\n // If the editor is not mounted, do nothing\n if (!this.view) return\n\n this.directEditorProps.state = this.view.state\n this.view.destroy()\n this.view = null\n }\n\n get mounted(): boolean {\n return !!this.view && !this.view.isDestroyed\n }\n\n public get assertView(): EditorView {\n if (!this.view) {\n throw new ProseKitError('Editor is not mounted')\n }\n return this.view\n }\n\n public definePlugins(plugins: readonly Plugin[]): void {\n const view = this.assertView\n const state = view.state\n const newPlugins = [...plugins, ...state.plugins]\n const newState = state.reconfigure({ plugins: newPlugins })\n view.setProps({ state: newState })\n }\n\n public removePlugins(plugins: readonly Plugin[]): void {\n const view = this.view\n if (!view) return\n\n const state = view.state\n const newPlugins = state.plugins.filter((p) => !plugins.includes(p))\n const newState = state.reconfigure({ plugins: newPlugins })\n view.setProps({ state: newState })\n }\n\n exec(command: Command): boolean {\n const state = this.getState()\n return command(state, this.dispatch, this.view ?? undefined)\n }\n\n canExec(command: Command): boolean {\n const state = this.getState()\n return command(state, undefined, this.view ?? undefined)\n }\n\n public defineCommand<Args extends any[] = any[]>(\n name: string,\n commandCreator: CommandCreator<Args>,\n ): void {\n const action: CommandAction<Args> = (...args: Args) => {\n const command = commandCreator(...args)\n return this.exec(command)\n }\n\n const canExec = (...args: Args) => {\n const command = commandCreator(...args)\n return this.canExec(command)\n }\n\n action.canExec = canExec\n\n this.commands[name] = action as CommandAction\n }\n\n public removeCommand(name: string): void {\n delete this.commands[name]\n }\n}\n\n/**\n * @public\n */\nexport class Editor<E extends Extension = any> {\n private instance: EditorInstance\n\n /**\n * @internal\n */\n constructor(instance: EditorInstance) {\n if (!(instance instanceof EditorInstance)) {\n throw new TypeError('Invalid EditorInstance')\n }\n this.instance = instance\n }\n\n /**\n * Whether the editor is mounted.\n */\n get mounted(): boolean {\n return this.instance.mounted\n }\n\n /**\n * The editor view.\n */\n get view(): EditorView {\n return this.instance.assertView\n }\n\n /**\n * The editor schema.\n */\n get schema(): Schema<ExtractNodeNames<E>, ExtractMarkNames<E>> {\n return this.instance.schema\n }\n\n /**\n * The editor's current state.\n */\n get state(): EditorState {\n return this.instance.getState()\n }\n\n /**\n * Whether the editor is focused.\n */\n get focused(): boolean {\n return this.instance.view?.hasFocus() ?? false\n }\n\n /**\n * Mount the editor to the given HTML element. Pass `null` or `undefined` to\n * unmount the editor. When an element is passed, this method returns a\n * function to unmount the editor.\n */\n mount = (place: HTMLElement | null | undefined): void | VoidFunction => {\n if (place) {\n this.instance.mount(place)\n return this.unmount\n } else {\n this.instance.unmount()\n }\n }\n\n /**\n * Unmount the editor. This is equivalent to `mount(null)`.\n */\n unmount = (): void => {\n this.instance.unmount()\n }\n\n /**\n * Focus the editor.\n */\n focus = (): void => {\n this.instance.view?.focus()\n }\n\n /**\n * Blur the editor.\n */\n blur = (): void => {\n this.instance.view?.dom.blur()\n }\n\n /**\n * Register an extension to the editor. Return a function to unregister the\n * extension.\n */\n use = (extension: Extension): VoidFunction => {\n return this.instance.use(extension)\n }\n\n /**\n * Update the editor's state.\n *\n * @remarks\n *\n * This is an advanced method. Use it only if you have a specific reason to\n * directly manipulate the editor's state.\n */\n updateState = (state: EditorState): void => {\n this.instance.updateState(state)\n }\n\n /**\n * Update the editor's document and selection.\n *\n * @param content - The new document to set. It can be one of the following:\n * - A ProseMirror node instance\n * - A ProseMirror node JSON object\n * - An HTML string\n * - A DOM element instance\n * @param selection - Optional. Specifies the new selection. It can be one of the following:\n * - A ProseMirror selection instance\n * - A ProseMirror selection JSON object\n * - The string \"start\" (to set selection at the beginning, default value)\n * - The string \"end\" (to set selection at the end)\n */\n setContent = (\n content: ProseMirrorNode | NodeJSON | string | Element,\n selection?: SelectionJSON | Selection | 'start' | 'end',\n ): void => {\n return this.instance.setContent(content, selection)\n }\n\n /**\n * Return a JSON object representing the editor's current document.\n */\n public getDocJSON = (): NodeJSON => {\n return this.instance.getDocJSON()\n }\n\n /**\n * Return an HTML string representing the editor's current document.\n */\n public getDocHTML = (options?: getDocHTMLOptions): string => {\n return this.instance.getDocHTML(options)\n }\n\n /**\n * Execute the given command. Return `true` if the command was successfully\n * executed, otherwise `false`.\n */\n exec = (command: Command): boolean => {\n return this.instance.exec(command)\n }\n\n /**\n * Check if the given command can be executed. Return `true` if the command\n * can be executed, otherwise `false`.\n */\n canExec = (command: Command): boolean => {\n return this.instance.canExec(command)\n }\n\n /**\n * All {@link CommandAction}s defined by the editor.\n */\n get commands(): ExtractCommandActions<E> {\n return this.instance.commands as ExtractCommandActions<E>\n }\n\n /**\n * All {@link NodeAction}s defined by the editor.\n */\n get nodes(): ExtractNodeActions<E> {\n return this.instance.nodes as ExtractNodeActions<E>\n }\n\n /**\n * All {@link MarkAction}s defined by the editor.\n */\n get marks(): ExtractMarkActions<E> {\n return this.instance.marks as ExtractMarkActions<E>\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as EditorInstance, r as EditorOptions, t as Editor, w as Extension } from "./editor
|
|
1
|
+
import { n as EditorInstance, r as EditorOptions, t as Editor, w as Extension } from "./editor.js";
|
|
2
2
|
import { ProseMirrorNode } from "@prosekit/pm/model";
|
|
3
3
|
|
|
4
4
|
//#region src/test/test-editor.d.ts
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L as assert, M as isProseMirrorNode, i as setupEditorExtension, n as EditorInstance, o as createMarkActions, s as createNodeActions, t as Editor } from "./editor.js";
|
|
2
2
|
import { NodeSelection, TextSelection } from "@prosekit/pm/state";
|
|
3
|
-
|
|
4
3
|
//#region src/test/test-builder.ts
|
|
5
4
|
const createNodeForTest = (type, attrs, children) => {
|
|
6
5
|
const tags = {};
|
|
@@ -41,7 +40,6 @@ const applyMarkForTest = (mark, children) => {
|
|
|
41
40
|
return newNode;
|
|
42
41
|
});
|
|
43
42
|
};
|
|
44
|
-
|
|
45
43
|
//#endregion
|
|
46
44
|
//#region src/test/test-editor.ts
|
|
47
45
|
function maybeResolve(doc, pos) {
|
|
@@ -99,7 +97,7 @@ var TestEditor = class extends Editor {
|
|
|
99
97
|
function createTestEditor(options) {
|
|
100
98
|
return new TestEditor(new TestEditorInstance(setupEditorExtension(options)));
|
|
101
99
|
}
|
|
102
|
-
|
|
103
100
|
//#endregion
|
|
104
101
|
export { createTestEditor };
|
|
102
|
+
|
|
105
103
|
//# sourceMappingURL=prosekit-core-test.js.map
|