@blocknote/core 0.16.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/dist/blocknote.js +3292 -2755
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +6 -6
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/webpack-stats.json +1 -1
  6. package/package.json +5 -2
  7. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +3087 -0
  8. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.ts +132 -0
  9. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +71 -0
  10. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +2276 -0
  11. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +131 -0
  12. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +103 -0
  13. package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +3767 -0
  14. package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +192 -0
  15. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +178 -0
  16. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +1136 -0
  17. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +34 -0
  18. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +100 -0
  19. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +4931 -0
  20. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.ts +222 -0
  21. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +70 -0
  22. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +2924 -0
  23. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +136 -0
  24. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +48 -0
  25. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +8376 -0
  26. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +300 -0
  27. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +199 -0
  28. package/src/api/blockManipulation/insertContentAt.ts +96 -0
  29. package/src/api/blockManipulation/selections/textCursorPosition/__snapshots__/textCursorPosition.test.ts.snap +316 -0
  30. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.ts +53 -0
  31. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +130 -0
  32. package/src/api/blockManipulation/setupTestEnv.ts +179 -0
  33. package/src/api/clipboard/__snapshots__/tableAllCells.html +1 -1
  34. package/src/api/clipboard/clipboard.test.ts +5 -6
  35. package/src/api/clipboard/fromClipboard/fileDropExtension.ts +8 -4
  36. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +11 -6
  37. package/src/api/clipboard/fromClipboard/pasteExtension.ts +8 -4
  38. package/src/api/clipboard/toClipboard/copyExtension.ts +113 -61
  39. package/src/api/exporters/html/__snapshots__/complex/misc/external.html +1 -1
  40. package/src/api/exporters/html/__snapshots__/lists/basic/external.html +1 -1
  41. package/src/api/exporters/html/__snapshots__/lists/nested/external.html +1 -1
  42. package/src/api/exporters/html/externalHTMLExporter.ts +42 -94
  43. package/src/api/exporters/html/htmlConversion.test.ts +19 -13
  44. package/src/api/exporters/html/internalHTMLSerializer.ts +21 -72
  45. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +263 -0
  46. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +158 -0
  47. package/src/api/exporters/markdown/markdownExporter.test.ts +10 -10
  48. package/src/api/exporters/markdown/markdownExporter.ts +11 -7
  49. package/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.ts +2 -2
  50. package/src/api/getBlockInfoFromPos.ts +172 -90
  51. package/src/api/nodeConversions/blockToNode.ts +257 -0
  52. package/src/api/nodeConversions/fragmentToBlocks.ts +60 -0
  53. package/src/api/nodeConversions/nodeConversions.test.ts +9 -8
  54. package/src/api/nodeConversions/{nodeConversions.ts → nodeToBlock.ts} +20 -262
  55. package/src/api/parsers/html/parseHTML.test.ts +2 -2
  56. package/src/api/parsers/html/parseHTML.ts +8 -4
  57. package/src/api/parsers/html/util/nestedLists.test.ts +2 -2
  58. package/src/api/parsers/markdown/parseMarkdown.test.ts +2 -2
  59. package/src/api/parsers/markdown/parseMarkdown.ts +8 -4
  60. package/src/api/testUtil/cases/customBlocks.ts +11 -11
  61. package/src/api/testUtil/cases/customInlineContent.ts +6 -6
  62. package/src/api/testUtil/cases/customStyles.ts +6 -6
  63. package/src/api/testUtil/cases/defaultSchema.ts +4 -4
  64. package/src/api/testUtil/index.ts +6 -6
  65. package/src/api/testUtil/partialBlockTestUtil.ts +5 -5
  66. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +5 -5
  67. package/src/blocks/FileBlockContent/FileBlockContent.ts +4 -4
  68. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +2 -2
  69. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +61 -39
  70. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +5 -5
  71. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +30 -18
  72. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +67 -33
  73. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +23 -19
  74. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +22 -24
  75. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +31 -19
  76. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +16 -11
  77. package/src/blocks/TableBlockContent/TableBlockContent.ts +4 -4
  78. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +5 -5
  79. package/src/blocks/defaultBlockHelpers.ts +4 -4
  80. package/src/blocks/defaultBlockTypeGuards.ts +5 -5
  81. package/src/blocks/defaultBlocks.ts +13 -13
  82. package/src/blocks/defaultProps.ts +1 -1
  83. package/src/editor/BlockNoteEditor.test.ts +14 -7
  84. package/src/editor/BlockNoteEditor.ts +82 -149
  85. package/src/editor/BlockNoteExtensions.ts +15 -11
  86. package/src/editor/BlockNoteSchema.ts +7 -7
  87. package/src/editor/BlockNoteTipTapEditor.ts +5 -3
  88. package/src/editor/cursorPositionTypes.ts +7 -2
  89. package/src/editor/selectionTypes.ts +6 -2
  90. package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -1
  91. package/src/extensions/BackgroundColor/BackgroundColorMark.ts +1 -1
  92. package/src/extensions/FilePanel/FilePanelPlugin.ts +4 -4
  93. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +8 -4
  94. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +334 -0
  95. package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +9 -4
  96. package/src/extensions/{NonEditableBlocks/NonEditableBlockPlugin.ts → NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts} +2 -2
  97. package/src/extensions/Placeholder/PlaceholderPlugin.ts +1 -1
  98. package/src/extensions/SideMenu/SideMenuPlugin.ts +72 -401
  99. package/src/extensions/SideMenu/dragging.ts +251 -0
  100. package/src/extensions/SuggestionMenu/DefaultSuggestionItem.ts +1 -1
  101. package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +8 -4
  102. package/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts +8 -4
  103. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +19 -15
  104. package/src/extensions/TableHandles/TableHandlesPlugin.ts +11 -7
  105. package/src/extensions/TextColor/TextColorExtension.ts +1 -1
  106. package/src/extensions/TextColor/TextColorMark.ts +1 -1
  107. package/src/i18n/dictionary.ts +1 -1
  108. package/src/i18n/locales/ar.ts +1 -1
  109. package/src/i18n/locales/fr.ts +1 -1
  110. package/src/i18n/locales/hr.ts +308 -0
  111. package/src/i18n/locales/index.ts +15 -14
  112. package/src/i18n/locales/is.ts +1 -1
  113. package/src/i18n/locales/ja.ts +1 -1
  114. package/src/i18n/locales/ko.ts +1 -1
  115. package/src/i18n/locales/nl.ts +1 -1
  116. package/src/i18n/locales/pl.ts +1 -1
  117. package/src/i18n/locales/pt.ts +1 -1
  118. package/src/i18n/locales/ru.ts +1 -1
  119. package/src/i18n/locales/vi.ts +1 -1
  120. package/src/i18n/locales/zh.ts +1 -1
  121. package/src/index.ts +45 -44
  122. package/src/pm-nodes/BlockContainer.ts +3 -647
  123. package/src/pm-nodes/BlockGroup.ts +2 -2
  124. package/src/pm-nodes/index.ts +3 -3
  125. package/src/schema/blocks/createSpec.ts +8 -7
  126. package/src/schema/blocks/internal.ts +9 -9
  127. package/src/schema/blocks/types.ts +4 -4
  128. package/src/schema/index.ts +10 -10
  129. package/src/schema/inlineContent/createSpec.ts +9 -10
  130. package/src/schema/inlineContent/internal.ts +3 -3
  131. package/src/schema/inlineContent/types.ts +2 -2
  132. package/src/schema/styles/createSpec.ts +4 -3
  133. package/src/schema/styles/internal.ts +1 -1
  134. package/types/src/api/blockManipulation/commands/insertBlocks/insertBlocks.d.ts +4 -0
  135. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +7 -0
  136. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.d.ts +1 -0
  137. package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.d.ts +5 -0
  138. package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.test.d.ts +1 -0
  139. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +7 -0
  140. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.d.ts +1 -0
  141. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +7 -0
  142. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.d.ts +1 -0
  143. package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.d.ts +5 -0
  144. package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.test.d.ts +1 -0
  145. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.d.ts +11 -0
  146. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.test.d.ts +1 -0
  147. package/types/src/api/blockManipulation/insertContentAt.d.ts +6 -0
  148. package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.d.ts +5 -0
  149. package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.d.ts +1 -0
  150. package/types/src/api/blockManipulation/setupTestEnv.d.ts +492 -0
  151. package/types/src/api/clipboard/fromClipboard/fileDropExtension.d.ts +3 -3
  152. package/types/src/api/clipboard/fromClipboard/handleFileInsertion.d.ts +1 -1
  153. package/types/src/api/clipboard/fromClipboard/pasteExtension.d.ts +2 -2
  154. package/types/src/api/clipboard/toClipboard/copyExtension.d.ts +5 -5
  155. package/types/src/api/exporters/html/externalHTMLExporter.d.ts +7 -9
  156. package/types/src/api/exporters/html/internalHTMLSerializer.d.ts +6 -10
  157. package/types/src/api/exporters/html/util/serializeBlocksExternalHTML.d.ts +10 -0
  158. package/types/src/api/exporters/html/util/serializeBlocksInternalHTML.d.ts +11 -0
  159. package/types/src/api/exporters/markdown/markdownExporter.d.ts +3 -3
  160. package/types/src/api/getBlockInfoFromPos.d.ts +63 -20
  161. package/types/src/api/nodeConversions/blockToNode.d.ts +15 -0
  162. package/types/src/api/nodeConversions/fragmentToBlocks.d.ts +7 -0
  163. package/types/src/api/nodeConversions/nodeToBlock.d.ts +16 -0
  164. package/types/src/api/parsers/html/parseHTML.d.ts +2 -2
  165. package/types/src/api/parsers/markdown/parseMarkdown.d.ts +2 -2
  166. package/types/src/api/testUtil/cases/customBlocks.d.ts +39 -39
  167. package/types/src/api/testUtil/cases/customInlineContent.d.ts +35 -35
  168. package/types/src/api/testUtil/cases/customStyles.d.ts +35 -35
  169. package/types/src/api/testUtil/cases/defaultSchema.d.ts +2 -2
  170. package/types/src/api/testUtil/index.d.ts +6 -6
  171. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +4 -4
  172. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +4 -4
  173. package/types/src/blocks/FileBlockContent/FileBlockContent.d.ts +4 -4
  174. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +2 -2
  175. package/types/src/blocks/HeadingBlockContent/HeadingBlockContent.d.ts +2 -2
  176. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +4 -4
  177. package/types/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +2 -2
  178. package/types/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.d.ts +2 -2
  179. package/types/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.d.ts +2 -2
  180. package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +2 -2
  181. package/types/src/blocks/ParagraphBlockContent/ParagraphBlockContent.d.ts +2 -2
  182. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +2 -2
  183. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +4 -4
  184. package/types/src/blocks/defaultBlockHelpers.d.ts +3 -3
  185. package/types/src/blocks/defaultBlockTypeGuards.d.ts +4 -4
  186. package/types/src/blocks/defaultBlocks.d.ts +38 -38
  187. package/types/src/blocks/defaultProps.d.ts +1 -1
  188. package/types/src/editor/BlockNoteEditor.d.ts +28 -16
  189. package/types/src/editor/BlockNoteExtensions.d.ts +3 -3
  190. package/types/src/editor/BlockNoteSchema.d.ts +4 -4
  191. package/types/src/editor/BlockNoteTipTapEditor.d.ts +2 -2
  192. package/types/src/editor/cursorPositionTypes.d.ts +3 -2
  193. package/types/src/editor/selectionTypes.d.ts +2 -2
  194. package/types/src/extensions/BackgroundColor/BackgroundColorMark.d.ts +1 -1
  195. package/types/src/extensions/FilePanel/FilePanelPlugin.d.ts +4 -4
  196. package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +4 -4
  197. package/types/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.d.ts +5 -0
  198. package/types/src/extensions/LinkToolbar/LinkToolbarPlugin.d.ts +4 -4
  199. package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +2 -0
  200. package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +1 -1
  201. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +12 -28
  202. package/types/src/extensions/SideMenu/dragging.d.ts +17 -0
  203. package/types/src/extensions/SuggestionMenu/DefaultSuggestionItem.d.ts +1 -1
  204. package/types/src/extensions/SuggestionMenu/SuggestionPlugin.d.ts +4 -4
  205. package/types/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.d.ts +3 -3
  206. package/types/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.d.ts +4 -4
  207. package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +4 -4
  208. package/types/src/extensions/TextColor/TextColorMark.d.ts +1 -1
  209. package/types/src/i18n/dictionary.d.ts +1 -1
  210. package/types/src/i18n/locales/ar.d.ts +1 -1
  211. package/types/src/i18n/locales/fr.d.ts +1 -1
  212. package/types/src/i18n/locales/hr.d.ts +239 -0
  213. package/types/src/i18n/locales/index.d.ts +15 -14
  214. package/types/src/i18n/locales/is.d.ts +1 -1
  215. package/types/src/i18n/locales/ja.d.ts +1 -1
  216. package/types/src/i18n/locales/ko.d.ts +1 -1
  217. package/types/src/i18n/locales/nl.d.ts +1 -1
  218. package/types/src/i18n/locales/pl.d.ts +1 -1
  219. package/types/src/i18n/locales/pt.d.ts +1 -1
  220. package/types/src/i18n/locales/ru.d.ts +1 -1
  221. package/types/src/i18n/locales/vi.d.ts +1 -1
  222. package/types/src/i18n/locales/zh.d.ts +1 -1
  223. package/types/src/index.d.ts +45 -44
  224. package/types/src/pm-nodes/BlockContainer.d.ts +2 -16
  225. package/types/src/pm-nodes/BlockGroup.d.ts +1 -1
  226. package/types/src/pm-nodes/index.d.ts +3 -3
  227. package/types/src/schema/blocks/createSpec.d.ts +5 -5
  228. package/types/src/schema/blocks/internal.d.ts +5 -5
  229. package/types/src/schema/blocks/types.d.ts +4 -4
  230. package/types/src/schema/index.d.ts +10 -10
  231. package/types/src/schema/inlineContent/createSpec.d.ts +3 -3
  232. package/types/src/schema/inlineContent/internal.d.ts +2 -2
  233. package/types/src/schema/inlineContent/types.d.ts +2 -2
  234. package/types/src/schema/styles/createSpec.d.ts +1 -1
  235. package/types/src/schema/styles/internal.d.ts +1 -1
  236. package/src/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap +0 -714
  237. package/src/api/blockManipulation/blockManipulation.test.ts +0 -292
  238. package/src/api/blockManipulation/blockManipulation.ts +0 -350
  239. package/src/api/exporters/html/util/sharedHTMLConversion.ts +0 -130
  240. package/src/api/exporters/html/util/simplifyBlocksRehypePlugin.ts +0 -218
  241. package/src/api/getCurrentBlockContentType.ts +0 -14
  242. package/types/src/api/blockManipulation/blockManipulation.d.ts +0 -14
  243. package/types/src/api/exporters/html/util/sharedHTMLConversion.d.ts +0 -9
  244. package/types/src/api/exporters/html/util/simplifyBlocksRehypePlugin.d.ts +0 -16
  245. package/types/src/api/getCurrentBlockContentType.d.ts +0 -2
  246. package/types/src/api/nodeConversions/nodeConversions.d.ts +0 -24
  247. package/types/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.d.ts +0 -2
  248. /package/types/src/api/blockManipulation/{blockManipulation.test.d.ts → commands/insertBlocks/insertBlocks.test.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
- import { Mark, Node, Schema } from "@tiptap/pm/model";
1
+ import { Mark, Node } from "@tiptap/pm/model";
2
2
 
3
- import UniqueID from "../../extensions/UniqueID/UniqueID";
3
+ import UniqueID from "../../extensions/UniqueID/UniqueID.js";
4
4
  import type {
5
5
  BlockSchema,
6
6
  CustomInlineContentConfig,
@@ -8,266 +8,23 @@ import type {
8
8
  InlineContent,
9
9
  InlineContentFromConfig,
10
10
  InlineContentSchema,
11
- PartialCustomInlineContentFromConfig,
12
- PartialInlineContent,
13
- PartialLink,
14
- PartialTableContent,
15
11
  StyleSchema,
16
- StyledText,
17
12
  Styles,
18
13
  TableContent,
19
- } from "../../schema";
20
- import { getBlockInfo } from "../getBlockInfoFromPos";
14
+ } from "../../schema/index.js";
15
+ import { getBlockInfoWithManualOffset } from "../getBlockInfoFromPos.js";
21
16
 
22
- import type { Block, PartialBlock } from "../../blocks/defaultBlocks";
17
+ import type { Block } from "../../blocks/defaultBlocks.js";
23
18
  import {
24
19
  isLinkInlineContent,
25
- isPartialLinkInlineContent,
26
20
  isStyledTextInlineContent,
27
- } from "../../schema/inlineContent/types";
28
- import { UnreachableCaseError } from "../../util/typescript";
29
-
30
- /**
31
- * Convert a StyledText inline element to a
32
- * prosemirror text node with the appropriate marks
33
- */
34
- function styledTextToNodes<T extends StyleSchema>(
35
- styledText: StyledText<T>,
36
- schema: Schema,
37
- styleSchema: T
38
- ): Node[] {
39
- const marks: Mark[] = [];
40
-
41
- for (const [style, value] of Object.entries(styledText.styles)) {
42
- const config = styleSchema[style];
43
- if (!config) {
44
- throw new Error(`style ${style} not found in styleSchema`);
45
- }
46
-
47
- if (config.propSchema === "boolean") {
48
- marks.push(schema.mark(style));
49
- } else if (config.propSchema === "string") {
50
- marks.push(schema.mark(style, { stringValue: value }));
51
- } else {
52
- throw new UnreachableCaseError(config.propSchema);
53
- }
54
- }
55
-
56
- return (
57
- styledText.text
58
- // Splits text & line breaks.
59
- .split(/(\n)/g)
60
- // If the content ends with a line break, an empty string is added to the
61
- // end, which this removes.
62
- .filter((text) => text.length > 0)
63
- // Converts text & line breaks to nodes.
64
- .map((text) => {
65
- if (text === "\n") {
66
- return schema.nodes["hardBreak"].create();
67
- } else {
68
- return schema.text(text, marks);
69
- }
70
- })
71
- );
72
- }
73
-
74
- /**
75
- * Converts a Link inline content element to
76
- * prosemirror text nodes with the appropriate marks
77
- */
78
- function linkToNodes(
79
- link: PartialLink<StyleSchema>,
80
- schema: Schema,
81
- styleSchema: StyleSchema
82
- ): Node[] {
83
- const linkMark = schema.marks.link.create({
84
- href: link.href,
85
- });
86
-
87
- return styledTextArrayToNodes(link.content, schema, styleSchema).map(
88
- (node) => {
89
- if (node.type.name === "text") {
90
- return node.mark([...node.marks, linkMark]);
91
- }
92
-
93
- if (node.type.name === "hardBreak") {
94
- return node;
95
- }
96
- throw new Error("unexpected node type");
97
- }
98
- );
99
- }
100
-
101
- /**
102
- * Converts an array of StyledText inline content elements to
103
- * prosemirror text nodes with the appropriate marks
104
- */
105
- function styledTextArrayToNodes<S extends StyleSchema>(
106
- content: string | StyledText<S>[],
107
- schema: Schema,
108
- styleSchema: S
109
- ): Node[] {
110
- const nodes: Node[] = [];
111
-
112
- if (typeof content === "string") {
113
- nodes.push(
114
- ...styledTextToNodes(
115
- { type: "text", text: content, styles: {} },
116
- schema,
117
- styleSchema
118
- )
119
- );
120
- return nodes;
121
- }
122
-
123
- for (const styledText of content) {
124
- nodes.push(...styledTextToNodes(styledText, schema, styleSchema));
125
- }
126
- return nodes;
127
- }
128
-
129
- /**
130
- * converts an array of inline content elements to prosemirror nodes
131
- */
132
- export function inlineContentToNodes<
133
- I extends InlineContentSchema,
134
- S extends StyleSchema
135
- >(
136
- blockContent: PartialInlineContent<I, S>,
137
- schema: Schema,
138
- styleSchema: S
139
- ): Node[] {
140
- const nodes: Node[] = [];
141
-
142
- for (const content of blockContent) {
143
- if (typeof content === "string") {
144
- nodes.push(...styledTextArrayToNodes(content, schema, styleSchema));
145
- } else if (isPartialLinkInlineContent(content)) {
146
- nodes.push(...linkToNodes(content, schema, styleSchema));
147
- } else if (isStyledTextInlineContent(content)) {
148
- nodes.push(...styledTextArrayToNodes([content], schema, styleSchema));
149
- } else {
150
- nodes.push(
151
- blockOrInlineContentToContentNode(content, schema, styleSchema)
152
- );
153
- }
154
- }
155
- return nodes;
156
- }
157
-
158
- /**
159
- * converts an array of inline content elements to prosemirror nodes
160
- */
161
- export function tableContentToNodes<
162
- I extends InlineContentSchema,
163
- S extends StyleSchema
164
- >(
165
- tableContent: PartialTableContent<I, S>,
166
- schema: Schema,
167
- styleSchema: StyleSchema
168
- ): Node[] {
169
- const rowNodes: Node[] = [];
170
-
171
- for (const row of tableContent.rows) {
172
- const columnNodes: Node[] = [];
173
- for (const cell of row.cells) {
174
- let pNode: Node;
175
- if (!cell) {
176
- pNode = schema.nodes["tableParagraph"].create({});
177
- } else if (typeof cell === "string") {
178
- pNode = schema.nodes["tableParagraph"].create({}, schema.text(cell));
179
- } else {
180
- const textNodes = inlineContentToNodes(cell, schema, styleSchema);
181
- pNode = schema.nodes["tableParagraph"].create({}, textNodes);
182
- }
183
-
184
- const cellNode = schema.nodes["tableCell"].create({}, pNode);
185
- columnNodes.push(cellNode);
186
- }
187
- const rowNode = schema.nodes["tableRow"].create({}, columnNodes);
188
- rowNodes.push(rowNode);
189
- }
190
- return rowNodes;
191
- }
192
-
193
- function blockOrInlineContentToContentNode(
194
- block:
195
- | PartialBlock<any, any, any>
196
- | PartialCustomInlineContentFromConfig<any, any>,
197
- schema: Schema,
198
- styleSchema: StyleSchema
199
- ) {
200
- let contentNode: Node;
201
- let type = block.type;
202
-
203
- // TODO: needed? came from previous code
204
- if (type === undefined) {
205
- type = "paragraph";
206
- }
207
-
208
- if (!schema.nodes[type]) {
209
- throw new Error(`node type ${type} not found in schema`);
210
- }
211
-
212
- if (!block.content) {
213
- contentNode = schema.nodes[type].create(block.props);
214
- } else if (typeof block.content === "string") {
215
- const nodes = inlineContentToNodes([block.content], schema, styleSchema);
216
- contentNode = schema.nodes[type].create(block.props, nodes);
217
- } else if (Array.isArray(block.content)) {
218
- const nodes = inlineContentToNodes(block.content, schema, styleSchema);
219
- contentNode = schema.nodes[type].create(block.props, nodes);
220
- } else if (block.content.type === "tableContent") {
221
- const nodes = tableContentToNodes(block.content, schema, styleSchema);
222
- contentNode = schema.nodes[type].create(block.props, nodes);
223
- } else {
224
- throw new UnreachableCaseError(block.content.type);
225
- }
226
- return contentNode;
227
- }
228
- /**
229
- * Converts a BlockNote block to a TipTap node.
230
- */
231
- export function blockToNode(
232
- block: PartialBlock<any, any, any>,
233
- schema: Schema,
234
- styleSchema: StyleSchema
235
- ) {
236
- let id = block.id;
237
-
238
- if (id === undefined) {
239
- id = UniqueID.options.generateID();
240
- }
241
-
242
- const contentNode = blockOrInlineContentToContentNode(
243
- block,
244
- schema,
245
- styleSchema
246
- );
247
-
248
- const children: Node[] = [];
249
-
250
- if (block.children) {
251
- for (const child of block.children) {
252
- children.push(blockToNode(child, schema, styleSchema));
253
- }
254
- }
255
-
256
- const groupNode = schema.nodes["blockGroup"].create({}, children);
257
-
258
- return schema.nodes["blockContainer"].create(
259
- {
260
- id: id,
261
- ...block.props,
262
- },
263
- children.length > 0 ? [contentNode, groupNode] : contentNode
264
- );
265
- }
21
+ } from "../../schema/inlineContent/types.js";
22
+ import { UnreachableCaseError } from "../../util/typescript.js";
266
23
 
