@tiptap/core 2.0.0-beta.18 → 2.0.0-beta.180

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/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  4. package/dist/packages/core/src/Editor.d.ts +24 -19
  5. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  6. package/dist/packages/core/src/Extension.d.ts +99 -27
  7. package/dist/packages/core/src/ExtensionManager.d.ts +7 -13
  8. package/dist/packages/core/src/InputRule.d.ts +42 -0
  9. package/dist/packages/core/src/Mark.d.ts +131 -31
  10. package/dist/packages/core/src/Node.d.ts +157 -33
  11. package/dist/packages/core/src/NodeView.d.ts +8 -12
  12. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  13. package/dist/packages/core/src/Tracker.d.ts +11 -0
  14. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  16. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  17. package/dist/packages/core/src/commands/command.d.ts +2 -2
  18. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  19. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  20. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  21. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  22. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  23. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  24. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  25. package/dist/packages/core/src/commands/first.d.ts +3 -3
  26. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  27. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  28. package/dist/packages/core/src/commands/index.d.ts +50 -0
  29. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  30. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  31. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  33. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  34. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  36. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  37. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  38. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  39. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  43. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  44. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  45. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  46. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  47. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  48. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  49. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  50. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  52. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  54. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  56. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  57. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  58. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  59. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  61. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  62. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  63. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  64. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  65. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  66. package/dist/packages/core/src/extensions/commands.d.ts +2 -95
  67. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  69. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  70. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  71. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  72. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  73. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  74. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  75. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  76. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  78. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  79. package/dist/packages/core/src/helpers/findParentNode.d.ts +2 -3
  80. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  83. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  84. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  85. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  86. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  87. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  88. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  89. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  90. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +2 -3
  91. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  93. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  94. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +2 -3
  95. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  96. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  97. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  98. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  99. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  101. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  102. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  104. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  105. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  106. package/dist/packages/core/src/helpers/index.d.ts +33 -0
  107. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  108. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  109. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  110. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  111. package/dist/packages/core/src/helpers/isMarkActive.d.ts +2 -3
  112. package/dist/packages/core/src/helpers/isNodeActive.d.ts +2 -3
  113. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
  114. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  115. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  117. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  118. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  119. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  120. package/dist/packages/core/src/index.d.ts +14 -21
  121. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  122. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  123. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  124. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  125. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  126. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  127. package/dist/packages/core/src/pasteRules/index.d.ts +2 -0
  128. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  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 +112 -56
  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/isClass.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  142. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  145. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  146. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  147. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  148. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  149. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  150. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  151. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  152. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  153. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  154. package/dist/tiptap-core.cjs.js +2675 -1378
  155. package/dist/tiptap-core.cjs.js.map +1 -1
  156. package/dist/tiptap-core.esm.js +2605 -1341
  157. package/dist/tiptap-core.esm.js.map +1 -1
  158. package/dist/tiptap-core.umd.js +2622 -1324
  159. package/dist/tiptap-core.umd.js.map +1 -1
  160. package/package.json +17 -20
  161. package/src/CommandManager.ts +63 -64
  162. package/src/Editor.ts +115 -78
  163. package/src/EventEmitter.ts +14 -4
  164. package/src/Extension.ts +193 -43
  165. package/src/ExtensionManager.ts +232 -83
  166. package/src/InputRule.ts +265 -0
  167. package/src/Mark.ts +239 -49
  168. package/src/Node.ts +279 -57
  169. package/src/NodeView.ts +115 -47
  170. package/src/PasteRule.ts +247 -0
  171. package/src/Tracker.ts +42 -0
  172. package/src/commands/blur.ts +12 -6
  173. package/src/commands/clearContent.ts +3 -3
  174. package/src/commands/clearNodes.ts +30 -18
  175. package/src/commands/command.ts +2 -2
  176. package/src/commands/createParagraphNear.ts +4 -3
  177. package/src/commands/deleteNode.ts +37 -0
  178. package/src/commands/deleteRange.ts +3 -3
  179. package/src/commands/deleteSelection.ts +4 -3
  180. package/src/commands/enter.ts +3 -3
  181. package/src/commands/exitCode.ts +4 -3
  182. package/src/commands/extendMarkRange.ts +12 -11
  183. package/src/commands/first.ts +3 -3
  184. package/src/commands/focus.ts +45 -44
  185. package/src/commands/forEach.ts +24 -0
  186. package/src/commands/index.ts +50 -0
  187. package/src/commands/insertContent.ts +13 -24
  188. package/src/commands/insertContentAt.ts +108 -0
  189. package/src/commands/joinBackward.ts +4 -3
  190. package/src/commands/joinForward.ts +4 -3
  191. package/src/commands/keyboardShortcut.ts +6 -6
  192. package/src/commands/lift.ts +6 -5
  193. package/src/commands/liftEmptyBlock.ts +4 -3
  194. package/src/commands/liftListItem.ts +6 -5
  195. package/src/commands/newlineInCode.ts +4 -3
  196. package/src/commands/resetAttributes.ts +62 -0
  197. package/src/commands/scrollIntoView.ts +3 -3
  198. package/src/commands/selectAll.ts +8 -6
  199. package/src/commands/selectNodeBackward.ts +4 -3
  200. package/src/commands/selectNodeForward.ts +4 -3
  201. package/src/commands/selectParentNode.ts +4 -3
  202. package/src/commands/selectTextblockEnd.ts +20 -0
  203. package/src/commands/selectTextblockStart.ts +20 -0
  204. package/src/commands/setContent.ts +8 -11
  205. package/src/commands/setMark.ts +36 -12
  206. package/src/commands/setMeta.ts +18 -0
  207. package/src/commands/setNode.ts +29 -7
  208. package/src/commands/setNodeSelection.ts +29 -0
  209. package/src/commands/setTextSelection.ts +33 -0
  210. package/src/commands/sinkListItem.ts +6 -5
  211. package/src/commands/splitBlock.ts +16 -10
  212. package/src/commands/splitListItem.ts +45 -18
  213. package/src/commands/toggleList.ts +83 -18
  214. package/src/commands/toggleMark.ts +18 -7
  215. package/src/commands/toggleNode.ts +6 -5
  216. package/src/commands/toggleWrap.ts +9 -9
  217. package/src/commands/undoInputRule.ts +34 -5
  218. package/src/commands/unsetAllMarks.ts +7 -11
  219. package/src/commands/unsetMark.ts +35 -22
  220. package/src/commands/updateAttributes.ts +73 -0
  221. package/src/commands/wrapIn.ts +5 -10
  222. package/src/commands/wrapInList.ts +6 -5
  223. package/src/extensions/clipboardTextSerializer.ts +14 -35
  224. package/src/extensions/commands.ts +3 -141
  225. package/src/extensions/editable.ts +1 -0
  226. package/src/extensions/focusEvents.ts +1 -3
  227. package/src/extensions/index.ts +1 -0
  228. package/src/extensions/keymap.ts +110 -13
  229. package/src/extensions/tabindex.ts +18 -0
  230. package/src/helpers/combineTransactionSteps.ts +18 -0
  231. package/src/helpers/createChainableState.ts +38 -0
  232. package/src/helpers/createDocument.ts +5 -6
  233. package/src/helpers/createNodeFromContent.ts +17 -19
  234. package/src/helpers/defaultBlockAt.ts +13 -0
  235. package/src/helpers/findChildren.ts +18 -0
  236. package/src/helpers/findChildrenInRange.ts +32 -0
  237. package/src/helpers/findParentNode.ts +3 -2
  238. package/src/helpers/findParentNodeClosestToPos.ts +3 -2
  239. package/src/helpers/generateHTML.ts +6 -5
  240. package/src/helpers/generateJSON.ts +14 -0
  241. package/src/helpers/generateText.ts +30 -0
  242. package/src/helpers/getAttributes.ts +28 -0
  243. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  244. package/src/helpers/getChangedRanges.ts +83 -0
  245. package/src/helpers/getDebugJSON.ts +54 -0
  246. package/src/helpers/getExtensionField.ts +25 -0
  247. package/src/helpers/getHTMLFromFragment.ts +6 -5
  248. package/src/helpers/getMarkAttributes.ts +14 -10
  249. package/src/helpers/getMarkRange.ts +41 -8
  250. package/src/helpers/getMarkType.ts +5 -1
  251. package/src/helpers/getMarksBetween.ts +32 -10
  252. package/src/helpers/getNodeAttributes.ts +9 -9
  253. package/src/helpers/getNodeType.ts +5 -1
  254. package/src/helpers/getRenderedAttributes.ts +6 -7
  255. package/src/helpers/getSchema.ts +7 -133
  256. package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
  257. package/src/helpers/getSchemaTypeByName.ts +2 -10
  258. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  259. package/src/helpers/getSplittedAttributes.ts +4 -4
  260. package/src/helpers/getText.ts +19 -0
  261. package/src/helpers/getTextBetween.ts +49 -0
  262. package/src/helpers/getTextContentFromNodes.ts +17 -0
  263. package/src/helpers/getTextSerializersFromSchema.ts +10 -0
  264. package/src/helpers/index.ts +33 -0
  265. package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
  266. package/src/helpers/isActive.ts +5 -5
  267. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  268. package/src/helpers/isList.ts +14 -7
  269. package/src/helpers/isMarkActive.ts +45 -20
  270. package/src/helpers/isNodeActive.ts +28 -35
  271. package/src/helpers/isNodeEmpty.ts +1 -1
  272. package/src/helpers/isNodeSelection.ts +3 -2
  273. package/src/helpers/isTextSelection.ts +3 -2
  274. package/src/helpers/posToDOMRect.ts +35 -0
  275. package/src/helpers/resolveFocusPosition.ts +43 -0
  276. package/src/helpers/selectionToInsertionEnd.ts +2 -2
  277. package/src/helpers/splitExtensions.ts +3 -3
  278. package/src/index.ts +15 -24
  279. package/src/inputRules/index.ts +5 -0
  280. package/src/inputRules/markInputRule.ts +59 -39
  281. package/src/inputRules/nodeInputRule.ts +45 -11
  282. package/src/inputRules/textInputRule.ts +35 -0
  283. package/src/inputRules/textblockTypeInputRule.ts +38 -0
  284. package/src/inputRules/wrappingInputRule.ts +60 -0
  285. package/src/pasteRules/index.ts +2 -0
  286. package/src/pasteRules/markPasteRule.ts +62 -53
  287. package/src/pasteRules/textPasteRule.ts +35 -0
  288. package/src/style.ts +16 -3
  289. package/src/types.ts +129 -43
  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 +3 -0
  298. package/src/utilities/isClass.ts +2 -2
  299. package/src/utilities/isEmptyObject.ts +2 -2
  300. package/src/utilities/isFunction.ts +3 -0
  301. package/src/utilities/isMacOS.ts +5 -0
  302. package/src/utilities/isNumber.ts +3 -0
  303. package/src/utilities/isObject.ts +6 -6
  304. package/src/utilities/isPlainObject.ts +8 -5
  305. package/src/utilities/isRegExp.ts +3 -0
  306. package/src/utilities/isString.ts +3 -0
  307. package/src/utilities/isiOS.ts +12 -0
  308. package/src/utilities/mergeAttributes.ts +2 -3
  309. package/src/utilities/mergeDeep.ts +2 -3
  310. package/src/utilities/minMax.ts +1 -1
  311. package/src/utilities/objectIncludes.ts +17 -5
  312. package/src/utilities/removeDuplicates.ts +15 -0
  313. package/CHANGELOG.md +0 -335
  314. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  315. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  316. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  317. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  318. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  319. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  320. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  321. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  322. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  323. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  324. package/src/commands/insertHTML.ts +0 -30
  325. package/src/commands/insertNode.ts +0 -33
  326. package/src/commands/insertText.ts +0 -22
  327. package/src/commands/replace.ts +0 -20
  328. package/src/commands/replaceRange.ts +0 -36
  329. package/src/commands/resetNodeAttributes.ts +0 -31
  330. package/src/commands/updateNodeAttributes.ts +0 -33
  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,2 @@
