@gravity-ui/markdown-editor 15.1.0 → 15.2.0

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 (221) 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/behavior/Autocomplete/handler.d.ts +3 -1
  42. package/build/cjs/extensions/behavior/Autocomplete/handler.js +16 -10
  43. package/build/cjs/extensions/behavior/Autocomplete/handler.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Autocomplete/index.js +1 -1
  45. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  46. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  47. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +31 -3
  48. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  49. package/build/cjs/extensions/behavior/Clipboard/index.js +4 -0
  50. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  51. package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  52. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -3
  53. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  54. package/build/cjs/extensions/behavior/CommandMenu/index.js +5 -3
  55. package/build/cjs/extensions/behavior/CommandMenu/index.js.map +1 -1
  56. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js +13 -2
  57. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  58. package/build/cjs/extensions/behavior/FilePaste/index.d.ts +1 -1
  59. package/build/cjs/extensions/behavior/FilePaste/index.js +12 -0
  60. package/build/cjs/extensions/behavior/FilePaste/index.js.map +1 -1
  61. package/build/cjs/extensions/behavior/SelectionContext/index.js +3 -3
  62. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  63. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  64. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +7 -2
  65. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  66. package/build/cjs/extensions/behavior/utils/upload.d.ts +2 -0
  67. package/build/cjs/extensions/behavior/utils/upload.js +3 -0
  68. package/build/cjs/extensions/behavior/utils/upload.js.map +1 -1
  69. package/build/cjs/extensions/markdown/Breaks/index.js +2 -1
  70. package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
  71. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +2 -1
  72. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  73. package/build/cjs/extensions/markdown/Html/index.js +2 -1
  74. package/build/cjs/extensions/markdown/Html/index.js.map +1 -1
  75. package/build/cjs/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  76. package/build/cjs/extensions/markdown/Link/paste-plugin.js +11 -0
  77. package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
  78. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  79. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  80. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  81. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js +6 -5
  82. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  83. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
  84. package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
  85. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  86. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  87. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  88. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  89. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  90. package/build/cjs/logger.d.ts +75 -0
  91. package/build/cjs/logger.js +89 -1
  92. package/build/cjs/logger.js.map +1 -1
  93. package/build/cjs/markup/codemirror/create.d.ts +2 -0
  94. package/build/cjs/markup/codemirror/create.js +15 -4
  95. package/build/cjs/markup/codemirror/create.js.map +1 -1
  96. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  97. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  98. package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
  99. package/build/cjs/markup/codemirror/logger-facet.js +9 -0
  100. package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
  101. package/build/cjs/utils/event-emitter.d.ts +1 -0
  102. package/build/cjs/utils/event-emitter.js +3 -0
  103. package/build/cjs/utils/event-emitter.js.map +1 -1
  104. package/build/cjs/utils/facet.d.ts +1 -0
  105. package/build/cjs/utils/facet.js +33 -0
  106. package/build/cjs/utils/facet.js.map +1 -0
  107. package/build/cjs/utils/keymap.js +7 -2
  108. package/build/cjs/utils/keymap.js.map +1 -1
  109. package/build/cjs/version.js +1 -1
  110. package/build/cjs/version.js.map +1 -1
  111. package/build/esm/bundle/Editor.d.ts +3 -0
  112. package/build/esm/bundle/Editor.js +22 -3
  113. package/build/esm/bundle/Editor.js.map +1 -1
  114. package/build/esm/bundle/MarkdownEditorView.js +3 -2
  115. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  116. package/build/esm/bundle/MarkupEditorView.js +7 -2
  117. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  118. package/build/esm/bundle/MarkupManager.d.ts +3 -6
  119. package/build/esm/bundle/MarkupManager.js +5 -5
  120. package/build/esm/bundle/MarkupManager.js.map +1 -1
  121. package/build/esm/bundle/WysiwygEditorView.js +7 -2
  122. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  123. package/build/esm/bundle/types.d.ts +2 -0
  124. package/build/esm/bundle/types.js.map +1 -1
  125. package/build/esm/bundle/useMarkdownEditor.js +5 -3
  126. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  127. package/build/esm/core/Editor.d.ts +3 -1
  128. package/build/esm/core/Editor.js +6 -3
  129. package/build/esm/core/Editor.js.map +1 -1
  130. package/build/esm/core/ExtensionBuilder.d.ts +3 -1
  131. package/build/esm/core/ExtensionBuilder.js +6 -1
  132. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  133. package/build/esm/core/ExtensionsManager.d.ts +4 -2
  134. package/build/esm/core/ExtensionsManager.js +6 -5
  135. package/build/esm/core/ExtensionsManager.js.map +1 -1
  136. package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
  137. package/build/esm/core/ParserTokensRegistry.js +9 -1
  138. package/build/esm/core/ParserTokensRegistry.js.map +1 -1
  139. package/build/esm/core/index.d.ts +1 -0
  140. package/build/esm/core/index.js +1 -0
  141. package/build/esm/core/index.js.map +1 -1
  142. package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
  143. package/build/esm/core/markdown/MarkdownParser.js +7 -3
  144. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  145. package/build/esm/core/utils/logger.d.ts +3 -0
  146. package/build/esm/core/utils/logger.js +8 -0
  147. package/build/esm/core/utils/logger.js.map +1 -0
  148. package/build/esm/core/utils/metrics.d.ts +2 -1
  149. package/build/esm/core/utils/metrics.js +8 -2
  150. package/build/esm/core/utils/metrics.js.map +1 -1
  151. package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  152. package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
  153. package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
  154. package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
  155. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  156. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  157. package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
  158. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  159. package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
  160. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  161. package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  162. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
  163. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  164. package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
  165. package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
  166. package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
  167. package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  168. package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
  169. package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
  170. package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
  171. package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
  172. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  173. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  174. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
  175. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  176. package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
  177. package/build/esm/extensions/behavior/utils/upload.js +3 -0
  178. package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
  179. package/build/esm/extensions/markdown/Breaks/index.js +3 -2
  180. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  181. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
  182. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  183. package/build/esm/extensions/markdown/Html/index.js +3 -2
  184. package/build/esm/extensions/markdown/Html/index.js.map +1 -1
  185. package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  186. package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
  187. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  188. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  189. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  190. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  191. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
  192. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  193. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
  194. package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
  195. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  196. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  197. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  198. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  199. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  200. package/build/esm/logger.d.ts +75 -0
  201. package/build/esm/logger.js +87 -0
  202. package/build/esm/logger.js.map +1 -1
  203. package/build/esm/markup/codemirror/create.d.ts +2 -0
  204. package/build/esm/markup/codemirror/create.js +16 -5
  205. package/build/esm/markup/codemirror/create.js.map +1 -1
  206. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  207. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  208. package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
  209. package/build/esm/markup/codemirror/logger-facet.js +6 -0
  210. package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
  211. package/build/esm/utils/event-emitter.d.ts +1 -0
  212. package/build/esm/utils/event-emitter.js +3 -0
  213. package/build/esm/utils/event-emitter.js.map +1 -1
  214. package/build/esm/utils/facet.d.ts +1 -0
  215. package/build/esm/utils/facet.js +29 -0
  216. package/build/esm/utils/facet.js.map +1 -0
  217. package/build/esm/utils/keymap.js +7 -2
  218. package/build/esm/utils/keymap.js.map +1 -1
  219. package/build/esm/version.js +1 -1
  220. package/build/esm/version.js.map +1 -1
  221. package/package.json +1 -1