267
24
  /**
268
25
  * Converts an internal (prosemirror) table node contentto a BlockNote Tablecontent
269
26
  */
270
- function contentNodeToTableContent<
27
+ export function contentNodeToTableContent<
271
28
  I extends InlineContentSchema,
272
29
  S extends StyleSchema
273
30
  >(contentNode: Node, inlineContentSchema: I, styleSchema: S) {
@@ -566,9 +323,10 @@ export function nodeToBlock<
566
323
  return cachedBlock;
567
324
  }
568
325
 
569
- const blockInfo = getBlockInfo(node);
326
+ const { blockContainer, blockContent, blockGroup } =
327
+ getBlockInfoWithManualOffset(node, 0);
570
328
 
571
- let id = blockInfo.id;
329
+ let id = blockContainer.node.attrs.id;
572
330
 
573
331
  // Only used for blocks converted from other formats.
574
332
  if (id === null) {
@@ -578,13 +336,13 @@ export function nodeToBlock<
578
336
  const props: any = {};
579
337
  for (const [attr, value] of Object.entries({
580
338
  ...node.attrs,
581
- ...blockInfo.contentNode.attrs,
339
+ ...blockContent.node.attrs,
582
340
  })) {
583
- const blockSpec = blockSchema[blockInfo.contentType.name];
341
+ const blockSpec = blockSchema[blockContent.node.type.name];
584
342
 
585
343
  if (!blockSpec) {
586
344
  throw Error(
587
- "Block is of an unrecognized type: " + blockInfo.contentType.name
345
+ "Block is of an unrecognized type: " + blockContent.node.type.name
588
346
  );
589
347
  }
590
348
 
@@ -595,32 +353,32 @@ export function nodeToBlock<
595
353
  }
596
354
  }
