@pyreon/document 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/lib/analysis/index.js.html +5406 -0
  3. package/lib/chunk-ErZ26oRB.js +48 -0
  4. package/lib/confluence-Va8e7RxQ.js +192 -0
  5. package/lib/confluence-Va8e7RxQ.js.map +1 -0
  6. package/lib/csv-2c38ub-Y.js +32 -0
  7. package/lib/csv-2c38ub-Y.js.map +1 -0
  8. package/lib/discord-DAoUZqvE.js +134 -0
  9. package/lib/discord-DAoUZqvE.js.map +1 -0
  10. package/lib/dist-BsqdI2nY.js +20179 -0
  11. package/lib/dist-BsqdI2nY.js.map +1 -0
  12. package/lib/docx-CorFwEH9.js +450 -0
  13. package/lib/docx-CorFwEH9.js.map +1 -0
  14. package/lib/email-Bn_Brjdp.js +131 -0
  15. package/lib/email-Bn_Brjdp.js.map +1 -0
  16. package/lib/exceljs-BoIDUUaw.js +34377 -0
  17. package/lib/exceljs-BoIDUUaw.js.map +1 -0
  18. package/lib/google-chat-B6I017I1.js +125 -0
  19. package/lib/google-chat-B6I017I1.js.map +1 -0
  20. package/lib/html-De_iS_f0.js +151 -0
  21. package/lib/html-De_iS_f0.js.map +1 -0
  22. package/lib/index.js +619 -0
  23. package/lib/index.js.map +1 -0
  24. package/lib/markdown-BYC_3C9i.js +75 -0
  25. package/lib/markdown-BYC_3C9i.js.map +1 -0
  26. package/lib/notion-DHaQHO6P.js +187 -0
  27. package/lib/notion-DHaQHO6P.js.map +1 -0
  28. package/lib/pdf-CDPc5Itc.js +419 -0
  29. package/lib/pdf-CDPc5Itc.js.map +1 -0
  30. package/lib/pdfmake-DnmLxK4Q.js +55511 -0
  31. package/lib/pdfmake-DnmLxK4Q.js.map +1 -0
  32. package/lib/pptx-DKQU6bjq.js +252 -0
  33. package/lib/pptx-DKQU6bjq.js.map +1 -0
  34. package/lib/pptxgen.es-COcgXsyx.js +5697 -0
  35. package/lib/pptxgen.es-COcgXsyx.js.map +1 -0
  36. package/lib/slack-CJRJgkag.js +139 -0
  37. package/lib/slack-CJRJgkag.js.map +1 -0
  38. package/lib/svg-BM8biZmL.js +187 -0
  39. package/lib/svg-BM8biZmL.js.map +1 -0
  40. package/lib/teams-S99tonRG.js +176 -0
  41. package/lib/teams-S99tonRG.js.map +1 -0
  42. package/lib/telegram-CbEO_2PN.js +77 -0
  43. package/lib/telegram-CbEO_2PN.js.map +1 -0
  44. package/lib/text-B5U8ucRr.js +75 -0
  45. package/lib/text-B5U8ucRr.js.map +1 -0
  46. package/lib/types/index.d.ts +528 -0
  47. package/lib/types/index.d.ts.map +1 -0
  48. package/lib/vfs_fonts-Df1kkZ4Y.js +19 -0
  49. package/lib/vfs_fonts-Df1kkZ4Y.js.map +1 -0
  50. package/lib/whatsapp-DJ2D1jGG.js +64 -0
  51. package/lib/whatsapp-DJ2D1jGG.js.map +1 -0
  52. package/lib/xlsx-D47x-gZ5.js +199 -0
  53. package/lib/xlsx-D47x-gZ5.js.map +1 -0
  54. package/package.json +62 -0
  55. package/src/builder.ts +266 -0
  56. package/src/download.ts +76 -0
  57. package/src/env.d.ts +17 -0
  58. package/src/index.ts +98 -0
  59. package/src/nodes.ts +315 -0
  60. package/src/render.ts +222 -0
  61. package/src/renderers/confluence.ts +231 -0
  62. package/src/renderers/csv.ts +67 -0
  63. package/src/renderers/discord.ts +192 -0
  64. package/src/renderers/docx.ts +612 -0
  65. package/src/renderers/email.ts +230 -0
  66. package/src/renderers/google-chat.ts +211 -0
  67. package/src/renderers/html.ts +225 -0
  68. package/src/renderers/markdown.ts +144 -0
  69. package/src/renderers/notion.ts +264 -0
  70. package/src/renderers/pdf.ts +427 -0
  71. package/src/renderers/pptx.ts +353 -0
  72. package/src/renderers/slack.ts +192 -0
  73. package/src/renderers/svg.ts +254 -0
  74. package/src/renderers/teams.ts +234 -0
  75. package/src/renderers/telegram.ts +137 -0
  76. package/src/renderers/text.ts +154 -0
  77. package/src/renderers/whatsapp.ts +121 -0
  78. package/src/renderers/xlsx.ts +342 -0
  79. package/src/tests/document.test.ts +2920 -0
  80. package/src/types.ts +291 -0
