@pyreon/document 0.10.0 → 0.11.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 (76) hide show
  1. package/lib/analysis/index.js.html +1 -1
  2. package/lib/confluence-Bd3ua1Ut.js.map +1 -1
  3. package/lib/csv-COrS4qdy.js.map +1 -1
  4. package/lib/discord-BLUnkEh9.js.map +1 -1
  5. package/lib/{dist-BsqdI2nY.js → dist-CYL41kqQ.js} +2 -2
  6. package/lib/dist-CYL41kqQ.js.map +1 -0
  7. package/lib/{docx-BEBOihjl.js → docx-uNAel545.js} +7 -2
  8. package/lib/docx-uNAel545.js.map +1 -0
  9. package/lib/email-D0bbfWq4.js.map +1 -1
  10. package/lib/{exceljs-BoIDUUaw.js → exceljs-BYETsesT.js} +314 -314
  11. package/lib/exceljs-BYETsesT.js.map +1 -0
  12. package/lib/google-chat-CkKCBUWC.js.map +1 -1
  13. package/lib/html-B5biprN2.js.map +1 -1
  14. package/lib/index.js +17 -8
  15. package/lib/index.js.map +1 -1
  16. package/lib/markdown-CdtlFGC0.js.map +1 -1
  17. package/lib/notion-iG2C5bEY.js.map +1 -1
  18. package/lib/{pdf-DIUQUEdj.js → pdf-IuBgTb3T.js} +9 -3
  19. package/lib/pdf-IuBgTb3T.js.map +1 -0
  20. package/lib/{pdfmake-DnmLxK4Q.js → pdfmake-CKMX5URW.js} +2 -4
  21. package/lib/pdfmake-CKMX5URW.js.map +1 -0
  22. package/lib/{pptx-Dd33oL3_.js → pptx-DXiMiYFM.js} +7 -2
  23. package/lib/pptx-DXiMiYFM.js.map +1 -0
  24. package/lib/{pptxgen.es-COcgXsyx.js → pptxgen.es-FsqHs8mD.js} +3 -6
  25. package/lib/pptxgen.es-FsqHs8mD.js.map +1 -0
  26. package/lib/sanitize-O_3j1mNJ.js.map +1 -1
  27. package/lib/slack-BI3EQwYm.js.map +1 -1
  28. package/lib/svg-BKxumy-p.js.map +1 -1
  29. package/lib/teams-Cwz9lce0.js.map +1 -1
  30. package/lib/telegram-gYFqyMXb.js.map +1 -1
  31. package/lib/text-l1XNXBOC.js.map +1 -1
  32. package/lib/types/index.d.ts +43 -39
  33. package/lib/types/index.d.ts.map +1 -1
  34. package/lib/{vfs_fonts-Df1kkZ4Y.js → vfs_fonts-Cap07Jg3.js} +2 -2
  35. package/lib/vfs_fonts-Cap07Jg3.js.map +1 -0
  36. package/lib/whatsapp-CjSGoOKx.js.map +1 -1
  37. package/lib/{xlsx-Bb5TWyXQ.js → xlsx-Cvu4LBNy.js} +8 -2
  38. package/lib/xlsx-Cvu4LBNy.js.map +1 -0
  39. package/package.json +19 -7
  40. package/src/builder.ts +53 -44
  41. package/src/download.ts +32 -36
  42. package/src/env.d.ts +3 -17
  43. package/src/index.ts +6 -8
  44. package/src/nodes.ts +45 -45
  45. package/src/render.ts +45 -118
  46. package/src/renderers/confluence.ts +64 -80
  47. package/src/renderers/csv.ts +11 -18
  48. package/src/renderers/discord.ts +38 -50
  49. package/src/renderers/docx.ts +78 -120
  50. package/src/renderers/email.ts +73 -92
  51. package/src/renderers/google-chat.ts +35 -47
  52. package/src/renderers/html.ts +78 -101
  53. package/src/renderers/markdown.ts +43 -53
  54. package/src/renderers/notion.ts +63 -85
  55. package/src/renderers/pdf.ts +92 -115
  56. package/src/renderers/pptx.ts +60 -66
  57. package/src/renderers/slack.ts +49 -61
  58. package/src/renderers/svg.ts +49 -63
  59. package/src/renderers/teams.ts +68 -80
  60. package/src/renderers/telegram.ts +40 -54
  61. package/src/renderers/text.ts +44 -66
  62. package/src/renderers/whatsapp.ts +34 -48
  63. package/src/renderers/xlsx.ts +47 -61
  64. package/src/sanitize.ts +21 -25
  65. package/src/tests/document.test.ts +1337 -1385
  66. package/src/tests/stress.test.ts +111 -111
  67. package/src/types.ts +66 -65
  68. package/lib/dist-BsqdI2nY.js.map +0 -1
  69. package/lib/docx-BEBOihjl.js.map +0 -1
  70. package/lib/exceljs-BoIDUUaw.js.map +0 -1
  71. package/lib/pdf-DIUQUEdj.js.map +0 -1
  72. package/lib/pdfmake-DnmLxK4Q.js.map +0 -1
  73. package/lib/pptx-Dd33oL3_.js.map +0 -1
  74. package/lib/pptxgen.es-COcgXsyx.js.map +0 -1
  75. package/lib/vfs_fonts-Df1kkZ4Y.js.map +0 -1
  76. package/lib/xlsx-Bb5TWyXQ.js.map +0 -1