597
355
 
598
- const blockConfig = blockSchema[blockInfo.contentType.name];
356
+ const blockConfig = blockSchema[blockContent.node.type.name];
599
357
 
600
358
  const children: Block<BSchema, I, S>[] = [];
601
- for (let i = 0; i < blockInfo.numChildBlocks; i++) {
359
+ blockGroup?.node.forEach((child) => {
602
360
  children.push(
603
361
  nodeToBlock(
604
- node.lastChild!.child(i),
362
+ child,
605
363
  blockSchema,
606
364
  inlineContentSchema,
607
365
  styleSchema,
608
366
  blockCache
609
367
  )
610
368
  );
611
- }
369
+ });
612
370
 
613
371
  let content: Block<any, any, any>["content"];
614
372
 
615
373
  if (blockConfig.content === "inline") {
616
374
  content = contentNodeToInlineContent(
617
- blockInfo.contentNode,
375
+ blockContent.node,
618
376
  inlineContentSchema,
619
377
  styleSchema
620
378
  );
621
379
  } else if (blockConfig.content === "table") {
622
380
  content = contentNodeToTableContent(
623
- blockInfo.contentNode,
381
+ blockContent.node,
624
382
  inlineContentSchema,
625
383
  styleSchema
626
384
  );
@@ -1,7 +1,7 @@
1
1
  import * as pmView from "prosemirror-view";
2
2
  import { describe, expect, it } from "vitest";
3
- import { BlockNoteEditor } from "../../..";
4
- import { nestedListsToBlockNoteStructure } from "./util/nestedLists";
3
+ import { BlockNoteEditor } from "../../../index.js";
4
+ import { nestedListsToBlockNoteStructure } from "./util/nestedLists.js";
5
5
 
6
6
  async function parseHTMLAndCompareSnapshots(
7
7
  html: string,
@@ -1,9 +1,13 @@
1
1
  import { DOMParser, Schema } from "prosemirror-model";
2
- import { BlockSchema, InlineContentSchema, StyleSchema } from "../../../schema";
2
+ import {
3
+ BlockSchema,
4
+ InlineContentSchema,
5
+ StyleSchema,
6
+ } from "../../../schema/index.js";
3
7
 
4
- import { Block } from "../../../blocks/defaultBlocks";
5
- import { nodeToBlock } from "../../nodeConversions/nodeConversions";
6
- import { nestedListsToBlockNoteStructure } from "./util/nestedLists";
8
+ import { Block } from "../../../blocks/defaultBlocks.js";
9
+ import { nodeToBlock } from "../../nodeConversions/nodeToBlock.js";
10
+ import { nestedListsToBlockNoteStructure } from "./util/nestedLists.js";
7
11
  export async function HTMLToBlocks<
8
12
  BSchema extends BlockSchema,
9
13
  I extends InlineContentSchema,
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { initializeESMDependencies } from "../../../../util/esmDependencies";
3
- import { nestedListsToBlockNoteStructure } from "./nestedLists";
2
+ import { initializeESMDependencies } from "../../../../util/esmDependencies.js";
3
+ import { nestedListsToBlockNoteStructure } from "./nestedLists.js";
4
4
 
5
5
  async function testHTML(html: string) {
6
6
  const deps = await initializeESMDependencies();
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { BlockNoteEditor } from "../../..";
3
- import { doPaste } from "../../testUtil/paste";
2
+ import { BlockNoteEditor } from "../../../index.js";
3
+ import { doPaste } from "../../testUtil/paste.js";
4
4
 
5
5
  async function parseMarkdownAndCompareSnapshots(
6
6
  md: string,
@@ -1,9 +1,13 @@
1
1
  import { Schema } from "prosemirror-model";
2
2
 
3
- import { Block } from "../../../blocks/defaultBlocks";
4
- import { BlockSchema, InlineContentSchema, StyleSchema } from "../../../schema";
5
- import { initializeESMDependencies } from "../../../util/esmDependencies";
6
- import { HTMLToBlocks } from "../html/parseHTML";
3
+ import { Block } from "../../../blocks/defaultBlocks.js";
4
+ import {
5
+ BlockSchema,
6
+ InlineContentSchema,
7
+ StyleSchema,
8
+ } from "../../../schema/index.js";
9
+ import { initializeESMDependencies } from "../../../util/esmDependencies.js";
10
+ import { HTMLToBlocks } from "../html/parseHTML.js";
7
11
 
8
12
  // modified version of https://github.com/syntax-tree/mdast-util-to-hast/blob/main/lib/handlers/code.js
9
13
  // that outputs a data-language attribute instead of a CSS class (e.g.: language-typescript)
@@ -1,19 +1,19 @@
1
- import { EditorTestCases } from "../index";
1
+ import { EditorTestCases } from "../index.js";
2
2
 
3
- import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY";
3
+ import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js";
4
+ import {
5
+ imagePropSchema,
6
+ imageRender,
7
+ } from "../../../blocks/ImageBlockContent/ImageBlockContent.js";
4
8
  import {
5
9
  DefaultInlineContentSchema,
6
10
  DefaultStyleSchema,
7
11
  defaultBlockSpecs,
8
- } from "../../../blocks/defaultBlocks";
9
- import { defaultProps } from "../../../blocks/defaultProps";
10
- import { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
11
- import { BlockNoteSchema } from "../../../editor/BlockNoteSchema";
12
- import { createBlockSpec } from "../../../schema";
13
- import {
14
- imagePropSchema,
15
- imageRender,
16
- } from "../../../blocks/ImageBlockContent/ImageBlockContent";
12
+ } from "../../../blocks/defaultBlocks.js";
13
+ import { defaultProps } from "../../../blocks/defaultProps.js";
14
+ import { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
15
+ import { BlockNoteSchema } from "../../../editor/BlockNoteSchema.js";
16
+ import { createBlockSpec } from "../../../schema/index.js";
17
17
 
18
18
  // This is a modified version of the default image block that does not implement
19
19
  // a `toExternalHTML` function. It's used to test if the custom serializer by
@@ -1,14 +1,14 @@
1
- import { EditorTestCases } from "../index";
1
+ import { EditorTestCases } from "../index.js";
2
2
 
3
- import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY";
3
+ import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js";
4
4
  import {
5
5
  DefaultBlockSchema,
6
6
  DefaultStyleSchema,
7
7
  defaultInlineContentSpecs,
8
- } from "../../../blocks/defaultBlocks";
9
- import { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
10
- import { BlockNoteSchema } from "../../../editor/BlockNoteSchema";
11
- import { createInlineContentSpec } from "../../../schema/inlineContent/createSpec";
8
+ } from "../../../blocks/defaultBlocks.js";
9
+ import { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
10
+ import { BlockNoteSchema } from "../../../editor/BlockNoteSchema.js";
11
+ import { createInlineContentSpec } from "../../../schema/inlineContent/createSpec.js";
12
12
 
13
13
  const mention = createInlineContentSpec(
14
14
  {
@@ -1,14 +1,14 @@
1
- import { EditorTestCases } from "../index";
1
+ import { EditorTestCases } from "../index.js";
2
2
 
3
- import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY";
3
+ import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js";
4
4
  import {
5
5
  DefaultBlockSchema,
6
6
  DefaultInlineContentSchema,
7
7
  defaultStyleSpecs,
8
- } from "../../../blocks/defaultBlocks";
9
- import { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
10
- import { BlockNoteSchema } from "../../../editor/BlockNoteSchema";
11
- import { createStyleSpec } from "../../../schema/styles/createSpec";
8
+ } from "../../../blocks/defaultBlocks.js";
9
+ import { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
10
+ import { BlockNoteSchema } from "../../../editor/BlockNoteSchema.js";
11
+ import { createStyleSpec } from "../../../schema/styles/createSpec.js";
12
12
 
13
13
  const small = createStyleSpec(
14
14
  {
@@ -1,12 +1,12 @@
1
- import { EditorTestCases } from "../index";
1
+ import { EditorTestCases } from "../index.js";
2
2
 
3
- import { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
3
+ import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js";
4
4
  import {
5
5
  DefaultBlockSchema,
6
6
  DefaultInlineContentSchema,
7
7
  DefaultStyleSchema,
8
- } from "../../../blocks/defaultBlocks";
9
- import { uploadToTmpFilesDotOrg_DEV_ONLY } from "../../../blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY";
8
+ } from "../../../blocks/defaultBlocks.js";
9
+ import { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
10
10
 
11
11
  export const defaultSchemaTestCases: EditorTestCases<
12
12
  DefaultBlockSchema,
@@ -1,9 +1,9 @@
1
- import { PartialBlock } from "../../blocks/defaultBlocks";
2
- import { BlockNoteEditor } from "../../editor/BlockNoteEditor";
3
- import { BlockSchema } from "../../schema/blocks/types";
4
- import { InlineContentSchema } from "../../schema/inlineContent/types";
5
- import { StyleSchema } from "../../schema/styles/types";
6
- import { NoInfer } from "../../util/typescript";
1
+ import { PartialBlock } from "../../blocks/defaultBlocks.js";
2
+ import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
3
+ import { BlockSchema } from "../../schema/blocks/types.js";
4
+ import { InlineContentSchema } from "../../schema/inlineContent/types.js";
5
+ import { StyleSchema } from "../../schema/styles/types.js";
6
+ import { NoInfer } from "../../util/typescript.js";
7
7
 
8
8
  export type EditorTestCases<
9
9
  B extends BlockSchema,
@@ -1,6 +1,6 @@
1
- import { Block, PartialBlock } from "../../blocks/defaultBlocks";
2
- import UniqueID from "../../extensions/UniqueID/UniqueID";
3
- import { BlockSchema, TableContent } from "../../schema/blocks/types";
1
+ import { Block, PartialBlock } from "../../blocks/defaultBlocks.js";
2
+ import UniqueID from "../../extensions/UniqueID/UniqueID.js";
3
+ import { BlockSchema, TableContent } from "../../schema/blocks/types.js";
4
4
  import {
5
5
  InlineContent,
6
6
  InlineContentSchema,
@@ -8,8 +8,8 @@ import {
8
8
  StyledText,
9
9
  isPartialLinkInlineContent,
10
10
  isStyledTextInlineContent,
11
- } from "../../schema/inlineContent/types";
12
- import { StyleSchema } from "../../schema/styles/types";
11
+ } from "../../schema/inlineContent/types.js";
12
+ import { StyleSchema } from "../../schema/styles/types.js";
13
13
 
14
14
  function textShorthandToStyledText(
15
15
  content: string | StyledText<any>[] = ""
@@ -1,12 +1,12 @@
1
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
1
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
2
2
  import {
3
3
  BlockFromConfig,
4
4
  createBlockSpec,
5
5
  FileBlockConfig,
6
6
  Props,
7
7
  PropSchema,
8
- } from "../../schema";
9
- import { defaultProps } from "../defaultProps";
8
+ } from "../../schema/index.js";
9
+ import { defaultProps } from "../defaultProps.js";
10
10
 
11
11
  import {
12
12
  createFigureWithCaption,
@@ -14,8 +14,8 @@ import {
14
14
  createFileBlockWrapper,
15
15
  createLinkWithCaption,
16
16
  parseFigureElement,
17
- } from "../FileBlockContent/fileBlockHelpers";
18
- import { parseAudioElement } from "./audioBlockHelpers";
17
+ } from "../FileBlockContent/fileBlockHelpers.js";
18
+ import { parseAudioElement } from "./audioBlockHelpers.js";
19
19
 
20
20
  export const audioPropSchema = {
21
21
  backgroundColor: defaultProps.backgroundColor,
@@ -1,11 +1,11 @@
1
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
1
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
2
2
  import {
3
3
  BlockFromConfig,
4
4
  FileBlockConfig,
5
5
  PropSchema,
6
6
  createBlockSpec,
7
- } from "../../schema";
8
- import { defaultProps } from "../defaultProps";
7
+ } from "../../schema/index.js";
8
+ import { defaultProps } from "../defaultProps.js";
9
9
  import {
10
10
  createDefaultFilePreview,
11
11
  createFileAndCaptionWrapper,
@@ -13,7 +13,7 @@ import {
13
13
  createLinkWithCaption,
14
14
  parseEmbedElement,
15
15
  parseFigureElement,
16
- } from "./fileBlockHelpers";
16
+ } from "./fileBlockHelpers.js";
17
17
 
18
18
  export const filePropSchema = {
19
19
  backgroundColor: defaultProps.backgroundColor,
@@ -1,9 +1,9 @@
1
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
1
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
2
2
  import {
3
3
  BlockFromConfig,
4
4
  BlockSchemaWithBlock,
5
5
  FileBlockConfig,
6
- } from "../../schema";
6
+ } from "../../schema/index.js";
7
7
 
8
8
  export const createFileBlockWrapper = (
9
9
  block: BlockFromConfig<FileBlockConfig, any, any>,