@gravity-ui/markdown-editor 15.1.0 → 15.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/build/cjs/bundle/Editor.d.ts +3 -0
  2. package/build/cjs/bundle/Editor.js +21 -2
  3. package/build/cjs/bundle/Editor.js.map +1 -1
  4. package/build/cjs/bundle/MarkdownEditorView.js +2 -1
  5. package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
  6. package/build/cjs/bundle/MarkupEditorView.js +6 -1
  7. package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
  8. package/build/cjs/bundle/MarkupManager.d.ts +3 -6
  9. package/build/cjs/bundle/MarkupManager.js +5 -5
  10. package/build/cjs/bundle/MarkupManager.js.map +1 -1
  11. package/build/cjs/bundle/WysiwygEditorView.js +6 -1
  12. package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
  13. package/build/cjs/bundle/types.d.ts +2 -0
  14. package/build/cjs/bundle/types.js.map +1 -1
  15. package/build/cjs/bundle/useMarkdownEditor.js +4 -2
  16. package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
  17. package/build/cjs/core/Editor.d.ts +3 -1
  18. package/build/cjs/core/Editor.js +6 -3
  19. package/build/cjs/core/Editor.js.map +1 -1
  20. package/build/cjs/core/ExtensionBuilder.d.ts +3 -1
  21. package/build/cjs/core/ExtensionBuilder.js +6 -1
  22. package/build/cjs/core/ExtensionBuilder.js.map +1 -1
  23. package/build/cjs/core/ExtensionsManager.d.ts +4 -2
  24. package/build/cjs/core/ExtensionsManager.js +6 -5
  25. package/build/cjs/core/ExtensionsManager.js.map +1 -1
  26. package/build/cjs/core/ParserTokensRegistry.d.ts +6 -0
  27. package/build/cjs/core/ParserTokensRegistry.js +9 -1
  28. package/build/cjs/core/ParserTokensRegistry.js.map +1 -1
  29. package/build/cjs/core/index.d.ts +1 -0
  30. package/build/cjs/core/index.js +3 -1
  31. package/build/cjs/core/index.js.map +1 -1
  32. package/build/cjs/core/markdown/MarkdownParser.d.ts +9 -1
  33. package/build/cjs/core/markdown/MarkdownParser.js +7 -3
  34. package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
  35. package/build/cjs/core/utils/logger.d.ts +3 -0
  36. package/build/cjs/core/utils/logger.js +12 -0
  37. package/build/cjs/core/utils/logger.js.map +1 -0
  38. package/build/cjs/core/utils/metrics.d.ts +2 -1
  39. package/build/cjs/core/utils/metrics.js +8 -2
  40. package/build/cjs/core/utils/metrics.js.map +1 -1
  41. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
  42. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js +2 -2
  43. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  45. package/build/cjs/extensions/behavior/Autocomplete/handler.js +16 -10
  46. package/build/cjs/extensions/behavior/Autocomplete/handler.js.map +1 -1
  47. package/build/cjs/extensions/behavior/Autocomplete/index.js +1 -1
  48. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  49. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  50. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +31 -3
  51. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  52. package/build/cjs/extensions/behavior/Clipboard/index.js +4 -0
  53. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  54. package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  55. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -3
  56. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  57. package/build/cjs/extensions/behavior/CommandMenu/index.js +5 -3
  58. package/build/cjs/extensions/behavior/CommandMenu/index.js.map +1 -1
  59. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js +13 -2
  60. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  61. package/build/cjs/extensions/behavior/FilePaste/index.d.ts +1 -1
  62. package/build/cjs/extensions/behavior/FilePaste/index.js +12 -0
  63. package/build/cjs/extensions/behavior/FilePaste/index.js.map +1 -1
  64. package/build/cjs/extensions/behavior/SelectionContext/index.js +3 -3
  65. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  66. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  67. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +7 -2
  68. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  69. package/build/cjs/extensions/behavior/utils/upload.d.ts +2 -0
  70. package/build/cjs/extensions/behavior/utils/upload.js +3 -0
  71. package/build/cjs/extensions/behavior/utils/upload.js.map +1 -1
  72. package/build/cjs/extensions/markdown/Breaks/index.js +2 -1
  73. package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
  74. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +2 -1
  75. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  76. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.js +2 -2
  77. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  78. package/build/cjs/extensions/markdown/Html/index.js +2 -1
  79. package/build/cjs/extensions/markdown/Html/index.js.map +1 -1
  80. package/build/cjs/extensions/markdown/Html/schema.js +2 -2
  81. package/build/cjs/extensions/markdown/Html/schema.js.map +1 -1
  82. package/build/cjs/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  83. package/build/cjs/extensions/markdown/Link/paste-plugin.js +11 -0
  84. package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
  85. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js +3 -3
  86. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  87. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js +2 -2
  88. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  89. package/build/cjs/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js +2 -2
  90. package/build/cjs/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js.map +1 -1
  91. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  92. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  93. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  94. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js +6 -5
  95. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  96. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -1
  97. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +6 -6
  98. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  99. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -3
  100. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  101. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
  102. package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
  103. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  104. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js +3 -3
  105. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  106. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js +2 -2
  107. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  108. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.d.ts +4 -4
  109. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.js +7 -7
  110. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.js.map +1 -1
  111. package/build/cjs/extensions/yfm/YfmConfigs/index.d.ts +2 -2
  112. package/build/cjs/extensions/yfm/YfmConfigs/index.js +2 -2
  113. package/build/cjs/extensions/yfm/YfmConfigs/index.js.map +1 -1
  114. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  115. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  116. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  117. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +3 -3
  118. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  119. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js +3 -3
  120. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  121. package/build/cjs/extensions/yfm/YfmTabs/actions.js +4 -4
  122. package/build/cjs/extensions/yfm/YfmTabs/actions.js.map +1 -1
  123. package/build/cjs/extensions/yfm/YfmTabs/plugins.js +11 -11
  124. package/build/cjs/extensions/yfm/YfmTabs/plugins.js.map +1 -1
  125. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  126. package/build/cjs/logger.d.ts +75 -0
  127. package/build/cjs/logger.js +89 -1
  128. package/build/cjs/logger.js.map +1 -1
  129. package/build/cjs/markdown-it/emoji.d.ts +2 -2
  130. package/build/cjs/markdown-it/emoji.js +4 -4
  131. package/build/cjs/markdown-it/emoji.js.map +1 -1
  132. package/build/cjs/markup/codemirror/create.d.ts +2 -0
  133. package/build/cjs/markup/codemirror/create.js +15 -4
  134. package/build/cjs/markup/codemirror/create.js.map +1 -1
  135. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  136. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  137. package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
  138. package/build/cjs/markup/codemirror/logger-facet.js +9 -0
  139. package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
  140. package/build/cjs/utils/event-emitter.d.ts +1 -0
  141. package/build/cjs/utils/event-emitter.js +3 -0
  142. package/build/cjs/utils/event-emitter.js.map +1 -1
  143. package/build/cjs/utils/facet.d.ts +1 -0
  144. package/build/cjs/utils/facet.js +33 -0
  145. package/build/cjs/utils/facet.js.map +1 -0
  146. package/build/cjs/utils/keymap.js +7 -2
  147. package/build/cjs/utils/keymap.js.map +1 -1
  148. package/build/cjs/version.js +1 -1
  149. package/build/cjs/version.js.map +1 -1
  150. package/build/esm/bundle/Editor.d.ts +3 -0
  151. package/build/esm/bundle/Editor.js +22 -3
  152. package/build/esm/bundle/Editor.js.map +1 -1
  153. package/build/esm/bundle/MarkdownEditorView.js +3 -2
  154. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  155. package/build/esm/bundle/MarkupEditorView.js +7 -2
  156. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  157. package/build/esm/bundle/MarkupManager.d.ts +3 -6
  158. package/build/esm/bundle/MarkupManager.js +5 -5
  159. package/build/esm/bundle/MarkupManager.js.map +1 -1
  160. package/build/esm/bundle/WysiwygEditorView.js +7 -2
  161. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  162. package/build/esm/bundle/types.d.ts +2 -0
  163. package/build/esm/bundle/types.js.map +1 -1
  164. package/build/esm/bundle/useMarkdownEditor.js +5 -3
  165. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  166. package/build/esm/core/Editor.d.ts +3 -1
  167. package/build/esm/core/Editor.js +6 -3
  168. package/build/esm/core/Editor.js.map +1 -1
  169. package/build/esm/core/ExtensionBuilder.d.ts +3 -1
  170. package/build/esm/core/ExtensionBuilder.js +6 -1
  171. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  172. package/build/esm/core/ExtensionsManager.d.ts +4 -2
  173. package/build/esm/core/ExtensionsManager.js +6 -5
  174. package/build/esm/core/ExtensionsManager.js.map +1 -1
  175. package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
  176. package/build/esm/core/ParserTokensRegistry.js +9 -1
  177. package/build/esm/core/ParserTokensRegistry.js.map +1 -1
  178. package/build/esm/core/index.d.ts +1 -0
  179. package/build/esm/core/index.js +1 -0
  180. package/build/esm/core/index.js.map +1 -1
  181. package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
  182. package/build/esm/core/markdown/MarkdownParser.js +7 -3
  183. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  184. package/build/esm/core/utils/logger.d.ts +3 -0
  185. package/build/esm/core/utils/logger.js +8 -0
  186. package/build/esm/core/utils/logger.js.map +1 -0
  187. package/build/esm/core/utils/metrics.d.ts +2 -1
  188. package/build/esm/core/utils/metrics.js +8 -2
  189. package/build/esm/core/utils/metrics.js.map +1 -1
  190. package/build/esm/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
  191. package/build/esm/extensions/additional/YfmHtmlBlock/utils.js +1 -1
  192. package/build/esm/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
  193. package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  194. package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
  195. package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
  196. package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
  197. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  198. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  199. package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
  200. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  201. package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
  202. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  203. package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  204. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
  205. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  206. package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
  207. package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
  208. package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
  209. package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  210. package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
  211. package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
  212. package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
  213. package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
  214. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  215. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  216. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
  217. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  218. package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
  219. package/build/esm/extensions/behavior/utils/upload.js +3 -0
  220. package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
  221. package/build/esm/extensions/markdown/Breaks/index.js +3 -2
  222. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  223. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
  224. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  225. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.js +1 -1
  226. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  227. package/build/esm/extensions/markdown/Html/index.js +3 -2
  228. package/build/esm/extensions/markdown/Html/index.js.map +1 -1
  229. package/build/esm/extensions/markdown/Html/schema.js +1 -1
  230. package/build/esm/extensions/markdown/Html/schema.js.map +1 -1
  231. package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  232. package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
  233. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  234. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js +2 -2
  235. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  236. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
  237. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  238. package/build/esm/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js +1 -1
  239. package/build/esm/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js.map +1 -1
  240. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  241. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  242. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  243. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
  244. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  245. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -1
  246. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -1
  247. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  248. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +2 -2
  249. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  250. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
  251. package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
  252. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  253. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js +2 -2
  254. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  255. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js +1 -1
  256. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  257. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.d.ts +4 -4
  258. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.js +3 -3
  259. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.js.map +1 -1
  260. package/build/esm/extensions/yfm/YfmConfigs/index.d.ts +2 -2
  261. package/build/esm/extensions/yfm/YfmConfigs/index.js +2 -2
  262. package/build/esm/extensions/yfm/YfmConfigs/index.js.map +1 -1
  263. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  264. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  265. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  266. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -2
  267. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  268. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js +2 -2
  269. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  270. package/build/esm/extensions/yfm/YfmTabs/actions.js +1 -1
  271. package/build/esm/extensions/yfm/YfmTabs/actions.js.map +1 -1
  272. package/build/esm/extensions/yfm/YfmTabs/plugins.js +1 -1
  273. package/build/esm/extensions/yfm/YfmTabs/plugins.js.map +1 -1
  274. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  275. package/build/esm/logger.d.ts +75 -0
  276. package/build/esm/logger.js +87 -0
  277. package/build/esm/logger.js.map +1 -1
  278. package/build/esm/markdown-it/emoji.d.ts +2 -2
  279. package/build/esm/markdown-it/emoji.js +2 -2
  280. package/build/esm/markdown-it/emoji.js.map +1 -1
  281. package/build/esm/markup/codemirror/create.d.ts +2 -0
  282. package/build/esm/markup/codemirror/create.js +16 -5
  283. package/build/esm/markup/codemirror/create.js.map +1 -1
  284. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  285. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  286. package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
  287. package/build/esm/markup/codemirror/logger-facet.js +6 -0
  288. package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
  289. package/build/esm/utils/event-emitter.d.ts +1 -0
  290. package/build/esm/utils/event-emitter.js +3 -0
  291. package/build/esm/utils/event-emitter.js.map +1 -1
  292. package/build/esm/utils/facet.d.ts +1 -0
  293. package/build/esm/utils/facet.js +29 -0
  294. package/build/esm/utils/facet.js.map +1 -0
  295. package/build/esm/utils/keymap.js +7 -2
  296. package/build/esm/utils/keymap.js.map +1 -1
  297. package/build/esm/version.js +1 -1
  298. package/build/esm/version.js.map +1 -1
  299. package/package.json +1 -1
