@tiptap/core 2.0.0-beta.22 → 2.0.0-beta.220

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 (344) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4354 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +4264 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4352 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/packages/core/src/CommandManager.d.ts +14 -7
  9. package/dist/packages/core/src/Editor.d.ts +27 -22
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +93 -21
  12. package/dist/packages/core/src/ExtensionManager.d.ts +8 -14
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +132 -24
  15. package/dist/packages/core/src/Node.d.ts +150 -26
  16. package/dist/packages/core/src/NodeView.d.ts +11 -15
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +11 -0
  19. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  20. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  21. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  22. package/dist/packages/core/src/commands/command.d.ts +2 -2
  23. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  24. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  25. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  26. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  27. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  28. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  29. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  30. package/dist/packages/core/src/commands/extendMarkRange.d.ts +4 -4
  31. package/dist/packages/core/src/commands/first.d.ts +3 -3
  32. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  33. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  34. package/dist/packages/core/src/commands/index.d.ts +50 -0
  35. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  36. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  37. package/dist/packages/core/src/commands/join.d.ts +33 -0
  38. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  39. package/dist/packages/core/src/commands/lift.d.ts +4 -4
  40. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  41. package/dist/packages/core/src/commands/liftListItem.d.ts +4 -4
  42. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/resetAttributes.d.ts +4 -4
  44. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  45. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  46. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  47. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  48. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  50. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  51. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  52. package/dist/packages/core/src/commands/setMark.d.ts +4 -4
  53. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  54. package/dist/packages/core/src/commands/setNode.d.ts +4 -4
  55. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  56. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  57. package/dist/packages/core/src/commands/sinkListItem.d.ts +4 -4
  58. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  59. package/dist/packages/core/src/commands/splitListItem.d.ts +4 -4
  60. package/dist/packages/core/src/commands/toggleList.d.ts +4 -4
  61. package/dist/packages/core/src/commands/toggleMark.d.ts +9 -4
  62. package/dist/packages/core/src/commands/toggleNode.d.ts +4 -4
  63. package/dist/packages/core/src/commands/toggleWrap.d.ts +4 -4
  64. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  65. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  66. package/dist/packages/core/src/commands/unsetMark.d.ts +9 -4
  67. package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
  68. package/dist/packages/core/src/commands/wrapIn.d.ts +4 -4
  69. package/dist/packages/core/src/commands/wrapInList.d.ts +4 -4
  70. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  71. package/dist/packages/core/src/extensions/commands.d.ts +2 -99
  72. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  73. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  74. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  75. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  76. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  78. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  79. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  80. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  81. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -8
  83. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  84. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  85. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  86. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  87. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  89. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  90. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  92. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  93. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  94. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  95. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -4
  96. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -4
  100. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  102. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  103. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  105. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  106. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  107. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  108. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  109. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  110. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  111. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  112. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  113. package/dist/packages/core/src/helpers/isActive.d.ts +2 -3
  114. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  115. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -4
  117. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -4
  118. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  119. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  120. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  121. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  122. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  123. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  124. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  125. package/dist/packages/core/src/index.d.ts +14 -23
  126. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  127. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  128. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  129. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  130. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  131. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  132. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  133. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  134. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  135. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  136. package/dist/packages/core/src/style.d.ts +1 -2
  137. package/dist/packages/core/src/types.d.ts +122 -62
  138. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  139. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  141. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  142. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  146. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  147. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  148. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  149. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  150. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  151. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  152. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  153. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  154. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  155. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  156. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  157. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  158. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  159. package/package.json +29 -24
  160. package/src/CommandManager.ts +76 -86
  161. package/src/Editor.ts +121 -79
  162. package/src/EventEmitter.ts +14 -4
  163. package/src/Extension.ts +276 -112
  164. package/src/ExtensionManager.ts +252 -110
  165. package/src/InputRule.ts +260 -0
  166. package/src/Mark.ts +394 -152
  167. package/src/Node.ts +433 -176
  168. package/src/NodeView.ts +144 -67
  169. package/src/PasteRule.ts +240 -0
  170. package/src/Tracker.ts +38 -0
  171. package/src/commands/blur.ts +12 -6
  172. package/src/commands/clearContent.ts +3 -3
  173. package/src/commands/clearNodes.ts +31 -19
  174. package/src/commands/command.ts +2 -2
  175. package/src/commands/createParagraphNear.ts +5 -4
  176. package/src/commands/deleteCurrentNode.ts +41 -0
  177. package/src/commands/deleteNode.ts +37 -0
  178. package/src/commands/deleteRange.ts +3 -3
  179. package/src/commands/deleteSelection.ts +5 -4
  180. package/src/commands/enter.ts +3 -3
  181. package/src/commands/exitCode.ts +5 -4
  182. package/src/commands/extendMarkRange.ts +16 -12
  183. package/src/commands/first.ts +3 -3
  184. package/src/commands/focus.ts +47 -44
  185. package/src/commands/forEach.ts +24 -0
  186. package/src/commands/index.ts +50 -0
  187. package/src/commands/insertContent.ts +17 -24
  188. package/src/commands/insertContentAt.ts +102 -0
  189. package/src/commands/join.ts +53 -0
  190. package/src/commands/keyboardShortcut.ts +6 -6
  191. package/src/commands/lift.ts +8 -7
  192. package/src/commands/liftEmptyBlock.ts +5 -4
  193. package/src/commands/liftListItem.ts +7 -6
  194. package/src/commands/newlineInCode.ts +5 -4
  195. package/src/commands/resetAttributes.ts +18 -12
  196. package/src/commands/scrollIntoView.ts +3 -3
  197. package/src/commands/selectAll.ts +8 -6
  198. package/src/commands/selectNodeBackward.ts +5 -4
  199. package/src/commands/selectNodeForward.ts +5 -4
  200. package/src/commands/selectParentNode.ts +5 -4
  201. package/src/commands/selectTextblockEnd.ts +20 -0
  202. package/src/commands/selectTextblockStart.ts +20 -0
  203. package/src/commands/setContent.ts +9 -16
  204. package/src/commands/setMark.ts +90 -14
  205. package/src/commands/setMeta.ts +18 -0
  206. package/src/commands/setNode.ts +32 -8
  207. package/src/commands/setNodeSelection.ts +27 -0
  208. package/src/commands/setTextSelection.ts +31 -0
  209. package/src/commands/sinkListItem.ts +7 -6
  210. package/src/commands/splitBlock.ts +31 -41
  211. package/src/commands/splitListItem.ts +58 -29
  212. package/src/commands/toggleList.ts +109 -20
  213. package/src/commands/toggleMark.ts +19 -8
  214. package/src/commands/toggleNode.ts +11 -6
  215. package/src/commands/toggleWrap.ts +10 -10
  216. package/src/commands/undoInputRule.ts +34 -5
  217. package/src/commands/unsetAllMarks.ts +7 -11
  218. package/src/commands/unsetMark.ts +36 -23
  219. package/src/commands/updateAttributes.ts +27 -15
  220. package/src/commands/wrapIn.ts +7 -12
  221. package/src/commands/wrapInList.ts +7 -6
  222. package/src/extensions/clipboardTextSerializer.ts +15 -36
  223. package/src/extensions/commands.ts +3 -147
  224. package/src/extensions/editable.ts +2 -1
  225. package/src/extensions/focusEvents.ts +4 -6
  226. package/src/extensions/index.ts +1 -0
  227. package/src/extensions/keymap.ts +106 -13
  228. package/src/extensions/tabindex.ts +18 -0
  229. package/src/helpers/combineTransactionSteps.ts +21 -0
  230. package/src/helpers/createChainableState.ts +38 -0
  231. package/src/helpers/createDocument.ts +5 -6
  232. package/src/helpers/createNodeFromContent.ts +20 -28
  233. package/src/helpers/defaultBlockAt.ts +13 -0
  234. package/src/helpers/findChildren.ts +3 -7
  235. package/src/helpers/findChildrenInRange.ts +36 -0
  236. package/src/helpers/findParentNode.ts +4 -3
  237. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  238. package/src/helpers/generateHTML.ts +7 -6
  239. package/src/helpers/generateJSON.ts +12 -0
  240. package/src/helpers/generateText.ts +27 -0
  241. package/src/helpers/getAttributes.ts +26 -0
  242. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  243. package/src/helpers/getChangedRanges.ts +83 -0
  244. package/src/helpers/getDebugJSON.ts +54 -0
  245. package/src/helpers/getExtensionField.ts +25 -0
  246. package/src/helpers/getHTMLFromFragment.ts +5 -6
  247. package/src/helpers/getMarkAttributes.ts +18 -11
  248. package/src/helpers/getMarkRange.ts +41 -8
  249. package/src/helpers/getMarkType.ts +8 -2
  250. package/src/helpers/getMarksBetween.ts +34 -10
  251. package/src/helpers/getNodeAttributes.ts +14 -13
  252. package/src/helpers/getNodeType.ts +8 -2
  253. package/src/helpers/getRenderedAttributes.ts +9 -7
  254. package/src/helpers/getSchema.ts +7 -133
  255. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  256. package/src/helpers/getSchemaTypeByName.ts +3 -11
  257. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  258. package/src/helpers/getSplittedAttributes.ts +4 -4
  259. package/src/helpers/getText.ts +19 -0
  260. package/src/helpers/getTextBetween.ts +46 -0
  261. package/src/helpers/getTextContentFromNodes.ts +26 -0
  262. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  263. package/src/helpers/index.ts +47 -0
  264. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  265. package/src/helpers/isActive.ts +10 -6
  266. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  267. package/src/helpers/isList.ts +14 -7
  268. package/src/helpers/isMarkActive.ts +49 -27
  269. package/src/helpers/isNodeActive.ts +29 -39
  270. package/src/helpers/isNodeEmpty.ts +2 -2
  271. package/src/helpers/isNodeSelection.ts +3 -4
  272. package/src/helpers/isTextSelection.ts +3 -4
  273. package/src/helpers/posToDOMRect.ts +35 -0
  274. package/src/helpers/resolveFocusPosition.ts +42 -0
  275. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  276. package/src/helpers/splitExtensions.ts +3 -3
  277. package/src/index.ts +15 -26
  278. package/src/inputRules/index.ts +5 -0
  279. package/src/inputRules/markInputRule.ts +59 -40
  280. package/src/inputRules/nodeInputRule.ts +45 -12
  281. package/src/inputRules/textInputRule.ts +35 -0
  282. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  283. package/src/inputRules/wrappingInputRule.ts +84 -0
  284. package/src/pasteRules/index.ts +3 -0
  285. package/src/pasteRules/markPasteRule.ts +61 -53
  286. package/src/pasteRules/nodePasteRule.ts +37 -0
  287. package/src/pasteRules/textPasteRule.ts +35 -0
  288. package/src/style.ts +16 -3
  289. package/src/types.ts +175 -97
  290. package/src/utilities/callOrReturn.ts +6 -3
  291. package/src/utilities/createStyleTag.ts +12 -1
  292. package/src/utilities/deleteProps.ts +2 -4
  293. package/src/utilities/elementFromString.ts +4 -5
  294. package/src/utilities/escapeForRegEx.ts +4 -0
  295. package/src/utilities/findDuplicates.ts +5 -0
  296. package/src/utilities/fromString.ts +2 -2
  297. package/src/utilities/index.ts +20 -0
  298. package/src/utilities/isEmptyObject.ts +2 -2
  299. package/src/utilities/isFunction.ts +3 -0
  300. package/src/utilities/isMacOS.ts +5 -0
  301. package/src/utilities/isNumber.ts +3 -0
  302. package/src/utilities/isPlainObject.ts +8 -5
  303. package/src/utilities/isRegExp.ts +3 -0
  304. package/src/utilities/isString.ts +3 -0
  305. package/src/utilities/isiOS.ts +12 -0
  306. package/src/utilities/mergeAttributes.ts +2 -3
  307. package/src/utilities/mergeDeep.ts +2 -3
  308. package/src/utilities/minMax.ts +1 -1
  309. package/src/utilities/objectIncludes.ts +17 -5
  310. package/src/utilities/removeDuplicates.ts +15 -0
  311. package/CHANGELOG.md +0 -373
  312. package/LICENSE.md +0 -21
  313. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  314. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  315. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  316. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  317. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  318. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  319. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  320. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  321. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  322. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  323. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  324. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  325. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  326. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  327. package/dist/tiptap-core.cjs.js +0 -3048
  328. package/dist/tiptap-core.cjs.js.map +0 -1
  329. package/dist/tiptap-core.esm.js +0 -3021
  330. package/dist/tiptap-core.esm.js.map +0 -1
  331. package/dist/tiptap-core.umd.js +0 -3045
  332. package/dist/tiptap-core.umd.js.map +0 -1
  333. package/src/commands/insertHTML.ts +0 -30
  334. package/src/commands/insertNode.ts +0 -33
  335. package/src/commands/insertText.ts +0 -22
  336. package/src/commands/joinBackward.ts +0 -17
  337. package/src/commands/joinForward.ts +0 -17
  338. package/src/commands/replace.ts +0 -20
  339. package/src/commands/replaceRange.ts +0 -36
  340. package/src/commands/resetNodeAttributes.ts +0 -33
  341. package/src/commands/updateNodeAttributes.ts +0 -35
  342. package/src/utilities/isClass.ts +0 -7
  343. package/src/utilities/isObject.ts +0 -10
  344. package/src/utilities/removeElement.ts +0 -5
