react-intlayer 8.0.0-canary.1 → 8.0.0-canary.2

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 (161) hide show
  1. package/dist/cjs/client/useLocale.cjs +6 -6
  2. package/dist/cjs/client/useLocale.cjs.map +1 -1
  3. package/dist/cjs/getDictionary.cjs +1 -0
  4. package/dist/cjs/getDictionary.cjs.map +1 -1
  5. package/dist/cjs/getIntlayer.cjs +1 -0
  6. package/dist/cjs/getIntlayer.cjs.map +1 -1
  7. package/dist/cjs/html/HTMLRenderer.cjs +59 -0
  8. package/dist/cjs/html/HTMLRenderer.cjs.map +1 -0
  9. package/dist/cjs/html/HTMLRendererPlugin.cjs +3 -9
  10. package/dist/cjs/html/HTMLRendererPlugin.cjs.map +1 -1
  11. package/dist/cjs/html/index.cjs +6 -2
  12. package/dist/cjs/html/types.cjs +0 -0
  13. package/dist/cjs/index.cjs +7 -1
  14. package/dist/cjs/markdown/MarkdownProvider.cjs +62 -23
  15. package/dist/cjs/markdown/MarkdownProvider.cjs.map +1 -1
  16. package/dist/cjs/markdown/MarkdownRenderer.cjs +176 -6
  17. package/dist/cjs/markdown/MarkdownRenderer.cjs.map +1 -1
  18. package/dist/cjs/markdown/MarkdownRendererPlugin.cjs.map +1 -1
  19. package/dist/cjs/markdown/index.cjs +3 -1
  20. package/dist/cjs/markdown/processor.cjs +0 -5
  21. package/dist/cjs/markdown/processor.cjs.map +1 -1
  22. package/dist/cjs/plugins.cjs +50 -5
  23. package/dist/cjs/plugins.cjs.map +1 -1
  24. package/dist/cjs/reactElement/renderReactElement.cjs +8 -8
  25. package/dist/cjs/reactElement/renderReactElement.cjs.map +1 -1
  26. package/dist/cjs/server/IntlayerServerProvider.cjs +2 -2
  27. package/dist/cjs/server/IntlayerServerProvider.cjs.map +1 -1
  28. package/dist/esm/client/useLocale.mjs +6 -6
  29. package/dist/esm/client/useLocale.mjs.map +1 -1
  30. package/dist/esm/getDictionary.mjs +2 -1
  31. package/dist/esm/getDictionary.mjs.map +1 -1
  32. package/dist/esm/getIntlayer.mjs +2 -1
  33. package/dist/esm/getIntlayer.mjs.map +1 -1
  34. package/dist/esm/html/HTMLRenderer.mjs +55 -0
  35. package/dist/esm/html/HTMLRenderer.mjs.map +1 -0
  36. package/dist/esm/html/HTMLRendererPlugin.mjs +4 -9
  37. package/dist/esm/html/HTMLRendererPlugin.mjs.map +1 -1
  38. package/dist/esm/html/index.mjs +3 -2
  39. package/dist/esm/html/types.mjs +0 -0
  40. package/dist/esm/index.mjs +3 -2
  41. package/dist/esm/markdown/MarkdownProvider.mjs +62 -23
  42. package/dist/esm/markdown/MarkdownProvider.mjs.map +1 -1
  43. package/dist/esm/markdown/MarkdownRenderer.mjs +175 -7
  44. package/dist/esm/markdown/MarkdownRenderer.mjs.map +1 -1
  45. package/dist/esm/markdown/MarkdownRendererPlugin.mjs.map +1 -1
  46. package/dist/esm/markdown/index.mjs +2 -2
  47. package/dist/esm/markdown/processor.mjs +0 -5
  48. package/dist/esm/markdown/processor.mjs.map +1 -1
  49. package/dist/esm/plugins.mjs +52 -8
  50. package/dist/esm/plugins.mjs.map +1 -1
  51. package/dist/esm/reactElement/renderReactElement.mjs +8 -8
  52. package/dist/esm/reactElement/renderReactElement.mjs.map +1 -1
  53. package/dist/esm/server/IntlayerServerProvider.mjs +2 -2
  54. package/dist/esm/server/IntlayerServerProvider.mjs.map +1 -1
  55. package/dist/types/IntlayerNode.d.ts.map +1 -1
  56. package/dist/types/UI/ContentSelector.d.ts.map +1 -1
  57. package/dist/types/client/IntlayerProvider.d.ts.map +1 -1
  58. package/dist/types/client/format/useCompact.d.ts +2 -3
  59. package/dist/types/client/format/useCompact.d.ts.map +1 -1
  60. package/dist/types/client/format/useCurrency.d.ts +2 -3
  61. package/dist/types/client/format/useCurrency.d.ts.map +1 -1
  62. package/dist/types/client/format/useDate.d.ts +0 -1
  63. package/dist/types/client/format/useDate.d.ts.map +1 -1
  64. package/dist/types/client/format/useIntl.d.ts +0 -1
  65. package/dist/types/client/format/useIntl.d.ts.map +1 -1
  66. package/dist/types/client/format/useList.d.ts +2 -3
  67. package/dist/types/client/format/useList.d.ts.map +1 -1
  68. package/dist/types/client/format/useNumber.d.ts +2 -3
  69. package/dist/types/client/format/useNumber.d.ts.map +1 -1
  70. package/dist/types/client/format/usePercentage.d.ts +2 -3
  71. package/dist/types/client/format/usePercentage.d.ts.map +1 -1
  72. package/dist/types/client/format/useRelativeTime.d.ts +2 -3
  73. package/dist/types/client/format/useRelativeTime.d.ts.map +1 -1
  74. package/dist/types/client/format/useUnit.d.ts +2 -3
  75. package/dist/types/client/format/useUnit.d.ts.map +1 -1
  76. package/dist/types/client/t.d.ts +0 -1
  77. package/dist/types/client/t.d.ts.map +1 -1
  78. package/dist/types/client/useDictionary.d.ts +2 -3
  79. package/dist/types/client/useDictionary.d.ts.map +1 -1
  80. package/dist/types/client/useDictionaryAsync.d.ts +0 -1
  81. package/dist/types/client/useDictionaryAsync.d.ts.map +1 -1
  82. package/dist/types/client/useDictionaryDynamic.d.ts +2 -3
  83. package/dist/types/client/useDictionaryDynamic.d.ts.map +1 -1
  84. package/dist/types/client/useI18n.d.ts +0 -1
  85. package/dist/types/client/useI18n.d.ts.map +1 -1
  86. package/dist/types/client/useIntlayer.d.ts +3 -4
  87. package/dist/types/client/useIntlayer.d.ts.map +1 -1
  88. package/dist/types/client/useLoadDynamic.d.ts.map +1 -1
  89. package/dist/types/client/useLocale.d.ts.map +1 -1
  90. package/dist/types/client/useLocaleBase.d.ts +5 -5
  91. package/dist/types/client/useLocaleBase.d.ts.map +1 -1
  92. package/dist/types/client/useLocaleStorage.d.ts +5 -6
  93. package/dist/types/client/useLocaleStorage.d.ts.map +1 -1
  94. package/dist/types/client/useTraduction.d.ts +0 -1
  95. package/dist/types/client/useTraduction.d.ts.map +1 -1
  96. package/dist/types/editor/ContentSelectorWrapper.d.ts.map +1 -1
  97. package/dist/types/editor/IntlayerEditorProvider.d.ts.map +1 -1
  98. package/dist/types/editor/useEditedContentRenderer.d.ts.map +1 -1
  99. package/dist/types/getDictionary.d.ts.map +1 -1
  100. package/dist/types/getIntlayer.d.ts.map +1 -1
  101. package/dist/types/html/HTMLProvider.d.ts.map +1 -1
  102. package/dist/types/html/HTMLRenderer.d.ts +46 -0
  103. package/dist/types/html/HTMLRenderer.d.ts.map +1 -0
  104. package/dist/types/html/HTMLRendererPlugin.d.ts +2 -7
  105. package/dist/types/html/HTMLRendererPlugin.d.ts.map +1 -1
  106. package/dist/types/html/index.d.ts +4 -2
  107. package/dist/types/html/types.d.ts +26 -0
  108. package/dist/types/html/types.d.ts.map +1 -0
  109. package/dist/types/index.d.ts +4 -2
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/types/markdown/MarkdownProvider.d.ts +34 -36
  112. package/dist/types/markdown/MarkdownProvider.d.ts.map +1 -1
  113. package/dist/types/markdown/MarkdownRenderer.d.ts +235 -13
  114. package/dist/types/markdown/MarkdownRenderer.d.ts.map +1 -1
  115. package/dist/types/markdown/MarkdownRendererPlugin.d.ts.map +1 -1
  116. package/dist/types/markdown/index.d.ts +2 -2
  117. package/dist/types/markdown/processor.d.ts +0 -1
  118. package/dist/types/markdown/processor.d.ts.map +1 -1
  119. package/dist/types/markdown/runtime.d.ts +0 -1
  120. package/dist/types/markdown/runtime.d.ts.map +1 -1
  121. package/dist/types/plugins.d.ts +17 -4
  122. package/dist/types/plugins.d.ts.map +1 -1
  123. package/dist/types/reactElement/renderReactElement.d.ts +2 -2
  124. package/dist/types/reactElement/renderReactElement.d.ts.map +1 -1
  125. package/dist/types/server/IntlayerServerProvider.d.ts +2 -2
  126. package/dist/types/server/IntlayerServerProvider.d.ts.map +1 -1
  127. package/dist/types/server/format/useCompact.d.ts +0 -1
  128. package/dist/types/server/format/useCompact.d.ts.map +1 -1
  129. package/dist/types/server/format/useCurrency.d.ts +0 -1
  130. package/dist/types/server/format/useCurrency.d.ts.map +1 -1
  131. package/dist/types/server/format/useDate.d.ts +0 -1
  132. package/dist/types/server/format/useDate.d.ts.map +1 -1
  133. package/dist/types/server/format/useIntl.d.ts +0 -1
  134. package/dist/types/server/format/useIntl.d.ts.map +1 -1
  135. package/dist/types/server/format/useList.d.ts +0 -1
  136. package/dist/types/server/format/useList.d.ts.map +1 -1
  137. package/dist/types/server/format/useNumber.d.ts +0 -1
  138. package/dist/types/server/format/useNumber.d.ts.map +1 -1
  139. package/dist/types/server/format/usePercentage.d.ts +0 -1
  140. package/dist/types/server/format/usePercentage.d.ts.map +1 -1
  141. package/dist/types/server/format/useRelativeTime.d.ts +0 -1
  142. package/dist/types/server/format/useRelativeTime.d.ts.map +1 -1
  143. package/dist/types/server/format/useUnit.d.ts +0 -1
  144. package/dist/types/server/format/useUnit.d.ts.map +1 -1
  145. package/dist/types/server/serverContext.d.ts +0 -1
  146. package/dist/types/server/serverContext.d.ts.map +1 -1
  147. package/dist/types/server/t.d.ts +0 -1
  148. package/dist/types/server/t.d.ts.map +1 -1
  149. package/dist/types/server/useDictionary.d.ts +2 -3
  150. package/dist/types/server/useDictionary.d.ts.map +1 -1
  151. package/dist/types/server/useDictionaryAsync.d.ts +2 -3
  152. package/dist/types/server/useDictionaryAsync.d.ts.map +1 -1
  153. package/dist/types/server/useDictionaryDynamic.d.ts +2 -3
  154. package/dist/types/server/useDictionaryDynamic.d.ts.map +1 -1
  155. package/dist/types/server/useI18n.d.ts +0 -1
  156. package/dist/types/server/useI18n.d.ts.map +1 -1
  157. package/dist/types/server/useIntlayer.d.ts +3 -3
  158. package/dist/types/server/useIntlayer.d.ts.map +1 -1
  159. package/dist/types/server/useLoadDynamic.d.ts.map +1 -1
  160. package/dist/types/server/useLocale.d.ts.map +1 -1
  161. package/package.json +11 -11