@@ -2,6 +2,7 @@ export * from "./Editor.js";
2
2
  export * from "./ExtensionBuilder.js";
3
3
  export * from "./ExtensionsManager.js";
4
4
  export { bindActions } from "./utils/actions.js";
5
+ export { getLoggerFromState } from "./utils/logger.js";
5
6
  export { trackTransactionMetrics } from "./utils/metrics.js";
6
7
  export type { Keymap } from "./types/keymap.js";
7
8
  export type { ActionSpec, Action, ActionStorage, CommandWithAttrs } from "./types/actions.js";
@@ -2,5 +2,6 @@ export * from "./Editor.js";
2
2
  export * from "./ExtensionBuilder.js";
3
3
  export * from "./ExtensionsManager.js";
4
4
  export { bindActions } from "./utils/actions.js";
5
+ export { getLoggerFromState } from "./utils/logger.js";
5
6
  export { trackTransactionMetrics } from "./utils/metrics.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":"AAAA,4BAAyB;AACzB,sCAAmC;AACnC,uCAAoC;AACpC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAC5C,OAAO,EAAC,uBAAuB,EAAC,2BAAwB","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":"AAAA,4BAAyB;AACzB,sCAAmC;AACnC,uCAAoC;AACpC,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAC5C,OAAO,EAAC,kBAAkB,EAAC,0BAAuB;AAClD,OAAO,EAAC,uBAAuB,EAAC,2BAAwB","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {getLoggerFromState} from './utils/logger';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