@@ -1,61 +1,69 @@
1
- import { Plugin, PluginKey } from 'prosemirror-state'
2
- import { Slice, Fragment, MarkType } from 'prosemirror-model'
3
-
4
- export default function (regexp: RegExp, type: MarkType, getAttrs?: (match: any) => any): Plugin {
5
- const handler = (fragment: Fragment, parent?: any) => {
6
- const nodes: any[] = []
7
-
8
- fragment.forEach(child => {
9
- if (child.isText && child.text) {
10
- const { text } = child
11
- let pos = 0
12
- let match
13
-
14
- // eslint-disable-next-line
15
- while ((match = regexp.exec(text)) !== null) {
16
- const outerMatch = Math.max(match.length - 2, 0)
17
- const innerMatch = Math.max(match.length - 1, 0)
18
-
19
- if (parent?.type.allowsMarkType(type)) {
20
- const start = match.index
21
- const matchStart = start + match[0].indexOf(match[outerMatch])
22
- const matchEnd = matchStart + match[outerMatch].length
23
- const textStart = matchStart + match[outerMatch].lastIndexOf(match[innerMatch])
24
- const textEnd = textStart + match[innerMatch].length
25
- const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs
26
-
27
- // adding text before markdown to nodes
28
- if (matchStart > 0) {
29
- nodes.push(child.cut(pos, matchStart))
30
- }
31
-
32
- // adding the markdown part to nodes
33
- nodes.push(child
34
- .cut(textStart, textEnd)
35
- .mark(type.create(attrs).addToSet(child.marks)))
36
-
37
- pos = matchEnd
38
- }
1
+ import { MarkType } from '@tiptap/pm/model'
2
+
3
+ import { getMarksBetween } from '../helpers/getMarksBetween'
4
+ import { PasteRule, PasteRuleFinder } from '../PasteRule'
5
+ import { ExtendedRegExpMatchArray } from '../types'
6
+ import { callOrReturn } from '../utilities/callOrReturn'
7
+
8
+ /**
9
+ * Build an paste rule that adds a mark when the
10
+ * matched text is pasted into it.
11
+ */
12
+ export function markPasteRule(config: {
13
+ find: PasteRuleFinder
14
+ type: MarkType
15
+ getAttributes?:
16
+ | Record<string, any>
17
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
18
+ | false
19
+ | null
20
+ }) {
21
+ return new PasteRule({
22
+ find: config.find,
23
+ handler: ({ state, range, match }) => {
24
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
25
+
26
+ if (attributes === false || attributes === null) {
27
+ return null
28
+ }
29
+
30
+ const { tr } = state
31
+ const captureGroup = match[match.length - 1]
32
+ const fullMatch = match[0]
33
+ let markEnd = range.to
34
+
35
+ if (captureGroup) {
36
+ const startSpaces = fullMatch.search(/\S/)
37
+ const textStart = range.from + fullMatch.indexOf(captureGroup)
38
+ const textEnd = textStart + captureGroup.length
39
+
40
+ const excludedMarks = getMarksBetween(range.from, range.to, state.doc)
41
+ .filter(item => {
42
+ // @ts-ignore
43
+ const excluded = item.mark.type.excluded as MarkType[]
44
+
45
+ return excluded.find(type => type === config.type && type !== item.mark.type)
46
+ })
47
+ .filter(item => item.to > textStart)
48
+
49
+ if (excludedMarks.length) {
50
+ return null
39
51
  }
40
52
 
41
- // adding rest of text to nodes
42
- if (pos < text.length) {
43
- nodes.push(child.cut(pos))
53
+ if (textEnd < range.to) {
54
+ tr.delete(textEnd, range.to)
44
55
  }
45
- } else {
46
- nodes.push(child.copy(handler(child.content, child)))
47
- }
48
- })
49
56
 
50
- return Fragment.fromArray(nodes)
51
- }
57
+ if (textStart > range.from) {
58
+ tr.delete(range.from + startSpaces, textStart)
59
+ }
52
60
 
53
- return new Plugin({
54
- key: new PluginKey('markPasteRule'),
55
- props: {
56
- transformPasted: slice => {
57
- return new Slice(handler(slice.content), slice.openStart, slice.openEnd)
58
- },
61
+ markEnd = range.from + startSpaces + captureGroup.length
62
+
63
+ tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))
64
+
65
+ tr.removeStoredMark(config.type)
66
+ }
59
67
  },
60
68
  })
61
69
  }
@@ -0,0 +1,37 @@
1
+ import { NodeType } from '@tiptap/pm/model'
2
+
3
+ import { PasteRule, PasteRuleFinder } from '../PasteRule'
4
+ import { ExtendedRegExpMatchArray } from '../types'
5
+ import { callOrReturn } from '../utilities'
6
+
7
+ /**
8
+ * Build an paste rule that adds a node when the
9
+ * matched text is pasted into it.
10
+ */
11
+ export function nodePasteRule(config: {
12
+ find: PasteRuleFinder
13
+ type: NodeType
14
+ getAttributes?:
15
+ | Record<string, any>
16
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
17
+ | false
18
+ | null
19
+ }) {
20
+ return new PasteRule({
21
+ find: config.find,
22
+ handler({ match, chain, range }) {
23
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
24
+
25
+ if (attributes === false || attributes === null) {
26
+ return null
27
+ }
28
+
29
+ if (match.input) {
30
+ chain().deleteRange(range).insertContentAt(range.from, {
31
+ type: config.type.name,
32
+ attrs: attributes,
33
+ })
34
+ }
35
+ },
36
+ })
37
+ }
@@ -0,0 +1,35 @@
1
+ import { PasteRule, PasteRuleFinder } from '../PasteRule'
2
+
3
+ /**
4
+ * Build an paste rule that replaces text when the
5
+ * matched text is pasted into it.
6
+ */
7
+ export function textPasteRule(config: {
8
+ find: PasteRuleFinder,
9
+ replace: string,
10
+ }) {
11
+ return new PasteRule({
12
+ find: config.find,
13
+ handler: ({ state, range, match }) => {
14
+ let insert = config.replace
15
+ let start = range.from
16
+ const end = range.to
17
+
18
+ if (match[1]) {
19
+ const offset = match[0].lastIndexOf(match[1])
20
+
21
+ insert += match[0].slice(offset + match[1].length)
22
+ start += offset
23
+
24
+ const cutOff = start - end
25
+
26
+ if (cutOff > 0) {
27
+ insert = match[0].slice(offset - cutOff, offset) + insert
28
+ start = end
29
+ }
30
+ }
31
+
32
+ state.tr.insertText(insert, start, end)
33
+ },
34
+ })
35
+ }
package/src/style.ts CHANGED
@@ -1,12 +1,14 @@
1
- const style = `.ProseMirror {
1
+ export const style = `.ProseMirror {
2
2
  position: relative;
3
3
  }
4
4
 
5
5
  .ProseMirror {
6
6
  word-wrap: break-word;
7
7
  white-space: pre-wrap;
8
+ white-space: break-spaces;
8
9
  -webkit-font-variant-ligatures: none;
9
10
  font-variant-ligatures: none;
11
+ font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */
10
12
  }
11
13
 
12
14
  .ProseMirror [contenteditable="false"] {
@@ -21,10 +23,19 @@ const style = `.ProseMirror {
21
23
  white-space: pre-wrap;
22
24
  }
23
25
 
26
+ img.ProseMirror-separator {
27
+ display: inline !important;
28
+ border: none !important;
29
+ margin: 0 !important;
30
+ width: 1px !important;
31
+ height: 1px !important;
32
+ }
33
+
24
34
  .ProseMirror-gapcursor {
25
35
  display: none;
26
36
  pointer-events: none;
27
37
  position: absolute;
38
+ margin: 0;
28
39
  }
29
40
 
30
41
  .ProseMirror-gapcursor:after {
@@ -57,6 +68,8 @@ const style = `.ProseMirror {
57
68
 
58
69
  .ProseMirror-focused .ProseMirror-gapcursor {
59
70
  display: block;
60
- }`
71
+ }
61
72
 
62
- export default style
73
+ .tippy-box[data-animation=fade][data-state=hidden] {
74
+ opacity: 0
75
+ }`
package/src/types.ts CHANGED
@@ -1,168 +1,246 @@
1
1
  import {
2
- Node as ProseMirrorNode,
3
- Mark as ProseMirrorMark,
4
- ParseOptions,
5
- } from 'prosemirror-model'
2
+ Mark as ProseMirrorMark, Node as ProseMirrorNode, NodeType, ParseOptions,
3
+ } from '@tiptap/pm/model'
4
+ import { EditorState, Transaction } from '@tiptap/pm/state'
6
5
  import {
7
- EditorView,
8
- Decoration,
9
- NodeView,
10
- EditorProps,
11
- } from 'prosemirror-view'
12
- import { EditorState, Transaction } from 'prosemirror-state'
6
+ Decoration, EditorProps, EditorView, NodeView,
7
+ } from '@tiptap/pm/view'
8
+
9
+ import {
10
+ Commands, ExtensionConfig, MarkConfig, NodeConfig,
11
+ } from '.'
12
+ import { Editor } from './Editor'
13
13
  import { Extension } from './Extension'
14
- import { Node } from './Node'
15
14
  import { Mark } from './Mark'
16
- import { Editor } from './Editor'
17
- import { Commands } from '.'
15
+ import { Node } from './Node'
16
+
17
+ export type AnyConfig = ExtensionConfig | NodeConfig | MarkConfig
18
+ export type AnyExtension = Extension | Node | Mark
19
+ export type Extensions = AnyExtension[]
20
+
21
+ export type ParentConfig<T> = Partial<{
22
+ [P in keyof T]: Required<T>[P] extends (...args: any) => any
23
+ ? (...args: Parameters<Required<T>[P]>) => ReturnType<Required<T>[P]>
24
+ : T[P]
25
+ }>
26
+
27
+ export type Primitive = null | undefined | string | number | boolean | symbol | bigint
28
+
29
+ export type RemoveThis<T> = T extends (...args: any) => any
30
+ ? (...args: Parameters<T>) => ReturnType<T>
31
+ : T
32
+
33
+ export type MaybeReturnType<T> = T extends (...args: any) => any ? ReturnType<T> : T
34
+
35
+ export type MaybeThisParameterType<T> = Exclude<T, Primitive> extends (...args: any) => any
36
+ ? ThisParameterType<Exclude<T, Primitive>>
37
+ : any
38
+
39
+ export interface EditorEvents {
40
+ beforeCreate: { editor: Editor }
41
+ create: { editor: Editor }
42
+ update: { editor: Editor; transaction: Transaction }
43
+ selectionUpdate: { editor: Editor; transaction: Transaction }
44
+ transaction: { editor: Editor; transaction: Transaction }
45
+ focus: { editor: Editor; event: FocusEvent; transaction: Transaction }
46
+ blur: { editor: Editor; event: FocusEvent; transaction: Transaction }
47
+ destroy: void
48
+ }
18
49
 
19
- export type Extensions = (Extension | Node | Mark)[]
50
+ export type EnableRules = (AnyExtension | string)[] | boolean
20
51
 
21
52
  export interface EditorOptions {
22
- element: Element,
23
- content: Content,
24
- extensions: Extensions,
25
- injectCSS: boolean,
26
- autofocus: FocusPosition,
27
- editable: boolean,
28
- editorProps: EditorProps,
29
- parseOptions: ParseOptions,
30
- enableInputRules: boolean,
31
- enablePasteRules: boolean,
32
- onBeforeCreate: (props: { editor: Editor }) => void,
33
- onCreate: (props: { editor: Editor }) => void,
34
- onUpdate: (props: { editor: Editor }) => void,
35
- onSelectionUpdate: (props: { editor: Editor }) => void,
36
- onTransaction: (props: { editor: Editor, transaction: Transaction }) => void,
37
- onFocus: (props: { editor: Editor, event: FocusEvent }) => void,
38
- onBlur: (props: { editor: Editor, event: FocusEvent }) => void,
39
- onResize: (props: { editor: Editor }) => void,
40
- onDestroy: () => void,
41
- }
42
-
43
- export type Content = string | JSON | null
53
+ element: Element
54
+ content: Content
55
+ extensions: Extensions
56
+ injectCSS: boolean
57
+ injectNonce: string | undefined
58
+ autofocus: FocusPosition
59
+ editable: boolean
60
+ editorProps: EditorProps
61
+ parseOptions: ParseOptions
62
+ enableInputRules: EnableRules
63
+ enablePasteRules: EnableRules
64
+ enableCoreExtensions: boolean
65
+ onBeforeCreate: (props: EditorEvents['beforeCreate']) => void
66
+ onCreate: (props: EditorEvents['create']) => void
67
+ onUpdate: (props: EditorEvents['update']) => void
68
+ onSelectionUpdate: (props: EditorEvents['selectionUpdate']) => void
69
+ onTransaction: (props: EditorEvents['transaction']) => void
70
+ onFocus: (props: EditorEvents['focus']) => void
71
+ onBlur: (props: EditorEvents['blur']) => void
72
+ onDestroy: (props: EditorEvents['destroy']) => void
73
+ }
74
+
75
+ export type HTMLContent = string
76
+
77
+ export type JSONContent = {
78
+ type?: string
79
+ attrs?: Record<string, any>
80
+ content?: JSONContent[]
81
+ marks?: {
82
+ type: string
83
+ attrs?: Record<string, any>
84
+ [key: string]: any
85
+ }[]
86
+ text?: string
87
+ [key: string]: any
88
+ }
89
+
90
+ export type Content = HTMLContent | JSONContent | JSONContent[] | null
44
91
 
45
92
  export type CommandProps = {
46
- editor: Editor,
47
- tr: Transaction,
48
- commands: SingleCommands,
49
- can: () => CanCommands,
50
- chain: () => ChainedCommands,
51
- state: EditorState,
52
- view: EditorView,
53
- dispatch: ((args?: any) => any) | undefined,
93
+ editor: Editor
94
+ tr: Transaction
95
+ commands: SingleCommands
96
+ can: () => CanCommands
97
+ chain: () => ChainedCommands
98
+ state: EditorState
99
+ view: EditorView
100
+ dispatch: ((args?: any) => any) | undefined
54
101
  }
55
102
 
56
103
  export type Command = (props: CommandProps) => boolean
57
104
 
58
105
  export type CommandSpec = (...args: any[]) => Command
59
106
 
107
+ export type KeyboardShortcutCommand = (props: { editor: Editor }) => boolean
108
+
60
109
  export type Attribute = {
61
- default: any,
62
- rendered?: boolean,
63
- renderHTML?: ((attributes: { [key: string]: any }) => { [key: string]: any } | null) | null,
64
- parseHTML?: ((element: HTMLElement) => { [key: string]: any } | null) | null,
65
- keepOnSplit: boolean,
110
+ default: any
111
+ rendered?: boolean
112
+ renderHTML?: ((attributes: Record<string, any>) => Record<string, any> | null) | null
113
+ parseHTML?: ((element: HTMLElement) => any | null) | null
114
+ keepOnSplit: boolean
115
+ isRequired?: boolean
66
116
  }
67
117
 
68
118
  export type Attributes = {
69
- [key: string]: Attribute,
119
+ [key: string]: Attribute
70
120
  }
71
121
 
72
122
  export type ExtensionAttribute = {
73
- type: string,
74
- name: string,
75
- attribute: Required<Attribute>,
123
+ type: string
124
+ name: string
125
+ attribute: Required<Attribute>
76
126
  }
77
127
 
78
128
  export type GlobalAttributes = {
79
- types: string[],
129
+ types: string[]
80
130
  attributes: {
81
131
  [key: string]: Attribute
82
- },
132
+ }
83
133
  }[]
84
134
 
85
135
  export type PickValue<T, K extends keyof T> = T[K]
86
136
 
87
- export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I)=>void)
137
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
138
+ k: infer I,
139
+ ) => void
88
140
  ? I