@@ -7,38 +7,77 @@ import { jsx } from "react/jsx-runtime";
7
7
  //#region src/markdown/MarkdownProvider.tsx
8
8
  const MarkdownContext = createContext(void 0);
9
9
  const useMarkdownContext = () => useContext(MarkdownContext);
10
- const MarkdownProvider = ({ children, components, wrapper, options = {}, renderMarkdown }) => {
11
- const { forceBlock, preserveFrontmatter, tagfilter } = options;
12
- const internalOptions = {
10
+ const isRenderMarkdownOptions = (override) => {
11
+ return override && typeof override === "object" && ("components" in override || "wrapper" in override || "forceBlock" in override || "forceInline" in override || "preserveFrontmatter" in override || "tagfilter" in override);
12
+ };
13
+ const mergeOptions = (baseOptions, overrides) => {
14
+ if (!overrides) return baseOptions;
15
+ if (!isRenderMarkdownOptions(overrides)) return {
16
+ ...baseOptions,
17
+ components: {
18
+ ...baseOptions.components,
19
+ ...overrides
20
+ }
21
+ };
22
+ const { components: overrideComponents, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, ...componentsFromRest } = overrides;
23
+ const components = overrideComponents || componentsFromRest;
24
+ return {
25
+ ...baseOptions,
26
+ forceBlock: forceBlock ?? baseOptions.forceBlock,
27
+ forceInline: forceInline ?? baseOptions.forceInline,
28
+ preserveFrontmatter: preserveFrontmatter ?? baseOptions.preserveFrontmatter,
29
+ tagfilter: tagfilter ?? baseOptions.tagfilter,
30
+ wrapper: wrapper || baseOptions.wrapper,
31
+ forceWrapper: !!(wrapper || baseOptions.wrapper),
32
+ components: {
33
+ ...baseOptions.components,
34
+ ...components
35
+ }
36
+ };
37
+ };
38
+ /**
39
+ * Provider for the MarkdownRenderer component.
40
+ *
41
+ * It will provide the `renderMarkdown` function to the context, which can be used to render markdown.
42
+ *
43
+ * ```tsx
44
+ * const content = useIntlayer('app');
45
+ *
46
+ * return (
47
+ * <div>
48
+ * {content.markdown} // Will be rendered with the components and options provided to the MarkdownProvider
49
+ * </div>
50
+ * );
51
+ * ```
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * <MarkdownProvider components={{ h1: CustomHeading }}>
56
+ * <MarkdownRenderer>
57
+ * {markdownContent}
58
+ * </MarkdownRenderer>
59
+ * </MarkdownProvider>
60
+ * ```
61
+ */
62
+ const MarkdownProvider = ({ children, components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRenderFn }) => {
63
+ const baseOptions = {
13
64
  components,
14
65
  forceBlock,
66
+ forceInline,
15
67
  wrapper,
16
68
  forceWrapper: !!wrapper,
17
69
  preserveFrontmatter,
18
70
  tagfilter
19
71
  };
20
- const finalRenderMarkdown = renderMarkdown || ((markdown, componentsOverride) => {
21
- const isOptionsObject = componentsOverride && (typeof componentsOverride.components === "object" || typeof componentsOverride.wrapper === "function" || typeof componentsOverride.options === "object");
22
- const localComponents = isOptionsObject ? componentsOverride.components : componentsOverride;
23
- const localWrapper = isOptionsObject ? componentsOverride.wrapper : void 0;
24
- const localOptions = isOptionsObject ? componentsOverride.options : {};
25
- const mergedOptions = {
26
- ...options,
27
- ...localOptions
28
- };
29
- return compiler(markdown, {
30
- ...internalOptions,
31
- ...mergedOptions,
32
- wrapper: localWrapper || wrapper || internalOptions.wrapper,
33
- forceWrapper: !!(localWrapper || wrapper),
34
- components: {
35
- ...internalOptions.components,
36
- ...localComponents
37
- }
38
- });
72
+ const defaultRenderMarkdown = (markdown, overrides) => {
73
+ return compiler(markdown, mergeOptions(baseOptions, overrides));
74
+ };
75
+ const customRenderMarkdownWrapper = (markdown, overrides) => /* @__PURE__ */ jsx(MarkdownContext.Provider, {
76
+ value: void 0,
77
+ children: customRenderFn?.(markdown, overrides)
39
78
  });
40
79
  return /* @__PURE__ */ jsx(MarkdownContext.Provider, {
41
- value: { renderMarkdown: finalRenderMarkdown },
80
+ value: { renderMarkdown: customRenderFn ? customRenderMarkdownWrapper : defaultRenderMarkdown },
42
81
  children
43
82
  });
44
83
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownProvider.mjs","names":[],"sources":["../../../src/markdown/MarkdownProvider.tsx"],"sourcesContent":["'use client';\n\nimport type { Overrides } from '@intlayer/core';\nimport {\n createContext,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n useContext,\n} from 'react';\nimport { compiler, type MarkdownRendererOptions } from './processor';\n\ntype RenderMarkdownOptions = {\n components?: Overrides;\n wrapper?: FC;\n options?: MarkdownProviderOptions;\n};\n\ntype MarkdownContextValue = {\n renderMarkdown: (\n markdown: string,\n components?: Overrides | RenderMarkdownOptions\n ) => ReactNode;\n};\n\n/**\n * Refined options for the MarkdownProvider.\n */\nexport type MarkdownProviderOptions = {\n /**\n * Forces the compiler to always output content with a block-level wrapper.\n */\n forceBlock?: boolean;\n /**\n * Whether to preserve frontmatter in the markdown content.\n */\n preserveFrontmatter?: boolean;\n /**\n * Whether to use the GitHub Tag Filter.\n */\n tagfilter?: boolean;\n};\n\ntype MarkdownProviderProps = PropsWithChildren<{\n /**\n * Component overrides for HTML tags.\n */\n components?: Overrides;\n /**\n * Wrapper element or component to be used when there are multiple children.\n */\n wrapper?: any;\n /**\n * Markdown processor options.\n */\n options?: MarkdownProviderOptions;\n /**\n * Custom render function for markdown.\n * If provided, it will overwrite all rules and default rendering.\n */\n renderMarkdown?: (markdown: string, overrides?: Overrides) => ReactNode;\n}>;\n\nconst MarkdownContext = createContext<MarkdownContextValue | undefined>(\n undefined\n);\n\nexport const useMarkdownContext = () => useContext(MarkdownContext);\n\nexport const MarkdownProvider: FC<MarkdownProviderProps> = ({\n children,\n components,\n wrapper,\n options = {},\n renderMarkdown,\n}) => {\n const { forceBlock, preserveFrontmatter, tagfilter } = options;\n\n // Map public options to internal processor options\n const internalOptions: MarkdownRendererOptions = {\n components,\n forceBlock,\n wrapper,\n forceWrapper: !!wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n const finalRenderMarkdown =\n renderMarkdown ||\n ((\n markdown: string,\n componentsOverride?: Overrides | RenderMarkdownOptions\n ) => {\n const isOptionsObject =\n componentsOverride &&\n (typeof (componentsOverride as RenderMarkdownOptions).components ===\n 'object' ||\n typeof (componentsOverride as RenderMarkdownOptions).wrapper ===\n 'function' ||\n typeof (componentsOverride as RenderMarkdownOptions).options ===\n 'object');\n\n const localComponents = isOptionsObject\n ? (componentsOverride as RenderMarkdownOptions).components\n : (componentsOverride as Overrides);\n const localWrapper = isOptionsObject\n ? (componentsOverride as RenderMarkdownOptions).wrapper\n : undefined;\n const localOptions = isOptionsObject\n ? (componentsOverride as RenderMarkdownOptions).options\n : {};\n\n const mergedOptions = {\n ...options,\n ...localOptions,\n };\n\n return compiler(markdown, {\n ...internalOptions,\n ...mergedOptions,\n wrapper: localWrapper || wrapper || internalOptions.wrapper,\n forceWrapper: !!(localWrapper || wrapper),\n components: {\n ...internalOptions.components,\n ...localComponents,\n },\n });\n });\n\n return (\n <MarkdownContext.Provider value={{ renderMarkdown: finalRenderMarkdown }}>\n {children}\n </MarkdownContext.Provider>\n );\n};\n"],"mappings":";;;;;;;AA+DA,MAAM,kBAAkB,cACtB,OACD;AAED,MAAa,2BAA2B,WAAW,gBAAgB;AAEnE,MAAa,oBAA+C,EAC1D,UACA,YACA,SACA,UAAU,EAAE,EACZ,qBACI;CACJ,MAAM,EAAE,YAAY,qBAAqB,cAAc;CAGvD,MAAM,kBAA2C;EAC/C;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD;CAED,MAAM,sBACJ,oBAEE,UACA,uBACG;EACH,MAAM,kBACJ,uBACC,OAAQ,mBAA6C,eACpD,YACA,OAAQ,mBAA6C,YACnD,cACF,OAAQ,mBAA6C,YACnD;EAEN,MAAM,kBAAkB,kBACnB,mBAA6C,aAC7C;EACL,MAAM,eAAe,kBAChB,mBAA6C,UAC9C;EACJ,MAAM,eAAe,kBAChB,mBAA6C,UAC9C,EAAE;EAEN,MAAM,gBAAgB;GACpB,GAAG;GACH,GAAG;GACJ;AAED,SAAO,SAAS,UAAU;GACxB,GAAG;GACH,GAAG;GACH,SAAS,gBAAgB,WAAW,gBAAgB;GACpD,cAAc,CAAC,EAAE,gBAAgB;GACjC,YAAY;IACV,GAAG,gBAAgB;IACnB,GAAG;IACJ;GACF,CAAC;;AAGN,QACE,oBAAC,gBAAgB;EAAS,OAAO,EAAE,gBAAgB,qBAAqB;EACrE;GACwB"}
1
+ {"version":3,"file":"MarkdownProvider.mjs","names":[],"sources":["../../../src/markdown/MarkdownProvider.tsx"],"sourcesContent":["'use client';\n\nimport type { Overrides } from '@intlayer/core';\nimport {\n createContext,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n useContext,\n} from 'react';\nimport { compiler, type MarkdownRendererOptions } from './processor';\n\nexport type MarkdownProviderOptions = {\n /** Forces the compiler to always output content with a block-level wrapper. */\n forceBlock?: boolean;\n /** Forces the compiler to always output content with an inline wrapper. */\n forceInline?: boolean;\n /** Whether to preserve frontmatter in the markdown content. */\n preserveFrontmatter?: boolean;\n /** Whether to use the GitHub Tag Filter for security. */\n tagfilter?: boolean;\n};\n\ntype RenderMarkdownOptions = MarkdownProviderOptions & {\n components?: Overrides;\n wrapper?: FC<any>;\n};\n\ntype MarkdownContextValue = {\n renderMarkdown: (\n markdown: string,\n components?: Overrides | RenderMarkdownOptions\n ) => ReactNode;\n};\n\ntype MarkdownProviderProps = PropsWithChildren<\n MarkdownProviderOptions & {\n components?: Overrides;\n wrapper?: any;\n renderMarkdown?: (\n markdown: string,\n overrides?: Overrides | RenderMarkdownOptions\n ) => ReactNode;\n }\n>;\n\nconst MarkdownContext = createContext<MarkdownContextValue | undefined>(\n undefined\n);\n\nexport const useMarkdownContext = () => useContext(MarkdownContext);\n\n// Pure functions defined outside the component are easier for React Compiler to track\n// and don't need to be recreated on every render.\n\nconst isRenderMarkdownOptions = (\n override: any\n): override is RenderMarkdownOptions => {\n return (\n override &&\n typeof override === 'object' &&\n ('components' in override ||\n 'wrapper' in override ||\n 'forceBlock' in override ||\n 'forceInline' in override ||\n 'preserveFrontmatter' in override ||\n 'tagfilter' in override)\n );\n};\n\nconst mergeOptions = (\n baseOptions: MarkdownRendererOptions,\n overrides?: Overrides | RenderMarkdownOptions\n): MarkdownRendererOptions => {\n if (!overrides) return baseOptions;\n\n if (!isRenderMarkdownOptions(overrides)) {\n // Overrides is just a component map\n return {\n ...baseOptions,\n components: { ...baseOptions.components, ...overrides },\n };\n }\n\n // Overrides is a full options object\n const {\n components: overrideComponents,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n ...componentsFromRest\n } = overrides;\n\n const components = overrideComponents || componentsFromRest;\n\n return {\n ...baseOptions,\n forceBlock: forceBlock ?? baseOptions.forceBlock,\n forceInline: forceInline ?? baseOptions.forceInline,\n preserveFrontmatter: preserveFrontmatter ?? baseOptions.preserveFrontmatter,\n tagfilter: tagfilter ?? baseOptions.tagfilter,\n wrapper: wrapper || baseOptions.wrapper,\n\n forceWrapper: !!(wrapper || baseOptions.wrapper),\n components: { ...baseOptions.components, ...components },\n };\n};\n\n/**\n * Provider for the MarkdownRenderer component.\n *\n * It will provide the `renderMarkdown` function to the context, which can be used to render markdown.\n *\n * ```tsx\n * const content = useIntlayer('app');\n *\n * return (\n * <div>\n * {content.markdown} // Will be rendered with the components and options provided to the MarkdownProvider\n * </div>\n * );\n * ```\n *\n * @example\n * ```tsx\n * <MarkdownProvider components={{ h1: CustomHeading }}>\n * <MarkdownRenderer>\n * {markdownContent}\n * </MarkdownRenderer>\n * </MarkdownProvider>\n * ```\n */\nexport const MarkdownProvider: FC<MarkdownProviderProps> = ({\n children,\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n renderMarkdown: customRenderFn,\n}) => {\n const baseOptions: MarkdownRendererOptions = {\n components,\n forceBlock,\n forceInline,\n wrapper,\n forceWrapper: !!wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n // Standard internal renderer\n const defaultRenderMarkdown = (\n markdown: string,\n overrides?: Overrides | RenderMarkdownOptions\n ) => {\n const mergedOptions = mergeOptions(baseOptions, overrides);\n return compiler(markdown, mergedOptions);\n };\n\n // Wrapper for user-provided custom renderer\n // Note: We wrap in a clean Provider to prevent infinite recursion\n const customRenderMarkdownWrapper = (\n markdown: string,\n overrides?: Overrides | RenderMarkdownOptions\n ) => (\n <MarkdownContext.Provider value={undefined}>\n {customRenderFn?.(markdown, overrides)}\n </MarkdownContext.Provider>\n );\n\n return (\n <MarkdownContext.Provider\n value={{\n renderMarkdown: customRenderFn\n ? customRenderMarkdownWrapper\n : defaultRenderMarkdown,\n }}\n >\n {children}\n </MarkdownContext.Provider>\n );\n};\n"],"mappings":";;;;;;;AA8CA,MAAM,kBAAkB,cACtB,OACD;AAED,MAAa,2BAA2B,WAAW,gBAAgB;AAKnE,MAAM,2BACJ,aACsC;AACtC,QACE,YACA,OAAO,aAAa,aACnB,gBAAgB,YACf,aAAa,YACb,gBAAgB,YAChB,iBAAiB,YACjB,yBAAyB,YACzB,eAAe;;AAIrB,MAAM,gBACJ,aACA,cAC4B;AAC5B,KAAI,CAAC,UAAW,QAAO;AAEvB,KAAI,CAAC,wBAAwB,UAAU,CAErC,QAAO;EACL,GAAG;EACH,YAAY;GAAE,GAAG,YAAY;GAAY,GAAG;GAAW;EACxD;CAIH,MAAM,EACJ,YAAY,oBACZ,SACA,YACA,aACA,qBACA,WACA,GAAG,uBACD;CAEJ,MAAM,aAAa,sBAAsB;AAEzC,QAAO;EACL,GAAG;EACH,YAAY,cAAc,YAAY;EACtC,aAAa,eAAe,YAAY;EACxC,qBAAqB,uBAAuB,YAAY;EACxD,WAAW,aAAa,YAAY;EACpC,SAAS,WAAW,YAAY;EAEhC,cAAc,CAAC,EAAE,WAAW,YAAY;EACxC,YAAY;GAAE,GAAG,YAAY;GAAY,GAAG;GAAY;EACzD;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,MAAa,oBAA+C,EAC1D,UACA,YACA,SACA,YACA,aACA,qBACA,WACA,gBAAgB,qBACZ;CACJ,MAAM,cAAuC;EAC3C;EACA;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD;CAGD,MAAM,yBACJ,UACA,cACG;AAEH,SAAO,SAAS,UADM,aAAa,aAAa,UAAU,CAClB;;CAK1C,MAAM,+BACJ,UACA,cAEA,oBAAC,gBAAgB;EAAS,OAAO;YAC9B,iBAAiB,UAAU,UAAU;GACb;AAG7B,QACE,oBAAC,gBAAgB;EACf,OAAO,EACL,gBAAgB,iBACZ,8BACA,uBACL;EAEA;GACwB"}
@@ -4,22 +4,190 @@ import { Fragment, jsx } from "react/jsx-runtime";
4
4
 
5
5
  //#region src/markdown/MarkdownRenderer.tsx
6
6
  /**
7
- * React component that renders markdown to JSX.
7
+ * Renders markdown content to JSX with the provided components and options.
8
8
  *
9
- * It uses the renderMarkdown function from the MarkdownProvider context if available.
10
- * Otherwise, it falls back to the default compiler with provided components and options.
9
+ * This function does not use context from MarkdownProvider. Use `useMarkdownRenderer`
10
+ * hook if you want to leverage provider context.
11
+ *
12
+ * @param content - The markdown string to render
13
+ * @param props - Configuration options for rendering
14
+ * @param props.components - Component overrides for HTML tags
15
+ * @param props.wrapper - Wrapper component for multiple children
16
+ * @returns JSX element representing the rendered markdown
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * import { renderMarkdown } from '@intlayer/react-intlayer/markdown';
21
+ *
22
+ * const markdown = '# Hello World\n\nThis is **bold** text.';
23
+ * const jsx = renderMarkdown(markdown, {
24
+ * components: {
25
+ * h1: ({ children }) => <h1 className="title">{children}</h1>,
26
+ * },
27
+ * forceBlock: true,
28
+ * });
29
+ * ```
30
+ */
31
+ const renderMarkdown = (content, { components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter } = {}) => {
32
+ return compiler(content, {
33
+ components,
34
+ forceBlock,
35
+ forceInline,
36
+ wrapper,
37
+ forceWrapper: !!wrapper,
38
+ preserveFrontmatter,
39
+ tagfilter
40
+ });
41
+ };
42
+ /**
43
+ * Hook that returns a function to render markdown content.
44
+ *
45
+ * This hook considers the configuration from the `MarkdownProvider` context if available,
46
+ * falling back to the provided props or default behavior.
47
+ *
48
+ * @param props - Optional configuration that will override context values
49
+ * @param props.components - Component overrides for HTML tags (overrides context)
50
+ * @param props.wrapper - Wrapper component (overrides context)
51
+ * @returns A function that takes markdown content and returns JSX
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * import { useMarkdownRenderer } from '@intlayer/react-intlayer/markdown';
56
+ *
57
+ * function MyComponent() {
58
+ * const renderMarkdown = useMarkdownRenderer({
59
+ * components: {
60
+ * h1: ({ children }) => <h1 className="custom">{children}</h1>,
61
+ * },
62
+ * });
63
+ *
64
+ * return (
65
+ * <div>
66
+ * {renderMarkdown('# Hello\n\nThis is **markdown**')}
67
+ * </div>
68
+ * );
69
+ * }
70
+ * ```
71
+ *
72
+ * @example
73
+ * ```tsx
74
+ * // With MarkdownProvider context
75
+ * function App() {
76
+ * return (
77
+ * <MarkdownProvider
78
+ * components={{ h1: CustomHeading }}
79
+ * forceBlock={true}
80
+ * >
81
+ * <MyComponent />
82
+ * </MarkdownProvider>
83
+ * );
84
+ * }
85
+ * ```
86
+ */
87
+ const useMarkdownRenderer = ({ components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter } = {}) => {
88
+ const context = useMarkdownContext();
89
+ return (content) => {
90
+ if (context) return context.renderMarkdown(content, {
91
+ components,
92
+ wrapper,
93
+ forceBlock,
94
+ forceInline,
95
+ preserveFrontmatter,
96
+ tagfilter
97
+ });
98
+ return renderMarkdown(content, {
99
+ components,
100
+ wrapper,
101
+ forceBlock,
102
+ forceInline,
103
+ preserveFrontmatter,
104
+ tagfilter
105
+ });
106
+ };
107
+ };
108
+ /**
109
+ * React component that renders markdown content to JSX.
110
+ *
111
+ * This component uses the `renderMarkdown` function from the `MarkdownProvider` context
112
+ * if available. Otherwise, it falls back to the default compiler with provided components
113
+ * and options. You can also provide a custom `renderMarkdown` function prop to override
114
+ * all rendering behavior.
115
+ *
116
+ * @example
117
+ * ```tsx
118
+ * import { MarkdownRenderer } from '@intlayer/react-intlayer/markdown';
119
+ *
120
+ * function MyComponent() {
121
+ * return (
122
+ * <MarkdownRenderer>
123
+ * {`# Hello World
124
+ *
125
+ * This is a paragraph with **bold** and *italic* text.
126
+ *
127
+ * - List item 1
128
+ * - List item 2`}
129
+ * </MarkdownRenderer>
130
+ * );
131
+ * }
132
+ * ```
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * // With custom components
137
+ * <MarkdownRenderer
138
+ * components={{
139
+ * h1: ({ children }) => <h1 className="text-4xl font-bold">{children}</h1>,
140
+ * a: ({ href, children }) => (
141
+ * <a href={href} className="text-blue-500 hover:underline">
142
+ * {children}
143
+ * </a>
144
+ * ),
145
+ * }}
146
+ * forceBlock={true}
147
+ * >
148
+ * {markdownContent}
149
+ * </MarkdownRenderer>
150
+ * ```
151
+ *
152
+ * @example
153
+ * ```tsx
154
+ * // With MarkdownProvider context
155
+ * function App() {
156
+ * return (
157
+ * <MarkdownProvider
158
+ * components={{ h1: CustomHeading }}
159
+ * forceBlock={true}
160
+ * >
161
+ * <MarkdownRenderer>
162
+ * {markdownContent}
163
+ * </MarkdownRenderer>
164
+ * </MarkdownProvider>
165
+ * );
166
+ * }
167
+ * ```
11
168
  */
12
- const MarkdownRenderer = ({ children = "", components, wrapper, options = {} }) => {
169
+ const MarkdownRenderer = ({ children = "", components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown }) => {
13
170
  const context = useMarkdownContext();
171
+ if (renderMarkdown) return /* @__PURE__ */ jsx(Fragment, { children: renderMarkdown(children, {
172
+ components,
173
+ wrapper,
174
+ forceBlock,
175
+ forceInline,
176
+ preserveFrontmatter,
177
+ tagfilter
178
+ }) });
14
179
  if (context) return /* @__PURE__ */ jsx(Fragment, { children: context.renderMarkdown(children, {
15
180
  components,
16
181
  wrapper,
17
- options
182
+ forceBlock,
183
+ forceInline,
184
+ preserveFrontmatter,
185
+ tagfilter
18
186
  }) });
19
- const { forceBlock, preserveFrontmatter, tagfilter } = options;
20
187
  return /* @__PURE__ */ jsx(Fragment, { children: compiler(children, {
21
188
  components,
22
189
  forceBlock,
190
+ forceInline,
23
191
  wrapper,
24
192
  forceWrapper: !!wrapper,
25
193
  preserveFrontmatter,
@@ -28,5 +196,5 @@ const MarkdownRenderer = ({ children = "", components, wrapper, options = {} })
28
196
  };
29
197
 
30
198
  //#endregion
31
- export { MarkdownRenderer };
199
+ export { MarkdownRenderer, renderMarkdown, useMarkdownRenderer };
32
200
  //# sourceMappingURL=MarkdownRenderer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.mjs","names":[],"sources":["../../../src/markdown/MarkdownRenderer.tsx"],"sourcesContent":["import type { Overrides } from '@intlayer/core';\nimport type { FC } from 'react';\nimport {\n type MarkdownProviderOptions,\n useMarkdownContext,\n} from './MarkdownProvider';\nimport { compiler, type MarkdownRendererOptions } from './processor';\n\ntype MarkdownRendererProps = {\n /**\n * The markdown content to render.\n */\n children: string;\n /**\n * Component overrides for HTML tags.\n * Only used if not wrapped in a MarkdownProvider.\n */\n components?: Overrides;\n /**\n * Wrapper element or component to be used when there are multiple children.\n * Only used if not wrapped in a MarkdownProvider.\n */\n wrapper?: FC;\n /**\n * Markdown processor options.\n * Only used if not wrapped in a MarkdownProvider.\n */\n options?: MarkdownProviderOptions;\n};\n\n/**\n * React component that renders markdown to JSX.\n *\n * It uses the renderMarkdown function from the MarkdownProvider context if available.\n * Otherwise, it falls back to the default compiler with provided components and options.\n */\nexport const MarkdownRenderer: FC<MarkdownRendererProps> = ({\n children = '',\n components,\n wrapper,\n options = {},\n}) => {\n const context = useMarkdownContext();\n\n if (context) {\n return (\n <>{context.renderMarkdown(children, { components, wrapper, options })}</>\n );\n }\n\n const { forceBlock, preserveFrontmatter, tagfilter } = options;\n\n // Map public options to internal processor options\n const internalOptions: MarkdownRendererOptions = {\n components,\n forceBlock,\n wrapper,\n forceWrapper: !!wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n return <>{compiler(children, internalOptions)}</>;\n};\n"],"mappings":";;;;;;;;;;;AAoCA,MAAa,oBAA+C,EAC1D,WAAW,IACX,YACA,SACA,UAAU,EAAE,OACR;CACJ,MAAM,UAAU,oBAAoB;AAEpC,KAAI,QACF,QACE,0CAAG,QAAQ,eAAe,UAAU;EAAE;EAAY;EAAS;EAAS,CAAC,GAAI;CAI7E,MAAM,EAAE,YAAY,qBAAqB,cAAc;AAYvD,QAAO,0CAAG,SAAS,UAT8B;EAC/C;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD,CAE4C,GAAI"}
1
+ {"version":3,"file":"MarkdownRenderer.mjs","names":[],"sources":["../../../src/markdown/MarkdownRenderer.tsx"],"sourcesContent":["import type { Overrides } from '@intlayer/core';\nimport type { FC, JSX, ReactNode } from 'react';\nimport {\n type MarkdownProviderOptions,\n useMarkdownContext,\n} from './MarkdownProvider';\nimport { compiler, type MarkdownRendererOptions } from './processor';\n\n/**\n * Props for rendering markdown content.\n *\n * @example\n * ```tsx\n * const props: RenderMarkdownProps = {\n * components: {\n * h1: ({ children }) => <h1 className=\"text-3xl\">{children}</h1>,\n * p: ({ children }) => <p className=\"text-gray-700\">{children}</p>,\n * },\n * wrapper: ({ children }) => <article>{children}</article>,\n * options: {\n * forceBlock: true,\n * preserveFrontmatter: false,\n * tagfilter: true,\n * },\n * };\n * ```\n */\nexport type RenderMarkdownProps = MarkdownProviderOptions & {\n /**\n * Component overrides for HTML tags.\n * Allows you to customize how specific HTML elements are rendered.\n * Only used if not wrapped in a MarkdownProvider.\n *\n * @example\n * ```tsx\n * components={{\n * h1: ({ children }) => <h1 className=\"title\">{children}</h1>,\n * a: ({ href, children }) => <Link to={href}>{children}</Link>,\n * }}\n * ```\n */\n components?: Overrides;\n /**\n * Wrapper element or component to be used when there are multiple children.\n * Only used if not wrapped in a MarkdownProvider.\n *\n * @example\n * ```tsx\n * wrapper={({ children }) => <div className=\"markdown-content\">{children}</div>}\n * ```\n */\n wrapper?: FC;\n};\n\n/**\n * Renders markdown content to JSX with the provided components and options.\n *\n * This function does not use context from MarkdownProvider. Use `useMarkdownRenderer`\n * hook if you want to leverage provider context.\n *\n * @param content - The markdown string to render\n * @param props - Configuration options for rendering\n * @param props.components - Component overrides for HTML tags\n * @param props.wrapper - Wrapper component for multiple children\n * @returns JSX element representing the rendered markdown\n *\n * @example\n * ```tsx\n * import { renderMarkdown } from '@intlayer/react-intlayer/markdown';\n *\n * const markdown = '# Hello World\\n\\nThis is **bold** text.';\n * const jsx = renderMarkdown(markdown, {\n * components: {\n * h1: ({ children }) => <h1 className=\"title\">{children}</h1>,\n * },\n * forceBlock: true,\n * });\n * ```\n */\nexport const renderMarkdown = (\n content: string,\n {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n }: RenderMarkdownProps = {}\n): JSX.Element => {\n // Map public options to internal processor options\n const internalOptions: MarkdownRendererOptions = {\n components,\n forceBlock,\n forceInline,\n wrapper,\n forceWrapper: !!wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n return compiler(content, internalOptions);\n};\n\n/**\n * Hook that returns a function to render markdown content.\n *\n * This hook considers the configuration from the `MarkdownProvider` context if available,\n * falling back to the provided props or default behavior.\n *\n * @param props - Optional configuration that will override context values\n * @param props.components - Component overrides for HTML tags (overrides context)\n * @param props.wrapper - Wrapper component (overrides context)\n * @returns A function that takes markdown content and returns JSX\n *\n * @example\n * ```tsx\n * import { useMarkdownRenderer } from '@intlayer/react-intlayer/markdown';\n *\n * function MyComponent() {\n * const renderMarkdown = useMarkdownRenderer({\n * components: {\n * h1: ({ children }) => <h1 className=\"custom\">{children}</h1>,\n * },\n * });\n *\n * return (\n * <div>\n * {renderMarkdown('# Hello\\n\\nThis is **markdown**')}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With MarkdownProvider context\n * function App() {\n * return (\n * <MarkdownProvider\n * components={{ h1: CustomHeading }}\n * forceBlock={true}\n * >\n * <MyComponent />\n * </MarkdownProvider>\n * );\n * }\n * ```\n */\nexport const useMarkdownRenderer = ({\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n}: RenderMarkdownProps = {}) => {\n const context = useMarkdownContext();\n\n return (content: string) => {\n if (context) {\n return context.renderMarkdown(content, {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n });\n }\n\n return renderMarkdown(content, {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n });\n };\n};\n\n/**\n * Props for the MarkdownRenderer component.\n *\n * @example\n * ```tsx\n * const props: MarkdownRendererProps = {\n * children: '# Hello World\\n\\nThis is **bold** text.',\n * components: {\n * h1: ({ children }) => <h1 className=\"title\">{children}</h1>,\n * },\n * wrapper: ({ children }) => <article>{children}</article>,\n * forceBlock: true,\n * };\n * ```\n */\nexport type MarkdownRendererProps = RenderMarkdownProps & {\n /**\n * The markdown content to render as a string.\n *\n * @example\n * ```tsx\n * <MarkdownRenderer>\n * {`# Title\\n\\nParagraph with **bold** text.`}\n * </MarkdownRenderer>\n * ```\n */\n children: string;\n /**\n * Custom render function for markdown.\n * If provided, it will overwrite context and default rendering.\n *\n * @param markdown - The markdown string to render\n * @param options - Optional rendering options\n * @returns React node representing the rendered markdown\n *\n * @example\n * ```tsx\n * <MarkdownRenderer\n * renderMarkdown={(md, opts) => {\n * // Custom rendering logic\n * return <div dangerouslySetInnerHTML={{ __html: customParser(md) }} />;\n * }}\n * >\n * {markdownContent}\n * </MarkdownRenderer>\n * ```\n */\n renderMarkdown?: (\n markdown: string,\n options?: {\n components?: Overrides;\n wrapper?: FC;\n forceBlock?: boolean;\n forceInline?: boolean;\n preserveFrontmatter?: boolean;\n tagfilter?: boolean;\n }\n ) => ReactNode;\n};\n\n/**\n * React component that renders markdown content to JSX.\n *\n * This component uses the `renderMarkdown` function from the `MarkdownProvider` context\n * if available. Otherwise, it falls back to the default compiler with provided components\n * and options. You can also provide a custom `renderMarkdown` function prop to override\n * all rendering behavior.\n *\n * @example\n * ```tsx\n * import { MarkdownRenderer } from '@intlayer/react-intlayer/markdown';\n *\n * function MyComponent() {\n * return (\n * <MarkdownRenderer>\n * {`# Hello World\n *\n * This is a paragraph with **bold** and *italic* text.\n *\n * - List item 1\n * - List item 2`}\n * </MarkdownRenderer>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <MarkdownRenderer\n * components={{\n * h1: ({ children }) => <h1 className=\"text-4xl font-bold\">{children}</h1>,\n * a: ({ href, children }) => (\n * <a href={href} className=\"text-blue-500 hover:underline\">\n * {children}\n * </a>\n * ),\n * }}\n * forceBlock={true}\n * >\n * {markdownContent}\n * </MarkdownRenderer>\n * ```\n *\n * @example\n * ```tsx\n * // With MarkdownProvider context\n * function App() {\n * return (\n * <MarkdownProvider\n * components={{ h1: CustomHeading }}\n * forceBlock={true}\n * >\n * <MarkdownRenderer>\n * {markdownContent}\n * </MarkdownRenderer>\n * </MarkdownProvider>\n * );\n * }\n * ```\n */\nexport const MarkdownRenderer: FC<MarkdownRendererProps> = ({\n children = '',\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n renderMarkdown,\n}) => {\n const context = useMarkdownContext();\n\n if (renderMarkdown) {\n return (\n <>\n {renderMarkdown(children, {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n })}\n </>\n );\n }\n\n if (context) {\n return (\n <>\n {context.renderMarkdown(children, {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n })}\n </>\n );\n }\n\n // Map public options to internal processor options\n const internalOptions: MarkdownRendererOptions = {\n components,\n forceBlock,\n forceInline,\n wrapper,\n forceWrapper: !!wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n return <>{compiler(children, internalOptions)}</>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,MAAa,kBACX,SACA,EACE,YACA,SACA,YACA,aACA,qBACA,cACuB,EAAE,KACX;AAYhB,QAAO,SAAS,SAViC;EAC/C;EACA;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD,CAEwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgD3C,MAAa,uBAAuB,EAClC,YACA,SACA,YACA,aACA,qBACA,cACuB,EAAE,KAAK;CAC9B,MAAM,UAAU,oBAAoB;AAEpC,SAAQ,YAAoB;AAC1B,MAAI,QACF,QAAO,QAAQ,eAAe,SAAS;GACrC;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AAGJ,SAAO,eAAe,SAAS;GAC7B;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6HN,MAAa,oBAA+C,EAC1D,WAAW,IACX,YACA,SACA,YACA,aACA,qBACA,WACA,qBACI;CACJ,MAAM,UAAU,oBAAoB;AAEpC,KAAI,eACF,QACE,0CACG,eAAe,UAAU;EACxB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,GACD;AAIP,KAAI,QACF,QACE,0CACG,QAAQ,eAAe,UAAU;EAChC;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,GACD;AAeP,QAAO,0CAAG,SAAS,UAV8B;EAC/C;EACA;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD,CAE4C,GAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRendererPlugin.mjs","names":[],"sources":["../../../src/markdown/MarkdownRendererPlugin.tsx"],"sourcesContent":["'use client';\n\nimport {\n getContent,\n getContentNodeByKeyPath,\n getMarkdownMetadata,\n} from '@intlayer/core';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport type { ContentNode, KeyPath, LocalesValues } from '@intlayer/types';\nimport type { FC, ReactNode } from 'react';\nimport { useEditedContentRenderer } from '../editor/useEditedContentRenderer';\nimport { useMarkdownContext } from './MarkdownProvider';\n\ntype MarkdownRendererPluginProps = {\n dictionaryKey: string;\n keyPath: KeyPath[];\n locale?: LocalesValues;\n children: string;\n [key: string]: any;\n};\n\nexport const MarkdownRendererPlugin: FC<MarkdownRendererPluginProps> = (\n props\n): ReactNode => {\n const { dictionaryKey, keyPath, children, locale, ...components } = props;\n const context = useMarkdownContext();\n const renderMarkdown = context?.renderMarkdown ?? ((md) => md);\n const editedContentContext = useEditedContentRenderer({\n dictionaryKey,\n keyPath,\n children,\n });\n\n const contentToRender =\n typeof editedContentContext === 'string' ? editedContentContext : children;\n\n return renderMarkdown(contentToRender, components);\n};\n\ntype MarkdownMetadataRendererProps = MarkdownRendererPluginProps & {\n metadataKeyPath: KeyPath[];\n};\n\nexport const MarkdownMetadataRenderer: FC<MarkdownMetadataRendererProps> = ({\n dictionaryKey,\n keyPath,\n children,\n metadataKeyPath,\n}): ReactNode => {\n const editedContentContext = useEditedContentRenderer({\n dictionaryKey,\n keyPath,\n children,\n });\n const currentLocale = useEditorLocale();\n\n const metadata = getMarkdownMetadata(editedContentContext);\n\n const metadataEl = getContentNodeByKeyPath(\n metadata as ContentNode,\n metadataKeyPath,\n currentLocale\n );\n\n return metadataEl as ReactNode;\n};\n"],"mappings":";;;;;;;;AAqBA,MAAa,0BACX,UACc;CACd,MAAM,EAAE,eAAe,SAAS,UAAU,QAAQ,GAAG,eAAe;CAEpE,MAAM,iBADU,oBAAoB,EACJ,oBAAoB,OAAO;CAC3D,MAAM,uBAAuB,yBAAyB;EACpD;EACA;EACA;EACD,CAAC;AAKF,QAAO,eAFL,OAAO,yBAAyB,WAAW,uBAAuB,UAE7B,WAAW;;AAOpD,MAAa,4BAA+D,EAC1E,eACA,SACA,UACA,sBACe;CACf,MAAM,uBAAuB,yBAAyB;EACpD;EACA;EACA;EACD,CAAC;CACF,MAAM,gBAAgB,iBAAiB;AAUvC,QANmB,wBAFF,oBAAoB,qBAAqB,EAIxD,iBACA,cACD"}
1
+ {"version":3,"file":"MarkdownRendererPlugin.mjs","names":[],"sources":["../../../src/markdown/MarkdownRendererPlugin.tsx"],"sourcesContent":["'use client';\n\nimport { getContentNodeByKeyPath, getMarkdownMetadata } from '@intlayer/core';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport type { ContentNode, KeyPath, LocalesValues } from '@intlayer/types';\nimport type { FC, ReactNode } from 'react';\nimport { useEditedContentRenderer } from '../editor/useEditedContentRenderer';\nimport { useMarkdownContext } from './MarkdownProvider';\n\ntype MarkdownRendererPluginProps = {\n dictionaryKey: string;\n keyPath: KeyPath[];\n locale?: LocalesValues;\n children: string;\n [key: string]: any;\n};\n\nexport const MarkdownRendererPlugin: FC<MarkdownRendererPluginProps> = (\n props\n): ReactNode => {\n const { dictionaryKey, keyPath, children, locale, ...components } = props;\n const context = useMarkdownContext();\n const renderMarkdown = context?.renderMarkdown ?? ((md) => md);\n const editedContentContext = useEditedContentRenderer({\n dictionaryKey,\n keyPath,\n children,\n });\n\n const contentToRender =\n typeof editedContentContext === 'string' ? editedContentContext : children;\n\n return renderMarkdown(contentToRender, components);\n};\n\ntype MarkdownMetadataRendererProps = MarkdownRendererPluginProps & {\n metadataKeyPath: KeyPath[];\n};\n\nexport const MarkdownMetadataRenderer: FC<MarkdownMetadataRendererProps> = ({\n dictionaryKey,\n keyPath,\n children,\n metadataKeyPath,\n}): ReactNode => {\n const editedContentContext = useEditedContentRenderer({\n dictionaryKey,\n keyPath,\n children,\n });\n const currentLocale = useEditorLocale();\n\n const metadata = getMarkdownMetadata(editedContentContext);\n\n const metadataEl = getContentNodeByKeyPath(\n metadata as ContentNode,\n metadataKeyPath,\n currentLocale\n );\n\n return metadataEl as ReactNode;\n};\n"],"mappings":";;;;;;;;AAiBA,MAAa,0BACX,UACc;CACd,MAAM,EAAE,eAAe,SAAS,UAAU,QAAQ,GAAG,eAAe;CAEpE,MAAM,iBADU,oBAAoB,EACJ,oBAAoB,OAAO;CAC3D,MAAM,uBAAuB,yBAAyB;EACpD;EACA;EACA;EACD,CAAC;AAKF,QAAO,eAFL,OAAO,yBAAyB,WAAW,uBAAuB,UAE7B,WAAW;;AAOpD,MAAa,4BAA+D,EAC1E,eACA,SACA,UACA,sBACe;CACf,MAAM,uBAAuB,yBAAyB;EACpD;EACA;EACA;EACD,CAAC;CACF,MAAM,gBAAgB,iBAAiB;AAUvC,QANmB,wBAFF,oBAAoB,qBAAqB,EAIxD,iBACA,cACD"}
@@ -1,7 +1,7 @@
1
1
  import { LegacyMarkdownRenderer, RuleType, compile, compileMarkdown, compiler, sanitizer as defaultSanitizer, slugify as defaultSlugify } from "./processor.mjs";
2
2
  import { MarkdownProvider, useMarkdownContext } from "./MarkdownProvider.mjs";
3
- import { MarkdownRenderer } from "./MarkdownRenderer.mjs";
3
+ import { MarkdownRenderer, renderMarkdown, useMarkdownRenderer } from "./MarkdownRenderer.mjs";
4
4
  import { MarkdownMetadataRenderer, MarkdownRendererPlugin } from "./MarkdownRendererPlugin.mjs";
5
5
  import { createReactRuntime, reactRuntime } from "./runtime.mjs";
6
6
 
7
- export { LegacyMarkdownRenderer, MarkdownMetadataRenderer, MarkdownProvider, MarkdownRenderer, MarkdownRendererPlugin, RuleType, compile, compileMarkdown, compiler, createReactRuntime, reactRuntime, defaultSanitizer as sanitizer, defaultSlugify as slugify, useMarkdownContext };
7
+ export { LegacyMarkdownRenderer, MarkdownMetadataRenderer, MarkdownProvider, MarkdownRenderer, MarkdownRendererPlugin, RuleType, compile, compileMarkdown, compiler, createReactRuntime, reactRuntime, renderMarkdown, defaultSanitizer as sanitizer, defaultSlugify as slugify, useMarkdownContext, useMarkdownRenderer };
@@ -3,11 +3,6 @@ import { RuleType, compile as compile$1, sanitizer as defaultSanitizer, slugify
3
3
 
4
4
  //#region src/markdown/processor.tsx
5
5
  /**
6
- * React adapter for the framework-agnostic markdown processor.
7
- *
8
- * Provides a backward-compatible compiler and LegacyMarkdownRenderer component.
9
- */
10
- /**
11
6
  * Default React runtime for markdown rendering.
12
7
  */
13
8
  const DEFAULT_RUNTIME = {
@@ -1 +1 @@
1
- {"version":3,"file":"processor.mjs","names":["coreCompile"],"sources":["../../../src/markdown/processor.tsx"],"sourcesContent":["/**\n * React adapter for the framework-agnostic markdown processor.\n *\n * Provides a backward-compatible compiler and LegacyMarkdownRenderer component.\n */\n\nimport {\n type Overrides as CoreOverrides,\n compile as coreCompile,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n type MarkdownContext,\n type MarkdownOptions,\n type MarkdownRuntime,\n type ParserResult,\n type ParseState,\n type RenderRuleHook,\n type RuleOutput,\n RuleType,\n} from '@intlayer/core';\nimport {\n cloneElement,\n createElement,\n type FC,\n Fragment,\n type HTMLAttributes,\n type JSX,\n type ReactNode,\n} from 'react';\n\n// Re-export RuleType for compatibility\nexport { RuleType };\n\n// Re-export utilities for compatibility\nexport { defaultSlugify as slugify, defaultSanitizer as sanitizer };\n\ntype HTMLTags = keyof JSX.IntrinsicElements;\n\ntype State = ParseState;\n\n/**\n * Refined MarkdownRendererOptions type.\n */\nexport type MarkdownRendererOptions = Partial<{\n /**\n * Ultimate control over the output of all rendered JSX.\n */\n createElement: (\n tag: Parameters<typeof createElement>[0],\n props: JSX.IntrinsicAttributes,\n ...children: ReactNode[]\n ) => ReactNode;\n\n /**\n * The library automatically generates an anchor tag for bare URLs included in the markdown\n * document, but this behavior can be disabled if desired.\n */\n disableAutoLink: boolean;\n\n /**\n * Disable the compiler's best-effort transcription of provided raw HTML\n * into JSX-equivalent.\n */\n disableParsingRawHTML: boolean;\n\n /**\n * Forces the compiler to have space between hash sign and the header text.\n */\n enforceAtxHeadings: boolean;\n\n /**\n * Forces the compiler to always output content with a block-level wrapper.\n */\n forceBlock: boolean;\n\n /**\n * Forces the compiler to always output content with an inline wrapper.\n */\n forceInline: boolean;\n\n /**\n * Forces the compiler to wrap results, even if there is only a single child.\n */\n forceWrapper: boolean;\n\n /**\n * Supply additional HTML entity: unicode replacement mappings.\n */\n namedCodesToUnicode: {\n [key: string]: string;\n };\n\n /**\n * Selectively control the output of particular HTML tags.\n */\n components: CoreOverrides;\n\n /**\n * Allows for full control over rendering of particular rules.\n */\n renderRule: RenderRuleHook;\n\n /**\n * Override the built-in sanitizer function for URLs.\n */\n sanitizer: (value: string, tag: HTMLTags, attribute: string) => string | null;\n\n /**\n * Override normalization of non-URI-safe characters for anchor linking.\n */\n slugify: (input: string) => string;\n\n /**\n * Declare the type of the wrapper to be used when there are multiple children.\n */\n wrapper: any | null;\n\n /**\n * Whether to preserve frontmatter in the markdown content.\n */\n preserveFrontmatter: boolean;\n\n /**\n * Whether to use the GitHub Tag Filter.\n */\n tagfilter: boolean;\n}>;\n\n/**\n * Default React runtime for markdown rendering.\n */\nconst DEFAULT_RUNTIME: MarkdownRuntime = {\n createElement: createElement as any,\n cloneElement,\n Fragment,\n normalizeProps: (_tag, props) => props,\n};\n\n/**\n * Compile markdown to React elements.\n * This is the primary export - use this for new code.\n */\nexport const compileMarkdown = (\n markdown: string = '',\n options: MarkdownRendererOptions = {}\n): JSX.Element => {\n const {\n createElement: customCreateElement,\n disableAutoLink,\n disableParsingRawHTML,\n enforceAtxHeadings,\n forceBlock,\n forceInline,\n forceWrapper,\n namedCodesToUnicode,\n components,\n renderRule,\n sanitizer,\n slugify,\n wrapper,\n preserveFrontmatter,\n tagfilter,\n } = options;\n\n const runtime = customCreateElement\n ? { ...DEFAULT_RUNTIME, createElement: customCreateElement as any }\n : DEFAULT_RUNTIME;\n\n const ctx: MarkdownContext = {\n runtime,\n components,\n namedCodesToUnicode,\n sanitizer: sanitizer as any,\n slugify,\n };\n\n const compilerOptions: MarkdownOptions = {\n disableAutoLink,\n disableParsingRawHTML,\n enforceAtxHeadings,\n forceBlock,\n forceInline,\n forceWrapper,\n renderRule,\n wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n return coreCompile(markdown, ctx, compilerOptions) as JSX.Element;\n};\n\n// Backward compatibility aliases\nexport const compiler = compileMarkdown;\nexport const compile = compileMarkdown;\n\n/**\n * React component that renders markdown to JSX (legacy).\n */\nexport const LegacyMarkdownRenderer: FC<\n Omit<HTMLAttributes<Element>, 'children'> & {\n children: string;\n options?: MarkdownRendererOptions;\n }\n> = ({ children = '', options, ...props }) => {\n if (process.env.NODE_ENV !== 'production' && typeof children !== 'string') {\n console.error(\n 'intlayer: <Markdown> component only accepts a single string as a child, received:',\n children\n );\n }\n\n return cloneElement(\n compiler(children, options),\n props as JSX.IntrinsicAttributes\n );\n};\n\nexport type {\n State,\n ParseState,\n ParserResult,\n RuleOutput,\n CoreOverrides as Overrides,\n};\n"],"mappings":";;;;;;;;;;;;AAmIA,MAAM,kBAAmC;CACxB;CACf;CACA;CACA,iBAAiB,MAAM,UAAU;CAClC;;;;;AAMD,MAAa,mBACX,WAAmB,IACnB,UAAmC,EAAE,KACrB;CAChB,MAAM,EACJ,eAAe,qBACf,iBACA,uBACA,oBACA,YACA,aACA,cACA,qBACA,YACA,YACA,WACA,SACA,SACA,qBACA,cACE;AA2BJ,QAAOA,UAAY,UArBU;EAC3B,SALc,sBACZ;GAAE,GAAG;GAAiB,eAAe;GAA4B,GACjE;EAIF;EACA;EACW;EACX;EACD,EAEwC;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAEiD;;AAIpD,MAAa,WAAW;AACxB,MAAa,UAAU;;;;AAKvB,MAAa,0BAKR,EAAE,WAAW,IAAI,SAAS,GAAG,YAAY;AAC5C,KAAI,QAAQ,IAAI,aAAa,gBAAgB,OAAO,aAAa,SAC/D,SAAQ,MACN,qFACA,SACD;AAGH,QAAO,aACL,SAAS,UAAU,QAAQ,EAC3B,MACD"}
1
+ {"version":3,"file":"processor.mjs","names":["coreCompile"],"sources":["../../../src/markdown/processor.tsx"],"sourcesContent":["import {\n type Overrides as CoreOverrides,\n compile as coreCompile,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n type MarkdownContext,\n type MarkdownOptions,\n type MarkdownRuntime,\n type ParserResult,\n type ParseState,\n type RenderRuleHook,\n type RuleOutput,\n RuleType,\n} from '@intlayer/core';\nimport {\n cloneElement,\n createElement,\n type FC,\n Fragment,\n type HTMLAttributes,\n type JSX,\n type ReactNode,\n} from 'react';\n\n// Re-export RuleType for compatibility\nexport { RuleType };\n\n// Re-export utilities for compatibility\nexport { defaultSlugify as slugify, defaultSanitizer as sanitizer };\n\ntype HTMLTags = keyof JSX.IntrinsicElements;\n\ntype State = ParseState;\n\n/**\n * Refined MarkdownRendererOptions type.\n */\nexport type MarkdownRendererOptions = Partial<{\n /**\n * Ultimate control over the output of all rendered JSX.\n */\n createElement: (\n tag: Parameters<typeof createElement>[0],\n props: JSX.IntrinsicAttributes,\n ...children: ReactNode[]\n ) => ReactNode;\n\n /**\n * The library automatically generates an anchor tag for bare URLs included in the markdown\n * document, but this behavior can be disabled if desired.\n */\n disableAutoLink: boolean;\n\n /**\n * Disable the compiler's best-effort transcription of provided raw HTML\n * into JSX-equivalent.\n */\n disableParsingRawHTML: boolean;\n\n /**\n * Forces the compiler to have space between hash sign and the header text.\n */\n enforceAtxHeadings: boolean;\n\n /**\n * Forces the compiler to always output content with a block-level wrapper.\n */\n forceBlock: boolean;\n\n /**\n * Forces the compiler to always output content with an inline wrapper.\n */\n forceInline: boolean;\n\n /**\n * Forces the compiler to wrap results, even if there is only a single child.\n */\n forceWrapper: boolean;\n\n /**\n * Supply additional HTML entity: unicode replacement mappings.\n */\n namedCodesToUnicode: {\n [key: string]: string;\n };\n\n /**\n * Selectively control the output of particular HTML tags.\n */\n components: CoreOverrides;\n\n /**\n * Allows for full control over rendering of particular rules.\n */\n renderRule: RenderRuleHook;\n\n /**\n * Override the built-in sanitizer function for URLs.\n */\n sanitizer: (value: string, tag: HTMLTags, attribute: string) => string | null;\n\n /**\n * Override normalization of non-URI-safe characters for anchor linking.\n */\n slugify: (input: string) => string;\n\n /**\n * Declare the type of the wrapper to be used when there are multiple children.\n */\n wrapper: any | null;\n\n /**\n * Whether to preserve frontmatter in the markdown content.\n */\n preserveFrontmatter: boolean;\n\n /**\n * Whether to use the GitHub Tag Filter.\n */\n tagfilter: boolean;\n}>;\n\n/**\n * Default React runtime for markdown rendering.\n */\nconst DEFAULT_RUNTIME: MarkdownRuntime = {\n createElement: createElement as any,\n cloneElement,\n Fragment,\n normalizeProps: (_tag, props) => props,\n};\n\n/**\n * Compile markdown to React elements.\n * This is the primary export - use this for new code.\n */\nexport const compileMarkdown = (\n markdown: string = '',\n options: MarkdownRendererOptions = {}\n): JSX.Element => {\n const {\n createElement: customCreateElement,\n disableAutoLink,\n disableParsingRawHTML,\n enforceAtxHeadings,\n forceBlock,\n forceInline,\n forceWrapper,\n namedCodesToUnicode,\n components,\n renderRule,\n sanitizer,\n slugify,\n wrapper,\n preserveFrontmatter,\n tagfilter,\n } = options;\n\n const runtime = customCreateElement\n ? { ...DEFAULT_RUNTIME, createElement: customCreateElement as any }\n : DEFAULT_RUNTIME;\n\n const ctx: MarkdownContext = {\n runtime,\n components,\n namedCodesToUnicode,\n sanitizer: sanitizer as any,\n slugify,\n };\n\n const compilerOptions: MarkdownOptions = {\n disableAutoLink,\n disableParsingRawHTML,\n enforceAtxHeadings,\n forceBlock,\n forceInline,\n forceWrapper,\n renderRule,\n wrapper,\n preserveFrontmatter,\n tagfilter,\n };\n\n return coreCompile(markdown, ctx, compilerOptions) as JSX.Element;\n};\n\n// Backward compatibility aliases\nexport const compiler = compileMarkdown;\nexport const compile = compileMarkdown;\n\n/**\n * React component that renders markdown to JSX (legacy).\n */\nexport const LegacyMarkdownRenderer: FC<\n Omit<HTMLAttributes<Element>, 'children'> & {\n children: string;\n options?: MarkdownRendererOptions;\n }\n> = ({ children = '', options, ...props }) => {\n if (process.env.NODE_ENV !== 'production' && typeof children !== 'string') {\n console.error(\n 'intlayer: <Markdown> component only accepts a single string as a child, received:',\n children\n );\n }\n\n return cloneElement(\n compiler(children, options),\n props as JSX.IntrinsicAttributes\n );\n};\n\nexport type {\n State,\n ParseState,\n ParserResult,\n RuleOutput,\n CoreOverrides as Overrides,\n};\n"],"mappings":";;;;;;;AA6HA,MAAM,kBAAmC;CACxB;CACf;CACA;CACA,iBAAiB,MAAM,UAAU;CAClC;;;;;AAMD,MAAa,mBACX,WAAmB,IACnB,UAAmC,EAAE,KACrB;CAChB,MAAM,EACJ,eAAe,qBACf,iBACA,uBACA,oBACA,YACA,aACA,cACA,qBACA,YACA,YACA,WACA,SACA,SACA,qBACA,cACE;AA2BJ,QAAOA,UAAY,UArBU;EAC3B,SALc,sBACZ;GAAE,GAAG;GAAiB,eAAe;GAA4B,GACjE;EAIF;EACA;EACW;EACX;EACD,EAEwC;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAEiD;;AAIpD,MAAa,WAAW;AACxB,MAAa,UAAU;;;;AAKvB,MAAa,0BAKR,EAAE,WAAW,IAAI,SAAS,GAAG,YAAY;AAC5C,KAAI,QAAQ,IAAI,aAAa,gBAAgB,OAAO,aAAa,SAC/D,SAAQ,MACN,qFACA,SACD;AAGH,QAAO,aACL,SAAS,UAAU,QAAQ,EAC3B,MACD"}
@@ -4,9 +4,9 @@ import { EditedContentRenderer } from "./editor/useEditedContentRenderer.mjs";
4
4
  import { HTMLRendererPlugin } from "./html/HTMLRendererPlugin.mjs";
5
5
  import { MarkdownMetadataRenderer, MarkdownRendererPlugin } from "./markdown/MarkdownRendererPlugin.mjs";
6
6
  import { renderReactElement } from "./reactElement/renderReactElement.mjs";
7
- import { createElement } from "react";
7
+ import { Fragment, createElement } from "react";
8
8
  import { jsx } from "react/jsx-runtime";
9
- import { getMarkdownMetadata } from "@intlayer/core";
9
+ import { getMarkdownMetadata, splitInsertionTemplate } from "@intlayer/core";
10
10
  import { NodeType } from "@intlayer/types";
11
11
 
12
12
  //#region src/plugins.tsx
@@ -36,6 +36,49 @@ const reactNodePlugins = {
36
36
  })
37
37
  })
38
38
  };
39
+ /**
40
+ * Split insertion string and join with React nodes using shared core logic
41
+ */
42
+ const splitAndJoinInsertion = (template, values) => {
43
+ const result = splitInsertionTemplate(template, values);
44
+ if (result.isSimple) return result.parts;
45
+ return createElement(Fragment, null, ...result.parts.map((part, index) => createElement(Fragment, { key: index }, part)));
46
+ };
47
+ /** Insertion plugin for React. Handles component/node insertion. */
48
+ const insertionPlugin = {
49
+ id: "insertion-plugin",
50
+ canHandle: (node) => typeof node === "object" && node?.nodeType === NodeType.Insertion,
51
+ transform: (node, props, deepTransformNode) => {
52
+ const newKeyPath = [...props.keyPath, { type: NodeType.Insertion }];
53
+ const children = node[NodeType.Insertion];
54
+ /** Insertion string plugin. Replaces string node with a component that render the insertion. */
55
+ const insertionStringPlugin = {
56
+ id: "insertion-string-plugin",
57
+ canHandle: (node) => typeof node === "string",
58
+ transform: (node, subProps, deepTransformNode) => {
59
+ const transformedResult = deepTransformNode(node, {
60
+ ...subProps,
61
+ children: node,
62
+ plugins: [...(props.plugins ?? []).filter((plugin) => plugin.id !== "intlayer-node-plugin")]
63
+ });
64
+ return (values) => {
65
+ const result = splitAndJoinInsertion(transformedResult, values);
66
+ return deepTransformNode(result, {
67
+ ...subProps,
68
+ plugins: props.plugins,
69
+ children: result
70
+ });
71
+ };
72
+ }
73
+ };
74
+ return deepTransformNode(children, {
75
+ ...props,
76
+ children,
77
+ keyPath: newKeyPath,
78
+ plugins: [insertionStringPlugin, ...props.plugins ?? []]
79
+ });
80
+ }
81
+ };
39
82
  /** Markdown string plugin. Replaces string node with a component that render the markdown. */
40
83
  const markdownStringPlugin = {
41
84
  id: "markdown-string-plugin",
@@ -46,14 +89,14 @@ const markdownStringPlugin = {
46
89
  plugins: [{
47
90
  id: "markdown-metadata-plugin",
48
91
  canHandle: (metadataNode) => typeof metadataNode === "string" || typeof metadataNode === "number" || typeof metadataNode === "boolean" || !metadataNode,
49
- transform: (metadataNode, props$1) => renderIntlayerNode({
50
- ...props$1,
92
+ transform: (metadataNode, props) => renderIntlayerNode({
93
+ ...props,
51
94
  value: metadataNode,
52
95
  children: /* @__PURE__ */ jsx(ContentSelectorRenderer, {
53
96
  ...rest,
54
97
  children: /* @__PURE__ */ jsx(MarkdownMetadataRenderer, {
55
98
  ...rest,
56
- metadataKeyPath: props$1.keyPath,
99
+ metadataKeyPath: props.keyPath,
57
100
  children: node
58
101
  })
59
102
  })
@@ -86,7 +129,7 @@ const markdownStringPlugin = {
86
129
  };
87
130
  const markdownPlugin = {
88
131
  id: "markdown-plugin",
89
- canHandle: (node) => typeof node === "object" && (node?.nodeType === NodeType.Markdown || node?.nodeType === "markdown"),
132
+ canHandle: (node) => typeof node === "object" && node?.nodeType === NodeType.Markdown,
90
133
  transform: (node, props, deepTransformNode) => {
91
134
  const newKeyPath = [...props.keyPath, { type: NodeType.Markdown }];
92
135
  const children = node[NodeType.Markdown];
@@ -101,9 +144,10 @@ const markdownPlugin = {
101
144
  /** HTML plugin. Replaces node with a function that takes components => ReactNode. */
102
145
  const htmlPlugin = {
103
146
  id: "html-plugin",
104
- canHandle: (node) => typeof node === "object" && (node?.nodeType === NodeType.HTML || node?.nodeType === "html"),
147
+ canHandle: (node) => typeof node === "object" && node?.nodeType === NodeType.HTML,
105
148
  transform: (node, props) => {
106
149
  const html = node[NodeType.HTML];
150
+ node.tags;
107
151
  const { plugins, ...rest } = props;
108
152
  const render = (userComponents) => createElement(HTMLRendererPlugin, {
109
153
  ...rest,
@@ -120,5 +164,5 @@ const htmlPlugin = {
120
164
  };
121
165
 
122
166
  //#endregion
123
- export { htmlPlugin, intlayerNodePlugins, markdownPlugin, markdownStringPlugin, reactNodePlugins };
167
+ export { htmlPlugin, insertionPlugin, intlayerNodePlugins, markdownPlugin, markdownStringPlugin, reactNodePlugins };
124
168
  //# sourceMappingURL=plugins.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.mjs","names":["props"],"sources":["../../src/plugins.tsx"],"sourcesContent":["import {\n type DeepTransformContent as DeepTransformContentCore,\n getMarkdownMetadata,\n type HTMLCond,\n type HTMLContent,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n type MarkdownContent,\n type Plugins,\n} from '@intlayer/core';\nimport {\n type DeclaredLocales,\n type KeyPath,\n type LocalesValues,\n NodeType,\n} from '@intlayer/types';\nimport { createElement, type ReactElement, type ReactNode } from 'react';\nimport { ContentSelectorRenderer } from './editor';\nimport { EditedContentRenderer } from './editor/useEditedContentRenderer';\nimport { HTMLRendererPlugin } from './html';\nimport { type IntlayerNode, renderIntlayerNode } from './IntlayerNode';\nimport { MarkdownMetadataRenderer, MarkdownRendererPlugin } from './markdown';\nimport { renderReactElement } from './reactElement/renderReactElement';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (\n _node,\n {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n }\n ) =>\n renderIntlayerNode({\n ...rest,\n value: rest.children,\n children: (\n <EditedContentRenderer {...rest}>{rest.children}</EditedContentRenderer>\n ),\n }),\n};\n\n/** ---------------------------------------------\n * REACT NODE PLUGIN\n * --------------------------------------------- */\n\nexport type ReactNodeCond<T> = T extends {\n props: any;\n key: any;\n}\n ? ReactNode\n : never;\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\nexport const reactNodePlugins: Plugins = {\n id: 'react-node-plugin',\n canHandle: (node) =>\n typeof node === 'object' &&\n typeof node?.props !== 'undefined' &&\n typeof node.key !== 'undefined',\n\n transform: (\n node,\n {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n }\n ) =>\n renderIntlayerNode({\n ...rest,\n value: '[[react-element]]',\n children: (\n <ContentSelectorRenderer {...rest}>\n {renderReactElement(node)}\n </ContentSelectorRenderer>\n ),\n }),\n};\n\n/**\n * MARKDOWN PLUGIN\n */\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<string, { metadata: DeepTransformContent<string> }>\n : never;\n\n/** Markdown string plugin. Replaces string node with a component that render the markdown. */\nexport const markdownStringPlugin: Plugins = {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n } = props;\n\n const metadata = getMarkdownMetadata(node);\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, props) =>\n renderIntlayerNode({\n ...props,\n value: metadataNode,\n children: (\n <ContentSelectorRenderer {...rest}>\n <MarkdownMetadataRenderer\n {...rest}\n metadataKeyPath={props.keyPath}\n >\n {node}\n </MarkdownMetadataRenderer>\n </ContentSelectorRenderer>\n ),\n }),\n };\n\n // Transform metadata while keeping the same structure\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const render = (components?: any) =>\n renderIntlayerNode({\n ...props,\n value: node,\n children: (\n <ContentSelectorRenderer {...rest}>\n <MarkdownRendererPlugin {...rest} {...components}>\n {node}\n </MarkdownRendererPlugin>\n </ContentSelectorRenderer>\n ),\n additionalProps: {\n metadata: metadataNodes,\n },\n });\n\n const element = render() as ReactElement;\n\n return new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return node;\n }\n if (prop === 'metadata') {\n return metadataNodes;\n }\n\n if (prop === 'use') {\n return (components?: any) => render(components);\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n },\n};\n\nexport type MarkdownCond<T, S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeType.Markdown]: infer M;\n metadata?: infer U;\n}\n ? {\n use: (components: any) => any;\n metadata: DeepTransformContent<U, L>;\n } & any\n : never;\n\nexport const markdownPlugin: Plugins = {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' &&\n (node?.nodeType === NodeType.Markdown || node?.nodeType === 'markdown'),\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n {\n type: NodeType.Markdown,\n },\n ];\n\n const children = node[NodeType.Markdown];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n};\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T, S, L> = HTMLCond<T, S, L>;\n\n/** HTML plugin. Replaces node with a function that takes components => ReactNode. */\nexport const htmlPlugin: Plugins = {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' &&\n (node?.nodeType === NodeType.HTML || node?.nodeType === 'html'),\n\n transform: (node: HTMLContent, props) => {\n const html = node[NodeType.HTML];\n const { plugins, ...rest } = props;\n\n const render = (userComponents?: Record<string, any>): ReactNode =>\n createElement(HTMLRendererPlugin, { ...rest, html, userComponents });\n\n const element = render() as ReactElement;\n\n return new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return html;\n }\n\n if (prop === 'use') {\n return (userComponents?: Record<string, any>) =>\n render(userComponents);\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n },\n};\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginReact<T, S, L extends LocalesValues> {\n reactNode: ReactNodeCond<T>;\n reactIntlayerNode: IntlayerNodeCond<T>;\n reactMarkdown: MarkdownCond<T, S, L>;\n reactHtml: HTMLPluginCond<T, S, L>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the the `react-intlayer` plugins will override the types of `intlayer` functions.\n */\nexport type IInterpreterPluginState = IInterpreterPluginStateCore & {\n reactNode: true;\n reactIntlayerNode: true;\n reactMarkdown: true;\n reactHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugins.mjs","names":[],"sources":["../../src/plugins.tsx"],"sourcesContent":["import {\n type DeepTransformContent as DeepTransformContentCore,\n getMarkdownMetadata,\n type HTMLCond,\n type HTMLContent,\n type IInterpreterPluginState as IInterpreterPluginStateCore,\n type InsertionContent,\n type MarkdownContent,\n type Plugins,\n splitInsertionTemplate,\n} from '@intlayer/core';\nimport {\n type DeclaredLocales,\n type KeyPath,\n type LocalesValues,\n NodeType,\n} from '@intlayer/types';\nimport {\n type ComponentType,\n createElement,\n type ElementType,\n Fragment,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { ContentSelectorRenderer } from './editor';\nimport { EditedContentRenderer } from './editor/useEditedContentRenderer';\nimport { HTMLRendererPlugin } from './html';\nimport type { ReactHTMLComponentMap } from './html/types';\nimport { type IntlayerNode, renderIntlayerNode } from './IntlayerNode';\nimport { MarkdownMetadataRenderer, MarkdownRendererPlugin } from './markdown';\nimport { renderReactElement } from './reactElement/renderReactElement';\n\n/** ---------------------------------------------\n * INTLAYER NODE PLUGIN\n * --------------------------------------------- */\n\nexport type IntlayerNodeCond<T> = T extends number | string\n ? IntlayerNode<T>\n : never;\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\nexport const intlayerNodePlugins: Plugins = {\n id: 'intlayer-node-plugin',\n canHandle: (node) =>\n typeof node === 'bigint' ||\n typeof node === 'string' ||\n typeof node === 'number',\n transform: (\n _node,\n {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n }\n ) =>\n renderIntlayerNode({\n ...rest,\n value: rest.children,\n children: (\n <EditedContentRenderer {...rest}>{rest.children}</EditedContentRenderer>\n ),\n }),\n};\n\n/** ---------------------------------------------\n * REACT NODE PLUGIN\n * --------------------------------------------- */\n\nexport type ReactNodeCond<T> = T extends {\n props: any;\n key: any;\n}\n ? ReactNode\n : never;\n\n/** Translation plugin. Replaces node with a locale string if nodeType = Translation. */\nexport const reactNodePlugins: Plugins = {\n id: 'react-node-plugin',\n canHandle: (node) =>\n typeof node === 'object' &&\n typeof node?.props !== 'undefined' &&\n typeof node.key !== 'undefined',\n\n transform: (\n node,\n {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n }\n ) =>\n renderIntlayerNode({\n ...rest,\n value: '[[react-element]]',\n children: (\n <ContentSelectorRenderer {...rest}>\n {renderReactElement(node)}\n </ContentSelectorRenderer>\n ),\n }),\n};\n\n/** ---------------------------------------------\n * INSERTION PLUGIN\n * --------------------------------------------- */\n\nexport type InsertionCond<T, S, L> = T extends {\n nodeType: NodeType | string;\n [NodeType.Insertion]: string;\n fields: readonly string[];\n}\n ? (\n values: {\n [K in T['fields'][number]]: ReactNode;\n }\n ) => ReactNode\n : never;\n\n/**\n * Split insertion string and join with React nodes using shared core logic\n */\nconst splitAndJoinInsertion = (\n template: string,\n values: Record<string, string | number | ReactNode>\n): ReactNode => {\n const result = splitInsertionTemplate(template, values);\n\n if (result.isSimple) {\n // Simple string replacement\n return result.parts as string;\n }\n\n // Return as Fragment with proper keys\n return createElement(\n Fragment,\n null,\n ...(result.parts as any[]).map((part, index) =>\n createElement(Fragment, { key: index }, part)\n )\n );\n};\n\n/** Insertion plugin for React. Handles component/node insertion. */\nexport const insertionPlugin: Plugins = {\n id: 'insertion-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeType.Insertion,\n transform: (node: InsertionContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n {\n type: NodeType.Insertion,\n },\n ];\n\n const children = node[NodeType.Insertion];\n\n /** Insertion string plugin. Replaces string node with a component that render the insertion. */\n const insertionStringPlugin: Plugins = {\n id: 'insertion-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, subProps, deepTransformNode) => {\n const transformedResult = deepTransformNode(node, {\n ...subProps,\n children: node,\n plugins: [\n ...(props.plugins ?? ([] as Plugins[])).filter(\n (plugin) => plugin.id !== 'intlayer-node-plugin'\n ),\n ],\n });\n\n return (\n values: {\n [K in InsertionContent['fields'][number]]:\n | string\n | number\n | ReactNode;\n }\n ) => {\n const result = splitAndJoinInsertion(transformedResult, values);\n\n return deepTransformNode(result, {\n ...subProps,\n plugins: props.plugins,\n children: result,\n });\n };\n },\n };\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [insertionStringPlugin, ...(props.plugins ?? [])],\n });\n },\n};\n\n/**\n * MARKDOWN PLUGIN\n */\n\nexport type MarkdownStringCond<T> = T extends string\n ? IntlayerNode<\n string,\n { metadata: DeepTransformContent<string>; use: (components: any) => any }\n >\n : never;\n\n/** Markdown string plugin. Replaces string node with a component that render the markdown. */\nexport const markdownStringPlugin: Plugins = {\n id: 'markdown-string-plugin',\n canHandle: (node) => typeof node === 'string',\n transform: (node: string, props, deepTransformNode) => {\n const {\n plugins, // Removed to avoid next error - Functions cannot be passed directly to Client Components\n ...rest\n } = props;\n\n const metadata = getMarkdownMetadata(node);\n\n const metadataPlugins: Plugins = {\n id: 'markdown-metadata-plugin',\n canHandle: (metadataNode) =>\n typeof metadataNode === 'string' ||\n typeof metadataNode === 'number' ||\n typeof metadataNode === 'boolean' ||\n !metadataNode,\n transform: (metadataNode, props) =>\n renderIntlayerNode({\n ...props,\n value: metadataNode,\n children: (\n <ContentSelectorRenderer {...rest}>\n <MarkdownMetadataRenderer\n {...rest}\n metadataKeyPath={props.keyPath}\n >\n {node}\n </MarkdownMetadataRenderer>\n </ContentSelectorRenderer>\n ),\n }),\n };\n\n // Transform metadata while keeping the same structure\n const metadataNodes = deepTransformNode(metadata, {\n plugins: [metadataPlugins],\n dictionaryKey: rest.dictionaryKey,\n keyPath: [],\n });\n\n const render = (components?: any) =>\n renderIntlayerNode({\n ...props,\n value: node,\n children: (\n <ContentSelectorRenderer {...rest}>\n <MarkdownRendererPlugin {...rest} {...components}>\n {node}\n </MarkdownRendererPlugin>\n </ContentSelectorRenderer>\n ),\n additionalProps: {\n metadata: metadataNodes,\n },\n });\n\n const element = render() as ReactElement;\n\n return new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return node;\n }\n if (prop === 'metadata') {\n return metadataNodes;\n }\n\n if (prop === 'use') {\n return (components?: any) => render(components);\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n },\n};\n\ntype MarkdownComponentMap = Record<string, ComponentType<any> | ElementType>;\n\nexport type MarkdownCond<T, S, L extends LocalesValues> = T extends {\n nodeType: NodeType | string;\n [NodeType.Markdown]: infer M;\n metadata?: infer U;\n}\n ? {\n use: (components?: MarkdownComponentMap) => ReactNode;\n metadata: DeepTransformContent<U, L>;\n } & any\n : never;\n\nexport const markdownPlugin: Plugins = {\n id: 'markdown-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeType.Markdown,\n transform: (node: MarkdownContent, props, deepTransformNode) => {\n const newKeyPath: KeyPath[] = [\n ...props.keyPath,\n {\n type: NodeType.Markdown,\n },\n ];\n\n const children = node[NodeType.Markdown];\n\n return deepTransformNode(children, {\n ...props,\n children,\n keyPath: newKeyPath,\n plugins: [markdownStringPlugin, ...(props.plugins ?? [])],\n });\n },\n};\n\n/** ---------------------------------------------\n * HTML PLUGIN\n * --------------------------------------------- */\n\nexport type HTMLPluginCond<T, S, L> = HTMLCond<T, S, L>;\n\n/** HTML plugin. Replaces node with a function that takes components => ReactNode. */\nexport const htmlPlugin: Plugins = {\n id: 'html-plugin',\n canHandle: (node) =>\n typeof node === 'object' && node?.nodeType === NodeType.HTML,\n\n transform: (node: HTMLContent<string>, props) => {\n const html = node[NodeType.HTML];\n const tags = node.tags ?? [];\n const { plugins, ...rest } = props;\n\n // Type-safe render function that accepts properly typed components\n const render = <\n T = typeof tags extends readonly (infer U extends string)[]\n ? U\n : typeof tags,\n >(\n userComponents?: ReactHTMLComponentMap<T>\n ): ReactNode =>\n createElement(HTMLRendererPlugin, { ...rest, html, userComponents });\n\n const element = render() as ReactElement;\n\n return new Proxy(element, {\n get(target, prop, receiver) {\n if (prop === 'value') {\n return html;\n }\n\n if (prop === 'use') {\n // Return a properly typed function based on custom components\n return <\n T = typeof tags extends readonly (infer U extends string)[]\n ? U\n : typeof tags,\n >(\n userComponents?: ReactHTMLComponentMap<T>\n ) => render(userComponents);\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }) as any;\n },\n};\n\n/** ---------------------------------------------\n * PLUGINS RESULT\n * --------------------------------------------- */\n\nexport interface IInterpreterPluginReact<T, S, L extends LocalesValues> {\n reactNode: ReactNodeCond<T>;\n reactIntlayerNode: IntlayerNodeCond<T>;\n reactInsertion: InsertionCond<T, S, L>;\n reactMarkdown: MarkdownCond<T, S, L>;\n reactHtml: HTMLPluginCond<T, S, L>;\n}\n\n/**\n * Insert this type as param of `DeepTransformContent` to avoid `intlayer` package pollution.\n *\n * Otherwise the the `react-intlayer` plugins will override the types of `intlayer` functions.\n */\nexport type IInterpreterPluginState = IInterpreterPluginStateCore & {\n reactNode: true;\n reactIntlayerNode: true;\n reactInsertion: true;\n reactMarkdown: true;\n reactHtml: true;\n};\n\nexport type DeepTransformContent<\n T,\n L extends LocalesValues = DeclaredLocales,\n> = DeepTransformContentCore<T, IInterpreterPluginState, L>;\n"],"mappings":"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"}