@bendyline/squisq-formats 0.1.1 → 1.1.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 (119) hide show
  1. package/dist/__tests__/container.test.d.ts +8 -0
  2. package/dist/__tests__/container.test.d.ts.map +1 -0
  3. package/dist/__tests__/container.test.js +147 -0
  4. package/dist/__tests__/container.test.js.map +1 -0
  5. package/dist/__tests__/docxExport.test.d.ts +8 -0
  6. package/dist/__tests__/docxExport.test.d.ts.map +1 -0
  7. package/dist/__tests__/docxExport.test.js +383 -0
  8. package/dist/__tests__/docxExport.test.js.map +1 -0
  9. package/dist/__tests__/docxImport.test.d.ts +8 -0
  10. package/dist/__tests__/docxImport.test.d.ts.map +1 -0
  11. package/dist/__tests__/docxImport.test.js +309 -0
  12. package/dist/__tests__/docxImport.test.js.map +1 -0
  13. package/dist/__tests__/html.test.d.ts +8 -0
  14. package/dist/__tests__/html.test.d.ts.map +1 -0
  15. package/dist/__tests__/html.test.js +243 -0
  16. package/dist/__tests__/html.test.js.map +1 -0
  17. package/dist/__tests__/ooxml.test.d.ts +5 -0
  18. package/dist/__tests__/ooxml.test.d.ts.map +1 -0
  19. package/dist/__tests__/ooxml.test.js +152 -0
  20. package/dist/__tests__/ooxml.test.js.map +1 -0
  21. package/dist/__tests__/pdfExport.test.d.ts +8 -0
  22. package/dist/__tests__/pdfExport.test.d.ts.map +1 -0
  23. package/dist/__tests__/pdfExport.test.js +275 -0
  24. package/dist/__tests__/pdfExport.test.js.map +1 -0
  25. package/dist/__tests__/pdfImport.test.d.ts +11 -0
  26. package/dist/__tests__/pdfImport.test.d.ts.map +1 -0
  27. package/dist/__tests__/pdfImport.test.js +254 -0
  28. package/dist/__tests__/pdfImport.test.js.map +1 -0
  29. package/dist/__tests__/roundTrip.test.d.ts +7 -0
  30. package/dist/__tests__/roundTrip.test.d.ts.map +1 -0
  31. package/dist/__tests__/roundTrip.test.js +173 -0
  32. package/dist/__tests__/roundTrip.test.js.map +1 -0
  33. package/dist/container/index.d.ts +36 -0
  34. package/dist/container/index.d.ts.map +1 -0
  35. package/dist/container/index.js +74 -0
  36. package/dist/container/index.js.map +1 -0
  37. package/dist/docx/export.d.ts +54 -0
  38. package/dist/docx/export.d.ts.map +1 -0
  39. package/dist/docx/export.js +729 -0
  40. package/dist/docx/export.js.map +1 -0
  41. package/dist/docx/import.d.ts +52 -0
  42. package/dist/docx/import.d.ts.map +1 -0
  43. package/dist/docx/import.js +687 -0
  44. package/dist/docx/import.js.map +1 -0
  45. package/dist/docx/index.d.ts +15 -100
  46. package/dist/docx/index.d.ts.map +1 -0
  47. package/dist/docx/index.js +22 -13
  48. package/dist/docx/index.js.map +1 -1
  49. package/dist/docx/styles.d.ts +68 -0
  50. package/dist/docx/styles.d.ts.map +1 -0
  51. package/dist/docx/styles.js +125 -0
  52. package/dist/docx/styles.js.map +1 -0
  53. package/dist/html/htmlTemplate.d.ts +64 -0
  54. package/dist/html/htmlTemplate.d.ts.map +1 -0
  55. package/dist/html/htmlTemplate.js +235 -0
  56. package/dist/html/htmlTemplate.js.map +1 -0
  57. package/dist/html/imageUtils.d.ts +29 -0
  58. package/dist/html/imageUtils.d.ts.map +1 -0
  59. package/dist/html/imageUtils.js +63 -0
  60. package/dist/html/imageUtils.js.map +1 -0
  61. package/dist/html/index.d.ts +9 -77
  62. package/dist/html/index.d.ts.map +1 -0
  63. package/dist/html/index.js +137 -16
  64. package/dist/html/index.js.map +1 -1
  65. package/dist/index.d.ts +36 -7
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +35 -53
  68. package/dist/index.js.map +1 -1
  69. package/dist/ooxml/index.d.ts +14 -343
  70. package/dist/ooxml/index.d.ts.map +1 -0
  71. package/dist/ooxml/index.js +22 -98
  72. package/dist/ooxml/index.js.map +1 -1
  73. package/dist/ooxml/namespaces.d.ts +67 -0
  74. package/dist/ooxml/namespaces.d.ts.map +1 -0
  75. package/dist/ooxml/namespaces.js +94 -0
  76. package/dist/ooxml/namespaces.js.map +1 -0
  77. package/dist/ooxml/reader.d.ts +52 -0
  78. package/dist/ooxml/reader.d.ts.map +1 -0
  79. package/dist/ooxml/reader.js +190 -0
  80. package/dist/ooxml/reader.js.map +1 -0
  81. package/dist/ooxml/types.d.ts +82 -0
  82. package/dist/ooxml/types.d.ts.map +1 -0
  83. package/dist/ooxml/types.js +9 -0
  84. package/dist/ooxml/types.js.map +1 -0
  85. package/dist/ooxml/writer.d.ts +71 -0
  86. package/dist/ooxml/writer.d.ts.map +1 -0
  87. package/dist/ooxml/writer.js +200 -0
  88. package/dist/ooxml/writer.js.map +1 -0
  89. package/dist/ooxml/xmlUtils.d.ts +76 -0
  90. package/dist/ooxml/xmlUtils.d.ts.map +1 -0
  91. package/dist/ooxml/xmlUtils.js +108 -0
  92. package/dist/ooxml/xmlUtils.js.map +1 -0
  93. package/dist/pdf/export.d.ts +50 -0
  94. package/dist/pdf/export.d.ts.map +1 -0
  95. package/dist/pdf/export.js +740 -0
  96. package/dist/pdf/export.js.map +1 -0
  97. package/dist/pdf/import.d.ts +78 -0
  98. package/dist/pdf/import.d.ts.map +1 -0
  99. package/dist/pdf/import.js +619 -0
  100. package/dist/pdf/import.js.map +1 -0
  101. package/dist/pdf/index.d.ts +17 -121
  102. package/dist/pdf/index.d.ts.map +1 -0
  103. package/dist/pdf/index.js +25 -14
  104. package/dist/pdf/index.js.map +1 -1
  105. package/dist/pdf/styles.d.ts +142 -0
  106. package/dist/pdf/styles.d.ts.map +1 -0
  107. package/dist/pdf/styles.js +145 -0
  108. package/dist/pdf/styles.js.map +1 -0
  109. package/dist/pptx/index.d.ts +9 -12
  110. package/dist/pptx/index.d.ts.map +1 -0
  111. package/dist/pptx/index.js +44 -12
  112. package/dist/pptx/index.js.map +1 -1
  113. package/dist/xlsx/index.d.ts +9 -12
  114. package/dist/xlsx/index.d.ts.map +1 -0
  115. package/dist/xlsx/index.js +44 -12
  116. package/dist/xlsx/index.js.map +1 -1
  117. package/package.json +8 -4
  118. package/src/__tests__/container.test.ts +189 -0
  119. package/src/container/index.ts +89 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for container ZIP serialization: containerToZip, zipToContainer.
