@bendyline/squisq-formats 0.1.0 → 1.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 (110) hide show
  1. package/README.md +105 -0
  2. package/dist/__tests__/docxExport.test.d.ts +8 -0
  3. package/dist/__tests__/docxExport.test.d.ts.map +1 -0
  4. package/dist/__tests__/docxExport.test.js +383 -0
  5. package/dist/__tests__/docxExport.test.js.map +1 -0
  6. package/dist/__tests__/docxImport.test.d.ts +8 -0
  7. package/dist/__tests__/docxImport.test.d.ts.map +1 -0
  8. package/dist/__tests__/docxImport.test.js +309 -0
  9. package/dist/__tests__/docxImport.test.js.map +1 -0
  10. package/dist/__tests__/html.test.d.ts +8 -0
  11. package/dist/__tests__/html.test.d.ts.map +1 -0
  12. package/dist/__tests__/html.test.js +243 -0
  13. package/dist/__tests__/html.test.js.map +1 -0
  14. package/dist/__tests__/ooxml.test.d.ts +5 -0
  15. package/dist/__tests__/ooxml.test.d.ts.map +1 -0
  16. package/dist/__tests__/ooxml.test.js +152 -0
  17. package/dist/__tests__/ooxml.test.js.map +1 -0
  18. package/dist/__tests__/pdfExport.test.d.ts +8 -0
  19. package/dist/__tests__/pdfExport.test.d.ts.map +1 -0
  20. package/dist/__tests__/pdfExport.test.js +275 -0
  21. package/dist/__tests__/pdfExport.test.js.map +1 -0
  22. package/dist/__tests__/pdfImport.test.d.ts +11 -0
  23. package/dist/__tests__/pdfImport.test.d.ts.map +1 -0
  24. package/dist/__tests__/pdfImport.test.js +254 -0
  25. package/dist/__tests__/pdfImport.test.js.map +1 -0
  26. package/dist/__tests__/roundTrip.test.d.ts +7 -0
  27. package/dist/__tests__/roundTrip.test.d.ts.map +1 -0
  28. package/dist/__tests__/roundTrip.test.js +173 -0
  29. package/dist/__tests__/roundTrip.test.js.map +1 -0
  30. package/dist/docx/export.d.ts +54 -0
  31. package/dist/docx/export.d.ts.map +1 -0
  32. package/dist/docx/export.js +729 -0
  33. package/dist/docx/export.js.map +1 -0
  34. package/dist/docx/import.d.ts +52 -0
  35. package/dist/docx/import.d.ts.map +1 -0
  36. package/dist/docx/import.js +687 -0
  37. package/dist/docx/import.js.map +1 -0
  38. package/dist/docx/index.d.ts +15 -100
  39. package/dist/docx/index.d.ts.map +1 -0
  40. package/dist/docx/index.js +22 -13
  41. package/dist/docx/index.js.map +1 -1
  42. package/dist/docx/styles.d.ts +68 -0
  43. package/dist/docx/styles.d.ts.map +1 -0
  44. package/dist/docx/styles.js +125 -0
  45. package/dist/docx/styles.js.map +1 -0
  46. package/dist/html/htmlTemplate.d.ts +64 -0
  47. package/dist/html/htmlTemplate.d.ts.map +1 -0
  48. package/dist/html/htmlTemplate.js +235 -0
  49. package/dist/html/htmlTemplate.js.map +1 -0
  50. package/dist/html/imageUtils.d.ts +29 -0
  51. package/dist/html/imageUtils.d.ts.map +1 -0
  52. package/dist/html/imageUtils.js +63 -0
  53. package/dist/html/imageUtils.js.map +1 -0
  54. package/dist/html/index.d.ts +9 -77
  55. package/dist/html/index.d.ts.map +1 -0
  56. package/dist/html/index.js +137 -16
  57. package/dist/html/index.js.map +1 -1
  58. package/dist/index.d.ts +36 -7
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +35 -53
  61. package/dist/index.js.map +1 -1
  62. package/dist/ooxml/index.d.ts +14 -343
  63. package/dist/ooxml/index.d.ts.map +1 -0
  64. package/dist/ooxml/index.js +22 -98
  65. package/dist/ooxml/index.js.map +1 -1
  66. package/dist/ooxml/namespaces.d.ts +67 -0
  67. package/dist/ooxml/namespaces.d.ts.map +1 -0
  68. package/dist/ooxml/namespaces.js +94 -0
  69. package/dist/ooxml/namespaces.js.map +1 -0
  70. package/dist/ooxml/reader.d.ts +52 -0
  71. package/dist/ooxml/reader.d.ts.map +1 -0
  72. package/dist/ooxml/reader.js +190 -0
  73. package/dist/ooxml/reader.js.map +1 -0
  74. package/dist/ooxml/types.d.ts +82 -0
  75. package/dist/ooxml/types.d.ts.map +1 -0
  76. package/dist/ooxml/types.js +9 -0
  77. package/dist/ooxml/types.js.map +1 -0
  78. package/dist/ooxml/writer.d.ts +71 -0
  79. package/dist/ooxml/writer.d.ts.map +1 -0
  80. package/dist/ooxml/writer.js +200 -0
  81. package/dist/ooxml/writer.js.map +1 -0
  82. package/dist/ooxml/xmlUtils.d.ts +76 -0
  83. package/dist/ooxml/xmlUtils.d.ts.map +1 -0
  84. package/dist/ooxml/xmlUtils.js +108 -0
  85. package/dist/ooxml/xmlUtils.js.map +1 -0
  86. package/dist/pdf/export.d.ts +50 -0
  87. package/dist/pdf/export.d.ts.map +1 -0
  88. package/dist/pdf/export.js +740 -0
  89. package/dist/pdf/export.js.map +1 -0
  90. package/dist/pdf/import.d.ts +78 -0
  91. package/dist/pdf/import.d.ts.map +1 -0
  92. package/dist/pdf/import.js +619 -0
  93. package/dist/pdf/import.js.map +1 -0
  94. package/dist/pdf/index.d.ts +17 -121
  95. package/dist/pdf/index.d.ts.map +1 -0
  96. package/dist/pdf/index.js +25 -14
  97. package/dist/pdf/index.js.map +1 -1
  98. package/dist/pdf/styles.d.ts +142 -0
  99. package/dist/pdf/styles.d.ts.map +1 -0
  100. package/dist/pdf/styles.js +145 -0
  101. package/dist/pdf/styles.js.map +1 -0
  102. package/dist/pptx/index.d.ts +9 -12
  103. package/dist/pptx/index.d.ts.map +1 -0
  104. package/dist/pptx/index.js +44 -12
  105. package/dist/pptx/index.js.map +1 -1
  106. package/dist/xlsx/index.d.ts +9 -12
  107. package/dist/xlsx/index.d.ts.map +1 -0
  108. package/dist/xlsx/index.js +44 -12
  109. package/dist/xlsx/index.js.map +1 -1
  110. package/package.json +5 -6
