@prosekit/core 0.3.1 → 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.
@@ -6,6 +6,8 @@ import type { ConditionalExcept } from 'type-fest';
6
6
  import type { ContentMatch } from '@prosekit/pm/model';
7
7
  import type { DirectEditorProps } from '@prosekit/pm/view';
8
8
  import type { DOMEventMap } from '@prosekit/pm/view';
9
+ import { DOMParser as DOMParser_2 } from '@prosekit/pm/model';
10
+ import { DOMSerializer } from '@prosekit/pm/model';
9
11
  import { EditorState } from '@prosekit/pm/state';
10
12
  import type { EditorStateConfig } from '@prosekit/pm/state';
11
13
  import { EditorView } from '@prosekit/pm/view';
@@ -598,6 +600,20 @@ declare type DocChangeHandler = (view: EditorView, prevState: EditorState) => vo
598
600
  export { DocChangeHandler }
599
601
  export { DocChangeHandler as DocChangeHandler_alias_1 }
600
602
 
603
+ /**
604
+ * @internal
605
+ */
606
+ export declare class DOMDocumentNotFoundError extends ProseKitError {
607
+ constructor();
608
+ }
609
+
610
+ /** @public */
611
+ declare type DOMDocumentOptions = {
612
+ document?: Document;
613
+ };
614
+ export { DOMDocumentOptions }
615
+ export { DOMDocumentOptions as DOMDocumentOptions_alias_1 }
616
+
601
617
  /**
602
618
  * @internal
603
619
  */
@@ -620,6 +636,22 @@ export { DOMEventHandler as DOMEventHandler_alias_1 }
620
636
  */
621
637
  export declare type DOMEventPayload = [event: string, handler: DOMEventHandler];
622
638
 
639
+ export declare type DOMNode = InstanceType<typeof window.Node>;
640
+
641
+ /** @public */
642
+ declare type DOMParserOptions = {
643
+ DOMParser?: typeof DOMParser_2;
644
+ };
645
+ export { DOMParserOptions }
646
+ export { DOMParserOptions as DOMParserOptions_alias_1 }
647
+
648
+ /** @public */
649
+ declare type DOMSerializerOptions = {
650
+ DOMSerializer?: typeof DOMSerializer;
651
+ };
652
+ export { DOMSerializerOptions }
653
+ export { DOMSerializerOptions as DOMSerializerOptions_alias_1 }
654
+
623
655
  declare type DoubleClickHandler = (view: EditorView, pos: number, event: MouseEvent) => boolean | void;
624
656
  export { DoubleClickHandler }
625
657
  export { DoubleClickHandler as DoubleClickHandler_alias_1 }
@@ -726,7 +758,25 @@ export { EditorOptions as EditorOptions_alias_1 }
726
758
  *
727
759
  * @internal
728
760
  */
729
- export declare function elementFromHTML(html: string): HTMLElement;
761
+ export declare function elementFromHTML(html: string, options?: DOMDocumentOptions): HTMLElement;
762
+
763
+ /**
764
+ * Parse a ProseMirror document JSON object to a HTML element.
765
+ *
766
+ * @public
767
+ */
768
+ declare function elementFromJSON(json: NodeJSON, options: JSONParserOptions & DOMSerializerOptions & DOMDocumentOptions): HTMLElement;
769
+ export { elementFromJSON }
770
+ export { elementFromJSON as elementFromJSON_alias_1 }
771
+
772
+ /**
773
+ * Serialize a ProseMirror node to a HTML element.
774
+ *
775
+ * @public
776
+ */
777
+ declare function elementFromNode(node: ProseMirrorNode, options?: DOMSerializerOptions & DOMDocumentOptions): HTMLElement;
778
+ export { elementFromNode }
779
+ export { elementFromNode as elementFromNode_alias_1 }
730
780
 
731
781
  declare type EmptyValue = undefined | null | EmptyObject;
732
782
 
