@bendyline/squisq-formats 1.2.3 → 1.3.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 (166) hide show
  1. package/dist/chunk-33YRFXZZ.js +1187 -0
  2. package/dist/chunk-33YRFXZZ.js.map +1 -0
  3. package/dist/{chunk-EUQQYBZZ.js → chunk-ERZ627GR.js} +4 -4
  4. package/dist/chunk-ERZ627GR.js.map +1 -0
  5. package/dist/{chunk-MEZF76JA.js → chunk-UDS45KUJ.js} +68 -25
  6. package/dist/chunk-UDS45KUJ.js.map +1 -0
  7. package/dist/{chunk-NGWHV77G.js → chunk-VN2KEOYB.js} +7 -6
  8. package/dist/chunk-VN2KEOYB.js.map +1 -0
  9. package/dist/container/index.d.ts +7 -5
  10. package/dist/container/index.js +39 -70
  11. package/dist/container/index.js.map +1 -1
  12. package/dist/docx/index.d.ts +128 -15
  13. package/dist/docx/index.js +17 -22
  14. package/dist/docx/index.js.map +1 -1
  15. package/dist/epub/index.d.ts +66 -11
  16. package/dist/epub/index.js +10 -18
  17. package/dist/epub/index.js.map +1 -1
  18. package/dist/html/index.d.ts +278 -9
  19. package/dist/html/index.js +26 -137
  20. package/dist/html/index.js.map +1 -1
  21. package/dist/index.d.ts +9 -38
  22. package/dist/index.js +62 -37
  23. package/dist/index.js.map +1 -1
  24. package/dist/ooxml/index.d.ts +353 -14
  25. package/dist/ooxml/index.js +116 -22
  26. package/dist/ooxml/index.js.map +1 -1
  27. package/dist/pdf/index.d.ts +143 -17
  28. package/dist/pdf/index.js +16 -25
  29. package/dist/pdf/index.js.map +1 -1
  30. package/dist/pptx/index.d.ts +83 -8
  31. package/dist/pptx/index.js +14 -34
  32. package/dist/pptx/index.js.map +1 -1
  33. package/dist/xlsx/index.d.ts +12 -9
  34. package/dist/xlsx/index.js +12 -44
  35. package/dist/xlsx/index.js.map +1 -1
  36. package/package.json +3 -2
  37. package/src/__tests__/html.test.ts +82 -4
  38. package/src/__tests__/pdfExport.test.ts +1 -1
  39. package/src/__tests__/plainHtml.test.ts +372 -0
  40. package/src/__tests__/plainHtmlBundle.test.ts +235 -0
  41. package/src/docx/export.ts +163 -22
  42. package/src/epub/export.ts +3 -3
  43. package/src/html/docsHtmlBundle.ts +369 -0
  44. package/src/html/htmlTemplate.ts +40 -0
  45. package/src/html/index.ts +32 -3
  46. package/src/html/plainHtml.ts +736 -0
  47. package/src/html/plainHtmlBundle.ts +419 -0
  48. package/src/pptx/export.ts +10 -9
  49. package/dist/__tests__/container.test.d.ts +0 -8
  50. package/dist/__tests__/container.test.d.ts.map +0 -1
  51. package/dist/__tests__/container.test.js +0 -147
  52. package/dist/__tests__/container.test.js.map +0 -1
  53. package/dist/__tests__/docxExport.test.d.ts +0 -8
  54. package/dist/__tests__/docxExport.test.d.ts.map +0 -1
  55. package/dist/__tests__/docxExport.test.js +0 -383
  56. package/dist/__tests__/docxExport.test.js.map +0 -1
  57. package/dist/__tests__/docxImport.test.d.ts +0 -8
  58. package/dist/__tests__/docxImport.test.d.ts.map +0 -1
  59. package/dist/__tests__/docxImport.test.js +0 -309
  60. package/dist/__tests__/docxImport.test.js.map +0 -1
  61. package/dist/__tests__/epub.test.d.ts +0 -8
  62. package/dist/__tests__/epub.test.d.ts.map +0 -1
  63. package/dist/__tests__/epub.test.js +0 -472
  64. package/dist/__tests__/epub.test.js.map +0 -1
  65. package/dist/__tests__/html.test.d.ts +0 -8
  66. package/dist/__tests__/html.test.d.ts.map +0 -1
  67. package/dist/__tests__/html.test.js +0 -243
  68. package/dist/__tests__/html.test.js.map +0 -1
  69. package/dist/__tests__/ooxml.test.d.ts +0 -5
  70. package/dist/__tests__/ooxml.test.d.ts.map +0 -1
  71. package/dist/__tests__/ooxml.test.js +0 -152
  72. package/dist/__tests__/ooxml.test.js.map +0 -1
  73. package/dist/__tests__/pdfExport.test.d.ts +0 -8
  74. package/dist/__tests__/pdfExport.test.d.ts.map +0 -1
  75. package/dist/__tests__/pdfExport.test.js +0 -275
  76. package/dist/__tests__/pdfExport.test.js.map +0 -1
  77. package/dist/__tests__/pdfImport.test.d.ts +0 -11
  78. package/dist/__tests__/pdfImport.test.d.ts.map +0 -1
  79. package/dist/__tests__/pdfImport.test.js +0 -254
  80. package/dist/__tests__/pdfImport.test.js.map +0 -1
  81. package/dist/__tests__/roundTrip.test.d.ts +0 -7
  82. package/dist/__tests__/roundTrip.test.d.ts.map +0 -1
  83. package/dist/__tests__/roundTrip.test.js +0 -173
  84. package/dist/__tests__/roundTrip.test.js.map +0 -1
  85. package/dist/chunk-EUQQYBZZ.js.map +0 -1
  86. package/dist/chunk-MEZF76JA.js.map +0 -1
  87. package/dist/chunk-NGWHV77G.js.map +0 -1
  88. package/dist/chunk-UM5V2XZG.js +0 -242
  89. package/dist/chunk-UM5V2XZG.js.map +0 -1
  90. package/dist/container/index.d.ts.map +0 -1
  91. package/dist/docx/export.d.ts +0 -69
  92. package/dist/docx/export.d.ts.map +0 -1
  93. package/dist/docx/export.js +0 -854
  94. package/dist/docx/export.js.map +0 -1
  95. package/dist/docx/import.d.ts +0 -65
  96. package/dist/docx/import.d.ts.map +0 -1
  97. package/dist/docx/import.js +0 -779
  98. package/dist/docx/import.js.map +0 -1
  99. package/dist/docx/index.d.ts.map +0 -1
  100. package/dist/docx/styles.d.ts +0 -68
  101. package/dist/docx/styles.d.ts.map +0 -1
  102. package/dist/docx/styles.js +0 -125
  103. package/dist/docx/styles.js.map +0 -1
  104. package/dist/epub/export.d.ts +0 -72
  105. package/dist/epub/export.d.ts.map +0 -1
  106. package/dist/epub/export.js +0 -698
  107. package/dist/epub/export.js.map +0 -1
  108. package/dist/epub/index.d.ts.map +0 -1
  109. package/dist/html/htmlTemplate.d.ts +0 -70
  110. package/dist/html/htmlTemplate.d.ts.map +0 -1
  111. package/dist/html/htmlTemplate.js +0 -239
  112. package/dist/html/htmlTemplate.js.map +0 -1
  113. package/dist/html/imageUtils.d.ts +0 -29
  114. package/dist/html/imageUtils.d.ts.map +0 -1
  115. package/dist/html/imageUtils.js +0 -63
  116. package/dist/html/imageUtils.js.map +0 -1
  117. package/dist/html/index.d.ts.map +0 -1
  118. package/dist/index.d.ts.map +0 -1
  119. package/dist/ooxml/index.d.ts.map +0 -1
  120. package/dist/ooxml/namespaces.d.ts +0 -77
  121. package/dist/ooxml/namespaces.d.ts.map +0 -1
  122. package/dist/ooxml/namespaces.js +0 -104
  123. package/dist/ooxml/namespaces.js.map +0 -1
  124. package/dist/ooxml/reader.d.ts +0 -52
  125. package/dist/ooxml/reader.d.ts.map +0 -1
  126. package/dist/ooxml/reader.js +0 -190
  127. package/dist/ooxml/reader.js.map +0 -1
  128. package/dist/ooxml/types.d.ts +0 -82
  129. package/dist/ooxml/types.d.ts.map +0 -1
  130. package/dist/ooxml/types.js +0 -9
  131. package/dist/ooxml/types.js.map +0 -1
  132. package/dist/ooxml/writer.d.ts +0 -71
  133. package/dist/ooxml/writer.d.ts.map +0 -1
  134. package/dist/ooxml/writer.js +0 -200
  135. package/dist/ooxml/writer.js.map +0 -1
  136. package/dist/ooxml/xmlUtils.d.ts +0 -76
  137. package/dist/ooxml/xmlUtils.d.ts.map +0 -1
  138. package/dist/ooxml/xmlUtils.js +0 -108
  139. package/dist/ooxml/xmlUtils.js.map +0 -1
  140. package/dist/pdf/export.d.ts +0 -56
  141. package/dist/pdf/export.d.ts.map +0 -1
  142. package/dist/pdf/export.js +0 -768
  143. package/dist/pdf/export.js.map +0 -1
  144. package/dist/pdf/import.d.ts +0 -94
  145. package/dist/pdf/import.d.ts.map +0 -1
  146. package/dist/pdf/import.js +0 -796
  147. package/dist/pdf/import.js.map +0 -1
  148. package/dist/pdf/index.d.ts.map +0 -1
  149. package/dist/pdf/styles.d.ts +0 -142
  150. package/dist/pdf/styles.d.ts.map +0 -1
  151. package/dist/pdf/styles.js +0 -145
  152. package/dist/pdf/styles.js.map +0 -1
  153. package/dist/pptx/export.d.ts +0 -75
  154. package/dist/pptx/export.d.ts.map +0 -1
  155. package/dist/pptx/export.js +0 -722
  156. package/dist/pptx/export.js.map +0 -1
  157. package/dist/pptx/index.d.ts.map +0 -1
  158. package/dist/pptx/styles.d.ts +0 -54
  159. package/dist/pptx/styles.d.ts.map +0 -1
  160. package/dist/pptx/styles.js +0 -73
  161. package/dist/pptx/styles.js.map +0 -1
  162. package/dist/pptx/templates.d.ts +0 -24
  163. package/dist/pptx/templates.d.ts.map +0 -1
  164. package/dist/pptx/templates.js +0 -158
  165. package/dist/pptx/templates.js.map +0 -1
  166. package/dist/xlsx/index.d.ts.map +0 -1
