@tiptap/core 2.0.0-beta.2 → 2.0.0-beta.200

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 (331) hide show
  1. package/README.md +2 -2
  2. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  3. package/dist/packages/core/src/Editor.d.ts +27 -25
  4. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  5. package/dist/packages/core/src/Extension.d.ts +103 -26
  6. package/dist/packages/core/src/ExtensionManager.d.ts +8 -12
  7. package/dist/packages/core/src/InputRule.d.ts +42 -0
  8. package/dist/packages/core/src/Mark.d.ts +148 -31
  9. package/dist/packages/core/src/Node.d.ts +162 -33
  10. package/dist/packages/core/src/NodeView.d.ts +27 -0
  11. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  12. package/dist/packages/core/src/Tracker.d.ts +11 -0
  13. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  14. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  16. package/dist/packages/core/src/commands/command.d.ts +2 -2
  17. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  18. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  19. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  20. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  21. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  22. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  23. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  24. package/dist/packages/core/src/commands/first.d.ts +3 -3
  25. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  26. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  27. package/dist/packages/core/src/commands/index.d.ts +50 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +16 -0
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  44. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  45. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  46. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  50. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  54. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  56. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  57. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  58. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  59. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  61. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  62. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  63. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  64. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/commands.d.ts +2 -91
  66. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  67. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  69. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  71. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  73. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -0
  74. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
  75. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  76. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  77. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  78. package/dist/packages/core/src/helpers/findParentNode.d.ts +2 -3
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  83. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  84. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  85. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  86. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  87. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  89. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +2 -3
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  93. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +2 -3
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  96. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  98. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  102. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  104. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  105. package/dist/packages/core/src/helpers/index.d.ts +33 -0
  106. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  107. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  108. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  109. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  110. package/dist/packages/core/src/helpers/isMarkActive.d.ts +2 -3
  111. package/dist/packages/core/src/helpers/isNodeActive.d.ts +2 -3
  112. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -0
  113. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  114. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  115. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  116. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  117. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  118. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  119. package/dist/packages/core/src/index.d.ts +15 -20
  120. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  121. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  122. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  123. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  124. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  125. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  126. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  127. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  128. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  129. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  130. package/dist/packages/core/src/style.d.ts +1 -2
  131. package/dist/packages/core/src/types.d.ts +120 -53
  132. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  133. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  135. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  139. package/dist/packages/core/src/utilities/index.d.ts +3 -0
  140. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  146. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  147. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  148. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  149. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  150. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  151. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  152. package/dist/tiptap-core.cjs.js +2896 -1261
  153. package/dist/tiptap-core.cjs.js.map +1 -1
  154. package/dist/tiptap-core.esm.js +2889 -1290
  155. package/dist/tiptap-core.esm.js.map +1 -1
  156. package/dist/tiptap-core.umd.js +2899 -1263
  157. package/dist/tiptap-core.umd.js.map +1 -1
  158. package/package.json +16 -20
  159. package/src/CommandManager.ts +64 -65
  160. package/src/Editor.ts +133 -98
  161. package/src/EventEmitter.ts +14 -4
  162. package/src/Extension.ts +198 -41
  163. package/src/ExtensionManager.ts +263 -78
  164. package/src/InputRule.ts +265 -0
  165. package/src/Mark.ts +285 -49
  166. package/src/Node.ts +284 -56
  167. package/src/NodeView.ts +261 -0
  168. package/src/PasteRule.ts +280 -0
  169. package/src/Tracker.ts +42 -0
  170. package/src/commands/blur.ts +12 -6
  171. package/src/commands/clearContent.ts +3 -3
  172. package/src/commands/clearNodes.ts +32 -18
  173. package/src/commands/command.ts +2 -2
  174. package/src/commands/createParagraphNear.ts +4 -3
  175. package/src/commands/deleteNode.ts +37 -0
  176. package/src/commands/deleteRange.ts +3 -3
  177. package/src/commands/deleteSelection.ts +4 -3
  178. package/src/commands/enter.ts +3 -3
  179. package/src/commands/exitCode.ts +4 -3
  180. package/src/commands/extendMarkRange.ts +12 -11
  181. package/src/commands/first.ts +3 -3
  182. package/src/commands/focus.ts +47 -44
  183. package/src/commands/forEach.ts +24 -0
  184. package/src/commands/index.ts +50 -0
  185. package/src/commands/insertContent.ts +24 -0
  186. package/src/commands/insertContentAt.ts +108 -0
  187. package/src/commands/joinBackward.ts +4 -3
  188. package/src/commands/joinForward.ts +4 -3
  189. package/src/commands/keyboardShortcut.ts +6 -6
  190. package/src/commands/lift.ts +6 -5
  191. package/src/commands/liftEmptyBlock.ts +4 -3
  192. package/src/commands/liftListItem.ts +6 -5
  193. package/src/commands/newlineInCode.ts +4 -3
  194. package/src/commands/resetAttributes.ts +62 -0
  195. package/src/commands/scrollIntoView.ts +3 -3
  196. package/src/commands/selectAll.ts +8 -6
  197. package/src/commands/selectNodeBackward.ts +4 -3
  198. package/src/commands/selectNodeForward.ts +4 -3
  199. package/src/commands/selectParentNode.ts +4 -3
  200. package/src/commands/selectTextblockEnd.ts +20 -0
  201. package/src/commands/selectTextblockStart.ts +20 -0
  202. package/src/commands/setContent.ts +12 -9
  203. package/src/commands/setMark.ts +83 -15
  204. package/src/commands/setMeta.ts +18 -0
  205. package/src/commands/setNode.ts +29 -7
  206. package/src/commands/setNodeSelection.ts +27 -0
  207. package/src/commands/setTextSelection.ts +33 -0
  208. package/src/commands/sinkListItem.ts +6 -5
  209. package/src/commands/splitBlock.ts +20 -23
  210. package/src/commands/splitListItem.ts +45 -18
  211. package/src/commands/toggleList.ts +83 -18
  212. package/src/commands/toggleMark.ts +18 -7
  213. package/src/commands/toggleNode.ts +6 -5
  214. package/src/commands/toggleWrap.ts +9 -9
  215. package/src/commands/undoInputRule.ts +34 -5
  216. package/src/commands/unsetAllMarks.ts +8 -10
  217. package/src/commands/unsetMark.ts +31 -13
  218. package/src/commands/updateAttributes.ts +73 -0
  219. package/src/commands/wrapIn.ts +5 -10
  220. package/src/commands/wrapInList.ts +6 -5
  221. package/src/extensions/clipboardTextSerializer.ts +14 -35
  222. package/src/extensions/commands.ts +3 -135
  223. package/src/extensions/editable.ts +1 -0
  224. package/src/extensions/focusEvents.ts +3 -5
  225. package/src/extensions/index.ts +1 -0
  226. package/src/extensions/keymap.ts +110 -13
  227. package/src/extensions/tabindex.ts +18 -0
  228. package/src/helpers/combineTransactionSteps.ts +18 -0
  229. package/src/helpers/createChainableState.ts +38 -0
  230. package/src/helpers/createDocument.ts +12 -0
  231. package/src/helpers/createNodeFromContent.ts +57 -0
  232. package/src/helpers/defaultBlockAt.ts +13 -0
  233. package/src/helpers/findChildren.ts +18 -0
  234. package/src/helpers/findChildrenInRange.ts +32 -0
  235. package/src/helpers/findParentNode.ts +3 -2
  236. package/src/helpers/findParentNodeClosestToPos.ts +3 -2
  237. package/src/helpers/generateHTML.ts +6 -5
  238. package/src/helpers/generateJSON.ts +14 -0
  239. package/src/helpers/generateText.ts +30 -0
  240. package/src/helpers/getAttributes.ts +28 -0
  241. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  242. package/src/helpers/getChangedRanges.ts +83 -0
  243. package/src/helpers/getDebugJSON.ts +54 -0
  244. package/src/helpers/getExtensionField.ts +25 -0
  245. package/src/helpers/getHTMLFromFragment.ts +6 -5
  246. package/src/helpers/getMarkAttributes.ts +14 -10
  247. package/src/helpers/getMarkRange.ts +41 -8
  248. package/src/helpers/getMarkType.ts +5 -1
  249. package/src/helpers/getMarksBetween.ts +32 -10
  250. package/src/helpers/getNodeAttributes.ts +9 -9
  251. package/src/helpers/getNodeType.ts +5 -1
  252. package/src/helpers/getRenderedAttributes.ts +6 -7
  253. package/src/helpers/getSchema.ts +7 -137
  254. package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
  255. package/src/helpers/getSchemaTypeByName.ts +2 -10
  256. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  257. package/src/helpers/getSplittedAttributes.ts +4 -4
  258. package/src/helpers/getText.ts +19 -0
  259. package/src/helpers/getTextBetween.ts +49 -0
  260. package/src/helpers/getTextContentFromNodes.ts +21 -0
  261. package/src/helpers/getTextSerializersFromSchema.ts +10 -0
  262. package/src/helpers/index.ts +33 -0
  263. package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
  264. package/src/helpers/isActive.ts +5 -5
  265. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  266. package/src/helpers/isList.ts +14 -7
  267. package/src/helpers/isMarkActive.ts +45 -20
  268. package/src/helpers/isNodeActive.ts +28 -35
  269. package/src/helpers/isNodeEmpty.ts +8 -0
  270. package/src/helpers/isNodeSelection.ts +2 -3
  271. package/src/helpers/isTextSelection.ts +2 -3
  272. package/src/helpers/posToDOMRect.ts +35 -0
  273. package/src/helpers/resolveFocusPosition.ts +43 -0
  274. package/src/helpers/selectionToInsertionEnd.ts +2 -2
  275. package/src/helpers/splitExtensions.ts +3 -3
  276. package/src/index.ts +16 -22
  277. package/src/inputRules/index.ts +5 -0
  278. package/src/inputRules/markInputRule.ts +59 -39
  279. package/src/inputRules/nodeInputRule.ts +45 -11
  280. package/src/inputRules/textInputRule.ts +35 -0
  281. package/src/inputRules/textblockTypeInputRule.ts +38 -0
  282. package/src/inputRules/wrappingInputRule.ts +60 -0
  283. package/src/pasteRules/index.ts +3 -0
  284. package/src/pasteRules/markPasteRule.ts +62 -53
  285. package/src/pasteRules/nodePasteRule.ts +39 -0
  286. package/src/pasteRules/textPasteRule.ts +35 -0
  287. package/src/style.ts +16 -3
  288. package/src/types.ts +132 -47
  289. package/src/utilities/callOrReturn.ts +6 -3
  290. package/src/utilities/createStyleTag.ts +12 -1
  291. package/src/utilities/deleteProps.ts +2 -4
  292. package/src/utilities/elementFromString.ts +4 -5
  293. package/src/utilities/escapeForRegEx.ts +4 -0
  294. package/src/utilities/findDuplicates.ts +5 -0
  295. package/src/utilities/fromString.ts +2 -2
  296. package/src/utilities/index.ts +3 -0
  297. package/src/utilities/isEmptyObject.ts +2 -2
  298. package/src/utilities/isFunction.ts +3 -0
  299. package/src/utilities/isMacOS.ts +5 -0
  300. package/src/utilities/isNumber.ts +3 -0
  301. package/src/utilities/isPlainObject.ts +8 -5
  302. package/src/utilities/isRegExp.ts +3 -0
  303. package/src/utilities/isString.ts +3 -0
  304. package/src/utilities/isiOS.ts +12 -0
  305. package/src/utilities/mergeAttributes.ts +2 -3
  306. package/src/utilities/mergeDeep.ts +2 -3
  307. package/src/utilities/minMax.ts +1 -1
  308. package/src/utilities/objectIncludes.ts +17 -5
  309. package/src/utilities/removeDuplicates.ts +15 -0
  310. package/CHANGELOG.md +0 -198
  311. package/LICENSE.md +0 -21
  312. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  313. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  314. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  315. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  316. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  317. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  318. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  319. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  320. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  321. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  322. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  323. package/src/commands/insertHTML.ts +0 -28
  324. package/src/commands/insertText.ts +0 -20
  325. package/src/commands/replace.ts +0 -20
  326. package/src/commands/replaceRange.ts +0 -36
  327. package/src/commands/resetNodeAttributes.ts +0 -29
  328. package/src/commands/updateNodeAttributes.ts +0 -31
  329. package/src/utilities/isClass.ts +0 -7
  330. package/src/utilities/isObject.ts +0 -10
  331. package/src/utilities/removeElement.ts +0 -5