@@ -890,6 +940,14 @@ declare interface FacetOptions<Input, Output> {
890
940
  export { FacetOptions }
891
941
  export { FacetOptions as FacetOptions_alias_1 }
892
942
 
943
+ export declare function findBrowserDocument(options?: {
944
+ document?: Document;
945
+ }): Document | undefined;
946
+
947
+ export declare function findBrowserWindow(options?: {
948
+ document?: Document;
949
+ }): (Window & typeof globalThis) | null | undefined;
950
+
893
951
  /**
894
952
  * A function that is called when the editor gains or loses focus.
895
953
  *
@@ -901,9 +959,13 @@ declare type FocusChangeHandler = (hasFocus: boolean) => void;
901
959
  export { FocusChangeHandler }
902
960
  export { FocusChangeHandler as FocusChangeHandler_alias_1 }
903
961
 
904
- export declare function getBrowserDocument(): Document | undefined;
962
+ export declare function getBrowserDocument(options?: {
963
+ document?: Document;
964
+ }): Document;
905
965
 
906
- export declare function getBrowserWindow(): (Window & typeof globalThis) | null | undefined;
966
+ export declare function getBrowserWindow(options?: {
967
+ document?: Document;
968
+ }): Window & typeof globalThis;
907
969
 
908
970
  export declare function getCustomSelection(state: EditorState, from?: number | null, to?: number | null): Selection_3;
909
971
 
@@ -938,6 +1000,29 @@ export declare type GroupedEntries<T extends Record<string, any>> = {
938
1000
 
939
1001
  export declare function groupEntries<T extends Record<string, any>>(entries: ObjectEntries<T>[]): GroupedEntries<T>;
940
1002
 
1003
+ /**
1004
+ * @internal
1005
+ */
1006
+ export declare function htmlFromElement(element: HTMLElement): string;
1007
+
1008
+ /**
1009
+ * Parse a ProseMirror document JSON object to a HTML string.
1010
+ *
1011
+ * @public
1012
+ */
1013
+ declare function htmlFromJSON(json: NodeJSON, options: JSONParserOptions & DOMSerializerOptions & DOMDocumentOptions): string;
1014
+ export { htmlFromJSON }
1015
+ export { htmlFromJSON as htmlFromJSON_alias_1 }
1016
+
1017
+ /**
1018
+ * Serialize a ProseMirror node to a HTML string
1019
+ *
1020
+ * @public
1021
+ */
1022
+ declare function htmlFromNode(node: ProseMirrorNode, options?: DOMSerializerOptions & DOMDocumentOptions): string;
1023
+ export { htmlFromNode }
1024
+ export { htmlFromNode as htmlFromNode_alias_1 }
1025
+
941
1026
  /**
942
1027
  * Returns a command that inserts the given node at the current selection or at
943
1028
  * the given position.
@@ -1032,20 +1117,18 @@ export { isTextSelection }
1032
1117
  export { isTextSelection as isTextSelection_alias_1 }
1033
1118
 
1034
1119
  /**
1035
- * Parse a HTML element to a ProseMirror document JSON.
1120
+ * Serialize a HTML element to a ProseMirror document JSON object.
1036
1121
  *
1037
1122
  * @public
1038
1123
  */
1039
- declare function jsonFromElement(element: HTMLElement, schema: Schema): NodeJSON;
1040
- export { jsonFromElement }
1041
- export { jsonFromElement as jsonFromElement_alias_1 }
1124
+ export declare function jsonFromElement(element: DOMNode, options: DOMParserOptions & JSONParserOptions): NodeJSON;
1042
1125
 
1043
1126
  /**
1044
- * Parse a HTML string to a ProseMirror document JSON.
1127
+ * Parse a HTML string to a ProseMirror document JSON object.
1045
1128
  *
1046
1129
  * @public
1047
1130
  */
1048
- declare function jsonFromHTML(html: string, schema: Schema): NodeJSON;
1131
+ declare function jsonFromHTML(html: string, options: DOMDocumentOptions & DOMParserOptions & JSONParserOptions): NodeJSON;
1049
1132
  export { jsonFromHTML }
1050
1133
  export { jsonFromHTML as jsonFromHTML_alias_1 }
1051
1134
 
@@ -1067,6 +1150,13 @@ declare function jsonFromState(state: EditorState): StateJSON;
1067
1150
  export { jsonFromState }
1068
1151
  export { jsonFromState as jsonFromState_alias_1 }
1069
1152
 
1153
+ /** @public */
1154
+ declare type JSONParserOptions = {
1155
+ schema: Schema;
1156
+ };
1157
+ export { JSONParserOptions }
1158
+ export { JSONParserOptions as JSONParserOptions_alias_1 }
1159
+
1070
1160
  declare type KeyDownHandler = (view: EditorView, event: KeyboardEvent) => boolean | void;
1071
1161
  export { KeyDownHandler }
1072
1162
  export { KeyDownHandler as KeyDownHandler_alias_1 }
@@ -1199,7 +1289,7 @@ export declare type NodeContent = ProseMirrorNode | ProseMirrorFragment | NodeCo
1199
1289
  *
1200
1290
  * @public
1201
1291
  */
1202
- declare function nodeFromElement(element: HTMLElement, schema: Schema): ProseMirrorNode;
1292
+ declare function nodeFromElement(element: DOMNode, options: DOMParserOptions & JSONParserOptions): ProseMirrorNode;
1203
1293
  export { nodeFromElement }
1204
1294
  export { nodeFromElement as nodeFromElement_alias_1 }
1205
1295
 
@@ -1208,7 +1298,7 @@ export { nodeFromElement as nodeFromElement_alias_1 }
1208
1298
  *
1209
1299
  * @public
1210
1300
  */
1211
- declare function nodeFromHTML(html: string, schema: Schema): ProseMirrorNode;
1301
+ declare function nodeFromHTML(html: string, options: DOMParserOptions & JSONParserOptions & DOMDocumentOptions): ProseMirrorNode;
1212
1302
  export { nodeFromHTML }
1213
1303
  export { nodeFromHTML as nodeFromHTML_alias_1 }
1214
1304
 
@@ -1217,7 +1307,7 @@ export { nodeFromHTML as nodeFromHTML_alias_1 }
1217
1307
  *
1218
1308
  * @public
1219
1309
  */
1220
- declare function nodeFromJSON(json: NodeJSON, schema: Schema): ProseMirrorNode;
1310
+ declare function nodeFromJSON(json: NodeJSON, options: JSONParserOptions): ProseMirrorNode;
1221
1311
  export { nodeFromJSON }
1222
1312
  export { nodeFromJSON as nodeFromJSON_alias_1 }
1223
1313
 
@@ -1469,7 +1559,7 @@ export declare const stateFacet: Facet<StatePayload, StatePayload>;
1469
1559
  *
1470
1560
  * @public
1471
1561
  */
1472
- declare function stateFromJSON(json: StateJSON, schema: Schema): EditorState;
1562
+ declare function stateFromJSON(json: StateJSON, options: JSONParserOptions): EditorState;
1473
1563
  export { stateFromJSON }
1474
1564
  export { stateFromJSON as stateFromJSON_alias_1 }
1475
1565
 
@@ -99,7 +99,10 @@ export { _getId } from './_tsup-dts-rollup';
99
99
  export { getMarkType } from './_tsup-dts-rollup';
100
100
  export { getNodeType } from './_tsup-dts-rollup';
101
101
  export { isInCodeBlock } from './_tsup-dts-rollup';
102
- export { jsonFromElement } from './_tsup-dts-rollup';
102
+ export { elementFromJSON } from './_tsup-dts-rollup';
103
+ export { elementFromNode } from './_tsup-dts-rollup';
104
+ export { htmlFromJSON } from './_tsup-dts-rollup';
105
+ export { htmlFromNode } from './_tsup-dts-rollup';
103
106
  export { jsonFromHTML } from './_tsup-dts-rollup';
104
107
  export { jsonFromNode } from './_tsup-dts-rollup';
105
108
  export { jsonFromState } from './_tsup-dts-rollup';
@@ -107,6 +110,10 @@ export { nodeFromElement } from './_tsup-dts-rollup';
107
110
  export { nodeFromHTML } from './_tsup-dts-rollup';
108
111
  export { nodeFromJSON } from './_tsup-dts-rollup';
109
112
  export { stateFromJSON } from './_tsup-dts-rollup';
113
+ export { DOMDocumentOptions } from './_tsup-dts-rollup';
114
+ export { DOMParserOptions } from './_tsup-dts-rollup';
115
+ export { DOMSerializerOptions } from './_tsup-dts-rollup';
116
+ export { JSONParserOptions } from './_tsup-dts-rollup';
110
117
  export { isAllSelection } from './_tsup-dts-rollup';
111
118
  export { isMark } from './_tsup-dts-rollup';
112
119
  export { isNodeSelection } from './_tsup-dts-rollup';
@@ -15,6 +15,13 @@ var EditorNotFoundError = class extends ProseKitError {
15
15
  );
16
16
  }