@@ -1,243 +0,0 @@
1
- /**
2
- * Tests for HTML export: docToHtml, docToHtmlZip, image utilities.
3
- *
4
- * Verifies that generated HTML contains the expected structure,
5
- * embedded script, and image handling. ZIP exports are also validated.
6
- */
7
- import { describe, it, expect } from 'vitest';
8
- import JSZip from 'jszip';
9
- import { docToHtml, docToHtmlZip, collectImagePaths } from '../html/index';
10
- import { inferMimeType, arrayBufferToBase64DataUrl, extractFilename } from '../html/imageUtils';
11
- // ============================================
12
- // Helpers
13
- // ============================================
14
- const MOCK_PLAYER_SCRIPT = 'var SquisqPlayer={mount:function(){}};';
15
- /** Helper to read a Blob as Uint8Array (works in jsdom where blob.arrayBuffer() may not exist) */
16
- async function blobToUint8Array(blob) {
17
- return new Promise((resolve, reject) => {
18
- const reader = new FileReader();
19
- reader.onload = () => resolve(new Uint8Array(reader.result));
20
- reader.onerror = () => reject(reader.error);
21
- reader.readAsArrayBuffer(blob);
22
- });
23
- }
24
- function makeDoc(overrides = {}) {
25
- return {
26
- articleId: 'test-doc',
27
- duration: 10,
28
- blocks: [],
29
- audio: {
30
- segments: [{ src: 'intro.mp3', name: 'intro', duration: 10, startTime: 0 }],
31
- },
32
- ...overrides,
33
- };
34
- }
35
- function makeImageBlock(imageSrc) {
36
- const layer = {
37
- id: 'img-1',
38
- type: 'image',
39
- position: { x: 0, y: 0, width: '100%', height: '100%' },
40
- content: { src: imageSrc, alt: 'test image' },
41
- };
42
- return {
43
- id: 'block-1',
44
- startTime: 0,
45
- duration: 5,
46
- audioSegment: 0,
47
- layers: [layer],
48
- };
49
- }
50
- function makeImageBuffer() {
51
- // Minimal 1x1 PNG
52
- const bytes = new Uint8Array([
53
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
54
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53,
55
- 0xde, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, 0xcf, 0xc0, 0x00,
56
- 0x00, 0x00, 0x02, 0x00, 0x01, 0xe2, 0x21, 0xbc, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
57
- 0x44, 0xae, 0x42, 0x60, 0x82,
58
- ]);
59
- return bytes.buffer;
60
- }
61
- // ============================================
62
- // Image Utilities
63
- // ============================================
64
- describe('inferMimeType', () => {
65
- it('returns correct MIME types for common extensions', () => {
66
- expect(inferMimeType('photo.jpg')).toBe('image/jpeg');
67
- expect(inferMimeType('photo.jpeg')).toBe('image/jpeg');
68
- expect(inferMimeType('logo.png')).toBe('image/png');
69
- expect(inferMimeType('anim.gif')).toBe('image/gif');
70
- expect(inferMimeType('hero.webp')).toBe('image/webp');
71
- expect(inferMimeType('icon.svg')).toBe('image/svg+xml');
72
- expect(inferMimeType('track.mp3')).toBe('audio/mpeg');
73
- });
74
- it('returns octet-stream for unknown extensions', () => {
75
- expect(inferMimeType('data.xyz')).toBe('application/octet-stream');
76
- expect(inferMimeType('noext')).toBe('application/octet-stream');
77
- });
78
- });
79
- describe('arrayBufferToBase64DataUrl', () => {
80
- it('produces a valid data URI', () => {
81
- const buffer = new TextEncoder().encode('hello').buffer;
82
- const result = arrayBufferToBase64DataUrl(buffer, 'text/plain');
83
- expect(result).toMatch(/^data:text\/plain;base64,/);
84
- expect(result).toBe('data:text/plain;base64,aGVsbG8=');
85
- });
86
- });
87
- describe('extractFilename', () => {
88
- it('extracts filename from path', () => {
89
- expect(extractFilename('images/hero.jpg')).toBe('hero.jpg');
90
- expect(extractFilename('hero.jpg')).toBe('hero.jpg');
91
- expect(extractFilename('a/b/c/deep.png')).toBe('deep.png');
92
- });
93
- it('strips query and hash', () => {
94
- expect(extractFilename('photo.jpg?v=2')).toBe('photo.jpg');
95
- expect(extractFilename('photo.jpg#anchor')).toBe('photo.jpg');
96
- });
97
- });
98
- // ============================================
99
- // Image Path Collection
100
- // ============================================
101
- describe('collectImagePaths', () => {
102
- it('collects image layer src from blocks', () => {
103
- const doc = makeDoc({ blocks: [makeImageBlock('hero.jpg')] });
104
- const paths = collectImagePaths(doc);
105
- expect(paths.has('hero.jpg')).toBe(true);
106
- });
107
- it('ignores absolute URLs', () => {
108
- const doc = makeDoc({ blocks: [makeImageBlock('https://example.com/photo.jpg')] });
109
- const paths = collectImagePaths(doc);
110
- expect(paths.size).toBe(0);
111
- });
112
- it('ignores data URIs', () => {
113
- const doc = makeDoc({ blocks: [makeImageBlock('data:image/png;base64,abc')] });
114
- const paths = collectImagePaths(doc);
115
- expect(paths.size).toBe(0);
116
- });
117
- it('collects startBlock heroSrc', () => {
118
- const doc = makeDoc({ startBlock: { heroSrc: 'cover.jpg', title: 'Test' } });
119
- const paths = collectImagePaths(doc);
120
- expect(paths.has('cover.jpg')).toBe(true);
121
- });
122
- });
123
- // ============================================
124
- // Single HTML Export
125
- // ============================================
126
- describe('docToHtml', () => {
127
- it('produces a complete HTML document', () => {
128
- const doc = makeDoc();
129
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT });
130
- expect(html).toContain('<!DOCTYPE html>');
131
- expect(html).toContain('<html');
132
- expect(html).toContain('</html>');
133
- expect(html).toContain('<meta charset="UTF-8">');
134
- expect(html).toContain('<div id="squisq-root">');
135
- });
136
- it('embeds the player script inline', () => {
137
- const doc = makeDoc();
138
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT });
139
- expect(html).toContain(MOCK_PLAYER_SCRIPT);
140
- });
141
- it('embeds the doc JSON', () => {
142
- const doc = makeDoc();
143
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT });
144
- expect(html).toContain('test-doc');
145
- });
146
- it('calls SquisqPlayer.mount', () => {
147
- const doc = makeDoc();
148
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT });
149
- expect(html).toContain('SquisqPlayer.mount');
150
- });
151
- it('sets the page title', () => {
152
- const doc = makeDoc();
153
- const html = docToHtml(doc, {
154
- playerScript: MOCK_PLAYER_SCRIPT,
155
- title: 'My Amazing Doc',
156
- });
157
- expect(html).toContain('<title>My Amazing Doc</title>');
158
- });
159
- it('uses slideshow mode by default', () => {
160
- const doc = makeDoc();
161
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT });
162
- expect(html).toContain('"slideshow"');
163
- });
164
- it('supports static mode', () => {
165
- const doc = makeDoc();
166
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT, mode: 'static' });
167
- expect(html).toContain('"static"');
168
- });
169
- it('inlines images as base64 data URIs', () => {
170
- const doc = makeDoc({ blocks: [makeImageBlock('hero.png')] });
171
- const images = new Map([['hero.png', makeImageBuffer()]]);
172
- const html = docToHtml(doc, { playerScript: MOCK_PLAYER_SCRIPT, images });
173
- expect(html).toContain('data:image/png;base64,');
174
- });
175
- it('escapes script-breaking content in title', () => {
176
- const doc = makeDoc();
177
- const html = docToHtml(doc, {
178
- playerScript: MOCK_PLAYER_SCRIPT,
179
- title: '<script>alert("xss")</script>',
180
- });
181
- // Title should be escaped
182
- expect(html).not.toContain('<script>alert');
183
- expect(html).toContain('&lt;script&gt;');
184
- });
185
- });
186
- // ============================================
187
- // ZIP Archive Export
188
- // ============================================
189
- describe('docToHtmlZip', () => {
190
- it('produces a valid ZIP blob', async () => {
191
- const doc = makeDoc();
192
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT });
193
- expect(blob).toBeInstanceOf(Blob);
194
- expect(blob.size).toBeGreaterThan(0);
195
- });
196
- it('contains index.html and squisq-player.js', async () => {
197
- const doc = makeDoc();
198
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT });
199
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
200
- expect(zip.file('index.html')).not.toBeNull();
201
- expect(zip.file('squisq-player.js')).not.toBeNull();
202
- });
203
- it('references player script via src attribute', async () => {
204
- const doc = makeDoc();
205
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT });
206
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
207
- const html = await zip.file('index.html').async('text');
208
- expect(html).toContain('src="squisq-player.js"');
209
- // Should NOT contain the inline script
210
- expect(html).not.toContain(MOCK_PLAYER_SCRIPT);
211
- });
212
- it('includes images in images/ folder', async () => {
213
- const doc = makeDoc({ blocks: [makeImageBlock('hero.png')] });
214
- const images = new Map([['hero.png', makeImageBuffer()]]);
215
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT, images });
216
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
217
- expect(zip.file('images/hero.png')).not.toBeNull();
218
- });
219
- it('includes audio in audio/ folder when provided', async () => {
220
- const audioData = new Uint8Array([0x49, 0x44, 0x33, 0x00]).buffer;
221
- const doc = makeDoc();
222
- const audio = new Map([['intro.mp3', audioData]]);
223
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT, audio });
224
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
225
- expect(zip.file('audio/intro.mp3')).not.toBeNull();
226
- });
227
- it('HTML references doc JSON inline', async () => {
228
- const doc = makeDoc();
229
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT });
230
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
231
- const html = await zip.file('index.html').async('text');
232
- expect(html).toContain('test-doc');
233
- expect(html).toContain('SquisqPlayer.mount');
234
- });
235
- it('player.js contains the provided script', async () => {
236
- const doc = makeDoc();
237
- const blob = await docToHtmlZip(doc, { playerScript: MOCK_PLAYER_SCRIPT });
238
- const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
239
- const js = await zip.file('squisq-player.js').async('text');
240
- expect(js).toBe(MOCK_PLAYER_SCRIPT);
241
- });
242
- });
243
- //# sourceMappingURL=html.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"html.test.js","sourceRoot":"","sources":["../../src/__tests__/html.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for the shared OOXML layer: xmlUtils, writer, reader round-trips.
3
- */
4
- export {};
5
- //# sourceMappingURL=ooxml.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ooxml.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ooxml.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,152 +0,0 @@
1
- /**
2
- * Tests for the shared OOXML layer: xmlUtils, writer, reader round-trips.
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { escapeXml, xmlElement, selfClosingElement, textElement, attrString, xmlDeclaration, } from '../ooxml/xmlUtils';
6
- import { createPackage } from '../ooxml/writer';
7
- import { openPackage, getPartXml, getCoreProperties, getPartRelationships } from '../ooxml/reader';
8
- import { REL_OFFICE_DOCUMENT } from '../ooxml/namespaces';
9
- // ============================================
10
- // XML Utilities
11
- // ============================================
12
- describe('escapeXml', () => {
13
- it('escapes all five XML entities', () => {
14
- expect(escapeXml('a & b < c > d " e \' f')).toBe('a &amp; b &lt; c &gt; d &quot; e &apos; f');
15
- });
16
- it('returns empty string unchanged', () => {
17
- expect(escapeXml('')).toBe('');
18
- });
19
- it('returns plain text unchanged', () => {
20
- expect(escapeXml('hello world')).toBe('hello world');
21
- });
22
- });
23
- describe('attrString', () => {
24
- it('builds attribute string from object', () => {
25
- const result = attrString({ 'w:val': 'Heading1' });
26
- expect(result).toBe(' w:val="Heading1"');
27
- });
28
- it('omits undefined values', () => {
29
- const result = attrString({ 'w:val': 'test', 'w:other': undefined });
30
- expect(result).toBe(' w:val="test"');
31
- });
32
- it('returns empty string for empty attrs', () => {
33
- expect(attrString({})).toBe('');
34
- expect(attrString(undefined)).toBe('');
35
- });
36
- });
37
- describe('selfClosingElement', () => {
38
- it('builds self-closing tag', () => {
39
- expect(selfClosingElement('w:b')).toBe('<w:b/>');
40
- });
41
- it('includes attributes', () => {
42
- expect(selfClosingElement('w:pStyle', { 'w:val': 'Heading1' })).toBe('<w:pStyle w:val="Heading1"/>');
43
- });
44
- });
45
- describe('xmlElement', () => {
46
- it('builds element with children', () => {
47
- expect(xmlElement('w:p', {}, 'content')).toBe('<w:p>content</w:p>');
48
- });
49
- it('self-closes when no children', () => {
50
- expect(xmlElement('w:p', {})).toBe('<w:p/>');
51
- });
52
- it('concatenates multiple children', () => {
53
- expect(xmlElement('w:p', {}, 'a', 'b')).toBe('<w:p>ab</w:p>');
54
- });
55
- });
56
- describe('textElement', () => {
57
- it('escapes text content', () => {
58
- expect(textElement('w:t', {}, 'a & b')).toBe('<w:t>a &amp; b</w:t>');
59
- });
60
- it('self-closes when no text', () => {
61
- expect(textElement('w:t', {})).toBe('<w:t/>');
62
- });
63
- });
64
- describe('xmlDeclaration', () => {
65
- it('returns standard XML declaration', () => {
66
- expect(xmlDeclaration()).toBe('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
67
- });
68
- });
69
- // ============================================
70
- // Package Writer + Reader Round-Trip
71
- // ============================================
72
- describe('createPackage / openPackage round-trip', () => {
73
- it('creates a valid ZIP with content types and parts', async () => {
74
- const pkg = createPackage();
75
- pkg.addPart('word/document.xml', '<w:document><w:body/></w:document>', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml');
76
- pkg.addRelationship('', {
77
- id: 'rId1',
78
- type: REL_OFFICE_DOCUMENT,
79
- target: 'word/document.xml',
80
- });
81
- const arrayBuffer = await pkg.toArrayBuffer();
82
- expect(arrayBuffer).toBeInstanceOf(ArrayBuffer);
83
- expect(arrayBuffer.byteLength).toBeGreaterThan(0);
84
- // Read it back
85
- const opened = await openPackage(arrayBuffer);
86
- expect(opened.zip).toBeDefined();
87
- expect(opened.contentTypes.overrides.has('word/document.xml')).toBe(true);
88
- expect(opened.rootRelationships.length).toBeGreaterThanOrEqual(1);
89
- expect(opened.rootRelationships[0].type).toBe(REL_OFFICE_DOCUMENT);
90
- });
91
- it('round-trips XML part content', async () => {
92
- const pkg = createPackage();
93
- const testXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><child attr="value">text</child></root>';
94
- pkg.addPart('test/data.xml', testXml, 'application/xml');
95
- const buffer = await pkg.toArrayBuffer();
96
- const opened = await openPackage(buffer);
97
- const doc = await getPartXml(opened, 'test/data.xml');
98
- expect(doc).not.toBeNull();
99
- const child = doc.getElementsByTagName('child')[0];
100
- expect(child.getAttribute('attr')).toBe('value');
101
- expect(child.textContent).toBe('text');
102
- });
103
- it('round-trips core properties', async () => {
104
- const pkg = createPackage();
105
- pkg.addPart('word/document.xml', '<doc/>', 'application/xml');
106
- pkg.setCoreProperties({
107
- title: 'Test Title',
108
- creator: 'Test Author',
109
- description: 'Test description with <special> & chars',
110
- });
111
- const buffer = await pkg.toArrayBuffer();
112
- const opened = await openPackage(buffer);
113
- const props = await getCoreProperties(opened);
114
- expect(props.title).toBe('Test Title');
115
- expect(props.creator).toBe('Test Author');
116
- expect(props.description).toBe('Test description with <special> & chars');
117
- });
118
- it('round-trips part relationships', async () => {
119
- const pkg = createPackage();
120
- pkg.addPart('word/document.xml', '<doc/>', 'application/xml');
121
- pkg.addRelationship('word/document.xml', {
122
- id: 'rId1',
123
- type: 'http://example.com/styles',
124
- target: 'styles.xml',
125
- });
126
- pkg.addRelationship('word/document.xml', {
127
- id: 'rId2',
128
- type: 'http://example.com/hyperlink',
129
- target: 'https://example.com',
130
- targetMode: 'External',
131
- });
132
- const buffer = await pkg.toArrayBuffer();
133
- const opened = await openPackage(buffer);
134
- const rels = await getPartRelationships(opened, 'word/document.xml');
135
- expect(rels.length).toBe(2);
136
- expect(rels[0].id).toBe('rId1');
137
- expect(rels[0].target).toBe('styles.xml');
138
- expect(rels[1].id).toBe('rId2');
139
- expect(rels[1].target).toBe('https://example.com');
140
- expect(rels[1].targetMode).toBe('External');
141
- });
142
- it('handles binary parts', async () => {
143
- const pkg = createPackage();
144
- const testData = new Uint8Array([0x89, 0x50, 0x4e, 0x47]); // PNG magic bytes
145
- pkg.addBinaryPart('word/media/image1.png', testData, 'image/png');
146
- const buffer = await pkg.toArrayBuffer();
147
- const opened = await openPackage(buffer);
148
- // Binary part should appear in content types via extension default
149
- expect(opened.contentTypes.defaults.has('png')).toBe(true);
150
- });
151
- });
152
- //# sourceMappingURL=ooxml.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ooxml.test.js","sourceRoot":"","sources":["../../src/__tests__/ooxml.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tests for PDF export: markdownDocToPdf, docToPdf.
3
- *
4
- * Exports various MarkdownDocuments to PDF, then re-opens the
5
- * resulting ArrayBuffers with pdf-lib to verify structure/metadata.
6
- */
7
- export {};
8
- //# sourceMappingURL=pdfExport.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdfExport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pdfExport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}