@@ -0,0 +1,60 @@
1
+ import { Node as ProseMirrorNode, NodeType } from 'prosemirror-model'
2
+ import { canJoin, findWrapping } from 'prosemirror-transform'
3
+
4
+ import { InputRule, InputRuleFinder } from '../InputRule'
5
+ import { ExtendedRegExpMatchArray } from '../types'
6
+ import { callOrReturn } from '../utilities/callOrReturn'
7
+
8
+ /**
9
+ * Build an input rule for automatically wrapping a textblock when a
10
+ * given string is typed. When using a regular expresion you’ll
11
+ * probably want the regexp to start with `^`, so that the pattern can
12
+ * only occur at the start of a textblock.
13
+ *
14
+ * `type` is the type of node to wrap in.
15
+ *
16
+ * By default, if there’s a node with the same type above the newly
17
+ * wrapped node, the rule will try to join those
18
+ * two nodes. You can pass a join predicate, which takes a regular
19
+ * expression match and the node before the wrapped node, and can
20
+ * return a boolean to indicate whether a join should happen.
21
+ */
22
+ export function wrappingInputRule(config: {
23
+ find: InputRuleFinder,
24
+ type: NodeType,
25
+ getAttributes?:
26
+ | Record<string, any>
27
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
28
+ | false
29
+ | null
30
+ ,
31
+ joinPredicate?: (match: ExtendedRegExpMatchArray, node: ProseMirrorNode) => boolean,
32
+ }) {
33
+ return new InputRule({
34
+ find: config.find,
35
+ handler: ({ state, range, match }) => {
36
+ const attributes = callOrReturn(config.getAttributes, undefined, match) || {}
37
+ const tr = state.tr.delete(range.from, range.to)
38
+ const $start = tr.doc.resolve(range.from)
39
+ const blockRange = $start.blockRange()
40
+ const wrapping = blockRange && findWrapping(blockRange, config.type, attributes)
41
+
42
+ if (!wrapping) {
43
+ return null
44
+ }
45
+
46
+ tr.wrap(blockRange, wrapping)
47
+
48
+ const before = tr.doc.resolve(range.from - 1).nodeBefore
49
+
50
+ if (
51
+ before
52
+ && before.type === config.type
53
+ && canJoin(tr.doc, range.from - 1)
54
+ && (!config.joinPredicate || config.joinPredicate(match, before))
55
+ ) {
56
+ tr.join(range.from - 1)
57
+ }
58
+ },
59
+ })
60
+ }
@@ -0,0 +1,3 @@
1
+ export * from './markPasteRule'
2
+ export * from './nodePasteRule'
3
+ export * from './textPasteRule'
@@ -1,61 +1,70 @@
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 'prosemirror-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
+ }) {
22
+ return new PasteRule({
23
+ find: config.find,
24
+ handler: ({ state, range, match }) => {
25
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
26
+
27
+ if (attributes === false || attributes === null) {
28
+ return null
29
+ }
30
+
31
+ const { tr } = state
32
+ const captureGroup = match[match.length - 1]
33
+ const fullMatch = match[0]
34
+ let markEnd = range.to
35
+
36
+ if (captureGroup) {
37
+ const startSpaces = fullMatch.search(/\S/)
38
+ const textStart = range.from + fullMatch.indexOf(captureGroup)
39
+ const textEnd = textStart + captureGroup.length
40
+
41
+ const excludedMarks = getMarksBetween(range.from, range.to, state.doc)
42
+ .filter(item => {
43
+ // @ts-ignore
44
+ const excluded = item.mark.type.excluded as MarkType[]
45
+
46
+ return excluded.find(type => type === config.type && type !== item.mark.type)
47
+ })
48
+ .filter(item => item.to > textStart)
49
+
50
+ if (excludedMarks.length) {
51
+ return null
39
52
  }
40
53
 
41
- // adding rest of text to nodes
42
- if (pos < text.length) {
43
- nodes.push(child.cut(pos))
54
+ if (textEnd < range.to) {
55
+ tr.delete(textEnd, range.to)
44
56
  }
45
- } else {
46
- nodes.push(child.copy(handler(child.content, child)))
47
- }
48
- })
49
57
 
50
- return Fragment.fromArray(nodes)
51
- }
58
+ if (textStart > range.from) {
59
+ tr.delete(range.from + startSpaces, textStart)
60
+ }
52
61
 
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
- },
62
+ markEnd = range.from + startSpaces + captureGroup.length
63
+
64
+ tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))
65
+
66
+ tr.removeStoredMark(config.type)
67
+ }
59
68
  },