89
141
  : never
90
142
 
91
- export type Diff<T extends keyof any, U extends keyof any> =
92
- ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T]
143
+ export type Diff<T extends keyof any, U extends keyof any> = ({ [P in T]: P } & {
144
+ [P in U]: never
145
+ } & { [x: string]: never })[T]
93
146
 
94
- export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
147
+ export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U
95
148
 
96
- export type AnyObject = {
97
- [key: string]: any
98
- }
149
+ export type ValuesOf<T> = T[keyof T]
99
150
 
100
- export type ValuesOf<T> = T[keyof T];
151
+ export type KeysWithTypeOf<T, Type> = { [P in keyof T]: T[P] extends Type ? P : never }[keyof T]
101
152
 
102
- export type KeysWithTypeOf<T, Type> = ({[P in keyof T]: T[P] extends Type ? P : never })[keyof T]
153
+ export type DecorationWithType = Decoration & {
154
+ type: NodeType
155
+ }
103
156
 
104
157
  export type NodeViewProps = {
105
- editor: Editor,
106
- node: ProseMirrorNode,
107
- decorations: Decoration[],
108
- selected: boolean,
109
- extension: Node,
110
- getPos: () => number,
111
- updateAttributes: (attributes: AnyObject) => void,
158
+ editor: Editor
159
+ node: ProseMirrorNode
160
+ decorations: DecorationWithType[]
161
+ selected: boolean
162
+ extension: Node
163
+ getPos: () => number
164
+ updateAttributes: (attributes: Record<string, any>) => void
165
+ deleteNode: () => void
166
+ }
167
+
168
+ export interface NodeViewRendererOptions {
169
+ stopEvent: ((props: { event: Event }) => boolean) | null
170
+ ignoreMutation:
171
+ | ((props: { mutation: MutationRecord | { type: 'selection'; target: Element } }) => boolean)
172
+ | null
112
173
  }