@@ -15,18 +15,19 @@ const directive_facet_1 = require("./directive-facet.js");
15
15
  const files_upload_facet_1 = require("./files-upload-facet.js");
16
16
  const gravity_1 = require("./gravity.js");
17
17
  const converters_1 = require("./html-to-markdown/converters.js");
18
+ const logger_facet_1 = require("./logger-facet.js");
18
19
  const pairing_chars_1 = require("./pairing-chars.js");
19
20
  const react_facet_1 = require("./react-facet.js");
20
21
  const plugin_1 = require("./search-plugin/plugin.js");
21
22
  const smart_reindent_1 = require("./smart-reindent/index.js");
22
23
  const yfm_1 = require("./yfm.js");
23
24
  function createCodemirror(params) {
24
- const { doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, } = params;
25
+ const { logger, doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, } = params;
25
26
  const extensions = [gravity_1.gravityTheme, (0, view_1.placeholder)(placeholderContent)];
26
27
  if (!disabledExtensions.history) {
27
28
  extensions.push((0, commands_1.history)());
28
29
  }
29
- extensions.push((0, language_1.syntaxHighlighting)(gravity_1.gravityHighlightStyle), view_1.keymap.of([
30
+ extensions.push((0, language_1.syntaxHighlighting)(gravity_1.gravityHighlightStyle), logger_facet_1.LoggerFacet.of(logger), view_1.keymap.of([
30
31
  { key: shortcuts_1.formatter.toCM(shortcuts_1.Action.Bold), run: withLogger(action_names_1.ActionName.bold, commands_2.toggleBold) },
31
32
  { key: shortcuts_1.formatter.toCM(shortcuts_1.Action.Italic), run: withLogger(action_names_1.ActionName.italic, commands_2.toggleItalic) },
32
33
  { key: shortcuts_1.formatter.toCM(shortcuts_1.Action.Strike), run: withLogger(action_names_1.ActionName.strike, commands_2.toggleStrikethrough) },
@@ -74,6 +75,10 @@ function createCodemirror(params) {
74
75
  paste(event, editor) {
75
76
  if (!event.clipboardData)
76
77
  return;
78
+ const pasteLogger = logger.nested({
79
+ domEvent: 'paste',
80
+ dataTypes: event.clipboardData.types,
81
+ });
77
82
  const { from } = editor.state.selection.main;
78
83
  const line = editor.state.doc.lineAt(from);
79
84
  const currentLine = line.text;
@@ -82,6 +87,7 @@ function createCodemirror(params) {
82
87
  const yfmContent = event.clipboardData.getData(clipboard_1.DataTransferType.Yfm);
83
88
  if (yfmContent) {
84
89
  event.preventDefault();
90
+ logger.event({ event: 'paste-markup' });
85
91
  const reindentedYfmContent = (0, smart_reindent_1.smartReindent)(yfmContent, currentLine);
86
92
  editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));
87
93
  return;
@@ -104,10 +110,12 @@ function createCodemirror(params) {
104
110
  // especially with invalid HTML or weird DOM parsing errors.
105
111
  // If something goes wrong, I just want to fall back to the "default pasting"
106
112
  // rather than break the entire experience for the user.
107
- logger_1.logger.error(e);
113
+ pasteLogger.error(e, { event: 'parse-html-to-md' });
114
+ logger_1.globalLogger.error(e);
108
115
  }
109
116
  if (parsedMarkdownMarkup !== undefined) {
110
117
  event.preventDefault();
118
+ logger.event({ event: 'paste-parsed-html' });
111
119
  const reindentedHtmlContent = (0, smart_reindent_1.smartReindent)(parsedMarkdownMarkup, currentLine);
112
120
  editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));
113
121
  return;
@@ -117,6 +125,7 @@ function createCodemirror(params) {
117
125
  const { imageUrl, title } = parseInsertedUrlAsImage(event.clipboardData.getData(clipboard_1.DataTransferType.Text) ?? '') || {};
118
126
  if (imageUrl) {
119
127
  event.preventDefault();
128
+ logger.event({ event: 'paste-url-as-image' });
120
129
  (0, commands_2.insertImages)([
121
130
  {
122
131
  url: imageUrl,
@@ -168,7 +177,9 @@ function createCodemirror(params) {
168
177
  }
169
178
  function withLogger(action, command) {
170
179
  return (...args) => {
171
- logger_1.logger.action({ mode: 'markup', source: 'keymap', action });
180
+ const { state } = args[0];
181
+ state.facet(logger_facet_1.LoggerFacet).action({ source: 'keymap', action });
182
+ logger_1.globalLogger.action({ mode: 'markup', source: 'keymap', action });
172
183
  return command(...args);
173
184
  };
174
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":"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","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {logger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return;\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n logger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return;\n }\n }\n\n if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n }\n },\n }),\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n logger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
1
+ {"version":3,"file":"create.js","sourceRoot":"../../../../src","sources":["markup/codemirror/create.ts"],"names":[],"mappings":"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","sourcesContent":["import {autocompletion} from '@codemirror/autocomplete';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n insertNewlineKeepIndent,\n insertTab,\n} from '@codemirror/commands';\nimport {syntaxHighlighting} from '@codemirror/language';\nimport type {Extension, StateCommand} from '@codemirror/state';\nimport {\n EditorView,\n type EditorViewConfig,\n type KeyBinding,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type {ParseInsertedUrlAsImage} from '../../bundle';\nimport type {EventMap} from '../../bundle/Editor';\nimport {ActionName} from '../../bundle/config/action-names';\nimport type {ReactRenderStorage} from '../../extensions';\nimport {type Logger2, globalLogger} from '../../logger';\nimport {Action as A, formatter as f} from '../../shortcuts';\nimport type {Receiver} from '../../utils';\nimport {DataTransferType, shouldSkipHtmlConversion} from '../../utils/clipboard';\nimport type {DirectiveSyntaxContext} from '../../utils/directive';\nimport {\n insertEmptyRow,\n insertImages,\n insertLink,\n toH1,\n toH2,\n toH3,\n toH4,\n toH5,\n toH6,\n toggleBold,\n toggleItalic,\n toggleStrikethrough,\n toggleUnderline,\n wrapToCodeBlock,\n wrapToInlineCode,\n wrapToYfmCut,\n wrapToYfmNote,\n} from '../commands';\n\nimport {DirectiveSyntaxFacet} from './directive-facet';\nimport {type FileUploadHandler, FileUploadHandlerFacet} from './files-upload-facet';\nimport {gravityHighlightStyle, gravityTheme} from './gravity';\nimport {MarkdownConverter} from './html-to-markdown/converters';\nimport {LoggerFacet} from './logger-facet';\nimport {PairingCharactersExtension} from './pairing-chars';\nimport {ReactRendererFacet} from './react-facet';\nimport {SearchPanelPlugin} from './search-plugin/plugin';\nimport {smartReindent} from './smart-reindent';\nimport {type YfmLangOptions, yfmLang} from './yfm';\n\nexport type {YfmLangOptions};\n\ntype Autocompletion = Parameters<typeof autocompletion>[0];\n\nexport type CreateCodemirrorParams = {\n doc: EditorViewConfig['doc'];\n placeholder: Parameters<typeof placeholder>[0];\n logger: Logger2.ILogger;\n onCancel: () => void;\n onSubmit: () => void;\n onChange: () => void;\n onDocChange: () => void;\n onScroll: (event: Event) => void;\n reactRenderer: ReactRenderStorage;\n uploadHandler?: FileUploadHandler;\n parseHtmlOnPaste?: boolean;\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n needImageDimensions?: boolean;\n enableNewImageSizeCalculation?: boolean;\n extensions?: Extension[];\n disabledExtensions?: {\n history?: boolean;\n };\n keymaps?: readonly KeyBinding[];\n receiver?: Receiver<EventMap>;\n yfmLangOptions?: YfmLangOptions;\n autocompletion?: Autocompletion;\n directiveSyntax: DirectiveSyntaxContext;\n preserveEmptyRows: boolean;\n};\n\nexport function createCodemirror(params: CreateCodemirrorParams) {\n const {\n logger,\n doc,\n reactRenderer,\n onCancel,\n onScroll,\n onSubmit,\n onChange,\n onDocChange,\n disabledExtensions = {},\n keymaps = [],\n receiver,\n yfmLangOptions,\n extensions: extraExtensions,\n placeholder: placeholderContent,\n autocompletion: autocompletionConfig,\n parseHtmlOnPaste,\n parseInsertedUrlAsImage,\n directiveSyntax,\n preserveEmptyRows,\n } = params;\n\n const extensions: Extension[] = [gravityTheme, placeholder(placeholderContent)];\n\n if (!disabledExtensions.history) {\n extensions.push(history());\n }\n\n extensions.push(\n syntaxHighlighting(gravityHighlightStyle),\n LoggerFacet.of(logger),\n keymap.of([\n {key: f.toCM(A.Bold)!, run: withLogger(ActionName.bold, toggleBold)},\n {key: f.toCM(A.Italic)!, run: withLogger(ActionName.italic, toggleItalic)},\n {key: f.toCM(A.Strike)!, run: withLogger(ActionName.strike, toggleStrikethrough)},\n {key: f.toCM(A.Underline)!, run: withLogger(ActionName.underline, toggleUnderline)},\n {key: f.toCM(A.Link)!, run: withLogger(ActionName.link, insertLink)},\n {key: f.toCM(A.Heading1)!, run: withLogger(ActionName.heading1, toH1)},\n {key: f.toCM(A.Heading2)!, run: withLogger(ActionName.heading2, toH2)},\n {key: f.toCM(A.Heading3)!, run: withLogger(ActionName.heading3, toH3)},\n {key: f.toCM(A.Heading4)!, run: withLogger(ActionName.heading4, toH4)},\n {key: f.toCM(A.Heading5)!, run: withLogger(ActionName.heading5, toH5)},\n {key: f.toCM(A.Heading6)!, run: withLogger(ActionName.heading6, toH6)},\n {key: f.toCM(A.Code)!, run: withLogger(ActionName.code_inline, wrapToInlineCode)},\n {key: f.toCM(A.CodeBlock)!, run: withLogger(ActionName.code_block, wrapToCodeBlock)},\n {key: f.toCM(A.Cut)!, run: withLogger(ActionName.yfm_cut, wrapToYfmCut)},\n {key: f.toCM(A.Note)!, run: withLogger(ActionName.yfm_note, wrapToYfmNote)},\n {\n key: f.toCM(A.Cancel)!,\n preventDefault: true,\n run: () => {\n onCancel();\n return true;\n },\n },\n {\n key: f.toCM(A.Submit)!,\n preventDefault: true,\n run: () => {\n onSubmit();\n return true;\n },\n },\n {key: 'Tab', preventDefault: true, run: insertTab},\n {\n key: 'Enter',\n shift: insertNewlineKeepIndent,\n },\n indentWithTab,\n ...defaultKeymap,\n ...(disabledExtensions.history ? [] : historyKeymap),\n ...keymaps,\n ]),\n autocompletion(autocompletionConfig),\n yfmLang(yfmLangOptions),\n ReactRendererFacet.of(reactRenderer),\n DirectiveSyntaxFacet.of(directiveSyntax),\n PairingCharactersExtension,\n EditorView.lineWrapping,\n EditorView.contentAttributes.of({spellcheck: 'true'}),\n EditorView.domEventHandlers({\n scroll(event) {\n onScroll(event);\n },\n paste(event, editor) {\n if (!event.clipboardData) return;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: event.clipboardData.types,\n });\n\n const {from} = editor.state.selection.main;\n const line = editor.state.doc.lineAt(from);\n const currentLine = line.text;\n\n // if clipboard contains YFM content - avoid any meddling with pasted content\n // since text/yfm will contain valid markdown\n const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);\n if (yfmContent) {\n event.preventDefault();\n logger.event({event: 'paste-markup'});\n const reindentedYfmContent = smartReindent(yfmContent, currentLine);\n editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));\n return;\n }\n\n // checking if a copy buffer content is suitable for convertion\n const shouldSkipHtml = shouldSkipHtmlConversion(event.clipboardData);\n\n // if we have text/html inside copy/paste buffer\n const htmlContent = event.clipboardData.getData(DataTransferType.Html);\n // if we pasting markdown from VsCode we need skip html transformation\n if (htmlContent && parseHtmlOnPaste && !shouldSkipHtml) {\n let parsedMarkdownMarkup: string | undefined;\n try {\n const parser = new DOMParser();\n const htmlDoc = parser.parseFromString(htmlContent, 'text/html');\n\n const converter = new MarkdownConverter();\n parsedMarkdownMarkup = converter.processNode(htmlDoc.body).trim();\n } catch (e) {\n // The code is pretty new and there might be random issues we haven't caught yet,\n // especially with invalid HTML or weird DOM parsing errors.\n // If something goes wrong, I just want to fall back to the \"default pasting\"\n // rather than break the entire experience for the user.\n pasteLogger.error(e, {event: 'parse-html-to-md'});\n globalLogger.error(e);\n }\n\n if (parsedMarkdownMarkup !== undefined) {\n event.preventDefault();\n logger.event({event: 'paste-parsed-html'});\n const reindentedHtmlContent = smartReindent(\n parsedMarkdownMarkup,\n currentLine,\n );\n editor.dispatch(editor.state.replaceSelection(reindentedHtmlContent));\n return;\n }\n }\n\n if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n event.clipboardData.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (imageUrl) {\n event.preventDefault();\n logger.event({event: 'paste-url-as-image'});\n insertImages([\n {\n url: imageUrl,\n alt: title,\n title,\n },\n ])(editor);\n }\n }\n\n // Reindenting pasted plain text\n const pastedText = event.clipboardData.getData(DataTransferType.Text);\n const reindentedText = smartReindent(pastedText, currentLine);\n // but only if there is a need for reindentation\n if (pastedText !== reindentedText) {\n editor.dispatch(editor.state.replaceSelection(reindentedText));\n event.preventDefault();\n }\n },\n }),\n SearchPanelPlugin({\n anchorSelector: '.g-md-search-anchor',\n receiver,\n }),\n );\n\n if (preserveEmptyRows) {\n extensions.push(\n keymap.of([\n {key: f.toCM(A.EmptyRow)!, run: withLogger(ActionName.emptyRow, insertEmptyRow)},\n ]),\n );\n }\n\n if (params.uploadHandler) {\n extensions.push(\n FileUploadHandlerFacet.of({\n fn: params.uploadHandler,\n imageWithDimensions: params.needImageDimensions,\n enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,\n }),\n );\n }\n\n if (extraExtensions) {\n extensions.push(...extraExtensions);\n }\n\n return new EditorView({\n doc,\n extensions,\n dispatchTransactions: (trs, view) => {\n view.update(trs);\n onChange();\n if (trs.some((tr) => tr.docChanged)) {\n onDocChange();\n }\n },\n });\n}\n\nexport function withLogger(action: string, command: StateCommand): StateCommand {\n return (...args) => {\n const {state} = args[0];\n state.facet(LoggerFacet).action({source: 'keymap', action});\n globalLogger.action({mode: 'markup', source: 'keymap', action});\n return command(...args);\n };\n}\n"]}
@@ -4,6 +4,7 @@ exports.FilesUploadPlugin = void 0;
4
4
  const view_1 = require("@codemirror/view");
5
5
  const utils_1 = require("../../../utils/index.js");
6
6
  const files_upload_facet_1 = require("../files-upload-facet.js");
7
+ const logger_facet_1 = require("../logger-facet.js");
7
8
  const react_facet_1 = require("../react-facet.js");
8
9
  const const_1 = require("./const.js");
9
10
  const effects_1 = require("./effects.js");
@@ -209,6 +210,12 @@ exports.FilesUploadPlugin = view_1.ViewPlugin.fromClass(class {
209
210
  if (!files)
210
211
  return false;
211
212
  const { from, to } = view.state.selection.main;
213
+ view.state.facet(logger_facet_1.LoggerFacet).event({
214
+ domEvent: 'paste',
215
+ event: 'paste-files',
216
+ plugin: 'files-upload',
217
+ dataTypes: event.clipboardData.types,
218
+ });
212
219
  view.dispatch({
213
220
  selection: { anchor: from },
214
221
  effects: effects_1.AddUploadWidgetEffect.of({ files, pos: from }),
@@ -223,6 +230,12 @@ exports.FilesUploadPlugin = view_1.ViewPlugin.fromClass(class {
223
230
  const files = (0, utils_2.getTransferFiles)(event.dataTransfer);
224
231
  if (!files)
225
232
  return false;
233
+ view.state.facet(logger_facet_1.LoggerFacet).event({
234
+ domEvent: 'drop',
235
+ event: 'drop-files',
236
+ plugin: 'files-upload',
237
+ dataTypes: event.dataTransfer.types,
238
+ });
226
239
  const pos = this.view.posAtCoords(event, false);
227
240
  view.dispatch({
228
241
  selection: { anchor: pos },
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/files-upload-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ChangeSpec} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport type {RendererItem} from '../../../extensions';\nimport {type FileUploadHandler, type FileUploadResult, getProportionalSize} from '../../../utils';\nimport {FileUploadHandlerFacet} from '../files-upload-facet';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {IMG_MAX_HEIGHT, SUCCESS_UPLOAD_REMOVE_TIMEOUT} from './const';\nimport {AddUploadWidgetEffect, RemoveUploadWidgetEffect} from './effects';\nimport {getImageDimensions, getTransferFiles, isImageFile, uniqueId} from './utils';\nimport {renderWidget} from './widget';\n\nclass FileUploadWidget extends WidgetType {\n readonly selfId: string;\n\n private presenter?: FileUploadPresenter;\n\n private renderer: RendererItem | null = null;\n private props: object = {};\n\n constructor(id: string) {\n super();\n this.selfId = id;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const dom = document.createElement('div');\n dom.className = 'cm-file-upload-widget';\n dom.style.display = 'inline-block';\n this.renderer?.remove();\n this.createRenderItem(dom, view);\n return dom;\n }\n\n updateDOM(dom: HTMLElement, view: EditorView): boolean {\n this.renderer?.remove();\n this.createRenderItem(dom, view);\n return true;\n }\n\n destroy(dom: HTMLElement): void {\n super.destroy(dom);\n this.renderer?.remove();\n this.presenter?.cancel();\n this.presenter = undefined;\n }\n\n setPresenter(presenter: FileUploadPresenter) {\n this.presenter = presenter;\n }\n\n render(props: object) {\n Object.assign(this.props, props);\n this.renderer?.rerender();\n }\n\n private createRenderItem(dom: HTMLElement, view: EditorView) {\n this.renderer = view.state\n .facet(ReactRendererFacet)\n .createItem('cm-file-upload-widget', () => renderWidget(dom, {...(this.props as any)}));\n }\n}\n\nclass FileUploadPresenter {\n readonly widget: FileUploadWidget;\n\n private readonly file: File;\n private readonly view: EditorView;\n private readonly uploader: FileUploadHandler;\n private readonly needDimensionsForImages: boolean;\n private readonly enableNewImageSizeCalculation: boolean;\n\n private state: 'initial' | 'uploading' | 'success' | 'error' | 'canceled' = 'initial';\n\n constructor(params: {\n file: File;\n widget: FileUploadWidget;\n uploader: FileUploadHandler;\n view: EditorView;\n needDimensionsForImages: boolean;\n enableNewImageSizeCalculation: boolean;\n }) {\n this.file = params.file;\n this.view = params.view;\n this.widget = params.widget;\n this.uploader = params.uploader;\n this.needDimensionsForImages = params.needDimensionsForImages;\n this.enableNewImageSizeCalculation = params.enableNewImageSizeCalculation;\n this.widget.setPresenter(this);\n this.run();\n }\n\n cancel() {\n this.state = 'canceled';\n }\n\n private run() {\n this.state = 'uploading';\n this.widget.render({\n status: 'uploading',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n });\n this.uploader(this.file).then(this.onUploadSuccess, this.onUploadError);\n }\n\n private onUploadSuccess = (res: FileUploadResult) => {\n if (this.state === 'canceled') return;\n this.state = 'success';\n this.widget.render({\n status: 'success',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n });\n setTimeout(async () => {\n const markup = await this.formatFileMarkup(res);\n if (this.state === 'canceled') return;\n\n this.view.dispatch({\n effects: RemoveUploadWidgetEffect.of({\n id: this.widget.selfId,\n markup,\n }),\n });\n }, SUCCESS_UPLOAD_REMOVE_TIMEOUT);\n };\n\n private onUploadError = (err: unknown) => {\n if (this.state === 'canceled') return;\n this.state = 'error';\n this.widget.render({\n status: 'error',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n errorText: String(err),\n onReUploadClick: () => {\n if (this.state === 'error') this.run();\n },\n });\n };\n\n private async formatFileMarkup(res: FileUploadResult) {\n const fileName = res.name ?? this.file.name ?? '';\n\n let markup = `![${fileName}](${res.url}`;\n\n if (isImageFile(this.file)) {\n if (this.needDimensionsForImages) {\n try {\n const fileSize = await getImageDimensions(this.file);\n\n if (this.enableNewImageSizeCalculation) {\n const {width, height} = getProportionalSize({\n width: fileSize.width,\n height: fileSize.height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n\n markup += ` =${width}x${height}`;\n } else {\n const height = Math.min(fileSize.height, IMG_MAX_HEIGHT);\n markup += ` =x${height}`;\n }\n } catch (err) {\n console.error(err);\n }\n }\n\n markup += `)`;\n } else {\n markup = `{% file src=\"${res.url}\" name=\"${fileName.replace('\"', '')}\" %}`;\n }\n\n return markup;\n }\n}\n\nexport const FilesUploadPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decos: DecorationSet = Decoration.none;\n readonly view: EditorView;\n\n constructor(view: EditorView) {\n this.view = view;\n }\n\n update(update: ViewUpdate): void {\n this.decos = this.decos.map(update.changes);\n const uploadFacet = this.view.state.facet(FileUploadHandlerFacet);\n\n const changes: ChangeSpec[] = [];\n\n for (const tr of update.transactions) {\n for (const eff of tr.effects) {\n if (eff.is(AddUploadWidgetEffect)) {\n this.decos = this.decos.update({\n add: Array.from(eff.value.files).map((file, index) => {\n const {widget} = new FileUploadPresenter({\n file,\n view: this.view,\n uploader: uploadFacet.fn,\n needDimensionsForImages: Boolean(\n uploadFacet.imageWithDimensions,\n ),\n enableNewImageSizeCalculation: Boolean(\n uploadFacet.enableNewImageSizeCalculation,\n ),\n widget: new FileUploadWidget(uniqueId('__file_widget_id')),\n });\n return Decoration.widget({\n widget,\n side: 1,\n __file_widget_id: widget.selfId,\n }).range(eff.value.pos + index);\n }),\n });\n }\n if (eff.is(RemoveUploadWidgetEffect)) {\n this.decos = this.decos.update({\n filter: (from, to, deco) => {\n if (deco.spec.__file_widget_id !== eff.value.id) return true;\n if (eff.value.markup) {\n changes.push({from, to, insert: eff.value.markup});\n }\n return false;\n },\n });\n }\n }\n }\n\n if (changes.length) {\n setTimeout(() => {\n this.view.dispatch({changes});\n });\n }\n }\n },\n {\n decorations: (v) => v.decos,\n eventHandlers: {\n paste(event, view) {\n if (!event.clipboardData) return false;\n\n const files = getTransferFiles(event.clipboardData);\n if (!files) return false;\n\n const {from, to} = view.state.selection.main;\n\n view.dispatch({\n selection: {anchor: from},\n effects: AddUploadWidgetEffect.of({files, pos: from}),\n changes: {from, to, insert: ' '.repeat(files.length)},\n });\n event.preventDefault();\n return true;\n },\n drop(event, view) {\n if (!event.dataTransfer) return false;\n\n const files = getTransferFiles(event.dataTransfer);\n if (!files) return false;\n\n const pos = this.view.posAtCoords(event, false);\n view.dispatch({\n selection: {anchor: pos},\n effects: AddUploadWidgetEffect.of({files, pos}),\n changes: {from: pos, insert: ' '.repeat(files.length)},\n });\n event.preventDefault();\n return true;\n },\n },\n },\n);\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/files-upload-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ChangeSpec} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport type {RendererItem} from '../../../extensions';\nimport {type FileUploadHandler, type FileUploadResult, getProportionalSize} from '../../../utils';\nimport {FileUploadHandlerFacet} from '../files-upload-facet';\nimport {LoggerFacet} from '../logger-facet';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {IMG_MAX_HEIGHT, SUCCESS_UPLOAD_REMOVE_TIMEOUT} from './const';\nimport {AddUploadWidgetEffect, RemoveUploadWidgetEffect} from './effects';\nimport {getImageDimensions, getTransferFiles, isImageFile, uniqueId} from './utils';\nimport {renderWidget} from './widget';\n\nclass FileUploadWidget extends WidgetType {\n readonly selfId: string;\n\n private presenter?: FileUploadPresenter;\n\n private renderer: RendererItem | null = null;\n private props: object = {};\n\n constructor(id: string) {\n super();\n this.selfId = id;\n }\n\n toDOM(view: EditorView): HTMLElement {\n const dom = document.createElement('div');\n dom.className = 'cm-file-upload-widget';\n dom.style.display = 'inline-block';\n this.renderer?.remove();\n this.createRenderItem(dom, view);\n return dom;\n }\n\n updateDOM(dom: HTMLElement, view: EditorView): boolean {\n this.renderer?.remove();\n this.createRenderItem(dom, view);\n return true;\n }\n\n destroy(dom: HTMLElement): void {\n super.destroy(dom);\n this.renderer?.remove();\n this.presenter?.cancel();\n this.presenter = undefined;\n }\n\n setPresenter(presenter: FileUploadPresenter) {\n this.presenter = presenter;\n }\n\n render(props: object) {\n Object.assign(this.props, props);\n this.renderer?.rerender();\n }\n\n private createRenderItem(dom: HTMLElement, view: EditorView) {\n this.renderer = view.state\n .facet(ReactRendererFacet)\n .createItem('cm-file-upload-widget', () => renderWidget(dom, {...(this.props as any)}));\n }\n}\n\nclass FileUploadPresenter {\n readonly widget: FileUploadWidget;\n\n private readonly file: File;\n private readonly view: EditorView;\n private readonly uploader: FileUploadHandler;\n private readonly needDimensionsForImages: boolean;\n private readonly enableNewImageSizeCalculation: boolean;\n\n private state: 'initial' | 'uploading' | 'success' | 'error' | 'canceled' = 'initial';\n\n constructor(params: {\n file: File;\n widget: FileUploadWidget;\n uploader: FileUploadHandler;\n view: EditorView;\n needDimensionsForImages: boolean;\n enableNewImageSizeCalculation: boolean;\n }) {\n this.file = params.file;\n this.view = params.view;\n this.widget = params.widget;\n this.uploader = params.uploader;\n this.needDimensionsForImages = params.needDimensionsForImages;\n this.enableNewImageSizeCalculation = params.enableNewImageSizeCalculation;\n this.widget.setPresenter(this);\n this.run();\n }\n\n cancel() {\n this.state = 'canceled';\n }\n\n private run() {\n this.state = 'uploading';\n this.widget.render({\n status: 'uploading',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n });\n this.uploader(this.file).then(this.onUploadSuccess, this.onUploadError);\n }\n\n private onUploadSuccess = (res: FileUploadResult) => {\n if (this.state === 'canceled') return;\n this.state = 'success';\n this.widget.render({\n status: 'success',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n });\n setTimeout(async () => {\n const markup = await this.formatFileMarkup(res);\n if (this.state === 'canceled') return;\n\n this.view.dispatch({\n effects: RemoveUploadWidgetEffect.of({\n id: this.widget.selfId,\n markup,\n }),\n });\n }, SUCCESS_UPLOAD_REMOVE_TIMEOUT);\n };\n\n private onUploadError = (err: unknown) => {\n if (this.state === 'canceled') return;\n this.state = 'error';\n this.widget.render({\n status: 'error',\n fileName: this.file.name,\n fileType: isImageFile(this.file) ? 'image' : 'file',\n errorText: String(err),\n onReUploadClick: () => {\n if (this.state === 'error') this.run();\n },\n });\n };\n\n private async formatFileMarkup(res: FileUploadResult) {\n const fileName = res.name ?? this.file.name ?? '';\n\n let markup = `![${fileName}](${res.url}`;\n\n if (isImageFile(this.file)) {\n if (this.needDimensionsForImages) {\n try {\n const fileSize = await getImageDimensions(this.file);\n\n if (this.enableNewImageSizeCalculation) {\n const {width, height} = getProportionalSize({\n width: fileSize.width,\n height: fileSize.height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n\n markup += ` =${width}x${height}`;\n } else {\n const height = Math.min(fileSize.height, IMG_MAX_HEIGHT);\n markup += ` =x${height}`;\n }\n } catch (err) {\n console.error(err);\n }\n }\n\n markup += `)`;\n } else {\n markup = `{% file src=\"${res.url}\" name=\"${fileName.replace('\"', '')}\" %}`;\n }\n\n return markup;\n }\n}\n\nexport const FilesUploadPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decos: DecorationSet = Decoration.none;\n readonly view: EditorView;\n\n constructor(view: EditorView) {\n this.view = view;\n }\n\n update(update: ViewUpdate): void {\n this.decos = this.decos.map(update.changes);\n const uploadFacet = this.view.state.facet(FileUploadHandlerFacet);\n\n const changes: ChangeSpec[] = [];\n\n for (const tr of update.transactions) {\n for (const eff of tr.effects) {\n if (eff.is(AddUploadWidgetEffect)) {\n this.decos = this.decos.update({\n add: Array.from(eff.value.files).map((file, index) => {\n const {widget} = new FileUploadPresenter({\n file,\n view: this.view,\n uploader: uploadFacet.fn,\n needDimensionsForImages: Boolean(\n uploadFacet.imageWithDimensions,\n ),\n enableNewImageSizeCalculation: Boolean(\n uploadFacet.enableNewImageSizeCalculation,\n ),\n widget: new FileUploadWidget(uniqueId('__file_widget_id')),\n });\n return Decoration.widget({\n widget,\n side: 1,\n __file_widget_id: widget.selfId,\n }).range(eff.value.pos + index);\n }),\n });\n }\n if (eff.is(RemoveUploadWidgetEffect)) {\n this.decos = this.decos.update({\n filter: (from, to, deco) => {\n if (deco.spec.__file_widget_id !== eff.value.id) return true;\n if (eff.value.markup) {\n changes.push({from, to, insert: eff.value.markup});\n }\n return false;\n },\n });\n }\n }\n }\n\n if (changes.length) {\n setTimeout(() => {\n this.view.dispatch({changes});\n });\n }\n }\n },\n {\n decorations: (v) => v.decos,\n eventHandlers: {\n paste(event, view) {\n if (!event.clipboardData) return false;\n\n const files = getTransferFiles(event.clipboardData);\n if (!files) return false;\n\n const {from, to} = view.state.selection.main;\n\n view.state.facet(LoggerFacet).event({\n domEvent: 'paste',\n event: 'paste-files',\n plugin: 'files-upload',\n dataTypes: event.clipboardData.types,\n });\n\n view.dispatch({\n selection: {anchor: from},\n effects: AddUploadWidgetEffect.of({files, pos: from}),\n changes: {from, to, insert: ' '.repeat(files.length)},\n });\n event.preventDefault();\n return true;\n },\n drop(event, view) {\n if (!event.dataTransfer) return false;\n\n const files = getTransferFiles(event.dataTransfer);\n if (!files) return false;\n\n view.state.facet(LoggerFacet).event({\n domEvent: 'drop',\n event: 'drop-files',\n plugin: 'files-upload',\n dataTypes: event.dataTransfer.types,\n });\n\n const pos = this.view.posAtCoords(event, false);\n view.dispatch({\n selection: {anchor: pos},\n effects: AddUploadWidgetEffect.of({files, pos}),\n changes: {from: pos, insert: ' '.repeat(files.length)},\n });\n event.preventDefault();\n return true;\n },\n },\n },\n);\n"]}
@@ -0,0 +1,3 @@
1
+ import { Facet } from '@codemirror/state';
2
+ import type { Logger2 } from "../../logger.js";
3
+ export declare const LoggerFacet: Facet<Logger2.ILogger, Logger2.ILogger>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoggerFacet = void 0;
4
+ const state_1 = require("@codemirror/state");
5
+ exports.LoggerFacet = state_1.Facet.define({
6
+ combine: (value) => value[0],
7
+ static: true,
8
+ });
9
+ //# sourceMappingURL=logger-facet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-facet.js","sourceRoot":"../../../../src","sources":["markup/codemirror/logger-facet.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AAI3B,QAAA,WAAW,GAAG,aAAK,CAAC,MAAM,CAAmC;IACtE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,IAAI;CACf,CAAC,CAAC","sourcesContent":["import {Facet} from '@codemirror/state';\n\nimport type {Logger2} from '../../logger';\n\nexport const LoggerFacet = Facet.define<Logger2.ILogger, Logger2.ILogger>({\n combine: (value) => value[0],\n static: true,\n});\n"]}
@@ -14,6 +14,7 @@ export declare class EventEmitter<T extends object = UnkObj> implements Emitter<
14
14
  on<K extends keyof T>(type: K, listener: Listener<T[K]>): void;
15
15
  off<K extends keyof T>(type: K, listener: Listener<T[K]>): void;
16
16
  emit<K extends keyof T>(type: K, value: T[K]): void;
17
+ countOf<K extends keyof T>(type: K): number;
17
18
  }
18
19
  export declare class SafeEventEmitter<T extends object = UnkObj> extends EventEmitter<T> {
19
20
  private onError;
@@ -17,6 +17,9 @@ class EventEmitter {
17
17
  emit(type, value) {
18
18
  this._listeners.get(type)?.forEach((listener) => listener(value));
19
19
  }
20
+ countOf(type) {
21
+ return this._listeners.get(type)?.length || 0;
22
+ }
20
23
  }
21
24
  exports.EventEmitter = EventEmitter;
22
25
  class SafeEventEmitter extends EventEmitter {
@@ -1 +1 @@
1
- {"version":3,"file":"event-emitter.js","sourceRoot":"../../../src","sources":["utils/event-emitter.ts"],"names":[],"mappings":";;;AAaA,MAAa,YAAY;IACX,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE3D,EAAE,CAAoB,IAAO,EAAE,QAAwB;QACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG,CAAoB,IAAO,EAAE,QAAwB;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CACf,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAC/D,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,CAAoB,IAAO,EAAE,KAAW;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;CACJ;AAtBD,oCAsBC;AAED,MAAa,gBAA4C,SAAQ,YAAe;IACpE,OAAO,CAA2B;IAE1C,YAAY,OAA8C;QACtD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IACrD,CAAC;IAED,IAAI,CAAoB,IAAO,EAAE,KAAW;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,QAAQ,CAAC,EAAc;QAC3B,IAAI,CAAC;YACD,EAAE,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;CACJ;AAnBD,4CAmBC","sourcesContent":["type UnkObj = {[key: string]: unknown};\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface Emitter<T extends object = UnkObj> {\n emit<K extends keyof T>(type: K, data: T[K]): void;\n}\n\nexport interface Receiver<T extends object = UnkObj> {\n on<K extends keyof T>(type: K, listener: Listener<T[K]>): void;\n off<K extends keyof T>(type: K, listener: Listener<T[K]>): void;\n}\n\nexport class EventEmitter<T extends object = UnkObj> implements Emitter<T>, Receiver<T> {\n protected _listeners = new Map<keyof T, Listener<any>[]>();\n\n on<K extends keyof T>(type: K, listener: Listener<T[K]>): void {\n if (!this._listeners.has(type)) {\n this._listeners.set(type, []);\n }\n this._listeners.get(type)!.push(listener);\n }\n\n off<K extends keyof T>(type: K, listener: Listener<T[K]>): void {\n if (this._listeners.has(type)) {\n this._listeners.set(\n type,\n this._listeners.get(type)!.filter((val) => val !== listener),\n );\n }\n }\n\n emit<K extends keyof T>(type: K, value: T[K]): void {\n this._listeners.get(type)?.forEach((listener) => listener(value));\n }\n}\n\nexport class SafeEventEmitter<T extends object = UnkObj> extends EventEmitter<T> {\n private onError: (error: unknown) => void;\n\n constructor(options?: {onError?: (error: unknown) => void}) {\n super();\n this.onError = options?.onError ?? console.error;\n }\n\n emit<K extends keyof T>(type: K, value: T[K]): void {\n this._listeners.get(type)?.forEach((listener) => this.safeExec(() => listener(value)));\n }\n\n private safeExec(fn: () => void): void {\n try {\n fn();\n } catch (e) {\n this.onError(e);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"../../../src","sources":["utils/event-emitter.ts"],"names":[],"mappings":";;;AAaA,MAAa,YAAY;IACX,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE3D,EAAE,CAAoB,IAAO,EAAE,QAAwB;QACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG,CAAoB,IAAO,EAAE,QAAwB;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CACf,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAC/D,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,CAAoB,IAAO,EAAE,KAAW;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAoB,IAAO;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAClD,CAAC;CACJ;AA1BD,oCA0BC;AAED,MAAa,gBAA4C,SAAQ,YAAe;IACpE,OAAO,CAA2B;IAE1C,YAAY,OAA8C;QACtD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IACrD,CAAC;IAED,IAAI,CAAoB,IAAO,EAAE,KAAW;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,QAAQ,CAAC,EAAc;QAC3B,IAAI,CAAC;YACD,EAAE,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;CACJ;AAnBD,4CAmBC","sourcesContent":["type UnkObj = {[key: string]: unknown};\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface Emitter<T extends object = UnkObj> {\n emit<K extends keyof T>(type: K, data: T[K]): void;\n}\n\nexport interface Receiver<T extends object = UnkObj> {\n on<K extends keyof T>(type: K, listener: Listener<T[K]>): void;\n off<K extends keyof T>(type: K, listener: Listener<T[K]>): void;\n}\n\nexport class EventEmitter<T extends object = UnkObj> implements Emitter<T>, Receiver<T> {\n protected _listeners = new Map<keyof T, Listener<any>[]>();\n\n on<K extends keyof T>(type: K, listener: Listener<T[K]>): void {\n if (!this._listeners.has(type)) {\n this._listeners.set(type, []);\n }\n this._listeners.get(type)!.push(listener);\n }\n\n off<K extends keyof T>(type: K, listener: Listener<T[K]>): void {\n if (this._listeners.has(type)) {\n this._listeners.set(\n type,\n this._listeners.get(type)!.filter((val) => val !== listener),\n );\n }\n }\n\n emit<K extends keyof T>(type: K, value: T[K]): void {\n this._listeners.get(type)?.forEach((listener) => listener(value));\n }\n\n countOf<K extends keyof T>(type: K): number {\n return this._listeners.get(type)?.length || 0;\n }\n}\n\nexport class SafeEventEmitter<T extends object = UnkObj> extends EventEmitter<T> {\n private onError: (error: unknown) => void;\n\n constructor(options?: {onError?: (error: unknown) => void}) {\n super();\n this.onError = options?.onError ?? console.error;\n }\n\n emit<K extends keyof T>(type: K, value: T[K]): void {\n this._listeners.get(type)?.forEach((listener) => this.safeExec(() => listener(value)));\n }\n\n private safeExec(fn: () => void): void {\n try {\n fn();\n } catch (e) {\n this.onError(e);\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ // Partial realization of Facet from CodeMirror, but for ProseMirror
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Facet = void 0;
5
+ const prosemirror_state_1 = require("prosemirror-state");
6
+ const lodash_1 = require("../lodash.js");
7
+ /** @internal @unstable */
8
+ class Facet {
9
+ static define(config) {
10
+ return new this(config);
11
+ }
12
+ _combine;
13
+ _key;
14
+ constructor(config) {
15
+ this._combine = config.combine;
16
+ this._key = new prosemirror_state_1.PluginKey(`Facet${config.static ? '_static' : ''}:${config.name || ''}:${(0, lodash_1.uniqueId)()}`);
17
+ }
18
+ of(value) {
19
+ const output = this._combine([value]);
20
+ return new prosemirror_state_1.Plugin({
21
+ key: this._key,
22
+ state: {
23
+ init: () => output,
24
+ apply: () => output,
25
+ },
26
+ });
27
+ }
28
+ getState(state) {
29
+ return this._key.getState(state);
30
+ }
31
+ }
32
+ exports.Facet = Facet;
33
+ //# sourceMappingURL=facet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet.js","sourceRoot":"../../../src","sources":["utils/facet.ts"],"names":[],"mappings":";AAAA,oEAAoE;;;AAEpE,yDAAsE;AAEtE,yCAAmC;AASnC,0BAA0B;AAC1B,MAAa,KAAK;IACd,MAAM,CAAC,MAAM,CACT,MAAkC;QAElC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEgB,QAAQ,CAAC;IACT,IAAI,CAAoB;IAEzC,YAAoB,MAAkC;QAClD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,6BAAS,CACrB,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,IAAA,iBAAQ,GAAE,EAAE,CAC9E,CAAC;IACN,CAAC;IAED,EAAE,CAAC,KAAY;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,0BAAM,CAAS;YACtB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,KAAK,EAAE;gBACH,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM;aACtB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,QAAQ,CAAC,KAAkB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;CACJ;AA/BD,sBA+BC","sourcesContent":["// Partial realization of Facet from CodeMirror, but for ProseMirror\n\nimport {type EditorState, Plugin, PluginKey} from 'prosemirror-state';\n\nimport {uniqueId} from '../lodash';\n\n/** @internal @unstable */\nexport type FacetConfig<Input, Output> = {\n combine: (value: readonly Input[]) => Output;\n static: true;\n name?: string;\n};\n\n/** @internal @unstable */\nexport class Facet<Input, Output = readonly Input[]> {\n static define<Input, Output = readonly Input[]>(\n config: FacetConfig<Input, Output>,\n ): Facet<Input, Output> {\n return new this(config);\n }\n\n private readonly _combine;\n private readonly _key: PluginKey<Output>;\n\n private constructor(config: FacetConfig<Input, Output>) {\n this._combine = config.combine;\n this._key = new PluginKey(\n `Facet${config.static ? '_static' : ''}:${config.name || ''}:${uniqueId()}`,\n );\n }\n\n of(value: Input): Plugin<Output> {\n const output = this._combine([value]);\n return new Plugin<Output>({\n key: this._key,\n state: {\n init: () => output,\n apply: () => output,\n },\n });\n }\n\n getState(state: EditorState): Output | undefined {\n return this._key.getState(state);\n }\n}\n"]}
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withLogAction = withLogAction;
4
+ const core_1 = require("../core/index.js");
4
5
  const logger_1 = require("../logger.js");
5
6
  function withLogAction(action, command) {
6
7
  return (...args) => {
7
8
  const res = command(...args);
8
- if (res)
9
- logger_1.logger.action({ action, source: 'keymap' });
9
+ if (res) {
10
+ const [state] = args;
11
+ const logger = (0, core_1.getLoggerFromState)(state);
12
+ logger.action({ action, source: 'keymap' });
13
+ logger_1.globalLogger.action({ action, source: 'keymap', mode: 'wysiwyg' });
14
+ }
10
15
  return res;
11
16
  };
12
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"keymap.js","sourceRoot":"../../../src","sources":["utils/keymap.ts"],"names":[],"mappings":";;AAIA,sCAMC;AARD,yCAAiC;AAEjC,SAAgB,aAAa,CAAC,MAAc,EAAE,OAAgB;IAC1D,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7B,IAAI,GAAG;YAAE,eAAM,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC;QACnD,OAAO,GAAG,CAAC;IACf,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type {Command} from 'prosemirror-state';\n\nimport {logger} from '../logger';\n\nexport function withLogAction(action: string, command: Command): Command {\n return (...args) => {\n const res = command(...args);\n if (res) logger.action({action, source: 'keymap'});\n return res;\n };\n}\n"]}
1
+ {"version":3,"file":"keymap.js","sourceRoot":"../../../src","sources":["utils/keymap.ts"],"names":[],"mappings":";;AAKA,sCAWC;AAdD,2CAA2C;AAC3C,yCAAuC;AAEvC,SAAgB,aAAa,CAAC,MAAc,EAAE,OAAgB;IAC1D,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7B,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YACrB,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC;YAC1C,qBAAY,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type {Command} from 'prosemirror-state';\n\nimport {getLoggerFromState} from '../core';\nimport {globalLogger} from '../logger';\n\nexport function withLogAction(action: string, command: Command): Command {\n return (...args) => {\n const res = command(...args);\n if (res) {\n const [state] = args;\n const logger = getLoggerFromState(state);\n logger.action({action, source: 'keymap'});\n globalLogger.action({action, source: 'keymap', mode: 'wysiwyg'});\n }\n return res;\n };\n}\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';
5
+ exports.VERSION = typeof '15.2.1' !== 'undefined' ? '15.2.1' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.2.1' !== 'undefined' ? '15.2.1' : 'unknown';\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { CommonEditor } from "../common/index.js";
2
2
  import type { TransformFn } from "../core/markdown/ProseMirrorTransformer/index.js";
3
3
  import type { ReactRenderStorage } from "../extensions/index.js";
4
+ import { type Logger2 } from "../logger.js";
4
5
  import { type Receiver } from "../utils/index.js";
5
6
  import type { DirectiveSyntaxContext } from "../utils/directive.js";
6
7
  import type { MarkdownEditorMode as EditorMode, MarkdownEditorPreset as EditorPreset, MarkdownEditorOptions } from "./types.js";
@@ -27,6 +28,7 @@ export interface EventMap {
27
28
  };
28
29
  }
29
30
  export interface Editor extends Receiver<EventMap>, CommonEditor {
31
+ readonly logger: Logger2.LogReceiver;
30
32
  readonly currentMode: EditorMode;
31
33
  readonly toolbarVisible: boolean;
32
34
  setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;
@@ -41,6 +43,7 @@ export type ChangeEditorModeOptions = {
41
43
  emit?: boolean;
42
44
  };
43
45
  export type EditorOptions = Pick<MarkdownEditorOptions, 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'> & {
46
+ logger: Logger2.ILogger;
44
47
  renderStorage: ReactRenderStorage;
45
48
  preset: EditorPreset;
46
49
  directiveSyntax: DirectiveSyntaxContext;
@@ -2,7 +2,7 @@ import { EditorView as CMEditorView } from '@codemirror/view';
2
2
  import { TextSelection } from 'prosemirror-state';
3
3
  import { WysiwygEditor, } from "../core/index.js";
4
4
  import { i18n } from "../i18n/bundle/index.js";
5
- import { logger } from "../logger.js";
5
+ import { globalLogger } from "../logger.js";
6
6
  import { createCodemirror } from "../markup/index.js";
7
7
  import { getAutocompleteConfig } from "../markup/codemirror/autocomplete/index.js";
8
8
  import { Editor as MarkupEditor } from "../markup/editor.js";
@@ -11,6 +11,7 @@ import { MarkupManager } from "./MarkupManager.js";
11
11
  import { createDynamicModifiers } from "./config/dynamicModifiers.js";
12
12
  /** @internal */
13
13
  export class EditorImpl extends SafeEventEmitter {
14
+ #logger;
14
15
  #markup;
15
16
  #editorMode;
16
17
  #toolbarVisible;
@@ -39,6 +40,9 @@ export class EditorImpl extends SafeEventEmitter {
39
40
  // @ts-expect-error internal typing
40
41
  return this.#wysiwygEditor?.view;
41
42
  }
43
+ get logger() {
44
+ return this.#logger;
45
+ }
42
46
  get currentMode() {
43
47
  return this.#editorMode;
44
48
  }
@@ -118,6 +122,7 @@ export class EditorImpl extends SafeEventEmitter {
118
122
  const mdPreset = this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';
119
123
  this.#wysiwygEditor = new WysiwygEditor({
120
124
  mdPreset,
125
+ logger: this.logger.nested({ mode: 'wysiwyg' }),
121
126
  initialContent: this.#markup,
122
127
  extensions: this.#extensions,
123
128
  pmTransformers: this.#pmTransformers,
@@ -136,6 +141,7 @@ export class EditorImpl extends SafeEventEmitter {
136
141
  if (!this.#markupEditor) {
137
142
  this.#markupEditor = new MarkupEditor(createCodemirror({
138
143
  doc: this.#markup,
144
+ logger: this.logger.nested({ mode: 'markup' }),
139
145
  placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),
140
146
  onCancel: () => this.emit('cancel', null),
141
147
  onSubmit: () => this.emit('submit', null),
@@ -180,10 +186,17 @@ export class EditorImpl extends SafeEventEmitter {
180
186
  return this.#enableNewImageSizeCalculation;
181
187
  }
182
188
  constructor(opts) {
183
- super({ onError: logger.error.bind(logger) });
189
+ const { logger } = opts;
190
+ super({
191
+ onError: (error) => {
192
+ logger.error(error);
193
+ globalLogger.error(error);
194
+ },
195
+ });
184
196
  const { md = {}, initial = {}, handlers = {}, experimental = {}, markupConfig = {}, wysiwygConfig = {}, } = opts;
197
+ this.#logger = logger;
185
198
  this.#modifiers = experimental.preserveMarkupFormatting
186
- ? createDynamicModifiers(new MarkupManager())
199
+ ? createDynamicModifiers(new MarkupManager(this.logger.nested({ module: 'markup-manager' })))
187
200
  : undefined;
188
201
  this.#editorMode = initial.mode ?? 'wysiwyg';
189
202
  this.#toolbarVisible = initial.toolbarVisible ?? true;
@@ -236,6 +249,12 @@ export class EditorImpl extends SafeEventEmitter {
236
249
  if (this.#beforeEditorModeChange?.({ mode: opts.mode, reason: opts.reason }) === false) {
237
250
  return;
238
251
  }
252
+ this.logger.event({
253
+ event: 'mode-change',
254
+ prevMode: this.#editorMode,
255
+ nextMode: opts.mode,
256
+ reason: opts.reason,
257
+ });
239
258
  this.currentMode = opts.mode;
240
259
  this.emit('rerender', null);
241
260
  if (emit) {