17
17
  };
18
+ var DOMDocumentNotFoundError = class extends ProseKitError {
19
+ constructor() {
20
+ super(
21
+ "Unable to find browser Document. When not in the browser environment, you need to pass a DOM Document."
22
+ );
23
+ }
24
+ };
18
25
 
19
26
  // src/utils/get-mark-type.ts
20
27
  function getMarkType(schema, type) {
@@ -433,11 +440,11 @@ var stateFacet = Facet.defineRootFacet({
433
440
  });
434
441
 
435
442
  // src/utils/parse.ts
436
- import { DOMParser } from "@prosekit/pm/model";
443
+ import { DOMParser, DOMSerializer } from "@prosekit/pm/model";
437
444
  import { EditorState } from "@prosekit/pm/state";
438
445
 
439
446
  // src/utils/get-dom-api.ts
440
- function getGlobalBrowserDocument() {
447
+ function findGlobalBrowserDocument() {
441
448
  if (typeof document !== "undefined") {
442
449
  return document;
443
450
  }
@@ -445,7 +452,7 @@ function getGlobalBrowserDocument() {
445
452
  return globalThis.document;
446
453
  }
447
454
  }
448
- function getGlobalBrowserWindow() {
455
+ function findGlobalBrowserWindow() {
449
456
  if (typeof window !== "undefined") {
450
457
  return window;
451
458
  }
@@ -453,49 +460,85 @@ function getGlobalBrowserWindow() {
453
460
  return globalThis.window;
454
461
  }
455
462
  }
456
- function getBrowserWindow() {
457
- var _a;
458
- const win = getGlobalBrowserWindow();
459
- if (win) {
463
+ function findBrowserDocument(options) {
464
+ var _a, _b, _c;
465
+ return (_c = (_a = options == null ? void 0 : options.document) != null ? _a : findGlobalBrowserDocument()) != null ? _c : (_b = findGlobalBrowserWindow()) == null ? void 0 : _b.document;
466
+ }
467
+ function findBrowserWindow(options) {
468
+ var _a, _b, _c, _d;
469
+ return (_d = (_b = (_a = options == null ? void 0 : options.document) == null ? void 0 : _a.defaultView) != null ? _b : findGlobalBrowserWindow()) != null ? _d : (_c = findBrowserDocument(options)) == null ? void 0 : _c.defaultView;
470
+ }
471
+ function getBrowserDocument(options) {
472
+ const doc = findBrowserDocument(options);
473
+ if (doc)
474
+ return doc;
475
+ throw new DOMDocumentNotFoundError();
476
+ }
477
+ function getBrowserWindow(options) {
478
+ const win = findBrowserWindow(options);
479
+ if (win)
460
480
  return win;
461
- }
462
- return (_a = getGlobalBrowserDocument()) == null ? void 0 : _a.defaultView;
481
+ throw new DOMDocumentNotFoundError();
463
482
  }
464
483
 
465
484
  // src/utils/parse.ts
466
- function nodeFromElement(element, schema) {
467
- return DOMParser.fromSchema(schema).parse(element);
468
- }
469
- function jsonFromElement(element, schema) {
470
- return jsonFromNode(nodeFromElement(element, schema));
485
+ function jsonFromState(state) {
486
+ return state.toJSON();
471
487
  }
472
- function nodeFromHTML(html, schema) {
473
- return nodeFromElement(elementFromHTML(html), schema);
488
+ function stateFromJSON(json, options) {
489
+ return EditorState.fromJSON({ schema: options.schema }, json);
474
490
  }
475
- function jsonFromHTML(html, schema) {
476
- return jsonFromElement(elementFromHTML(html), schema);
491
+ function jsonFromNode(node) {
492
+ return node.toJSON();
477
493
  }
478
- function elementFromHTML(html) {
479
- const win = getBrowserWindow();
480
- if (!win) {
481
- throw new ProseKitError(
482
- "No Browser Document Found. You can only parse a HTML string in the browser environment."
494
+ function nodeFromJSON(json, options) {
495
+ return options.schema.nodeFromJSON(json);
496
+ }
497
+ function nodeFromElement(element, options) {
498
+ const Parser = options.DOMParser || DOMParser;
499
+ const schema = options.schema;
500
+ return Parser.fromSchema(schema).parse(element);
501
+ }
502
+ function elementFromNode(node, options) {
503
+ const Serializer = (options == null ? void 0 : options.DOMSerializer) || DOMSerializer;
504
+ const document2 = getBrowserDocument(options);
505
+ const schema = node.type.schema;
506
+ const serializer = Serializer.fromSchema(schema);
507
+ if (schema.topNodeType !== node.type) {
508
+ return serializer.serializeNode(node, { document: document2 });
509
+ } else {
510
+ return serializer.serializeFragment(
511
+ node.content,
512
+ { document: document2 },
513
+ document2.createElement("div")
483
514
  );
484
515
  }
516
+ }
517
+ function elementFromHTML(html, options) {
518
+ const win = getBrowserWindow(options);
485
519
  const parser = new win.DOMParser();
486
- return parser.parseFromString(`<body>${html}</body>`, "text/html").body;
520
+ return parser.parseFromString(`<body><div>${html}</div></body>`, "text/html").body.firstElementChild;
487
521
  }
488
- function jsonFromState(state) {
489
- return state.toJSON();
522
+ function htmlFromElement(element) {
523
+ return element.outerHTML;
490
524
  }
491
- function jsonFromNode(node) {
492
- return node.toJSON();
525
+ function nodeFromHTML(html, options) {
526
+ return nodeFromElement(elementFromHTML(html, options), options);
527
+ }
528
+ function htmlFromNode(node, options) {
529
+ return elementFromNode(node, options).outerHTML;
530
+ }
531
+ function jsonFromElement(element, options) {
532
+ return jsonFromNode(nodeFromElement(element, options));
533
+ }
534
+ function elementFromJSON(json, options) {
535
+ return elementFromNode(nodeFromJSON(json, options), options);
493
536
  }
494
- function nodeFromJSON(json, schema) {
495
- return schema.nodeFromJSON(json);
537
+ function jsonFromHTML(html, options) {
538
+ return jsonFromElement(elementFromHTML(html, options), options);
496
539
  }
497
- function stateFromJSON(json, schema) {
498
- return EditorState.fromJSON({ schema }, json);
540
+ function htmlFromJSON(json, options) {
541
+ return htmlFromElement(elementFromJSON(json, options));
499
542
  }
500
543
 
501
544
  // src/extensions/default-state.ts
@@ -514,9 +557,9 @@ function defineDefaultState({
514
557
  const config = {};
515
558
  if (defaultHTML) {
516
559
  if (typeof defaultHTML === "string") {
517
- defaultDoc = jsonFromHTML(defaultHTML, schema);
560
+ defaultDoc = jsonFromHTML(defaultHTML, { schema });
518
561
  } else {
519
- defaultDoc = jsonFromElement(defaultHTML, schema);
562
+ defaultDoc = jsonFromElement(defaultHTML, { schema });
520
563
  }
521
564
  }
522
565
  if (defaultDoc) {
@@ -1975,9 +2018,13 @@ export {
1975
2018
  defineTripleClickOnHandler,
1976
2019
  defineUnmountHandler,
1977
2020
  defineUpdateHandler,
2021
+ elementFromJSON,
2022
+ elementFromNode,
1978
2023
  expandMark,
1979
2024
  getMarkType,
1980
2025
  getNodeType,
2026
+ htmlFromJSON,
2027
+ htmlFromNode,
1981
2028
  insertNode,
1982
2029
  isAllSelection,
1983
2030
  isInCodeBlock,
@@ -1985,7 +2032,6 @@ export {
1985
2032
  isNodeSelection,
1986
2033
  isProseMirrorNode,
1987
2034
  isTextSelection,
1988
- jsonFromElement,
1989
2035
  jsonFromHTML,
1990
2036
  jsonFromNode,
1991
2037
  jsonFromState,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/core",
3
3
  "type": "module",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "private": false,
6
6
  "author": {
7
7
  "name": "ocavue",