60
69
  })
61
70
  }
@@ -0,0 +1,39 @@
1
+ import { NodeType } from 'prosemirror-model'
2
+
3
+ import { PasteRule } 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: RegExp,
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()
31
+ .deleteRange(range)
32
+ .insertContentAt(range.from, {
33
+ type: config.type.name,
34
+ attrs: attributes,
35
+ })
36
+ }
37
+ },
38
+ })
39
+ }
@@ -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,57 +1,110 @@
1
1
  import {
2
- Node as ProseMirrorNode,
3
2
  Mark as ProseMirrorMark,
3
+ Node as ProseMirrorNode,
4
4
  ParseOptions,
5
5
  } from 'prosemirror-model'
6
+ import { EditorState, Transaction } from 'prosemirror-state'
6
7
  import {
7
- EditorView,
8
8
  Decoration,
9
- NodeView,
10
9
  EditorProps,
10
+ EditorView,
11
+ NodeView,
11
12
  } from 'prosemirror-view'
12
- import { EditorState, Transaction } from 'prosemirror-state'
13
- import { Extension } from './Extension'
14
- import { Node } from './Node'
15
- import { Mark } from './Mark'
16
- import { Editor } from './Editor'
13
+
17
14
  import {
18
15
  Commands,
19
16
  ExtensionConfig,
20
- NodeConfig,
21
17
  MarkConfig,
18
+ NodeConfig,
22
19
  } from '.'