113
174
 
114
175
  export type NodeViewRendererProps = {
115
- editor: Editor,
116
- node: ProseMirrorNode,
117
- getPos: (() => number) | boolean,
118
- HTMLAttributes: { [key: string]: any },
119
- decorations: Decoration[],
120
- extension: Node,
176
+ editor: Editor
177
+ node: ProseMirrorNode
178
+ getPos: (() => number) | boolean
179
+ HTMLAttributes: Record<string, any>
180
+ decorations: Decoration[]
181
+ extension: Node
121
182
  }
122
183
 
123
- export type NodeViewRenderer = (props: NodeViewRendererProps) => (NodeView | {})
184
+ export type NodeViewRenderer = (props: NodeViewRendererProps) => NodeView | {}
124
185
 
125
- export type UnionCommands = UnionToIntersection<ValuesOf<Pick<Commands, KeysWithTypeOf<Commands, {}>>>>
186
+ export type AnyCommands = Record<string, (...args: any[]) => Command>
187
+
188
+ export type UnionCommands<T = Command> = UnionToIntersection<
189
+ ValuesOf<Pick<Commands<T>, KeysWithTypeOf<Commands<T>, {}>>>
190
+ >
126
191
 
127
192
  export type RawCommands = {
128
- [Item in keyof UnionCommands]: UnionCommands[Item] extends (...args: any[]) => any
129
- ? (...args: Parameters<UnionCommands[Item]>) => Command
130
- : never
193
+ [Item in keyof UnionCommands]: UnionCommands<Command>[Item]
131
194
  }