@@ -0,0 +1,75 @@
1
+ //#region src/renderers/markdown.ts
2
+ function resolveColumn(col) {
3
+ return typeof col === "string" ? { header: col } : col;
4
+ }
5
+ function renderChild(child) {
6
+ if (typeof child === "string") return child;
7
+ return renderNode(child);
8
+ }
9
+ function renderChildren(children) {
10
+ return children.map(renderChild).join("");
11
+ }
12
+ function renderInline(children) {
13
+ return children.map(renderChild).join("");
14
+ }
15
+ function renderNode(node) {
16
+ const p = node.props;
17
+ switch (node.type) {
18
+ case "document": return renderChildren(node.children);
19
+ case "page": return renderChildren(node.children);
20
+ case "section": return `${renderChildren(node.children)}\n`;
21
+ case "row":
22
+ case "column": return renderChildren(node.children);
23
+ case "heading": {
24
+ const level = p.level ?? 1;
25
+ return `${"#".repeat(Math.min(Math.max(level, 1), 6))} ${renderInline(node.children)}\n\n`;
26
+ }
27
+ case "text": {
28
+ let text = renderInline(node.children);
29
+ if (p.bold) text = `**${text}**`;
30
+ if (p.italic) text = `*${text}*`;
31
+ if (p.strikethrough) text = `~~${text}~~`;
32
+ return `${text}\n\n`;
33
+ }
34
+ case "link": return `[${renderInline(node.children)}](${p.href})`;
35
+ case "image": {
36
+ let md = `![${p.alt ?? ""}](${p.src})`;
37
+ if (p.caption) md += `\n*${p.caption}*`;
38
+ return `${md}\n\n`;
39
+ }
40
+ case "table": {
41
+ const columns = (p.columns ?? []).map(resolveColumn);
42
+ const rows = p.rows ?? [];
43
+ if (columns.length === 0) return "";
44
+ let md = `${`| ${columns.map((c) => c.header).join(" | ")} |`}\n${`| ${columns.map((c) => {
45
+ const align = c.align ?? "left";
46
+ if (align === "center") return ":---:";
47
+ if (align === "right") return "---:";
48
+ return "---";
49
+ }).join(" | ")} |`}\n${rows.map((row) => `| ${row.map((cell) => String(cell ?? "")).join(" | ")} |`).join("\n")}\n\n`;
50
+ if (p.caption) md = `*${p.caption}*\n\n${md}`;
51
+ return md;
52
+ }
53
+ case "list": {
54
+ const ordered = p.ordered;
55
+ return `${node.children.filter((c) => typeof c !== "string").map((item, i) => {
56
+ return `${ordered ? `${i + 1}.` : "-"} ${renderInline(item.children)}`;
57
+ }).join("\n")}\n\n`;
58
+ }
59
+ case "list-item": return renderInline(node.children);
60
+ case "code": return `\`\`\`${p.language ?? ""}\n${renderInline(node.children)}\n\`\`\`\n\n`;
61
+ case "divider": return "---\n\n";
62
+ case "page-break": return "---\n\n";
63
+ case "spacer": return "\n";
64
+ case "button": return `[${renderInline(node.children)}](${p.href})\n\n`;
65
+ case "quote": return `> ${renderInline(node.children)}\n\n`;
66
+ default: return renderChildren(node.children);
67
+ }
68
+ }
69
+ const markdownRenderer = { async render(node, _options) {
70
+ return `${renderNode(node).trim()}\n`;
71
+ } };
72
+
73
+ //#endregion
74
+ export { markdownRenderer };
75
+ //# sourceMappingURL=markdown-BYC_3C9i.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-BYC_3C9i.js","names":[],"sources":["../src/renderers/markdown.ts"],"sourcesContent":["import type {\n DocChild,\n DocNode,\n DocumentRenderer,\n RenderOptions,\n TableColumn,\n} from '../types'\n\nfunction resolveColumn(col: string | TableColumn): TableColumn {\n return typeof col === 'string' ? { header: col } : col\n}\n\nfunction renderChild(child: DocChild): string {\n if (typeof child === 'string') return child\n return renderNode(child)\n}\n\nfunction renderChildren(children: DocChild[]): string {\n return children.map(renderChild).join('')\n}\n\nfunction renderInline(children: DocChild[]): string {\n return children.map(renderChild).join('')\n}\n\nfunction renderNode(node: DocNode): string {\n const p = node.props\n\n switch (node.type) {\n case 'document':\n return renderChildren(node.children)\n\n case 'page':\n return renderChildren(node.children)\n\n case 'section':\n return `${renderChildren(node.children)}\\n`\n\n case 'row':\n case 'column':\n return renderChildren(node.children)\n\n case 'heading': {\n const level = (p.level as number) ?? 1\n const prefix = '#'.repeat(Math.min(Math.max(level, 1), 6))\n return `${prefix} ${renderInline(node.children)}\\n\\n`\n }\n\n case 'text': {\n let text = renderInline(node.children)\n if (p.bold) text = `**${text}**`\n if (p.italic) text = `*${text}*`\n if (p.strikethrough) text = `~~${text}~~`\n return `${text}\\n\\n`\n }\n\n case 'link':\n return `[${renderInline(node.children)}](${p.href})`\n\n case 'image': {\n const alt = (p.alt as string) ?? ''\n let md = `![${alt}](${p.src})`\n if (p.caption) md += `\\n*${p.caption}*`\n return `${md}\\n\\n`\n }\n\n case 'table': {\n const columns = ((p.columns ?? []) as (string | TableColumn)[]).map(\n resolveColumn,\n )\n const rows = (p.rows ?? []) as (string | number)[][]\n\n if (columns.length === 0) return ''\n\n // Header\n const header = `| ${columns.map((c) => c.header).join(' | ')} |`\n\n // Separator with alignment\n const separator = `| ${columns\n .map((c) => {\n const align = c.align ?? 'left'\n if (align === 'center') return ':---:'\n if (align === 'right') return '---:'\n return '---'\n })\n .join(' | ')} |`\n\n // Rows\n const body = rows\n .map(\n (row) => `| ${row.map((cell) => String(cell ?? '')).join(' | ')} |`,\n )\n .join('\\n')\n\n let md = `${header}\\n${separator}\\n${body}\\n\\n`\n if (p.caption) md = `*${p.caption}*\\n\\n${md}`\n return md\n }\n\n case 'list': {\n const ordered = p.ordered as boolean | undefined\n return `${node.children\n .filter((c): c is DocNode => typeof c !== 'string')\n .map((item, i) => {\n const prefix = ordered ? `${i + 1}.` : '-'\n return `${prefix} ${renderInline(item.children)}`\n })\n .join('\\n')}\\n\\n`\n }\n\n case 'list-item':\n return renderInline(node.children)\n\n case 'code': {\n const lang = (p.language as string) ?? ''\n const content = renderInline(node.children)\n return `\\`\\`\\`${lang}\\n${content}\\n\\`\\`\\`\\n\\n`\n }\n\n case 'divider':\n return '---\\n\\n'\n\n case 'page-break':\n return '---\\n\\n'\n\n case 'spacer':\n return '\\n'\n\n case 'button':\n return `[${renderInline(node.children)}](${p.href})\\n\\n`\n\n case 'quote':\n return `> ${renderInline(node.children)}\\n\\n`\n\n default:\n return renderChildren(node.children)\n }\n}\n\nexport const markdownRenderer: DocumentRenderer = {\n async render(node: DocNode, _options?: RenderOptions): Promise<string> {\n return `${renderNode(node).trim()}\\n`\n },\n}\n"],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ //#region src/renderers/notion.ts
2
+ /**
3
+ * Notion renderer — outputs Notion Block JSON for the Notion API.
4
+ * Blocks can be appended to a page via `notion.blocks.children.append()`.
5
+ */
6
+ function resolveColumn(col) {
7
+ return typeof col === "string" ? { header: col } : col;
8
+ }
9
+ function getTextContent(children) {
10
+ return children.map((c) => typeof c === "string" ? c : getTextContent(c.children)).join("");
11
+ }
12
+ function textToRichText(text, annotations) {
13
+ return [{
14
+ type: "text",
15
+ text: { content: text },
16
+ ...annotations ? { annotations } : {}
17
+ }];
18
+ }
19
+ function nodeToBlocks(node) {
20
+ const p = node.props;
21
+ const blocks = [];
22
+ switch (node.type) {
23
+ case "document":
24
+ case "page":
25
+ case "section":
26
+ case "row":
27
+ case "column":
28
+ for (const child of node.children) if (typeof child !== "string") blocks.push(...nodeToBlocks(child));
29
+ break;
30
+ case "heading": {
31
+ const level = p.level ?? 1;
32
+ const text = getTextContent(node.children);
33
+ const type = level <= 1 ? "heading_1" : level === 2 ? "heading_2" : "heading_3";
34
+ blocks.push({
35
+ object: "block",
36
+ type,
37
+ [type]: { rich_text: textToRichText(text) }
38
+ });
39
+ break;
40
+ }
41
+ case "text": {
42
+ const text = getTextContent(node.children);
43
+ const annotations = {};
44
+ if (p.bold) annotations.bold = true;
45
+ if (p.italic) annotations.italic = true;
46
+ if (p.strikethrough) annotations.strikethrough = true;
47
+ if (p.underline) annotations.underline = true;
48
+ blocks.push({
49
+ object: "block",
50
+ type: "paragraph",
51
+ paragraph: { rich_text: textToRichText(text, Object.keys(annotations).length > 0 ? annotations : void 0) }
52
+ });
53
+ break;
54
+ }
55
+ case "link": {
56
+ const href = p.href;
57
+ const text = getTextContent(node.children);
58
+ blocks.push({
59
+ object: "block",
60
+ type: "paragraph",
61
+ paragraph: { rich_text: [{
62
+ type: "text",
63
+ text: {
64
+ content: text,
65
+ link: { url: href }
66
+ }
67
+ }] }
68
+ });
69
+ break;
70
+ }
71
+ case "image": {
72
+ const src = p.src;
73
+ if (src.startsWith("http")) blocks.push({
74
+ object: "block",
75
+ type: "image",
76
+ image: {
77
+ type: "external",
78
+ external: { url: src },
79
+ ...p.caption ? { caption: textToRichText(p.caption) } : {}
80
+ }
81
+ });
82
+ break;
83
+ }
84
+ case "table": {
85
+ const columns = (p.columns ?? []).map(resolveColumn);
86
+ const rows = p.rows ?? [];
87
+ const tableRows = [];
88
+ tableRows.push({
89
+ object: "block",
90
+ type: "table_row",
91
+ table_row: { cells: columns.map((col) => textToRichText(col.header, { bold: true })) }
92
+ });
93
+ for (const row of rows) tableRows.push({
94
+ object: "block",
95
+ type: "table_row",
96
+ table_row: { cells: columns.map((_, i) => textToRichText(String(row[i] ?? ""))) }
97
+ });
98
+ blocks.push({
99
+ object: "block",
100
+ type: "table",
101
+ table: {
102
+ table_width: columns.length,
103
+ has_column_header: true,
104
+ children: tableRows
105
+ }
106
+ });
107
+ break;
108
+ }
109
+ case "list": {
110
+ const ordered = p.ordered;
111
+ const items = node.children.filter((c) => typeof c !== "string");
112
+ for (const item of items) {
113
+ const text = getTextContent(item.children);
114
+ const type = ordered ? "numbered_list_item" : "bulleted_list_item";
115
+ blocks.push({
116
+ object: "block",
117
+ type,
118
+ [type]: { rich_text: textToRichText(text) }
119
+ });
120
+ }
121
+ break;
122
+ }
123
+ case "code": {
124
+ const text = getTextContent(node.children);
125
+ const lang = p.language ?? "plain text";
126
+ blocks.push({
127
+ object: "block",
128
+ type: "code",
129
+ code: {
130
+ rich_text: textToRichText(text),
131
+ language: lang
132
+ }
133
+ });
134
+ break;
135
+ }
136
+ case "divider":
137
+ case "page-break":
138
+ blocks.push({
139
+ object: "block",
140
+ type: "divider",
141
+ divider: {}
142
+ });
143
+ break;
144
+ case "spacer":
145
+ blocks.push({
146
+ object: "block",
147
+ type: "paragraph",
148
+ paragraph: { rich_text: [] }
149
+ });
150
+ break;
151
+ case "button": {
152
+ const href = p.href;
153
+ const text = getTextContent(node.children);
154
+ blocks.push({
155
+ object: "block",
156
+ type: "paragraph",
157
+ paragraph: { rich_text: [{
158
+ type: "text",
159
+ text: {
160
+ content: text,
161
+ link: { url: href }
162
+ },
163
+ annotations: { bold: true }
164
+ }] }
165
+ });
166
+ break;
167
+ }
168
+ case "quote": {
169
+ const text = getTextContent(node.children);
170
+ blocks.push({
171
+ object: "block",
172
+ type: "quote",
173
+ quote: { rich_text: textToRichText(text) }
174
+ });
175
+ break;
176
+ }
177
+ }
178
+ return blocks;
179
+ }
180
+ const notionRenderer = { async render(node, _options) {
181
+ const blocks = nodeToBlocks(node);
182
+ return JSON.stringify({ children: blocks }, null, 2);
183
+ } };
184
+
185
+ //#endregion
186
+ export { notionRenderer };
187
+ //# sourceMappingURL=notion-DHaQHO6P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-DHaQHO6P.js","names":[],"sources":["../src/renderers/notion.ts"],"sourcesContent":["import type {\n DocChild,\n DocNode,\n DocumentRenderer,\n RenderOptions,\n TableColumn,\n} from '../types'\n\n/**\n * Notion renderer — outputs Notion Block JSON for the Notion API.\n * Blocks can be appended to a page via `notion.blocks.children.append()`.\n */\n\nfunction resolveColumn(col: string | TableColumn): TableColumn {\n return typeof col === 'string' ? { header: col } : col\n}\n\nfunction getTextContent(children: DocChild[]): string {\n return children\n .map((c) =>\n typeof c === 'string' ? c : getTextContent((c as DocNode).children),\n )\n .join('')\n}\n\ninterface RichText {\n type: 'text'\n text: { content: string; link?: { url: string } }\n annotations?: {\n bold?: boolean\n italic?: boolean\n strikethrough?: boolean\n underline?: boolean\n code?: boolean\n }\n}\n\nfunction textToRichText(\n text: string,\n annotations?: RichText['annotations'],\n): RichText[] {\n return [\n {\n type: 'text',\n text: { content: text },\n ...(annotations ? { annotations } : {}),\n },\n ]\n}\n\ninterface NotionBlock {\n object: 'block'\n type: string\n [key: string]: unknown\n}\n\nfunction nodeToBlocks(node: DocNode): NotionBlock[] {\n const p = node.props\n const blocks: NotionBlock[] = []\n\n switch (node.type) {\n case 'document':\n case 'page':\n case 'section':\n case 'row':\n case 'column':\n for (const child of node.children) {\n if (typeof child !== 'string') {\n blocks.push(...nodeToBlocks(child))\n }\n }\n break\n\n case 'heading': {\n const level = (p.level as number) ?? 1\n const text = getTextContent(node.children)\n const type =\n level <= 1 ? 'heading_1' : level === 2 ? 'heading_2' : 'heading_3'\n blocks.push({\n object: 'block',\n type,\n [type]: { rich_text: textToRichText(text) },\n })\n break\n }\n\n case 'text': {\n const text = getTextContent(node.children)\n const annotations: RichText['annotations'] = {}\n if (p.bold) annotations.bold = true\n if (p.italic) annotations.italic = true\n if (p.strikethrough) annotations.strikethrough = true\n if (p.underline) annotations.underline = true\n blocks.push({\n object: 'block',\n type: 'paragraph',\n paragraph: {\n rich_text: textToRichText(\n text,\n Object.keys(annotations).length > 0 ? annotations : undefined,\n ),\n },\n })\n break\n }\n\n case 'link': {\n const href = p.href as string\n const text = getTextContent(node.children)\n blocks.push({\n object: 'block',\n type: 'paragraph',\n paragraph: {\n rich_text: [\n { type: 'text', text: { content: text, link: { url: href } } },\n ],\n },\n })\n break\n }\n\n case 'image': {\n const src = p.src as string\n if (src.startsWith('http')) {\n blocks.push({\n object: 'block',\n type: 'image',\n image: {\n type: 'external',\n external: { url: src },\n ...(p.caption\n ? { caption: textToRichText(p.caption as string) }\n : {}),\n },\n })\n }\n break\n }\n\n case 'table': {\n const columns = ((p.columns ?? []) as (string | TableColumn)[]).map(\n resolveColumn,\n )\n const rows = (p.rows ?? []) as (string | number)[][]\n\n const tableRows: NotionBlock[] = []\n\n // Header row\n tableRows.push({\n object: 'block',\n type: 'table_row',\n table_row: {\n cells: columns.map((col) =>\n textToRichText(col.header, { bold: true }),\n ),\n },\n })\n\n // Data rows\n for (const row of rows) {\n tableRows.push({\n object: 'block',\n type: 'table_row',\n table_row: {\n cells: columns.map((_, i) => textToRichText(String(row[i] ?? ''))),\n },\n })\n }\n\n blocks.push({\n object: 'block',\n type: 'table',\n table: {\n table_width: columns.length,\n has_column_header: true,\n children: tableRows,\n },\n })\n break\n }\n\n case 'list': {\n const ordered = p.ordered as boolean | undefined\n const items = node.children.filter(\n (c): c is DocNode => typeof c !== 'string',\n )\n for (const item of items) {\n const text = getTextContent(item.children)\n const type = ordered ? 'numbered_list_item' : 'bulleted_list_item'\n blocks.push({\n object: 'block',\n type,\n [type]: { rich_text: textToRichText(text) },\n })\n }\n break\n }\n\n case 'code': {\n const text = getTextContent(node.children)\n const lang = (p.language as string) ?? 'plain text'\n blocks.push({\n object: 'block',\n type: 'code',\n code: {\n rich_text: textToRichText(text),\n language: lang,\n },\n })\n break\n }\n\n case 'divider':\n case 'page-break':\n blocks.push({ object: 'block', type: 'divider', divider: {} })\n break\n\n case 'spacer':\n blocks.push({\n object: 'block',\n type: 'paragraph',\n paragraph: { rich_text: [] },\n })\n break\n\n case 'button': {\n const href = p.href as string\n const text = getTextContent(node.children)\n blocks.push({\n object: 'block',\n type: 'paragraph',\n paragraph: {\n rich_text: [\n {\n type: 'text',\n text: { content: text, link: { url: href } },\n annotations: { bold: true },\n },\n ],\n },\n })\n break\n }\n\n case 'quote': {\n const text = getTextContent(node.children)\n blocks.push({\n object: 'block',\n type: 'quote',\n quote: { rich_text: textToRichText(text) },\n })\n break\n }\n }\n\n return blocks\n}\n\nexport const notionRenderer: DocumentRenderer = {\n async render(node: DocNode, _options?: RenderOptions): Promise<string> {\n const blocks = nodeToBlocks(node)\n return JSON.stringify({ children: blocks }, null, 2)\n },\n}\n"],"mappings":"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"}