20
+ import { Editor } from './Editor'
21
+ import { Extension } from './Extension'
22
+ import { Mark } from './Mark'
23
+ import { Node } from './Node'
23
24
 
24
- export {
25
- Commands,
26
- ExtensionConfig,
27
- NodeConfig,
28
- MarkConfig,
25
+ export type AnyConfig = ExtensionConfig | NodeConfig | MarkConfig
26
+ export type AnyExtension = Extension | Node | Mark
27
+ export type Extensions = AnyExtension[]
28
+
29
+ export type ParentConfig<T> = Partial<{
30
+ [P in keyof T]: Required<T>[P] extends (...args: any) => any
31
+ ? (...args: Parameters<Required<T>[P]>) => ReturnType<Required<T>[P]>
32
+ : T[P]
33
+ }>
34
+
35
+ export type Primitive =
36
+ | null
37
+ | undefined
38
+ | string
39
+ | number
40
+ | boolean
41
+ | symbol
42
+ | bigint
43
+
44
+ export type RemoveThis<T> = T extends (...args: any) => any
45
+ ? (...args: Parameters<T>) => ReturnType<T>
46
+ : T
47
+
48
+ export type MaybeReturnType<T> = T extends (...args: any) => any
49
+ ? ReturnType<T>
50
+ : T
51
+
52
+ export type MaybeThisParameterType<T> = Exclude<T, Primitive> extends (...args: any) => any
53
+ ? ThisParameterType<Exclude<T, Primitive>>
54
+ : any
55
+
56
+ export interface EditorEvents {
57
+ beforeCreate: { editor: Editor },
58
+ create: { editor: Editor },
59
+ update: { editor: Editor, transaction: Transaction },
60
+ selectionUpdate: { editor: Editor, transaction: Transaction },
61
+ transaction: { editor: Editor, transaction: Transaction },
62
+ focus: { editor: Editor, event: FocusEvent, transaction: Transaction },
63
+ blur: { editor: Editor, event: FocusEvent, transaction: Transaction },
64
+ destroy: void,
29
65
  }
30
66
 
31
- export type Extensions = (Extension | Node | Mark)[]
67
+ export type EnableRules = (AnyExtension | string)[] | boolean
32
68
 
33
69
  export interface EditorOptions {
34
70
  element: Element,
35
71
  content: Content,
36
72
  extensions: Extensions,
37
73
  injectCSS: boolean,
74
+ injectNonce: string | undefined,
38
75
  autofocus: FocusPosition,
39
76
  editable: boolean,
40
77
  editorProps: EditorProps,
41
78
  parseOptions: ParseOptions,
42
- enableInputRules: boolean,
43
- enablePasteRules: boolean,
44
- onCreate: (props: { editor: Editor }) => void,
45
- onUpdate: (props: { editor: Editor }) => void,
46
- onViewUpdate: (props: { editor: Editor }) => void,
47
- onSelectionUpdate: (props: { editor: Editor }) => void,
48
- onTransaction: (props: { editor: Editor, transaction: Transaction }) => void,
49
- onFocus: (props: { editor: Editor, event: FocusEvent }) => void,
50
- onBlur: (props: { editor: Editor, event: FocusEvent }) => void,
51
- onDestroy: () => void,
79
+ enableInputRules: EnableRules,
80
+ enablePasteRules: EnableRules,
81
+ enableCoreExtensions: boolean,
82
+ onBeforeCreate: (props: EditorEvents['beforeCreate']) => void,
83
+ onCreate: (props: EditorEvents['create']) => void,
84
+ onUpdate: (props: EditorEvents['update']) => void,
85
+ onSelectionUpdate: (props: EditorEvents['selectionUpdate']) => void,
86
+ onTransaction: (props: EditorEvents['transaction']) => void,
87
+ onFocus: (props: EditorEvents['focus']) => void,
88
+ onBlur: (props: EditorEvents['blur']) => void,
89
+ onDestroy: (props: EditorEvents['destroy']) => void,
90
+ }
91
+
92
+ export type HTMLContent = string
93
+
94
+ export type JSONContent = {
95
+ type?: string,
96
+ attrs?: Record<string, any>,
97
+ content?: JSONContent[],
98
+ marks?: {
99
+ type: string,
100
+ attrs?: Record<string, any>,
101
+ [key: string]: any,
102
+ }[],
103
+ text?: string,
104
+ [key: string]: any,
52
105
  }
53
106
 
54
- export type Content = string | JSON | null
107
+ export type Content = HTMLContent | JSONContent | JSONContent[] | null
55
108
 
56
109
  export type CommandProps = {
57
110
  editor: Editor,
@@ -68,12 +121,15 @@ export type Command = (props: CommandProps) => boolean
68
121
 
69
122
  export type CommandSpec = (...args: any[]) => Command
70
123
 
124
+ export type KeyboardShortcutCommand = (props: { editor: Editor }) => boolean
125
+
71
126
  export type Attribute = {
72
127
  default: any,
73
128
  rendered?: boolean,
74
- renderHTML?: ((attributes: { [key: string]: any }) => { [key: string]: any } | null) | null,
75
- parseHTML?: ((element: HTMLElement) => { [key: string]: any } | null) | null,
129
+ renderHTML?: ((attributes: Record<string, any>) => Record<string, any> | null) | null,
130
+ parseHTML?: ((element: HTMLElement) => any | null) | null,
76
131
  keepOnSplit: boolean,
132
+ isRequired?: boolean,
77
133
  }
78
134
 
79
135
  export type Attributes = {
@@ -95,59 +151,71 @@ export type GlobalAttributes = {
95
151
 
96
152
  export type PickValue<T, K extends keyof T> = T[K]
97
153
 
98
- export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I)=>void)
154
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void)
99
155
  ? I
100
156
  : never
101
157
 
102
158
  export type Diff<T extends keyof any, U extends keyof any> =
103
159
  ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T]