132
195
 
133
196
  export type SingleCommands = {
134
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
135
- ? (...args: Parameters<RawCommands[Item]>) => boolean
136
- : never
197
+ [Item in keyof UnionCommands]: UnionCommands<boolean>[Item]
137
198
  }
138
199
 
139
200
  export type ChainedCommands = {
140
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
141
- ? (...args: Parameters<RawCommands[Item]>) => ChainedCommands
142
- : never
201
+ [Item in keyof UnionCommands]: UnionCommands<ChainedCommands>[Item]
143
202
  } & {
144
203
  run: () => boolean
145
204
  }
146
205
 
147
206
  export type CanCommands = SingleCommands & { chain: () => ChainedCommands }
148
207
 
149
- export type FocusPosition = 'start' | 'end' | number | boolean | null
208
+ export type FocusPosition = 'start' | 'end' | 'all' | number | boolean | null
150
209
 
151
210
  export type Range = {
152
- from: number,
153
- to: number,
211
+ from: number
212
+ to: number
154
213
  }
155
214
 
156
215
  export type NodeRange = {
157
- node: ProseMirrorNode,
158
- from: number,
159
- to: number,
216
+ node: ProseMirrorNode
217
+ from: number
218
+ to: number
160
219
  }
161
220
 
162
221
  export type MarkRange = {
163
- mark: ProseMirrorMark,
164
- from: number,
165
- to: number,
222
+ mark: ProseMirrorMark
223
+ from: number
224
+ to: number
166
225
  }