package/src/nodes.ts CHANGED
@@ -19,7 +19,7 @@ import type {
19
19
  SpacerProps,
20
20
  TableProps,
21
21
  TextProps,
22
- } from './types'
22
+ } from "./types"
23
23
 
24
24
  // ─── Node Constructor ───────────────────────────────────────────────────────
25
25
 
@@ -33,13 +33,13 @@ function createNode(type: NodeType, props: object, children: unknown): DocNode {
33
33
 
34
34
  function normalizeChildren(children: unknown): DocChild[] {
35
35
  if (children == null || children === false) return []
36
- if (typeof children === 'string') return [children]
37
- if (typeof children === 'number') return [String(children)]
36
+ if (typeof children === "string") return [children]
37
+ if (typeof children === "number") return [String(children)]
38
38
  if (Array.isArray(children)) return children.flatMap(normalizeChildren)
39
39
  if (isDocNode(children)) return [children]
40
- if (typeof children === 'object') {
40
+ if (typeof children === "object") {
41
41
  throw new Error(
42
- '[@pyreon/document] Invalid child: plain objects are not valid document children. Use a document node (Text, Heading, etc.) instead.',
42
+ "[@pyreon/document] Invalid child: plain objects are not valid document children. Use a document node (Text, Heading, etc.) instead.",
43
43
  )
44
44
  }
45
45
  return [String(children)]
@@ -48,11 +48,11 @@ function normalizeChildren(children: unknown): DocChild[] {
48
48
  /** Type guard — checks if a value is a DocNode. */
49
49
  export function isDocNode(value: unknown): value is DocNode {
50
50
  return (
51
- typeof value === 'object' &&
51
+ typeof value === "object" &&
52
52
  value !== null &&
53
- 'type' in value &&
54
- 'props' in value &&
55
- 'children' in value
53
+ "type" in value &&
54
+ "props" in value &&
55
+ "children" in value
56
56
  )
57
57
  }
58
58
 
@@ -70,9 +70,9 @@ export function isDocNode(value: unknown): value is DocNode {
70
70
  */
71
71
  export function Document(props: DocumentProps): DocNode {
72
72
  const { children, ...rest } = props
73
- return createNode('document', rest, children)
73
+ return createNode("document", rest, children)
74
74
  }
75
- Document._documentType = 'document' as const
75
+ Document._documentType = "document" as const
76
76
 
77
77
  /**
78
78
  * Page container. Maps to a PDF page, DOCX section, or email block.
@@ -86,9 +86,9 @@ Document._documentType = 'document' as const
86
86
  */
87
87
  export function Page(props: PageProps): DocNode {
88
88
  const { children, ...rest } = props
89
- return createNode('page', rest, children)
89
+ return createNode("page", rest, children)
90
90
  }
91
- Page._documentType = 'page' as const
91
+ Page._documentType = "page" as const
92
92
 
93
93
  /**
94
94
  * Layout section — groups content with optional direction, padding, background.
@@ -103,9 +103,9 @@ Page._documentType = 'page' as const
103
103
  */
104
104
  export function Section(props: SectionProps): DocNode {
105
105
  const { children, ...rest } = props
106
- return createNode('section', rest, children)
106
+ return createNode("section", rest, children)
107
107
  }
108
- Section._documentType = 'section' as const
108
+ Section._documentType = "section" as const
109
109
 
110
110
  /**
111
111
  * Horizontal layout container.
@@ -120,18 +120,18 @@ Section._documentType = 'section' as const
120
120
  */
121
121
  export function Row(props: RowProps): DocNode {
122
122
  const { children, ...rest } = props
123
- return createNode('row', rest, children)
123
+ return createNode("row", rest, children)
124
124
  }
125
- Row._documentType = 'row' as const
125
+ Row._documentType = "row" as const
126
126
 
127
127
  /**
128
128
  * Column within a Row.
129
129
  */
130
130
  export function Column(props: ColumnProps): DocNode {
131
131
  const { children, ...rest } = props
132
- return createNode('column', rest, children)
132
+ return createNode("column", rest, children)
133
133
  }
134
- Column._documentType = 'column' as const
134
+ Column._documentType = "column" as const
135
135
 
136
136
  /**
137
137
  * Heading text (h1–h6).
@@ -144,9 +144,9 @@ Column._documentType = 'column' as const
144
144
  */
145
145
  export function Heading(props: HeadingProps): DocNode {
146
146
  const { children, ...rest } = props
147
- return createNode('heading', { level: 1, ...rest }, children)
147
+ return createNode("heading", { level: 1, ...rest }, children)
148
148
  }
149
- Heading._documentType = 'heading' as const
149
+ Heading._documentType = "heading" as const
150
150
 
151
151
  /**
152
152
  * Text paragraph with optional formatting.
@@ -159,9 +159,9 @@ Heading._documentType = 'heading' as const
159
159
  */
160
160
  export function Text(props: TextProps): DocNode {
161
161
  const { children, ...rest } = props
162
- return createNode('text', rest, children)
162
+ return createNode("text", rest, children)
163
163
  }
164
- Text._documentType = 'text' as const
164
+ Text._documentType = "text" as const
165
165
 
166
166
  /**
167
167
  * Hyperlink.
@@ -173,9 +173,9 @@ Text._documentType = 'text' as const
173
173
  */
174
174
  export function Link(props: LinkProps): DocNode {
175
175
  const { children, ...rest } = props
176
- return createNode('link', rest, children)
176
+ return createNode("link", rest, children)
177
177
  }
178
- Link._documentType = 'link' as const
178
+ Link._documentType = "link" as const
179
179
 
180
180
  /**
181
181
  * Image with optional sizing and caption.
@@ -187,9 +187,9 @@ Link._documentType = 'link' as const
187
187
  * ```
188
188
  */
189
189
  export function Image(props: ImageProps): DocNode {
190
- return createNode('image', props, [])
190
+ return createNode("image", props, [])
191
191
  }
192
- Image._documentType = 'image' as const
192
+ Image._documentType = "image" as const
193
193
 
194
194
  /**
195
195
  * Data table with columns and rows.
@@ -205,9 +205,9 @@ Image._documentType = 'image' as const
205
205
  * ```
206
206
  */
207
207
  export function Table(props: TableProps): DocNode {
208
- return createNode('table', props, [])
208
+ return createNode("table", props, [])
209
209
  }
210
- Table._documentType = 'table' as const
210
+ Table._documentType = "table" as const
211
211
 
212
212
  /**
213
213
  * Ordered or unordered list.
@@ -222,18 +222,18 @@ Table._documentType = 'table' as const
222
222
  */
223
223
  export function List(props: ListProps): DocNode {
224
224
  const { children, ...rest } = props
225
- return createNode('list', rest, children)
225
+ return createNode("list", rest, children)
226
226
  }
227
- List._documentType = 'list' as const
227
+ List._documentType = "list" as const
228
228
 
229
229
  /**
230
230
  * Single list item within a List.
231
231
  */
232
232
  export function ListItem(props: ListItemProps): DocNode {
233
233
  const { children } = props
234
- return createNode('list-item', {}, children)
234
+ return createNode("list-item", {}, children)
235
235
  }
236
- ListItem._documentType = 'list-item' as const
236
+ ListItem._documentType = "list-item" as const
237
237
 
238
238
  /**
239
239
  * Code block with optional language hint.
@@ -245,9 +245,9 @@ ListItem._documentType = 'list-item' as const
245
245
  */
246
246
  export function Code(props: CodeProps): DocNode {
247
247
  const { children, ...rest } = props
248
- return createNode('code', rest, children)
248
+ return createNode("code", rest, children)
249
249
  }
250
- Code._documentType = 'code' as const
250
+ Code._documentType = "code" as const
251
251
 
252
252
  /**
253
253
  * Horizontal divider line.
@@ -258,9 +258,9 @@ Code._documentType = 'code' as const
258
258
  * ```
259
259
  */
260
260
  export function Divider(props: DividerProps = {}): DocNode {
261
- return createNode('divider', props, [])
261
+ return createNode("divider", props, [])
262
262
  }
263
- Divider._documentType = 'divider' as const
263
+ Divider._documentType = "divider" as const
264
264
 
265
265
  /**
266
266
  * Page break — forces content after this point to the next page (PDF/DOCX)
@@ -272,9 +272,9 @@ Divider._documentType = 'divider' as const
272
272
  * ```
273
273
  */
274
274
  export function PageBreak(): DocNode {
275
- return createNode('page-break', {}, [])
275
+ return createNode("page-break", {}, [])
276
276
  }
277
- PageBreak._documentType = 'page-break' as const
277
+ PageBreak._documentType = "page-break" as const
278
278
 
279
279
  /**
280
280
  * Vertical spacer.
@@ -285,9 +285,9 @@ PageBreak._documentType = 'page-break' as const
285
285
  * ```
286
286
  */
287
287
  export function Spacer(props: SpacerProps): DocNode {
288
- return createNode('spacer', props, [])
288
+ return createNode("spacer", props, [])
289
289
  }
290
- Spacer._documentType = 'spacer' as const
290
+ Spacer._documentType = "spacer" as const
291
291
 
292
292
  /**
293
293
  * CTA button — renders as a bulletproof button in email, styled link in PDF/DOCX.
@@ -301,9 +301,9 @@ Spacer._documentType = 'spacer' as const
301
301
  */
302
302
  export function Button(props: ButtonProps): DocNode {
303
303
  const { children, ...rest } = props
304
- return createNode('button', rest, children)
304
+ return createNode("button", rest, children)
305
305
  }
306
- Button._documentType = 'button' as const
306
+ Button._documentType = "button" as const
307
307
 
308
308
  /**
309
309
  * Block quote.
@@ -315,6 +315,6 @@ Button._documentType = 'button' as const
315
315
  */
316
316
  export function Quote(props: QuoteProps): DocNode {
317
317
  const { children, ...rest } = props
318
- return createNode('quote', rest, children)
318
+ return createNode("quote", rest, children)
319
319
  }
320
- Quote._documentType = 'quote' as const
320
+ Quote._documentType = "quote" as const
package/src/render.ts CHANGED
@@ -1,17 +1,8 @@
1
- import type {
2
- DocNode,
3
- DocumentRenderer,
4
- OutputFormat,
5
- RenderOptions,
6
- RenderResult,
7
- } from './types'
1
+ import type { DocNode, DocumentRenderer, OutputFormat, RenderOptions, RenderResult } from "./types"
8
2
 
9
3
  // ─── Renderer Registry ──────────────────────────────────────────────────────
10
4
 
11
- const renderers = new Map<
12
- string,
13
- DocumentRenderer | (() => Promise<DocumentRenderer>)
14
- >()
5
+ const renderers = new Map<string, DocumentRenderer | (() => Promise<DocumentRenderer>)>()
15
6
 
16
7
  /**
17
8
  * Register a custom renderer for a format.
@@ -46,76 +37,44 @@ export function unregisterRenderer(format: string): void {
46
37
 
47
38
  // Built-in renderers are registered lazily — only loaded when first used.
48
39
 
49
- registerRenderer('html', () =>
50
- import('./renderers/html').then((m) => m.htmlRenderer),
51
- )
40
+ registerRenderer("html", () => import("./renderers/html").then((m) => m.htmlRenderer))
52
41
 
53
- registerRenderer('email', () =>
54
- import('./renderers/email').then((m) => m.emailRenderer),
55
- )
42
+ registerRenderer("email", () => import("./renderers/email").then((m) => m.emailRenderer))
56
43
 
57
- registerRenderer('md', () =>
58
- import('./renderers/markdown').then((m) => m.markdownRenderer),
59
- )
44
+ registerRenderer("md", () => import("./renderers/markdown").then((m) => m.markdownRenderer))
60
45
 
61
- registerRenderer('text', () =>
62
- import('./renderers/text').then((m) => m.textRenderer),
63
- )
46
+ registerRenderer("text", () => import("./renderers/text").then((m) => m.textRenderer))
64
47
 
65
- registerRenderer('csv', () =>
66
- import('./renderers/csv').then((m) => m.csvRenderer),
67
- )
48
+ registerRenderer("csv", () => import("./renderers/csv").then((m) => m.csvRenderer))
68
49
 
69
- registerRenderer('pdf', () =>
70
- import('./renderers/pdf').then((m) => m.pdfRenderer),
71
- )
50
+ registerRenderer("pdf", () => import("./renderers/pdf").then((m) => m.pdfRenderer))
72
51
 
73
- registerRenderer('docx', () =>
74
- import('./renderers/docx').then((m) => m.docxRenderer),
75
- )
52
+ registerRenderer("docx", () => import("./renderers/docx").then((m) => m.docxRenderer))
76
53
 
77
- registerRenderer('xlsx', () =>
78
- import('./renderers/xlsx').then((m) => m.xlsxRenderer),
79
- )
54
+ registerRenderer("xlsx", () => import("./renderers/xlsx").then((m) => m.xlsxRenderer))
80
55
 
81
- registerRenderer('pptx', () =>
82
- import('./renderers/pptx').then((m) => m.pptxRenderer),
83
- )
56
+ registerRenderer("pptx", () => import("./renderers/pptx").then((m) => m.pptxRenderer))
84
57
 
85
- registerRenderer('slack', () =>
86
- import('./renderers/slack').then((m) => m.slackRenderer),
87
- )
58
+ registerRenderer("slack", () => import("./renderers/slack").then((m) => m.slackRenderer))
88
59
 
89
- registerRenderer('svg', () =>
90
- import('./renderers/svg').then((m) => m.svgRenderer),
91
- )
60
+ registerRenderer("svg", () => import("./renderers/svg").then((m) => m.svgRenderer))
92
61
 
93
- registerRenderer('teams', () =>
94
- import('./renderers/teams').then((m) => m.teamsRenderer),
95
- )
62
+ registerRenderer("teams", () => import("./renderers/teams").then((m) => m.teamsRenderer))
96
63
 
97
- registerRenderer('discord', () =>
98
- import('./renderers/discord').then((m) => m.discordRenderer),
99
- )
64
+ registerRenderer("discord", () => import("./renderers/discord").then((m) => m.discordRenderer))
100
65
 
101
- registerRenderer('telegram', () =>
102
- import('./renderers/telegram').then((m) => m.telegramRenderer),
103
- )
66
+ registerRenderer("telegram", () => import("./renderers/telegram").then((m) => m.telegramRenderer))
104
67
 
105
- registerRenderer('notion', () =>
106
- import('./renderers/notion').then((m) => m.notionRenderer),
107
- )
68
+ registerRenderer("notion", () => import("./renderers/notion").then((m) => m.notionRenderer))
108
69
 
109
- registerRenderer('confluence', () =>
110
- import('./renderers/confluence').then((m) => m.confluenceRenderer),
70
+ registerRenderer("confluence", () =>
71
+ import("./renderers/confluence").then((m) => m.confluenceRenderer),
111
72
  )
112
73
 
113
- registerRenderer('whatsapp', () =>
114
- import('./renderers/whatsapp').then((m) => m.whatsappRenderer),
115
- )
74
+ registerRenderer("whatsapp", () => import("./renderers/whatsapp").then((m) => m.whatsappRenderer))
116
75
 
117
- registerRenderer('google-chat', () =>
118
- import('./renderers/google-chat').then((m) => m.googleChatRenderer),
76
+ registerRenderer("google-chat", () =>
77
+ import("./renderers/google-chat").then((m) => m.googleChatRenderer),
119
78
  )
120
79
 
121
80
  // ─── Render Function ────────────────────────────────────────────────────────
@@ -124,11 +83,11 @@ async function resolveRenderer(format: string): Promise<DocumentRenderer> {
124
83
  const entry = renderers.get(format)
125
84
  if (!entry) {
126
85
  throw new Error(
127
- `[@pyreon/document] No renderer registered for format '${format}'. Available: ${[...renderers.keys()].join(', ')}`,
86
+ `[@pyreon/document] No renderer registered for format '${format}'. Available: ${[...renderers.keys()].join(", ")}`,
128
87
  )
129
88
  }
130
89
 
131
- if (typeof entry === 'function') {
90
+ if (typeof entry === "function") {
132
91
  const renderer = await entry()
133
92
  // Cache the resolved renderer so we don't re-import
134
93
  renderers.set(format, renderer)
@@ -165,58 +124,26 @@ export async function render(
165
124
  export function _resetRenderers(): void {
166
125
  renderers.clear()
167
126
  // Re-register built-in lazy loaders
168
- registerRenderer('html', () =>
169
- import('./renderers/html').then((m) => m.htmlRenderer),
170
- )
171
- registerRenderer('email', () =>
172
- import('./renderers/email').then((m) => m.emailRenderer),
173
- )
174
- registerRenderer('md', () =>
175
- import('./renderers/markdown').then((m) => m.markdownRenderer),
176
- )
177
- registerRenderer('text', () =>
178
- import('./renderers/text').then((m) => m.textRenderer),
179
- )
180
- registerRenderer('csv', () =>
181
- import('./renderers/csv').then((m) => m.csvRenderer),
182
- )
183
- registerRenderer('pdf', () =>
184
- import('./renderers/pdf').then((m) => m.pdfRenderer),
185
- )
186
- registerRenderer('docx', () =>
187
- import('./renderers/docx').then((m) => m.docxRenderer),
188
- )
189
- registerRenderer('xlsx', () =>
190
- import('./renderers/xlsx').then((m) => m.xlsxRenderer),
191
- )
192
- registerRenderer('pptx', () =>
193
- import('./renderers/pptx').then((m) => m.pptxRenderer),
194
- )
195
- registerRenderer('slack', () =>
196
- import('./renderers/slack').then((m) => m.slackRenderer),
197
- )
198
- registerRenderer('svg', () =>
199
- import('./renderers/svg').then((m) => m.svgRenderer),
200
- )
201
- registerRenderer('teams', () =>
202
- import('./renderers/teams').then((m) => m.teamsRenderer),
203
- )
204
- registerRenderer('discord', () =>
205
- import('./renderers/discord').then((m) => m.discordRenderer),
206
- )
207
- registerRenderer('telegram', () =>
208
- import('./renderers/telegram').then((m) => m.telegramRenderer),
209
- )
210
- registerRenderer('notion', () =>
211
- import('./renderers/notion').then((m) => m.notionRenderer),
212
- )
213
- registerRenderer('confluence', () =>
214
- import('./renderers/confluence').then((m) => m.confluenceRenderer),
215
- )
216
- registerRenderer('whatsapp', () =>
217
- import('./renderers/whatsapp').then((m) => m.whatsappRenderer),
218
- )
219
- registerRenderer('google-chat', () =>
220
- import('./renderers/google-chat').then((m) => m.googleChatRenderer),
127
+ registerRenderer("html", () => import("./renderers/html").then((m) => m.htmlRenderer))
128
+ registerRenderer("email", () => import("./renderers/email").then((m) => m.emailRenderer))
129
+ registerRenderer("md", () => import("./renderers/markdown").then((m) => m.markdownRenderer))
130
+ registerRenderer("text", () => import("./renderers/text").then((m) => m.textRenderer))
131
+ registerRenderer("csv", () => import("./renderers/csv").then((m) => m.csvRenderer))
132
+ registerRenderer("pdf", () => import("./renderers/pdf").then((m) => m.pdfRenderer))
133
+ registerRenderer("docx", () => import("./renderers/docx").then((m) => m.docxRenderer))
134
+ registerRenderer("xlsx", () => import("./renderers/xlsx").then((m) => m.xlsxRenderer))
135
+ registerRenderer("pptx", () => import("./renderers/pptx").then((m) => m.pptxRenderer))
136
+ registerRenderer("slack", () => import("./renderers/slack").then((m) => m.slackRenderer))
137
+ registerRenderer("svg", () => import("./renderers/svg").then((m) => m.svgRenderer))
138
+ registerRenderer("teams", () => import("./renderers/teams").then((m) => m.teamsRenderer))
139
+ registerRenderer("discord", () => import("./renderers/discord").then((m) => m.discordRenderer))
140
+ registerRenderer("telegram", () => import("./renderers/telegram").then((m) => m.telegramRenderer))
141
+ registerRenderer("notion", () => import("./renderers/notion").then((m) => m.notionRenderer))
142
+ registerRenderer("confluence", () =>
143
+ import("./renderers/confluence").then((m) => m.confluenceRenderer),
144
+ )
145
+ registerRenderer("whatsapp", () => import("./renderers/whatsapp").then((m) => m.whatsappRenderer))
146
+ registerRenderer("google-chat", () =>
147
+ import("./renderers/google-chat").then((m) => m.googleChatRenderer),
221
148
  )
222
149
  }