104
160
 
105
- export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
161
+ export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U
106
162
 
107
- export type AnyObject = {
108
- [key: string]: any
109
- }
163
+ export type ValuesOf<T> = T[keyof T]
164
+
165
+ export type KeysWithTypeOf<T, Type> = ({ [P in keyof T]: T[P] extends Type ? P : never })[keyof T]
110
166
 
111
- export type ValuesOf<T> = T[keyof T];
167
+ export type NodeViewProps = {
168
+ editor: Editor,
169
+ node: ProseMirrorNode,
170
+ decorations: Decoration[],
171
+ selected: boolean,
172
+ extension: Node,
173
+ getPos: () => number,
174
+ updateAttributes: (attributes: Record<string, any>) => void,
175
+ deleteNode: () => void,
176
+ }
112
177
 
113
- export type KeysWithTypeOf<T, Type> = ({[P in keyof T]: T[P] extends Type ? P : never })[keyof T]
178
+ export interface NodeViewRendererOptions {
179
+ stopEvent: ((props: {
180
+ event: Event
181
+ }) => boolean) | null,
182
+ ignoreMutation: ((props: {
183
+ mutation: MutationRecord | { type: 'selection', target: Element }
184
+ }) => boolean) | null,
185
+ }
114
186
 
115
187
  export type NodeViewRendererProps = {
116
188
  editor: Editor,
117
189
  node: ProseMirrorNode,
118
190
  getPos: (() => number) | boolean,
119
- HTMLAttributes: { [key: string]: any },
191
+ HTMLAttributes: Record<string, any>,
120
192
  decorations: Decoration[],
121
193
  extension: Node,
122
194
  }