1
+ export * from './markPasteRule'
2
+ 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,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,46 +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
+
14
+ import {
15
+ Commands,
16
+ ExtensionConfig,
17
+ MarkConfig,
18
+ NodeConfig,
19
+ } from '.'
20
+ import { Editor } from './Editor'
13
21
  import { Extension } from './Extension'
14
- import { Node } from './Node'
15
22
  import { Mark } from './Mark'
16
- import { Editor } from './Editor'
17
- import { Commands } from '.'
23
+ import { Node } from './Node'
24
+
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,
65
+ }
18
66
 
19
- export type Extensions = (Extension | Node | Mark)[]
67
+ export type EnableRules = (AnyExtension | string)[] | boolean
20
68
 
21
69
  export interface EditorOptions {
22
70
  element: Element,
23
71
  content: Content,
24
72
  extensions: Extensions,
25
73
  injectCSS: boolean,
74
+ injectNonce: string | undefined,
26
75
  autofocus: FocusPosition,
27
76
  editable: boolean,
28
77
  editorProps: EditorProps,
29
78
  parseOptions: ParseOptions,
30
- enableInputRules: boolean,
31
- enablePasteRules: boolean,
32
- onCreate: (props: { editor: Editor }) => void,
33
- onUpdate: (props: { editor: Editor }) => void,
34
- onViewUpdate: (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,
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,
41
90
  }
42
91
 
43
- export type Content = string | JSON | null
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,
105
+ }
106
+
107
+ export type Content = HTMLContent | JSONContent | JSONContent[] | null
44
108
 