package/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # @bendyline/squisq-formats
2
+
3
+ Document format converters for Squisq. Import and export between Squisq's Markdown-based document model and common file formats — DOCX, PDF, and HTML. All converters run entirely in the browser with no server or native binaries required.
4
+
5
+ Part of the [Squisq](https://github.com/bendyline/squisq) monorepo.
6
+
7
+ [![npm](https://img.shields.io/npm/v/@bendyline/squisq-formats)](https://www.npmjs.com/package/@bendyline/squisq-formats)
8
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/bendyline/squisq/blob/main/LICENSE)
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @bendyline/squisq-formats @bendyline/squisq
14
+ ```
15
+
16
+ ## Supported Formats
17
+
18
+ | Format | Import | Export | Subpath |
19
+ | --------------------- | ------- | ------- | -------------------------------- |
20
+ | **DOCX** (Word) | ✅ | ✅ | `@bendyline/squisq-formats/docx` |
21
+ | **PDF** | ✅ | ✅ | `@bendyline/squisq-formats/pdf` |
22
+ | **HTML** | — | ✅ | `@bendyline/squisq-formats/html` |
23
+ | **PPTX** (PowerPoint) | planned | planned | `@bendyline/squisq-formats/pptx` |
24
+ | **XLSX** (Excel) | planned | planned | `@bendyline/squisq-formats/xlsx` |
25
+
26
+ ## Quick Examples
27
+
28
+ ### DOCX
29
+
30
+ ```ts
31
+ import { markdownDocToDocx, docxToMarkdownDoc } from '@bendyline/squisq-formats/docx';
32
+
33
+ // Export: MarkdownDocument → DOCX (Uint8Array)
34
+ const docxBytes = await markdownDocToDocx(markdownDoc);
35
+
36
+ // Import: DOCX (ArrayBuffer) → MarkdownDocument
37
+ const markdownDoc = await docxToMarkdownDoc(docxBuffer);
38
+ ```
39
+
40
+ ### PDF
41
+
42
+ ```ts
43
+ import {
44
+ markdownDocToPdf,
45
+ pdfToMarkdownDoc,
46
+ configurePdfWorker,
47
+ } from '@bendyline/squisq-formats/pdf';
48
+
49
+ // Configure the PDF.js worker (required for import)
50
+ configurePdfWorker('/pdf.worker.min.mjs');
51
+
52
+ // Export: MarkdownDocument → PDF (Uint8Array)
53
+ const pdfBytes = await markdownDocToPdf(markdownDoc);
54
+
55
+ // Import: PDF (ArrayBuffer) → MarkdownDocument
56
+ const markdownDoc = await pdfToMarkdownDoc(pdfBuffer);
57
+ ```
58
+
59
+ ### HTML
60
+
61
+ ```ts
62
+ import { docToHtml, docToHtmlZip } from '@bendyline/squisq-formats/html';
63
+
64
+ // Export: Doc → standalone HTML string
65
+ const html = docToHtml(doc);
66
+
67
+ // Export: Doc → ZIP with HTML + images
68
+ const zipBytes = await docToHtmlZip(doc);
69
+ ```
70
+
71
+ ### Doc-level Convenience Functions
72
+
73
+ Each format also exports `Doc`-level wrappers that handle the Markdown↔Doc conversion internally:
74
+
75
+ ```ts
76
+ import { docToDocx, docxToDoc } from '@bendyline/squisq-formats/docx';
77
+ import { docToPdf, pdfToDoc } from '@bendyline/squisq-formats/pdf';
78
+ ```
79
+
80
+ ## Subpath Exports
81
+
82
+ | Subpath | Contents |
83
+ | --------------------------------- | -------------------------------------------------------------- |
84
+ | `@bendyline/squisq-formats/docx` | DOCX import/export |
85
+ | `@bendyline/squisq-formats/pdf` | PDF import/export + worker config |
86
+ | `@bendyline/squisq-formats/html` | HTML export |
87
+ | `@bendyline/squisq-formats/ooxml` | Shared OOXML infrastructure (ZIP reader/writer, XML utilities) |
88
+ | `@bendyline/squisq-formats/pptx` | PPTX stubs (not yet implemented) |
89
+ | `@bendyline/squisq-formats/xlsx` | XLSX stubs (not yet implemented) |
90
+
91
+ ## Architecture
92
+
93
+ All converters use Squisq's `MarkdownDocument` AST as the pivot format. Importing a file parses it into a `MarkdownDocument`; exporting serializes from one. The OOXML subpath provides shared infrastructure for reading and writing Office Open XML packages (used by DOCX, and eventually PPTX/XLSX).
94
+
95
+ ## Related Packages
96
+
97
+ | Package | Description |
98
+ | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
99
+ | [@bendyline/squisq](https://www.npmjs.com/package/@bendyline/squisq) | Headless core — schemas, templates, spatial, markdown, storage |
100
+ | [@bendyline/squisq-react](https://www.npmjs.com/package/@bendyline/squisq-react) | React components for rendering docs |
101
+ | [@bendyline/squisq-editor-react](https://www.npmjs.com/package/@bendyline/squisq-editor-react) | React editor with raw/WYSIWYG/preview modes |
102
+
103
+ ## License
104
+
105
+ [MIT](https://github.com/bendyline/squisq/blob/main/LICENSE)
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for DOCX export: markdownDocToDocx, docToDocx.
3
+ *
4
+ * Exports a MarkdownDocument to .docx, then unzips and inspects
5
+ * the OOXML structure to verify correctness.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=docxExport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docxExport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docxExport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Tests for DOCX export: markdownDocToDocx, docToDocx.
3
+ *
4
+ * Exports a MarkdownDocument to .docx, then unzips and inspects
5
+ * the OOXML structure to verify correctness.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import JSZip from 'jszip';
9
+ import { markdownDocToDocx, docToDocx } from '../docx/export';
10
+ // ============================================
11
+ // Helpers
12
+ // ============================================
13
+ async function exportAndParse(doc, options) {
14
+ const buffer = await markdownDocToDocx(doc, options);
15
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
16
+ expect(buffer.byteLength).toBeGreaterThan(0);
17
+ const zip = await JSZip.loadAsync(buffer);
18
+ return zip;
19
+ }
20
+ async function getDocumentXml(zip) {
21
+ const text = await zip.file('word/document.xml').async('text');
22
+ return new DOMParser().parseFromString(text, 'application/xml');
23
+ }
24
+ function _getBodyParagraphs(doc) {
25
+ const body = doc.getElementsByTagName('w:body')[0];
26
+ return Array.from(body.children).filter((el) => el.localName === 'p');
27
+ }
28
+ // ============================================
29
+ // Basic Structure
30
+ // ============================================
31
+ describe('markdownDocToDocx', () => {
32
+ it('produces a valid zip with required parts', async () => {
33
+ const doc = {
34
+ type: 'document',
35
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'Hello' }] }],
36
+ };
37
+ const zip = await exportAndParse(doc);
38
+ expect(zip.file('[Content_Types].xml')).not.toBeNull();
39
+ expect(zip.file('_rels/.rels')).not.toBeNull();
40
+ expect(zip.file('word/document.xml')).not.toBeNull();
41
+ expect(zip.file('word/styles.xml')).not.toBeNull();
42
+ expect(zip.file('word/settings.xml')).not.toBeNull();
43
+ expect(zip.file('word/fontTable.xml')).not.toBeNull();
44
+ });
45
+ it('exports an empty document', async () => {
46
+ const doc = { type: 'document', children: [] };
47
+ const zip = await exportAndParse(doc);
48
+ const xmlDoc = await getDocumentXml(zip);
49
+ const body = xmlDoc.getElementsByTagName('w:body')[0];
50
+ expect(body).toBeDefined();
51
+ });
52
+ // ============================================
53
+ // Headings
54
+ // ============================================
55
+ it('exports headings with correct styles', async () => {
56
+ const doc = {
57
+ type: 'document',
58
+ children: [
59
+ {
60
+ type: 'heading',
61
+ depth: 1,
62
+ children: [{ type: 'text', value: 'Title' }],
63
+ },
64
+ {
65
+ type: 'heading',
66
+ depth: 2,
67
+ children: [{ type: 'text', value: 'Subtitle' }],
68
+ },
69
+ {
70
+ type: 'heading',
71
+ depth: 3,
72
+ children: [{ type: 'text', value: 'Section' }],
73
+ },
74
+ ],
75
+ };
76
+ const zip = await exportAndParse(doc);
77
+ const xmlText = await zip.file('word/document.xml').async('text');
78
+ // Verify heading styles are present
79
+ expect(xmlText).toContain('w:val="Heading1"');
80
+ expect(xmlText).toContain('w:val="Heading2"');
81
+ expect(xmlText).toContain('w:val="Heading3"');
82
+ // Verify heading text
83
+ expect(xmlText).toContain('Title');
84
+ expect(xmlText).toContain('Subtitle');
85
+ expect(xmlText).toContain('Section');
86
+ });
87
+ // ============================================
88
+ // Inline Formatting
89
+ // ============================================
90
+ it('exports bold text with w:b element', async () => {
91
+ const doc = {
92
+ type: 'document',
93
+ children: [
94
+ {
95
+ type: 'paragraph',
96
+ children: [
97
+ {
98
+ type: 'strong',
99
+ children: [{ type: 'text', value: 'bold text' }],
100
+ },
101
+ ],
102
+ },
103
+ ],
104
+ };
105
+ const zip = await exportAndParse(doc);
106
+ const xmlText = await zip.file('word/document.xml').async('text');
107
+ expect(xmlText).toContain('<w:b/>');
108
+ expect(xmlText).toContain('bold text');
109
+ });
110
+ it('exports italic text with w:i element', async () => {
111
+ const doc = {
112
+ type: 'document',
113
+ children: [
114
+ {
115
+ type: 'paragraph',
116
+ children: [
117
+ {
118
+ type: 'emphasis',
119
+ children: [{ type: 'text', value: 'italic text' }],
120
+ },
121
+ ],
122
+ },
123
+ ],
124
+ };
125
+ const zip = await exportAndParse(doc);
126
+ const xmlText = await zip.file('word/document.xml').async('text');
127
+ expect(xmlText).toContain('<w:i/>');
128
+ expect(xmlText).toContain('italic text');
129
+ });
130
+ it('exports inline code with monospace font', async () => {
131
+ const doc = {
132
+ type: 'document',
133
+ children: [
134
+ {
135
+ type: 'paragraph',
136
+ children: [{ type: 'inlineCode', value: 'console.log()' }],
137
+ },
138
+ ],
139
+ };
140
+ const zip = await exportAndParse(doc);
141
+ const xmlText = await zip.file('word/document.xml').async('text');
142
+ expect(xmlText).toContain('Consolas');
143
+ expect(xmlText).toContain('console.log()');
144
+ });
145
+ // ============================================
146
+ // Lists
147
+ // ============================================
148
+ it('exports unordered list with numbering', async () => {
149
+ const doc = {
150
+ type: 'document',
151
+ children: [
152
+ {
153
+ type: 'list',
154
+ ordered: false,
155
+ children: [
156
+ {
157
+ type: 'listItem',
158
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'Item 1' }] }],
159
+ },
160
+ {
161
+ type: 'listItem',
162
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'Item 2' }] }],
163
+ },
164
+ ],
165
+ },
166
+ ],
167
+ };
168
+ const zip = await exportAndParse(doc);
169
+ // Should have numbering.xml
170
+ expect(zip.file('word/numbering.xml')).not.toBeNull();
171
+ const xmlText = await zip.file('word/document.xml').async('text');
172
+ expect(xmlText).toContain('Item 1');
173
+ expect(xmlText).toContain('Item 2');
174
+ expect(xmlText).toContain('w:numId');
175
+ // Numbering should be bullet type
176
+ const numXml = await zip.file('word/numbering.xml').async('text');
177
+ expect(numXml).toContain('w:val="bullet"');
178
+ });
179
+ it('exports ordered list with decimal numbering', async () => {
180
+ const doc = {
181
+ type: 'document',
182
+ children: [
183
+ {
184
+ type: 'list',
185
+ ordered: true,
186
+ children: [
187
+ {
188
+ type: 'listItem',
189
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'First' }] }],
190
+ },
191
+ ],
192
+ },
193
+ ],
194
+ };
195
+ const zip = await exportAndParse(doc);
196
+ const numXml = await zip.file('word/numbering.xml').async('text');
197
+ expect(numXml).toContain('w:val="decimal"');
198
+ });
199
+ // ============================================
200
+ // Tables
201
+ // ============================================
202
+ it('exports tables with rows and cells', async () => {
203
+ const doc = {
204
+ type: 'document',
205
+ children: [
206
+ {
207
+ type: 'table',
208
+ children: [
209
+ {
210
+ type: 'tableRow',
211
+ children: [
212
+ {
213
+ type: 'tableCell',
214
+ isHeader: true,
215
+ children: [{ type: 'text', value: 'Name' }],
216
+ },
217
+ {
218
+ type: 'tableCell',
219
+ isHeader: true,
220
+ children: [{ type: 'text', value: 'Value' }],
221
+ },
222
+ ],
223
+ },
224
+ {
225
+ type: 'tableRow',
226
+ children: [
227
+ {
228
+ type: 'tableCell',
229
+ children: [{ type: 'text', value: 'A' }],
230
+ },
231
+ {
232
+ type: 'tableCell',
233
+ children: [{ type: 'text', value: '1' }],
234
+ },
235
+ ],
236
+ },
237
+ ],
238
+ },
239
+ ],
240
+ };
241
+ const zip = await exportAndParse(doc);
242
+ const xmlText = await zip.file('word/document.xml').async('text');
243
+ expect(xmlText).toContain('<w:tbl>');
244
+ expect(xmlText).toContain('<w:tr>');
245
+ expect(xmlText).toContain('<w:tc>');
246
+ expect(xmlText).toContain('Name');
247
+ expect(xmlText).toContain('Value');
248
+ });
249
+ // ============================================
250
+ // Code Blocks
251
+ // ============================================
252
+ it('exports code blocks with code styling', async () => {
253
+ const doc = {
254
+ type: 'document',
255
+ children: [
256
+ {
257
+ type: 'code',
258
+ value: 'const x = 1;\nconst y = 2;',
259
+ },
260
+ ],
261
+ };
262
+ const zip = await exportAndParse(doc);
263
+ const xmlText = await zip.file('word/document.xml').async('text');
264
+ expect(xmlText).toContain('const x = 1;');
265
+ expect(xmlText).toContain('const y = 2;');
266
+ expect(xmlText).toContain('Consolas');
267
+ });
268
+ // ============================================
269
+ // Blockquotes
270
+ // ============================================
271
+ it('exports blockquotes with quote style', async () => {
272
+ const doc = {
273
+ type: 'document',
274
+ children: [
275
+ {
276
+ type: 'blockquote',
277
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'A wise quote' }] }],
278
+ },
279
+ ],
280
+ };
281
+ const zip = await exportAndParse(doc);
282
+ const xmlText = await zip.file('word/document.xml').async('text');
283
+ expect(xmlText).toContain('Quote');
284
+ expect(xmlText).toContain('A wise quote');
285
+ });
286
+ // ============================================
287
+ // Hyperlinks
288
+ // ============================================
289
+ it('exports hyperlinks with relationship', async () => {
290
+ const doc = {
291
+ type: 'document',
292
+ children: [
293
+ {
294
+ type: 'paragraph',
295
+ children: [
296
+ {
297
+ type: 'link',
298
+ url: 'https://example.com',
299
+ children: [{ type: 'text', value: 'click here' }],
300
+ },
301
+ ],
302
+ },
303
+ ],
304
+ };
305
+ const zip = await exportAndParse(doc);
306
+ const xmlText = await zip.file('word/document.xml').async('text');
307
+ expect(xmlText).toContain('<w:hyperlink');
308
+ expect(xmlText).toContain('click here');
309
+ // Check relationships
310
+ const relsText = await zip.file('word/_rels/document.xml.rels').async('text');
311
+ expect(relsText).toContain('https://example.com');
312
+ expect(relsText).toContain('TargetMode="External"');
313
+ });
314
+ // ============================================
315
+ // Thematic Break
316
+ // ============================================
317
+ it('exports thematic breaks', async () => {
318
+ const doc = {
319
+ type: 'document',
320
+ children: [{ type: 'thematicBreak' }],
321
+ };
322
+ const zip = await exportAndParse(doc);
323
+ const xmlText = await zip.file('word/document.xml').async('text');
324
+ expect(xmlText).toContain('w:pBdr');
325
+ expect(xmlText).toContain('w:bottom');
326
+ });
327
+ // ============================================
328
+ // Core Properties
329
+ // ============================================
330
+ it('includes core properties when options are provided', async () => {
331
+ const doc = {
332
+ type: 'document',
333
+ children: [{ type: 'paragraph', children: [{ type: 'text', value: 'test' }] }],
334
+ };
335
+ const zip = await exportAndParse(doc, {
336
+ title: 'My Document',
337
+ author: 'Test Author',
338
+ });
339
+ const coreXml = await zip.file('docProps/core.xml')?.async('text');
340
+ expect(coreXml).toBeDefined();
341
+ expect(coreXml).toContain('My Document');
342
+ expect(coreXml).toContain('Test Author');
343
+ });
344
+ });
345
+ // ============================================
346
+ // docToDocx convenience wrapper
347
+ // ============================================
348
+ describe('docToDocx', () => {
349
+ it('converts a Doc to docx', async () => {
350
+ const doc = {
351
+ articleId: 'test',
352
+ duration: 10,
353
+ blocks: [
354
+ {
355
+ id: 'block-1',
356
+ startTime: 0,
357
+ duration: 5,
358
+ audioSegment: 0,
359
+ sourceHeading: {
360
+ type: 'heading',
361
+ depth: 1,
362
+ children: [{ type: 'text', value: 'Test Heading' }],
363
+ },
364
+ contents: [
365
+ {
366
+ type: 'paragraph',
367
+ children: [{ type: 'text', value: 'Body text' }],
368
+ },
369
+ ],
370
+ },
371
+ ],
372
+ audio: { segments: [] },
373
+ };
374
+ const buffer = await docToDocx(doc);
375
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
376
+ expect(buffer.byteLength).toBeGreaterThan(0);
377
+ const zip = await JSZip.loadAsync(buffer);
378
+ const xmlText = await zip.file('word/document.xml').async('text');
379
+ expect(xmlText).toContain('Test Heading');
380
+ expect(xmlText).toContain('Body text');
381
+ });
382
+ });
383
+ //# sourceMappingURL=docxExport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docxExport.test.js","sourceRoot":"","sources":["../../src/__tests__/docxExport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for DOCX import: docxToMarkdownDoc, docxToDoc.
3
+ *
4
+ * Builds minimal .docx test fixtures programmatically using our own
5
+ * OOXML writer (dogfooding the shared layer), then imports them.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=docxImport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docxImport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docxImport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}