3
+ *
4
+ * Verifies round-trip fidelity: write files to a container, serialize to ZIP,
5
+ * deserialize back, and confirm all files are intact.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=container.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Tests for container ZIP serialization: containerToZip, zipToContainer.
3
+ *
4
+ * Verifies round-trip fidelity: write files to a container, serialize to ZIP,
5
+ * deserialize back, and confirm all files are intact.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import JSZip from 'jszip';
9
+ import { MemoryContentContainer } from '@bendyline/squisq/storage';
10
+ import { containerToZip, zipToContainer } from '../container/index';
11
+ // ============================================
12
+ // Helpers
13
+ // ============================================
14
+ /** Helper to read a Blob as ArrayBuffer (works in jsdom) */
15
+ async function blobToArrayBuffer(blob) {
16
+ return new Promise((resolve, reject) => {
17
+ const reader = new FileReader();
18
+ reader.onload = () => resolve(reader.result);
19
+ reader.onerror = () => reject(reader.error);
20
+ reader.readAsArrayBuffer(blob);
21
+ });
22
+ }
23
+ // ============================================
24
+ // containerToZip
25
+ // ============================================
26
+ describe('containerToZip', () => {
27
+ it('creates a valid ZIP from an empty container', async () => {
28
+ const container = new MemoryContentContainer();
29
+ const blob = await containerToZip(container);
30
+ expect(blob).toBeInstanceOf(Blob);
31
+ expect(blob.size).toBeGreaterThan(0);
32
+ // Should be parseable as a ZIP with no files
33
+ const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
34
+ expect(Object.keys(zip.files)).toHaveLength(0);
35
+ });
36
+ it('includes all files from the container', async () => {
37
+ const container = new MemoryContentContainer();
38
+ await container.writeDocument('# Hello World');
39
+ await container.writeFile('images/hero.jpg', new Uint8Array([0xff, 0xd8, 0xff]), 'image/jpeg');
40
+ await container.writeFile('timing.json', new TextEncoder().encode('{"duration":10}'));
41
+ const blob = await containerToZip(container);
42
+ const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
43
+ const filenames = Object.keys(zip.files)
44
+ .filter((f) => !zip.files[f].dir)
45
+ .sort();
46
+ expect(filenames).toEqual(['images/hero.jpg', 'index.md', 'timing.json']);
47
+ });
48
+ it('preserves file content', async () => {
49
+ const container = new MemoryContentContainer();
50
+ const markdown = '# Test Document\n\nSome content.';
51
+ await container.writeDocument(markdown);
52
+ const blob = await containerToZip(container);
53
+ const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
54
+ const content = await zip.file('index.md').async('string');
55
+ expect(content).toBe(markdown);
56
+ });
57
+ it('preserves binary content', async () => {
58
+ const container = new MemoryContentContainer();
59
+ const binaryData = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
60
+ await container.writeFile('image.png', binaryData, 'image/png');
61
+ const blob = await containerToZip(container);
62
+ const zip = await JSZip.loadAsync(await blobToArrayBuffer(blob));
63
+ const data = await zip.file('image.png').async('uint8array');
64
+ expect(data).toEqual(binaryData);
65
+ });
66
+ });
67
+ // ============================================
68
+ // zipToContainer
69
+ // ============================================
70
+ describe('zipToContainer', () => {
71
+ it('loads files from a ZIP', async () => {
72
+ const zip = new JSZip();
73
+ zip.file('index.md', '# Hello');
74
+ zip.file('images/photo.jpg', new Uint8Array([0xff, 0xd8]));
75
+ const zipBlob = await zip.generateAsync({ type: 'blob' });
76
+ const container = await zipToContainer(zipBlob);
77
+ const entries = await container.listFiles();
78
+ expect(entries.map((e) => e.path).sort()).toEqual(['images/photo.jpg', 'index.md']);
79
+ });
80
+ it('preserves text content', async () => {
81
+ const zip = new JSZip();
82
+ zip.file('index.md', '# My Document\n\nParagraph.');
83
+ const zipBlob = await zip.generateAsync({ type: 'blob' });
84
+ const container = await zipToContainer(zipBlob);
85
+ expect(await container.readDocument()).toBe('# My Document\n\nParagraph.');
86
+ });
87
+ it('preserves binary content', async () => {
88
+ const original = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
89
+ const zip = new JSZip();
90
+ zip.file('data.bin', original);
91
+ const zipBlob = await zip.generateAsync({ type: 'blob' });
92
+ const container = await zipToContainer(zipBlob);
93
+ const data = await container.readFile('data.bin');
94
+ expect(new Uint8Array(data)).toEqual(original);
95
+ });
96
+ it('skips directory entries', async () => {
97
+ const zip = new JSZip();
98
+ zip.folder('images');
99
+ zip.file('images/photo.jpg', new Uint8Array([0xff]));
100
+ const zipBlob = await zip.generateAsync({ type: 'blob' });
101
+ const container = await zipToContainer(zipBlob);
102
+ const entries = await container.listFiles();
103
+ // Only the file, not the directory
104
+ expect(entries).toHaveLength(1);
105
+ expect(entries[0].path).toBe('images/photo.jpg');
106
+ });
107
+ it('works with ArrayBuffer input', async () => {
108
+ const zip = new JSZip();
109
+ zip.file('readme.md', '# Read me');
110
+ const ab = await zip.generateAsync({ type: 'arraybuffer' });
111
+ const container = await zipToContainer(ab);
112
+ expect(await container.readDocument()).toBe('# Read me');
113
+ });
114
+ });
115
+ // ============================================
116
+ // Round-trip
117
+ // ============================================
118
+ describe('containerToZip / zipToContainer round-trip', () => {
119
+ it('round-trips a container with markdown and media', async () => {
120
+ // Create original container
121
+ const original = new MemoryContentContainer();
122
+ const markdown = '# Round Trip Test\n\n![hero](images/hero.jpg)\n\nSome text.';
123
+ await original.writeDocument(markdown);
124
+ await original.writeFile('images/hero.jpg', new Uint8Array([0xff, 0xd8, 0xff, 0xe0]), 'image/jpeg');
125
+ await original.writeFile('audio/narration.mp3', new Uint8Array([0x49, 0x44, 0x33]), 'audio/mpeg');
126
+ await original.writeFile('timing.json', new TextEncoder().encode('{"segments":[]}'));
127
+ // Serialize to ZIP
128
+ const zipBlob = await containerToZip(original);
129
+ // Deserialize back
130
+ const restored = await zipToContainer(zipBlob);
131
+ // Verify document
132
+ expect(await restored.readDocument()).toBe(markdown);
133
+ expect(await restored.getDocumentPath()).toBe('index.md');
134
+ // Verify all files present
135
+ const entries = (await restored.listFiles()).map((e) => e.path).sort();
136
+ expect(entries).toEqual(['audio/narration.mp3', 'images/hero.jpg', 'index.md', 'timing.json']);
137
+ // Verify binary content
138
+ const heroData = new Uint8Array((await restored.readFile('images/hero.jpg')));
139
+ expect(heroData).toEqual(new Uint8Array([0xff, 0xd8, 0xff, 0xe0]));
140
+ const audioData = new Uint8Array((await restored.readFile('audio/narration.mp3')));
141
+ expect(audioData).toEqual(new Uint8Array([0x49, 0x44, 0x33]));
142
+ // Verify JSON sidecar
143
+ const timingData = new TextDecoder().decode((await restored.readFile('timing.json')));
144
+ expect(timingData).toBe('{"segments":[]}');
145
+ });
146
+ });
147
+ //# sourceMappingURL=container.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE9D,+CAA+C;AAC/C,UAAU;AACV,+CAA+C;AAE/C,KAAK,UAAU,cAAc,CAC3B,GAAqB,EACrB,OAAiD;IAEjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAU;IACtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAa;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,+CAA+C;AAC/C,kBAAkB;AAClB,+CAA+C;AAE/C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SAChF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAEtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,GAAG,GAAqB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,WAAW;IACX,+CAA+C;IAE/C,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;iBACnB;gBAC3B;oBACE,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;iBACtB;gBAC3B;oBACE,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,CAAC;oBACR,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;iBACrB;aAC5B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnE,oCAAoC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAE9C,sBAAsB;QACtB,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,oBAAoB;IACpB,+CAA+C;IAE/C,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;yBACxB;qBAC3B;iBACF;aACF;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;yBACxB;qBAC7B;iBACF;aACF;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAA+B,CAAC;iBACxF;aACF;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,QAAQ;IACR,+CAA+C;IAE/C,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;yBACtD;wBAC5B;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;yBACtD;qBAC7B;iBACqB;aACzB;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAEtC,4BAA4B;QAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEtD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAErC,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;yBACrD;qBAC7B;iBACqB;aACzB;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,SAAS;IACT,+CAA+C;IAE/C,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE;gCACR;oCACE,IAAI,EAAE,WAAW;oCACjB,QAAQ,EAAE,IAAI;oCACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iCAChB;gCAC7B;oCACE,IAAI,EAAE,WAAW;oCACjB,QAAQ,EAAE,IAAI;oCACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;iCACjB;6BAC9B;yBACyB;wBAC5B;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE;gCACR;oCACE,IAAI,EAAE,WAAW;oCACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;iCACb;gCAC7B;oCACE,IAAI,EAAE,WAAW;oCACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;iCACb;6BAC9B;yBACyB;qBAC7B;iBACsB;aAC1B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,cAAc;IACd,+CAA+C;IAE/C,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,4BAA4B;iBACR;aAC9B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,cAAc;IACd,+CAA+C;IAE/C,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;iBAC1D;aAC/B;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,aAAa;IACb,+CAA+C;IAE/C,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAM;4BACZ,GAAG,EAAE,qBAAqB;4BAC1B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;yBAC3B;qBACzB;iBACF;aACF;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAExC,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,iBAAiB;IACjB,+CAA+C;IAE/C,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAkC,CAAC;SACtE,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,kBAAkB;IAClB,+CAA+C;IAE/C,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;SAC/E,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE;YACpC,KAAK,EAAE,aAAa;YACpB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,gCAAgC;AAChC,+CAA+C;AAE/C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,GAAG,GAAG;YACV,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE;gBACN;oBACE,EAAE,EAAE,SAAS;oBACb,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC;oBACf,aAAa,EAAE;wBACb,IAAI,EAAE,SAAkB;wBACxB,KAAK,EAAE,CAAU;wBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;qBAC7D;oBACD,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,WAAoB;4BAC1B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;yBAC1D;qBACF;iBACF;aACF;YACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SACxB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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"}