@@ -2,11 +2,17 @@ import type { Match } from 'linkify-it';
2
2
  import type MarkdownIt from 'markdown-it';
3
3
  import type Token from 'markdown-it/lib/token';
4
4
  import { Mark, type Node, type NodeType, type Schema } from 'prosemirror-model';
5
+ import { type Logger2 } from "../../logger.js";
5
6
  import type { Parser, ParserToken } from "../types/parser.js";
6
7
  import { type TransformFn } from "./ProseMirrorTransformer/index.js";
7
8
  export type TokenAttrs = {
8
9
  [name: string]: unknown;
9
10
  };
11
+ type MarkdownParserOptions = {
12
+ logger: Logger2.ILogger;
13
+ pmTransformers: TransformFn[];
14
+ dynamicModifier?: MarkdownParserDynamicModifier;
15
+ };
10
16
  export declare class MarkdownParser implements Parser {
11
17
  schema: Schema;
12
18
  stack: Array<{
@@ -19,7 +25,8 @@ export declare class MarkdownParser implements Parser {
19
25
  tokenizer: MarkdownIt;
20
26
  pmTransformers: TransformFn[];
21
27
  dynamicModifier: MarkdownParserDynamicModifier | null;
22
- constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, pmTransformers: TransformFn[], dynamicModifier?: MarkdownParserDynamicModifier);
28
+ private logger;
29
+ constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, opts: MarkdownParserOptions);
23
30
  validateLink(url: string): boolean;
24
31
  normalizeLink(url: string): string;
25
32
  normalizeLinkText(url: string): string;
@@ -46,3 +53,4 @@ export declare class MarkdownParser implements Parser {
46
53
  }
47
54
  export type ProcessNodeAttrs = (token: Token, attrs: TokenAttrs, allowedAttrs?: string[]) => TokenAttrs;
48
55
  export type ProcessNode = (node: Node) => Node;
56
+ export {};
@@ -25,13 +25,15 @@ export class MarkdownParser {
25
25
  tokenizer;
26
26
  pmTransformers;
27
27
  dynamicModifier;
28
- constructor(schema, tokenizer, tokens, pmTransformers, dynamicModifier) {
28
+ logger;
29
+ constructor(schema, tokenizer, tokens, opts) {
29
30
  this.schema = schema;
30
31
  this.marks = Mark.none;
31
32
  this.tokens = tokens;
32
33
  this.tokenizer = tokenizer;
33
- this.pmTransformers = pmTransformers;
34
- this.dynamicModifier = dynamicModifier ?? null;
34
+ this.pmTransformers = opts.pmTransformers;
35
+ this.dynamicModifier = opts.dynamicModifier ?? null;
36
+ this.logger = opts.logger.nested({ module: 'markdown-parser' });
35
37
  }
36
38
  validateLink(url) {
37
39
  return this.tokenizer.validateLink(url);
@@ -59,6 +61,7 @@ export class MarkdownParser {
59
61
  catch (err) {
60
62
  const e = err;
61
63
  e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;
64
+ this.logger.error(e);
62
65
  throw e;
63
66
  }
64
67
  this.parseTokens(mdItTokens);
@@ -72,6 +75,7 @@ export class MarkdownParser {
72
75
  }
73
76
  finally {
74
77
  logger.metrics({ component: 'parser', event: 'parse', duration: Date.now() - time });
78
+ this.logger.metrics({ component: 'parser', event: 'parse', duration: Date.now() - time });
75
79
  }
76
80
  }
77
81
  top() {
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {logger} from '../../logger';\nimport type {Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n pmTransformers: TransformFn[],\n dynamicModifier?: MarkdownParserDynamicModifier,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = pmTransformers;\n this.dynamicModifier = dynamicModifier ?? null;\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<Match>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(text: string) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = this.tokenizer.parse(text, {});\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(mdItTokens, text);\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\n\n/** @internal */\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\n/** @internal */\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\n/** @internal */\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/** @internal */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processToken || processor.processToken.length === 0) {\n return token;\n }\n\n return processor.processToken.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token);\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
1
+ {"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {type Logger2, logger} from '../../logger';\nimport type {Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\ntype MarkdownParserOptions = {\n logger: Logger2.ILogger;\n pmTransformers: TransformFn[];\n dynamicModifier?: MarkdownParserDynamicModifier;\n};\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n private logger: Logger2.ILogger;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n opts: MarkdownParserOptions,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = opts.pmTransformers;\n this.dynamicModifier = opts.dynamicModifier ?? null;\n\n this.logger = opts.logger.nested({module: 'markdown-parser'});\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<Match>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(text: string) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = this.tokenizer.parse(text, {});\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(mdItTokens, text);\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n this.logger.error(e);\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n this.logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\n\n/** @internal */\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\n/** @internal */\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\n/** @internal */\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/** @internal */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processToken || processor.processToken.length === 0) {\n return token;\n }\n\n return processor.processToken.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token);\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EditorState } from 'prosemirror-state';
2
+ import type { Logger2 } from "../../logger.js";
3
+ export declare const getLoggerFromState: (state: EditorState) => Logger2.ILogger;
@@ -0,0 +1,8 @@
1
+ import { Facet } from "../../utils/facet.js";
2
+ /** @internal */
3
+ export const LoggerFacet = Facet.define({
4
+ combine: (value) => value[0],
5
+ static: true,
6
+ });
7
+ export const getLoggerFromState = (state) => LoggerFacet.getState(state);
8
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"../../../../src","sources":["core/utils/logger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAAC,6BAA0B;AAExC,gBAAgB;AAChB,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAmC;IACtE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAkB,EAAmB,EAAE,CACtE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC","sourcesContent":["import type {EditorState} from 'prosemirror-state';\n\nimport type {Logger2} from '../../logger';\nimport {Facet} from '../../utils/facet';\n\n/** @internal */\nexport const LoggerFacet = Facet.define<Logger2.ILogger, Logger2.ILogger>({\n combine: (value) => value[0],\n static: true,\n});\n\nexport const getLoggerFromState = (state: EditorState): Logger2.ILogger =>\n LoggerFacet.getState(state)!;\n"]}
@@ -1,3 +1,4 @@
1
1
  import type { Transaction } from 'prosemirror-state';
2
+ import { type Logger2 } from "../../logger.js";
2
3
  export declare const trackTransactionMetrics: (tr: Transaction, type: string, meta?: Record<string, any>) => Transaction;
3
- export declare const logTransactionMetrics: (tr: Transaction) => void;
4
+ export declare const logTransactionMetrics: (tr: Transaction, logger: Logger2.ILogger) => void;
@@ -1,12 +1,18 @@
1
- import { logger } from "../../logger.js";
1
+ import { globalLogger } from "../../logger.js";
2
2
  const METRICS_KEY = 'metrics';
3
3
  export const trackTransactionMetrics = (tr, type, meta) => {
4
4
  tr.setMeta(METRICS_KEY, { type, meta });
5
5
  return tr;
6
6
  };
7
- export const logTransactionMetrics = (tr) => {
7
+ export const logTransactionMetrics = (tr, logger) => {
8
8
  const metrics = tr.getMeta(METRICS_KEY);
9
9
  if (metrics) {
10
+ globalLogger.metrics({
11
+ component: 'transaction',
12
+ event: metrics.type,
13
+ duration: Date.now() - tr.time,
14
+ meta: metrics.meta,
15
+ });
10
16
  logger.metrics({
11
17
  component: 'transaction',
12
18
  event: metrics.type,
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"../../../../src","sources":["core/utils/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAC,wBAAqB;AAEpC,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACnC,EAAe,EACf,IAAY,EACZ,IAA0B,EAC5B,EAAE;IACA,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;IAEtC,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAe,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,CAAC;YACX,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;SACrB,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC","sourcesContent":["import type {Transaction} from 'prosemirror-state';\n\nimport {logger} from '../../logger';\n\nconst METRICS_KEY = 'metrics';\n\nexport const trackTransactionMetrics = (\n tr: Transaction,\n type: string,\n meta?: Record<string, any>,\n) => {\n tr.setMeta(METRICS_KEY, {type, meta});\n\n return tr;\n};\n\nexport const logTransactionMetrics = (tr: Transaction) => {\n const metrics = tr.getMeta(METRICS_KEY);\n if (metrics) {\n logger.metrics({\n component: 'transaction',\n event: metrics.type,\n duration: Date.now() - tr.time,\n meta: metrics.meta,\n });\n }\n};\n"]}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"../../../../src","sources":["core/utils/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAC,wBAAqB;AAExD,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACnC,EAAe,EACf,IAAY,EACZ,IAA0B,EAC5B,EAAE;IACA,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;IAEtC,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAe,EAAE,MAAuB,EAAE,EAAE;IAC9E,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACV,YAAY,CAAC,OAAO,CAAC;YACjB,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC;YACX,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;SACrB,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC","sourcesContent":["import type {Transaction} from 'prosemirror-state';\n\nimport {type Logger2, globalLogger} from '../../logger';\n\nconst METRICS_KEY = 'metrics';\n\nexport const trackTransactionMetrics = (\n tr: Transaction,\n type: string,\n meta?: Record<string, any>,\n) => {\n tr.setMeta(METRICS_KEY, {type, meta});\n\n return tr;\n};\n\nexport const logTransactionMetrics = (tr: Transaction, logger: Logger2.ILogger) => {\n const metrics = tr.getMeta(METRICS_KEY);\n if (metrics) {\n globalLogger.metrics({\n component: 'transaction',\n event: metrics.type,\n duration: Date.now() - tr.time,\n meta: metrics.meta,\n });\n logger.metrics({\n component: 'transaction',\n event: metrics.type,\n duration: Date.now() - tr.time,\n meta: metrics.meta,\n });\n }\n};\n"]}
@@ -1,9 +1,11 @@
1
+ import { type Logger2 } from "../../../logger.js";
1
2
  import type { AutocompleteAction, AutocompleteHandler, AutocompleteItem } from "./types.js";
2
3
  export type MainHandlerConfig = readonly AutocompleteItem[];
3
4
  export declare class MainHandler implements Required<AutocompleteHandler> {
4
5
  private static log;
5
6
  private readonly config;
6
- constructor(config: MainHandlerConfig);
7
+ private readonly logger;
8
+ constructor(config: MainHandlerConfig, logger: Logger2.ILogger);
7
9
  onOpen(action: AutocompleteAction): boolean;
8
10
  onClose(action: AutocompleteAction): boolean;
9
11
  onArrow(action: AutocompleteAction): boolean;
@@ -1,10 +1,11 @@
1
1
  import { capitalize, isString } from "../../../lodash.js";
2
- import { logger } from "../../../logger.js";
2
+ import { globalLogger } from "../../../logger.js";
3
3
  export class MainHandler {
4
- static log(opts) {
4
+ static log(logger, opts) {
5
5
  const prefix = '[Autocomplete]';
6
6
  if (opts.event === 'destroy') {
7
7
  logger.log(`${prefix} Destroy`);
8
+ globalLogger.log(`${prefix} Destroy`);
8
9
  return;
9
10
  }
10
11
  const { action, item } = opts;
@@ -17,38 +18,43 @@ export class MainHandler {
17
18
  `Handler=${item ? `"${item.trigger.name}"` : 'None'}`,
18
19
  ].join(' ');
19
20
  logger.log(msg);
21
+ globalLogger.log(msg);
20
22
  }
21
23
  config;
22
- constructor(config) {
24
+ logger;
25
+ constructor(config, logger) {
23
26
  this.config = config;
27
+ this.logger = logger.nested({
28
+ module: 'autocomplete-main-handler',
29
+ });
24
30
  }
25
31
  onOpen(action) {
26
32
  const item = this.getItem(action);
27
- MainHandler.log({ event: 'open', action, item });
33
+ MainHandler.log(this.logger, { event: 'open', action, item });
28
34
  return item?.handler.onOpen?.(action) ?? false;
29
35
  }
30
36
  onClose(action) {
31
37
  const item = this.getItem(action);
32
- MainHandler.log({ event: 'close', action, item });
38
+ MainHandler.log(this.logger, { event: 'close', action, item });
33
39
  return item?.handler.onClose?.(action) ?? false;
34
40
  }
35
41
  onArrow(action) {
36
42
  const item = this.getItem(action);
37
- MainHandler.log({ event: 'arrow', action, item });
43
+ MainHandler.log(this.logger, { event: 'arrow', action, item });
38
44
  return item?.handler.onArrow?.(action) ?? false;
39
45
  }
40
46
  onEnter(action) {
41
47
  const item = this.getItem(action);
42
- MainHandler.log({ event: 'enter', action, item });
48
+ MainHandler.log(this.logger, { event: 'enter', action, item });
43
49
  return item?.handler.onEnter?.(action) ?? false;
44
50
  }
45
51
  onFilter(action) {
46
52
  const item = this.getItem(action);
47
- MainHandler.log({ event: 'filter', action, item });
53
+ MainHandler.log(this.logger, { event: 'filter', action, item });
48
54
  return item?.handler.onFilter?.(action) ?? false;
49
55
  }
50
56
  onDestroy() {
51
- MainHandler.log({ event: 'destroy' });
57
+ MainHandler.log(this.logger, { event: 'destroy' });
52
58
  for (const item of this.config) {
53
59
  item.handler.onDestroy?.();
54
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {capitalize, isString} from '../../../lodash';\nimport {logger} from '../../../logger';\n\nimport type {AutocompleteAction, AutocompleteHandler, AutocompleteItem} from './types';\n\nexport type MainHandlerConfig = readonly AutocompleteItem[];\n\ntype MainHandlerLogOptions =\n | {\n event: 'destroy';\n }\n | {\n event: 'open' | 'close' | 'arrow' | 'filter' | 'enter';\n action: AutocompleteAction;\n item?: AutocompleteItem;\n };\n\nexport class MainHandler implements Required<AutocompleteHandler> {\n private static log(opts: MainHandlerLogOptions) {\n const prefix = '[Autocomplete]';\n\n if (opts.event === 'destroy') {\n logger.log(`${prefix} Destroy`);\n return;\n }\n\n const {action, item} = opts;\n const msg = [\n prefix,\n capitalize(opts.event),\n `Trigger=\"${action.trigger}\"`,\n `Filter=${action.filter !== undefined ? `\"${action.filter}\"` : 'None'}`,\n `Type=${action.type ? `\"${action.type.name}\"` : 'None'}`,\n `Handler=${item ? `\"${item.trigger.name}\"` : 'None'}`,\n ].join(' ');\n\n logger.log(msg);\n }\n\n private readonly config: MainHandlerConfig;\n\n constructor(config: MainHandlerConfig) {\n this.config = config;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log({event: 'open', action, item});\n return item?.handler.onOpen?.(action) ?? false;\n }\n\n onClose(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log({event: 'close', action, item});\n return item?.handler.onClose?.(action) ?? false;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log({event: 'arrow', action, item});\n return item?.handler.onArrow?.(action) ?? false;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log({event: 'enter', action, item});\n return item?.handler.onEnter?.(action) ?? false;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log({event: 'filter', action, item});\n return item?.handler.onFilter?.(action) ?? false;\n }\n\n onDestroy(): void {\n MainHandler.log({event: 'destroy'});\n for (const item of this.config) {\n item.handler.onDestroy?.();\n }\n }\n\n private getItem({trigger, type}: AutocompleteAction) {\n let predicate: Parameters<(typeof this.config)['find']>[0];\n\n if (type) {\n predicate = (item) => item.trigger.name === type.name;\n } else {\n predicate = (item) => {\n const itemTrigger = item.trigger.trigger;\n if (isString(itemTrigger)) return itemTrigger === trigger;\n return itemTrigger.test(trigger);\n };\n }\n\n return this.config.find(predicate);\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {capitalize, isString} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\n\nimport type {AutocompleteAction, AutocompleteHandler, AutocompleteItem} from './types';\n\nexport type MainHandlerConfig = readonly AutocompleteItem[];\n\ntype MainHandlerLogOptions =\n | {\n event: 'destroy';\n }\n | {\n event: 'open' | 'close' | 'arrow' | 'filter' | 'enter';\n action: AutocompleteAction;\n item?: AutocompleteItem;\n };\n\nexport class MainHandler implements Required<AutocompleteHandler> {\n private static log(logger: Logger2.ILogger, opts: MainHandlerLogOptions) {\n const prefix = '[Autocomplete]';\n\n if (opts.event === 'destroy') {\n logger.log(`${prefix} Destroy`);\n globalLogger.log(`${prefix} Destroy`);\n return;\n }\n\n const {action, item} = opts;\n const msg = [\n prefix,\n capitalize(opts.event),\n `Trigger=\"${action.trigger}\"`,\n `Filter=${action.filter !== undefined ? `\"${action.filter}\"` : 'None'}`,\n `Type=${action.type ? `\"${action.type.name}\"` : 'None'}`,\n `Handler=${item ? `\"${item.trigger.name}\"` : 'None'}`,\n ].join(' ');\n\n logger.log(msg);\n globalLogger.log(msg);\n }\n\n private readonly config: MainHandlerConfig;\n private readonly logger: Logger2.ILogger;\n\n constructor(config: MainHandlerConfig, logger: Logger2.ILogger) {\n this.config = config;\n this.logger = logger.nested({\n module: 'autocomplete-main-handler',\n });\n }\n\n onOpen(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log(this.logger, {event: 'open', action, item});\n return item?.handler.onOpen?.(action) ?? false;\n }\n\n onClose(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log(this.logger, {event: 'close', action, item});\n return item?.handler.onClose?.(action) ?? false;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log(this.logger, {event: 'arrow', action, item});\n return item?.handler.onArrow?.(action) ?? false;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log(this.logger, {event: 'enter', action, item});\n return item?.handler.onEnter?.(action) ?? false;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n const item = this.getItem(action);\n MainHandler.log(this.logger, {event: 'filter', action, item});\n return item?.handler.onFilter?.(action) ?? false;\n }\n\n onDestroy(): void {\n MainHandler.log(this.logger, {event: 'destroy'});\n for (const item of this.config) {\n item.handler.onDestroy?.();\n }\n }\n\n private getItem({trigger, type}: AutocompleteAction) {\n let predicate: Parameters<(typeof this.config)['find']>[0];\n\n if (type) {\n predicate = (item) => item.trigger.name === type.name;\n } else {\n predicate = (item) => {\n const itemTrigger = item.trigger.trigger;\n if (isString(itemTrigger)) return itemTrigger === trigger;\n return itemTrigger.test(trigger);\n };\n }\n\n return this.config.find(predicate);\n }\n}\n"]}
@@ -23,7 +23,7 @@ export const Autocomplete = (builder) => {
23
23
  triggers.push(item.trigger);
24
24
  config.push(item);
25
25
  }
26
- const handler = new MainHandler(config);
26
+ const handler = new MainHandler(config, builder.logger);
27
27
  const plugins = autocomplete({
28
28
  triggers,
29
29
  onOpen: handler.onOpen.bind(handler),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import autocomplete from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import autocomplete from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import { Plugin } from 'prosemirror-state';
2
2
  import { type Parser, type Serializer } from "../../../core/index.js";
3
+ import { type Logger2 } from "../../../logger.js";
3
4
  import "../../../types/spec.js";
4
5
  export type ClipboardPluginOptions = {
6
+ logger: Logger2.ILogger;
5
7
  mdParser: Parser;
6
8
  textParser: Parser;
7
9
  serializer: Serializer;
8
10
  pasteFileHandler?: (file: File) => void;
9
11
  };
10
- export declare const clipboard: ({ textParser, mdParser, serializer, pasteFileHandler, }: ClipboardPluginOptions) => Plugin<any>;
12
+ export declare const clipboard: ({ logger, textParser, mdParser, serializer, pasteFileHandler, }: ClipboardPluginOptions) => Plugin<any>;
@@ -1,7 +1,7 @@
1
1
  import { Fragment, Slice } from 'prosemirror-model';
2
2
  import { Plugin } from 'prosemirror-state';
3
3
  import { trackTransactionMetrics } from "../../../core/index.js";
4
- import { logger } from "../../../logger.js";
4
+ import { globalLogger } from "../../../logger.js";
5
5
  import "../../../types/spec.js";
6
6
  import { tryCatch } from "../../../utils/helpers.js";
7
7
  import { isNodeSelection, isTextSelection, isWholeSelection } from "../../../utils/selection.js";
@@ -9,7 +9,7 @@ import { serializeForClipboard } from "../../../utils/serialize-for-clipboard.js
9
9
  import { BaseNode, pType } from "../../base/BaseSchema/index.js";
10
10
  import { isInsideCode } from "./code.js";
11
11
  import { DataTransferType, extractTextContentFromHtml, isIosSafariShare } from "./utils.js";
12
- export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler, }) => {
12
+ export const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
13
13
  return new Plugin({
14
14
  props: {
15
15
  handleDOMEvents: {
@@ -42,6 +42,10 @@ export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler,
42
42
  paste(view, e) {
43
43
  if (!e.clipboardData)
44
44
  return false;
45
+ const pasteLogger = logger.nested({
46
+ domEvent: 'paste',
47
+ dataTypes: e.clipboardData.types,
48
+ });
45
49
  let data;
46
50
  let isPasteHandled = false;
47
51
  if (isIosSafariShare(e.clipboardData) &&
@@ -50,6 +54,9 @@ export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler,
50
54
  view.dispatch(trackTransactionMetrics(view.state.tr.replaceSelection(
51
55
  // paste link inline
52
56
  new Slice(Fragment.from(pType(schema).create(null, schema.text(data))), 1, 1)), 'paste', { clipboardDataFormat: DataTransferType.UriList }));
57
+ pasteLogger.event({
58
+ event: 'paste-uri-list',
59
+ });
53
60
  isPasteHandled = true;
54
61
  e.preventDefault();
55
62
  return true;
@@ -63,10 +70,16 @@ export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler,
63
70
  const docNode = res.result;
64
71
  const slice = getSliceFromMarkupFragment(docNode.content);
65
72
  view.dispatch(trackTransactionMetrics(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: DataTransferType.Html }));
73
+ pasteLogger.event({
74
+ event: 'paste-parsed-html',
75
+ });
66
76
  isPasteHandled = true;
67
77
  }
68
78
  else {
69
- logger.error(res.error);
79
+ globalLogger.error(res.error);
80
+ pasteLogger.error(res.error, {
81
+ event: 'parse-html',
82
+ });
70
83
  console.error(res.error);
71
84
  }
72
85
  }
@@ -90,6 +103,10 @@ export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler,
90
103
  if (codeType) {
91
104
  const schema = view.state.schema;
92
105
  const insideCodeData = e.clipboardData.getData(DataTransferType.Text);
106
+ pasteLogger.event({
107
+ event: 'paste-text-to-code',
108
+ codeType,
109
+ });
93
110
  view.dispatch(trackTransactionMetrics(view.state.tr.replaceSelectionWith(schema.text(codeType === 'inline'
94
111
  ? insideCodeData.trim()
95
112
  : insideCodeData)), 'paste', { clipboardDataFormat: DataTransferType.Text, code: codeType }));
@@ -100,16 +117,27 @@ export const clipboard = ({ textParser, mdParser, serializer, pasteFileHandler,
100
117
  if (res.success) {
101
118
  const docNode = res.result;
102
119
  const slice = getSliceFromMarkupFragment(docNode.content);
120
+ pasteLogger.event({
121
+ event: 'paste-parsed-content',
122
+ dataFormat,
123
+ });
103
124
  view.dispatch(trackTransactionMetrics(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: dataFormat }));
104
125
  isPasteHandled = true;
105
126
  }
106
127
  else {
107
- logger.error(res.error);
128
+ globalLogger.error(res.error);
129
+ pasteLogger.error(res.error, {
130
+ event: 'paste',
131
+ dataFormat,
132
+ });
108
133
  console.error(res.error);
109
134
  }
110
135
  }
111
136
  }
112
137
  if (e.clipboardData.files.length && pasteFileHandler) {
138
+ pasteLogger.event({
139
+ event: 'paste-files',
140
+ });
113
141
  for (const file of Array.from(e.clipboardData.files)) {
114
142
  pasteFileHandler(file);
115
143
  }