45
109
  export type CommandProps = {
46
110
  editor: Editor,
@@ -57,12 +121,15 @@ export type Command = (props: CommandProps) => boolean
57
121
 
58
122
  export type CommandSpec = (...args: any[]) => Command
59
123
 
124
+ export type KeyboardShortcutCommand = (props: { editor: Editor }) => boolean
125
+
60
126
  export type Attribute = {
61
127
  default: any,
62
128
  rendered?: boolean,
63
- renderHTML?: ((attributes: { [key: string]: any }) => { [key: string]: any } | null) | null,
64
- 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,
65
131
  keepOnSplit: boolean,
132
+ isRequired?: boolean,
66
133
  }
67
134
 
68
135
  export type Attributes = {
@@ -84,22 +151,18 @@ export type GlobalAttributes = {
84
151
 
85
152
  export type PickValue<T, K extends keyof T> = T[K]
86
153
 
87
- 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)
88
155
  ? I
89
156
  : never
90
157
 
91
158
  export type Diff<T extends keyof any, U extends keyof any> =
92
159
  ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T]
93
160
 
94
- export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
95
-
96
- export type AnyObject = {
97
- [key: string]: any
98
- }
161
+ export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U
99
162
 
100
- export type ValuesOf<T> = T[keyof T];
163
+ export type ValuesOf<T> = T[keyof T]
101
164
 
102
- export type KeysWithTypeOf<T, Type> = ({[P in keyof T]: T[P] extends Type ? P : never })[keyof T]
165
+ export type KeysWithTypeOf<T, Type> = ({ [P in keyof T]: T[P] extends Type ? P : never })[keyof T]
103
166
 
104
167
  export type NodeViewProps = {
105
168
  editor: Editor,
@@ -108,45 +171,51 @@ export type NodeViewProps = {
108
171
  selected: boolean,
109
172
  extension: Node,
110
173
  getPos: () => number,
111
- updateAttributes: (attributes: AnyObject) => void,
174
+ updateAttributes: (attributes: Record<string, any>) => void,
175
+ deleteNode: () => void,
176
+ }
177
+
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,
112
185
  }
113
186
 
114
187
  export type NodeViewRendererProps = {
115
188
  editor: Editor,
116
189
  node: ProseMirrorNode,
117
190
  getPos: (() => number) | boolean,
118
- HTMLAttributes: { [key: string]: any },
191
+ HTMLAttributes: Record<string, any>,
119
192
  decorations: Decoration[],
120
193
  extension: Node,
121
194
  }
122
195
 
123
196
  export type NodeViewRenderer = (props: NodeViewRendererProps) => (NodeView | {})
124
197
 
125
- 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>, {}>>>>
126
201
 
127
202
  export type RawCommands = {
128
- [Item in keyof UnionCommands]: UnionCommands[Item] extends (...args: any[]) => any
129
- ? (...args: Parameters<UnionCommands[Item]>) => Command
130
- : never
203
+ [Item in keyof UnionCommands]: UnionCommands<Command>[Item]
131
204
  }
132
205
 
133
206
  export type SingleCommands = {
134
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
135
- ? (...args: Parameters<RawCommands[Item]>) => boolean
136
- : never
207
+ [Item in keyof UnionCommands]: UnionCommands<boolean>[Item]
137
208
  }
138
209
 
139
210
  export type ChainedCommands = {
140
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
141
- ? (...args: Parameters<RawCommands[Item]>) => ChainedCommands
142
- : never
211
+ [Item in keyof UnionCommands]: UnionCommands<ChainedCommands>[Item]
143
212
  } & {
144
213
  run: () => boolean
145
214
  }
146
215
 
147
216
  export type CanCommands = SingleCommands & { chain: () => ChainedCommands }
148
217
 
149
- export type FocusPosition = 'start' | 'end' | number | boolean | null
218
+ export type FocusPosition = 'start' | 'end' | 'all' | number | boolean | null
150
219
 
151
220
  export type Range = {
152
221
  from: number,
@@ -166,3 +235,20 @@ export type MarkRange = {
166
235
  }
167
236
 
168
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
+ }
@@ -1,9 +1,9 @@
1
- export default function fromString(value: any): any {
1
+ export function fromString(value: any): any {
2
2
  if (typeof value !== 'string') {
3
3
  return value
4
4
  }
5
5
 
6
- if (value.match(/^\d*(\.\d+)?$/)) {
6
+ if (value.match(/^[+-]?(?:\d*\.)?\d+$/)) {
7
7
  return Number(value)
8
8
  }
9
9
 
@@ -0,0 +1,3 @@
1
+ export * from './callOrReturn'
2
+ export * from './escapeForRegEx'
3
+ export * from './mergeAttributes'
@@ -1,5 +1,5 @@
1
- export default function isClass(item: any): boolean {
2
- if (item.constructor?.toString().substring(0, 5) !== 'class') {
1
+ export function isClass(value: any): boolean {
2
+ if (value.constructor?.toString().substring(0, 5) !== 'class') {
3
3
  return false
4
4
  }
5
5
 
@@ -1,3 +1,3 @@
1
- export default function isEmptyObject(object = {}): boolean {
2
- return Object.keys(object).length === 0 && object.constructor === Object
1
+ export function isEmptyObject(value = {}): boolean {
2
+ return Object.keys(value).length === 0 && value.constructor === Object
3
3
  }
@@ -0,0 +1,3 @@
1
+ export function isFunction(value: any): value is Function {
2
+ return typeof value === 'function'
3
+ }
@@ -0,0 +1,5 @@
1
+ export function isMacOS(): boolean {
2
+ return typeof navigator !== 'undefined'
3
+ ? /Mac/.test(navigator.platform)
4
+ : false
5
+ }