@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
@@ -0,0 +1,309 @@
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
+ import { describe, it, expect } from 'vitest';
8
+ import { createPackage } from '../ooxml/writer';
9
+ import { NS_WML, NS_R, REL_OFFICE_DOCUMENT, REL_STYLES, REL_NUMBERING, REL_HYPERLINK, CONTENT_TYPE_DOCX_DOCUMENT, CONTENT_TYPE_DOCX_STYLES, CONTENT_TYPE_DOCX_NUMBERING, } from '../ooxml/namespaces';
10
+ import { xmlDeclaration } from '../ooxml/xmlUtils';
11
+ import { docxToMarkdownDoc, docxToDoc } from '../docx/import';
12
+ async function buildTestDocx(options) {
13
+ const pkg = createPackage();
14
+ // document.xml
15
+ const documentXml = xmlDeclaration() +
16
+ `<w:document xmlns:w="${NS_WML}" xmlns:r="${NS_R}">` +
17
+ `<w:body>${options.bodyXml}</w:body>` +
18
+ `</w:document>`;
19
+ pkg.addPart('word/document.xml', documentXml, CONTENT_TYPE_DOCX_DOCUMENT);
20
+ // styles.xml
21
+ if (options.stylesXml) {
22
+ pkg.addPart('word/styles.xml', options.stylesXml, CONTENT_TYPE_DOCX_STYLES);
23
+ }
24
+ else {
25
+ // Minimal default styles
26
+ const defaultStyles = xmlDeclaration() +
27
+ `<w:styles xmlns:w="${NS_WML}">` +
28
+ `<w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/></w:style>` +
29
+ `<w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/></w:style>` +
30
+ `<w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/></w:style>` +
31
+ `<w:style w:type="paragraph" w:styleId="Quote"><w:name w:val="Quote"/></w:style>` +
32
+ `</w:styles>`;
33
+ pkg.addPart('word/styles.xml', defaultStyles, CONTENT_TYPE_DOCX_STYLES);
34
+ }
35
+ // numbering.xml
36
+ if (options.numberingXml) {
37
+ pkg.addPart('word/numbering.xml', options.numberingXml, CONTENT_TYPE_DOCX_NUMBERING);
38
+ }
39
+ // Root relationship
40
+ pkg.addRelationship('', {
41
+ id: 'rId1',
42
+ type: REL_OFFICE_DOCUMENT,
43
+ target: 'word/document.xml',
44
+ });
45
+ // Document relationships
46
+ pkg.addRelationship('word/document.xml', {
47
+ id: 'rIdStyles',
48
+ type: REL_STYLES,
49
+ target: 'styles.xml',
50
+ });
51
+ if (options.numberingXml) {
52
+ pkg.addRelationship('word/document.xml', {
53
+ id: 'rIdNumbering',
54
+ type: REL_NUMBERING,
55
+ target: 'numbering.xml',
56
+ });
57
+ }
58
+ if (options.documentRels) {
59
+ for (const rel of options.documentRels) {
60
+ pkg.addRelationship('word/document.xml', {
61
+ id: rel.id,
62
+ type: rel.type,
63
+ target: rel.target,
64
+ ...(rel.targetMode ? { targetMode: rel.targetMode } : {}),
65
+ });
66
+ }
67
+ }
68
+ return pkg.toArrayBuffer();
69
+ }
70
+ // ============================================
71
+ // Headings
72
+ // ============================================
73
+ describe('docxToMarkdownDoc', () => {
74
+ it('imports headings based on paragraph style', async () => {
75
+ const data = await buildTestDocx({
76
+ bodyXml: `<w:p><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:r><w:t>Title</w:t></w:r></w:p>` +
77
+ `<w:p><w:pPr><w:pStyle w:val="Heading2"/></w:pPr><w:r><w:t>Subtitle</w:t></w:r></w:p>`,
78
+ });
79
+ const doc = await docxToMarkdownDoc(data);
80
+ expect(doc.type).toBe('document');
81
+ expect(doc.children.length).toBe(2);
82
+ expect(doc.children[0].type).toBe('heading');
83
+ const h1 = doc.children[0];
84
+ expect(h1.depth).toBe(1);
85
+ expect(h1.children[0].type).toBe('text');
86
+ expect(h1.children[0].value).toBe('Title');
87
+ expect(doc.children[1].type).toBe('heading');
88
+ const h2 = doc.children[1];
89
+ expect(h2.depth).toBe(2);
90
+ expect(h2.children[0].value).toBe('Subtitle');
91
+ });
92
+ // ============================================
93
+ // Paragraphs
94
+ // ============================================
95
+ it('imports plain paragraphs', async () => {
96
+ const data = await buildTestDocx({
97
+ bodyXml: `<w:p><w:r><w:t>Hello world</w:t></w:r></w:p>` +
98
+ `<w:p><w:r><w:t>Second paragraph</w:t></w:r></w:p>`,
99
+ });
100
+ const doc = await docxToMarkdownDoc(data);
101
+ expect(doc.children.length).toBe(2);
102
+ expect(doc.children[0].type).toBe('paragraph');
103
+ expect(doc.children[0].children[0].value).toBe('Hello world');
104
+ });
105
+ it('skips empty paragraphs', async () => {
106
+ const data = await buildTestDocx({
107
+ bodyXml: `<w:p><w:pPr/></w:p><w:p><w:r><w:t>Text</w:t></w:r></w:p>`,
108
+ });
109
+ const doc = await docxToMarkdownDoc(data);
110
+ expect(doc.children.length).toBe(1);
111
+ expect(doc.children[0].children[0].value).toBe('Text');
112
+ });
113
+ // ============================================
114
+ // Inline Formatting
115
+ // ============================================
116
+ it('imports bold text', async () => {
117
+ const data = await buildTestDocx({
118
+ bodyXml: `<w:p><w:r><w:rPr><w:b/></w:rPr><w:t>bold</w:t></w:r></w:p>`,
119
+ });
120
+ const doc = await docxToMarkdownDoc(data);
121
+ const para = doc.children[0];
122
+ expect(para.children[0].type).toBe('strong');
123
+ const strong = para.children[0];
124
+ expect(strong.children[0].type).toBe('text');
125
+ expect(strong.children[0].value).toBe('bold');
126
+ });
127
+ it('imports italic text', async () => {
128
+ const data = await buildTestDocx({
129
+ bodyXml: `<w:p><w:r><w:rPr><w:i/></w:rPr><w:t>italic</w:t></w:r></w:p>`,
130
+ });
131
+ const doc = await docxToMarkdownDoc(data);
132
+ const para = doc.children[0];
133
+ expect(para.children[0].type).toBe('emphasis');
134
+ const em = para.children[0];
135
+ expect(em.children[0].value).toBe('italic');
136
+ });
137
+ it('imports strikethrough text', async () => {
138
+ const data = await buildTestDocx({
139
+ bodyXml: `<w:p><w:r><w:rPr><w:strike/></w:rPr><w:t>struck</w:t></w:r></w:p>`,
140
+ });
141
+ const doc = await docxToMarkdownDoc(data);
142
+ const para = doc.children[0];
143
+ const del = para.children[0];
144
+ expect(del.type).toBe('delete');
145
+ expect(del.children[0].value).toBe('struck');
146
+ });
147
+ it('imports bold+italic combined formatting', async () => {
148
+ const data = await buildTestDocx({
149
+ bodyXml: `<w:p><w:r><w:rPr><w:b/><w:i/></w:rPr><w:t>bold italic</w:t></w:r></w:p>`,
150
+ });
151
+ const doc = await docxToMarkdownDoc(data);
152
+ const para = doc.children[0];
153
+ // Should be strong > emphasis > text (bold wraps italic wraps text)
154
+ const strong = para.children[0];
155
+ expect(strong.type).toBe('strong');
156
+ const em = strong.children[0];
157
+ expect(em.type).toBe('emphasis');
158
+ expect(em.children[0].value).toBe('bold italic');
159
+ });
160
+ it('merges adjacent plain text runs', async () => {
161
+ const data = await buildTestDocx({
162
+ bodyXml: `<w:p>` + `<w:r><w:t>Hello </w:t></w:r>` + `<w:r><w:t>world</w:t></w:r>` + `</w:p>`,
163
+ });
164
+ const doc = await docxToMarkdownDoc(data);
165
+ const para = doc.children[0];
166
+ expect(para.children.length).toBe(1);
167
+ expect(para.children[0].type).toBe('text');
168
+ expect(para.children[0].value).toBe('Hello world');
169
+ });
170
+ // ============================================
171
+ // Hyperlinks
172
+ // ============================================
173
+ it('imports hyperlinks', async () => {
174
+ const data = await buildTestDocx({
175
+ bodyXml: `<w:p>` +
176
+ `<w:hyperlink r:id="rId10">` +
177
+ `<w:r><w:t>click me</w:t></w:r>` +
178
+ `</w:hyperlink>` +
179
+ `</w:p>`,
180
+ documentRels: [
181
+ {
182
+ id: 'rId10',
183
+ type: REL_HYPERLINK,
184
+ target: 'https://example.com',
185
+ targetMode: 'External',
186
+ },
187
+ ],
188
+ });
189
+ const doc = await docxToMarkdownDoc(data);
190
+ const para = doc.children[0];
191
+ const link = para.children[0];
192
+ expect(link.type).toBe('link');
193
+ expect(link.url).toBe('https://example.com');
194
+ expect(link.children[0].type).toBe('text');
195
+ expect(link.children[0].value).toBe('click me');
196
+ });
197
+ // ============================================
198
+ // Lists
199
+ // ============================================
200
+ it('imports bullet lists', async () => {
201
+ const numberingXml = xmlDeclaration() +
202
+ `<w:numbering xmlns:w="${NS_WML}">` +
203
+ `<w:abstractNum w:abstractNumId="1">` +
204
+ `<w:lvl w:ilvl="0"><w:numFmt w:val="bullet"/></w:lvl>` +
205
+ `</w:abstractNum>` +
206
+ `<w:num w:numId="1"><w:abstractNumId w:val="1"/></w:num>` +
207
+ `</w:numbering>`;
208
+ const data = await buildTestDocx({
209
+ bodyXml: `<w:p><w:pPr><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>` +
210
+ `<w:r><w:t>Item A</w:t></w:r></w:p>` +
211
+ `<w:p><w:pPr><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>` +
212
+ `<w:r><w:t>Item B</w:t></w:r></w:p>`,
213
+ numberingXml,
214
+ });
215
+ const doc = await docxToMarkdownDoc(data);
216
+ expect(doc.children[0].type).toBe('list');
217
+ const list = doc.children[0];
218
+ expect(list.ordered).toBe(false);
219
+ expect(list.children.length).toBe(2);
220
+ expect(list.children[0].type).toBe('listItem');
221
+ const listPara = list.children[0].children[0];
222
+ expect(listPara.children[0].value).toBe('Item A');
223
+ });
224
+ it('imports ordered lists', async () => {
225
+ const numberingXml = xmlDeclaration() +
226
+ `<w:numbering xmlns:w="${NS_WML}">` +
227
+ `<w:abstractNum w:abstractNumId="2">` +
228
+ `<w:lvl w:ilvl="0"><w:numFmt w:val="decimal"/></w:lvl>` +
229
+ `</w:abstractNum>` +
230
+ `<w:num w:numId="2"><w:abstractNumId w:val="2"/></w:num>` +
231
+ `</w:numbering>`;
232
+ const data = await buildTestDocx({
233
+ bodyXml: `<w:p><w:pPr><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr>` +
234
+ `<w:r><w:t>First</w:t></w:r></w:p>` +
235
+ `<w:p><w:pPr><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr>` +
236
+ `<w:r><w:t>Second</w:t></w:r></w:p>`,
237
+ numberingXml,
238
+ });
239
+ const doc = await docxToMarkdownDoc(data);
240
+ const list = doc.children[0];
241
+ expect(list.type).toBe('list');
242
+ expect(list.ordered).toBe(true);
243
+ });
244
+ // ============================================
245
+ // Tables
246
+ // ============================================
247
+ it('imports tables', async () => {
248
+ const data = await buildTestDocx({
249
+ bodyXml: `<w:tbl>` +
250
+ `<w:tr>` +
251
+ `<w:tc><w:p><w:r><w:t>A</w:t></w:r></w:p></w:tc>` +
252
+ `<w:tc><w:p><w:r><w:t>B</w:t></w:r></w:p></w:tc>` +
253
+ `</w:tr>` +
254
+ `<w:tr>` +
255
+ `<w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>` +
256
+ `<w:tc><w:p><w:r><w:t>2</w:t></w:r></w:p></w:tc>` +
257
+ `</w:tr>` +
258
+ `</w:tbl>`,
259
+ });
260
+ const doc = await docxToMarkdownDoc(data);
261
+ expect(doc.children[0].type).toBe('table');
262
+ const table = doc.children[0];
263
+ expect(table.children.length).toBe(2);
264
+ expect(table.children[0].children.length).toBe(2);
265
+ const cell00 = table.children[0].children[0];
266
+ const cell01 = table.children[0].children[1];
267
+ const cell10 = table.children[1].children[0];
268
+ expect(cell00.children[0].value).toBe('A');
269
+ expect(cell01.children[0].value).toBe('B');
270
+ expect(cell10.children[0].value).toBe('1');
271
+ });
272
+ // ============================================
273
+ // Empty Document
274
+ // ============================================
275
+ it('handles empty document', async () => {
276
+ const data = await buildTestDocx({ bodyXml: '' });
277
+ const doc = await docxToMarkdownDoc(data);
278
+ expect(doc.type).toBe('document');
279
+ expect(doc.children.length).toBe(0);
280
+ });
281
+ // ============================================
282
+ // Line Breaks
283
+ // ============================================
284
+ it('imports line breaks', async () => {
285
+ const data = await buildTestDocx({
286
+ bodyXml: `<w:p><w:r><w:t>Before</w:t></w:r><w:r><w:br/></w:r><w:r><w:t>After</w:t></w:r></w:p>`,
287
+ });
288
+ const doc = await docxToMarkdownDoc(data);
289
+ const para = doc.children[0];
290
+ expect(para.children.some((c) => c.type === 'break')).toBe(true);
291
+ });
292
+ });
293
+ // ============================================
294
+ // docxToDoc convenience wrapper
295
+ // ============================================
296
+ describe('docxToDoc', () => {
297
+ it('converts docx to a squisq Doc', async () => {
298
+ const data = await buildTestDocx({
299
+ bodyXml: `<w:p><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:r><w:t>Main Title</w:t></w:r></w:p>` +
300
+ `<w:p><w:r><w:t>Some content here.</w:t></w:r></w:p>`,
301
+ });
302
+ const doc = await docxToDoc(data);
303
+ expect(doc.articleId).toBeDefined();
304
+ expect(doc.blocks.length).toBeGreaterThan(0);
305
+ // The first block should have the heading
306
+ expect(doc.blocks[0].sourceHeading).toBeDefined();
307
+ });
308
+ });
309
+ //# sourceMappingURL=docxImport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docxImport.test.js","sourceRoot":"","sources":["../../src/__tests__/docxImport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,MAAM,EACN,IAAI,EACJ,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA8B9D,KAAK,UAAU,aAAa,CAAC,OAA2B;IACtD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,eAAe;IACf,MAAM,WAAW,GACf,cAAc,EAAE;QAChB,wBAAwB,MAAM,cAAc,IAAI,IAAI;QACpD,WAAW,OAAO,CAAC,OAAO,WAAW;QACrC,eAAe,CAAC;IAClB,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,WAAW,EAAE,0BAA0B,CAAC,CAAC;IAE1E,aAAa;IACb,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,MAAM,aAAa,GACjB,cAAc,EAAE;YAChB,sBAAsB,MAAM,IAAI;YAChC,wFAAwF;YACxF,wFAAwF;YACxF,wFAAwF;YACxF,iFAAiF;YACjF,aAAa,CAAC;QAChB,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,aAAa,EAAE,wBAAwB,CAAC,CAAC;IAC1E,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;IACvF,CAAC;IAED,oBAAoB;IACpB,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE;QACtB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,mBAAmB;KAC5B,CAAC,CAAC;IAEH,yBAAyB;IACzB,GAAG,CAAC,eAAe,CAAC,mBAAmB,EAAE;QACvC,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,GAAG,CAAC,eAAe,CAAC,mBAAmB,EAAE;YACvC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvC,GAAG,CAAC,eAAe,CAAC,mBAAmB,EAAE;gBACvC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC;AAED,+CAA+C;AAC/C,WAAW;AACX,+CAA+C;AAE/C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,mFAAmF;gBACnF,sFAAsF;SACzF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAoB,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAoB,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,aAAa;IACb,+CAA+C;IAE/C,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,8CAA8C;gBAC9C,mDAAmD;SACtD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAuB,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CACrF,aAAa,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,0DAA0D;SACpE,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAuB,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,oBAAoB;IACpB,+CAA+C;IAE/C,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,4DAA4D;SACtE,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAmB,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,8DAA8D;SACxE,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAqB,CAAC;QAChD,MAAM,CAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,mEAAmE;SAC7E,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAA0B,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,yEAAyE;SACnF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,oEAAoE;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAmB,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAqB,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,OAAO,GAAG,8BAA8B,GAAG,6BAA6B,GAAG,QAAQ;SAC7F,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,aAAa;IACb,+CAA+C;IAE/C,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,OAAO;gBACP,4BAA4B;gBAC5B,gCAAgC;gBAChC,gBAAgB;gBAChB,QAAQ;YACV,YAAY,EAAE;gBACZ;oBACE,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,qBAAqB;oBAC7B,UAAU,EAAE,UAAU;iBACvB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAiB,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,QAAQ;IACR,+CAA+C;IAE/C,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,YAAY,GAChB,cAAc,EAAE;YAChB,yBAAyB,MAAM,IAAI;YACnC,qCAAqC;YACrC,sDAAsD;YACtD,kBAAkB;YAClB,yDAAyD;YACzD,gBAAgB,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,gFAAgF;gBAChF,oCAAoC;gBACpC,gFAAgF;gBAChF,oCAAoC;YACtC,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAiB,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QACnE,MAAM,CAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,YAAY,GAChB,cAAc,EAAE;YAChB,yBAAyB,MAAM,IAAI;YACnC,qCAAqC;YACrC,uDAAuD;YACvD,kBAAkB;YAClB,yDAAyD;YACzD,gBAAgB,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,gFAAgF;gBAChF,mCAAmC;gBACnC,gFAAgF;gBAChF,oCAAoC;YACtC,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAiB,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,SAAS;IACT,+CAA+C;IAE/C,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,SAAS;gBACT,QAAQ;gBACR,iDAAiD;gBACjD,iDAAiD;gBACjD,SAAS;gBACT,QAAQ;gBACR,iDAAiD;gBACjD,iDAAiD;gBACjD,SAAS;gBACT,UAAU;SACb,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,iBAAiB;IACjB,+CAA+C;IAE/C,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,cAAc;IACd,+CAA+C;IAE/C,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EAAE,sFAAsF;SAChG,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAsB,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,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,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC;YAC/B,OAAO,EACL,wFAAwF;gBACxF,qDAAqD;SACxD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,0CAA0C;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
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
+ export {};
8
+ //# sourceMappingURL=html.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/html.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,243 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.test.js","sourceRoot":"","sources":["../../src/__tests__/html.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the shared OOXML layer: xmlUtils, writer, reader round-trips.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=ooxml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ooxml.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ooxml.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}