123
195
 
124
196
  export type NodeViewRenderer = (props: NodeViewRendererProps) => (NodeView | {})
125
197
 
126
- export type UnionCommands = UnionToIntersection<ValuesOf<Pick<Commands, KeysWithTypeOf<Commands, {}>>>>
198
+ export type AnyCommands = Record<string, (...args: any[]) => Command>
199
+
200
+ export type UnionCommands<T = Command> = UnionToIntersection<ValuesOf<Pick<Commands<T>, KeysWithTypeOf<Commands<T>, {}>>>>
127
201
 
128
202
  export type RawCommands = {
129
- [Item in keyof UnionCommands]: UnionCommands[Item] extends (...args: any[]) => any
130
- ? (...args: Parameters<UnionCommands[Item]>) => Command
131
- : never
203
+ [Item in keyof UnionCommands]: UnionCommands<Command>[Item]
132
204
  }
133
205
 
134
206
  export type SingleCommands = {
135
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
136
- ? (...args: Parameters<RawCommands[Item]>) => boolean
137
- : never
207
+ [Item in keyof UnionCommands]: UnionCommands<boolean>[Item]
138
208
  }
139
209
 
140
210
  export type ChainedCommands = {
141
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
142
- ? (...args: Parameters<RawCommands[Item]>) => ChainedCommands
143
- : never
211
+ [Item in keyof UnionCommands]: UnionCommands<ChainedCommands>[Item]
144
212
  } & {
145
213
  run: () => boolean
146
214
  }
147
215
 
148
216
  export type CanCommands = SingleCommands & { chain: () => ChainedCommands }
149
217
 
150
- export type FocusPosition = 'start' | 'end' | number | boolean | null
218
+ export type FocusPosition = 'start' | 'end' | 'all' | number | boolean | null
151
219
 
152
220
  export type Range = {
153
221
  from: number,
@@ -167,3 +235,20 @@ export type MarkRange = {
167
235
  }
168
236
 
169
237
  export type Predicate = (node: ProseMirrorNode) => boolean
238
+
239
+ export type NodeWithPos = {
240
+ node: ProseMirrorNode,
241
+ pos: number,
242
+ }
243
+
244
+ export type TextSerializer = (props: {
245
+ node: ProseMirrorNode,
246
+ pos: number,
247
+ parent: ProseMirrorNode,
248
+ index: number,
249
+ range: Range,
250
+ }) => string
251
+
252
+ export type ExtendedRegExpMatchArray = RegExpMatchArray & {
253
+ data?: Record<string, any>,
254
+ }
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ export function findDuplicates(items: any[]): any[] {
2
+ const filtered = items.filter((el, index) => items.indexOf(el) !== index)
3
+
4
+ return [...new Set(filtered)]
5
+ }