167
226
 
168
227
  export type Predicate = (node: ProseMirrorNode) => boolean
228
+
229
+ export type NodeWithPos = {
230
+ node: ProseMirrorNode
231
+ pos: number
232
+ }
233
+
234
+ export type TextSerializer = (props: {
235
+ node: ProseMirrorNode
236
+ pos: number
237
+ parent: ProseMirrorNode
238
+ index: number
239
+ range: Range
240
+ }) => string
241
+
242
+ export type ExtendedRegExpMatchArray = RegExpMatchArray & {
243
+ data?: Record<string, any>
244
+ }
245
+
246
+ export type Dispatch = ((args?: any) => any) | undefined
@@ -1,3 +1,6 @@
1
+ import { MaybeReturnType } from '../types'
2
+ import { isFunction } from './isFunction'
3
+
1
4
  /**
2
5
  * Optionally calls `value` as a function.
3
6
  * Otherwise it is returned directly.
@@ -5,8 +8,8 @@
5
8
  * @param context Optional context to bind to function.
6
9
  * @param props Optional props to pass to function.
7
10
  */
8
- export default function callOrReturn(value: any, context: any = undefined, ...props: any[]): any {
9
- if (typeof value === 'function') {
11
+ export function callOrReturn<T>(value: T, context: any = undefined, ...props: any[]): MaybeReturnType<T> {
12
+ if (isFunction(value)) {
10
13
  if (context) {
11
14
  return value.bind(context)(...props)
12
15
  }
@@ -14,5 +17,5 @@ export default function callOrReturn(value: any, context: any = undefined, ...pr
14
17
  return value(...props)
15
18
  }
16
19
 
17
- return value
20
+ return value as MaybeReturnType<T>
18
21
  }
@@ -1,6 +1,17 @@
1
- export default function createStyleTag(style: string): HTMLStyleElement {
1
+ export function createStyleTag(style: string, nonce?: string): HTMLStyleElement {
2
+ const tipTapStyleTag = (<HTMLStyleElement>document.querySelector('style[data-tiptap-style]'))
3
+
4
+ if (tipTapStyleTag !== null) {
5
+ return tipTapStyleTag
6
+ }
7
+
2
8
  const styleNode = document.createElement('style')
3
9
 
10
+ if (nonce) {
11
+ styleNode.setAttribute('nonce', nonce)
12
+ }
13
+
14
+ styleNode.setAttribute('data-tiptap-style', '')
4
15
  styleNode.innerHTML = style
5
16
  document.getElementsByTagName('head')[0].appendChild(styleNode)
6
17
 
@@ -1,18 +1,16 @@
1
- import { AnyObject } from '../types'
2
-
3
1
  /**
4
2
  * Remove a property or an array of properties from an object
5
3
  * @param obj Object
6
4
  * @param key Key to remove
7
5
  */
8
- export default function deleteProps(obj: AnyObject, propOrProps: string | string[]): AnyObject {
6
+ export function deleteProps(obj: Record<string, any>, propOrProps: string | string[]): Record<string, any> {
9
7
  const props = typeof propOrProps === 'string'
10
8
  ? [propOrProps]
11
9
  : propOrProps
12
10
 
13
11
  return Object
14
12
  .keys(obj)
15
- .reduce((newObj: AnyObject, prop) => {
13
+ .reduce((newObj: Record<string, any>, prop) => {
16
14
  if (!props.includes(prop)) {
17
15
  newObj[prop] = obj[prop]
18
16
  }
@@ -1,7 +1,6 @@
1
- export default function elementFromString(value: string): HTMLElement {
2
- const htmlString = `<div>${value}</div>`
3
- const parser = new window.DOMParser()
4
- const element = parser.parseFromString(htmlString, 'text/html').body
1
+ export function elementFromString(value: string): HTMLElement {
2
+ // add a wrapper to preserve leading and trailing whitespace
3
+ const wrappedValue = `<body>${value}</body>`
5
4
 
6
- return element
5
+ return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body
7
6
  }
@@ -0,0 +1,4 @@
1
+ // source: https://stackoverflow.com/a/6969486
2
+ export function escapeForRegEx(string: string): string {
3
+ return string.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
4
+ }