@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,152 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ooxml.test.js","sourceRoot":"","sources":["../../src/__tests__/ooxml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfExport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pdfExport.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,275 @@
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
+ import { describe, it, expect } from 'vitest';
8
+ import { PDFDocument } from 'pdf-lib';
9
+ import { markdownDocToPdf, docToPdf } from '../pdf/export';
10
+ // ============================================
11
+ // Helpers
12
+ // ============================================
13
+ async function exportAndLoad(doc, options) {
14
+ const buffer = await markdownDocToPdf(doc, options);
15
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
16
+ expect(buffer.byteLength).toBeGreaterThan(0);
17
+ return PDFDocument.load(buffer);
18
+ }
19
+ function text(value) {
20
+ return { type: 'text', value };
21
+ }
22
+ // ============================================
23
+ // Basic Structure
24
+ // ============================================
25
+ describe('markdownDocToPdf', () => {
26
+ it('produces a valid PDF for an empty document', async () => {
27
+ const doc = { type: 'document', children: [] };
28
+ const pdf = await exportAndLoad(doc);
29
+ expect(pdf.getPageCount()).toBeGreaterThanOrEqual(1);
30
+ });
31
+ it('sets title and author metadata', async () => {
32
+ const doc = { type: 'document', children: [] };
33
+ const pdf = await exportAndLoad(doc, { title: 'Test Title', author: 'Test Author' });
34
+ expect(pdf.getTitle()).toBe('Test Title');
35
+ expect(pdf.getAuthor()).toBe('Test Author');
36
+ });
37
+ it('renders a single paragraph', async () => {
38
+ const doc = {
39
+ type: 'document',
40
+ children: [
41
+ {
42
+ type: 'paragraph',
43
+ children: [text('Hello, World!')],
44
+ },
45
+ ],
46
+ };
47
+ const pdf = await exportAndLoad(doc);
48
+ expect(pdf.getPageCount()).toBe(1);
49
+ });
50
+ it('renders headings at various depths', async () => {
51
+ const children = [1, 2, 3, 4, 5, 6].map((d) => ({
52
+ type: 'heading',
53
+ depth: d,
54
+ children: [text(`Heading Level ${d}`)],
55
+ }));
56
+ const doc = { type: 'document', children };
57
+ const pdf = await exportAndLoad(doc);
58
+ expect(pdf.getPageCount()).toBeGreaterThanOrEqual(1);
59
+ });
60
+ it('renders inline formatting (bold, italic, code)', async () => {
61
+ const doc = {
62
+ type: 'document',
63
+ children: [
64
+ {
65
+ type: 'paragraph',
66
+ children: [
67
+ text('Normal '),
68
+ { type: 'strong', children: [text('bold')] },
69
+ text(' '),
70
+ { type: 'emphasis', children: [text('italic')] },
71
+ text(' '),
72
+ { type: 'inlineCode', value: 'code' },
73
+ ],
74
+ },
75
+ ],
76
+ };
77
+ // Should not throw
78
+ const pdf = await exportAndLoad(doc);
79
+ expect(pdf.getPageCount()).toBe(1);
80
+ });
81
+ it('renders a link', async () => {
82
+ const doc = {
83
+ type: 'document',
84
+ children: [
85
+ {
86
+ type: 'paragraph',
87
+ children: [
88
+ text('See '),
89
+ {
90
+ type: 'link',
91
+ url: 'https://example.com',
92
+ children: [text('Example')],
93
+ },
94
+ ],
95
+ },
96
+ ],
97
+ };
98
+ const pdf = await exportAndLoad(doc);
99
+ expect(pdf.getPageCount()).toBe(1);
100
+ });
101
+ it('renders unordered and ordered lists', async () => {
102
+ const unordered = {
103
+ type: 'list',
104
+ ordered: false,
105
+ children: [
106
+ {
107
+ type: 'listItem',
108
+ children: [{ type: 'paragraph', children: [text('Apple')] }],
109
+ },
110
+ {
111
+ type: 'listItem',
112
+ children: [{ type: 'paragraph', children: [text('Banana')] }],
113
+ },
114
+ ],
115
+ };
116
+ const ordered = {
117
+ type: 'list',
118
+ ordered: true,
119
+ children: [
120
+ {
121
+ type: 'listItem',
122
+ children: [{ type: 'paragraph', children: [text('First')] }],
123
+ },
124
+ {
125
+ type: 'listItem',
126
+ children: [{ type: 'paragraph', children: [text('Second')] }],
127
+ },
128
+ ],
129
+ };
130
+ const doc = { type: 'document', children: [unordered, ordered] };
131
+ const pdf = await exportAndLoad(doc);
132
+ expect(pdf.getPageCount()).toBeGreaterThanOrEqual(1);
133
+ });
134
+ it('renders a code block', async () => {
135
+ const doc = {
136
+ type: 'document',
137
+ children: [
138
+ {
139
+ type: 'code',
140
+ value: 'function hello() {\n return "world";\n}',
141
+ },
142
+ ],
143
+ };
144
+ const pdf = await exportAndLoad(doc);
145
+ expect(pdf.getPageCount()).toBe(1);
146
+ });
147
+ it('renders a blockquote', async () => {
148
+ const doc = {
149
+ type: 'document',
150
+ children: [
151
+ {
152
+ type: 'blockquote',
153
+ children: [{ type: 'paragraph', children: [text('Quoted text')] }],
154
+ },
155
+ ],
156
+ };
157
+ const pdf = await exportAndLoad(doc);
158
+ expect(pdf.getPageCount()).toBe(1);
159
+ });
160
+ it('renders a table', async () => {
161
+ const row = (cells, isHeader) => ({
162
+ type: 'tableRow',
163
+ children: cells.map((c) => ({
164
+ type: 'tableCell',
165
+ isHeader,
166
+ children: [text(c)],
167
+ })),
168
+ });
169
+ const doc = {
170
+ type: 'document',
171
+ children: [
172
+ {
173
+ type: 'table',
174
+ children: [
175
+ row(['Name', 'Age', 'City'], true),
176
+ row(['Alice', '30', 'NYC'], false),
177
+ row(['Bob', '25', 'LA'], false),
178
+ ],
179
+ },
180
+ ],
181
+ };
182
+ const pdf = await exportAndLoad(doc);
183
+ expect(pdf.getPageCount()).toBeGreaterThanOrEqual(1);
184
+ });
185
+ it('renders a thematic break', async () => {
186
+ const doc = {
187
+ type: 'document',
188
+ children: [
189
+ { type: 'paragraph', children: [text('Before')] },
190
+ { type: 'thematicBreak' },
191
+ { type: 'paragraph', children: [text('After')] },
192
+ ],
193
+ };
194
+ const pdf = await exportAndLoad(doc);
195
+ expect(pdf.getPageCount()).toBe(1);
196
+ });
197
+ it('uses A4 page size when specified', async () => {
198
+ const doc = {
199
+ type: 'document',
200
+ children: [{ type: 'paragraph', children: [text('A4 page')] }],
201
+ };
202
+ const pdf = await exportAndLoad(doc, { pageSize: 'a4' });
203
+ const page = pdf.getPage(0);
204
+ const { width, height } = page.getSize();
205
+ // A4 is approximately 595 × 842
206
+ expect(width).toBeCloseTo(595.28, 0);
207
+ expect(height).toBeCloseTo(841.89, 0);
208
+ });
209
+ it('paginates long documents', async () => {
210
+ const children = [];
211
+ // Each paragraph is a few lines — 100 paragraphs should overflow a page
212
+ for (let i = 0; i < 100; i++) {
213
+ children.push({
214
+ type: 'paragraph',
215
+ children: [text(`Paragraph number ${i + 1}. This is some body text to fill the page.`)],
216
+ });
217
+ }
218
+ const doc = { type: 'document', children };
219
+ const pdf = await exportAndLoad(doc);
220
+ expect(pdf.getPageCount()).toBeGreaterThan(1);
221
+ });
222
+ it('handles nested lists', async () => {
223
+ const inner = {
224
+ type: 'list',
225
+ ordered: false,
226
+ children: [
227
+ {
228
+ type: 'listItem',
229
+ children: [{ type: 'paragraph', children: [text('Nested item')] }],
230
+ },
231
+ ],
232
+ };
233
+ const outer = {
234
+ type: 'list',
235
+ ordered: false,
236
+ children: [
237
+ {
238
+ type: 'listItem',
239
+ children: [
240
+ { type: 'paragraph', children: [text('Outer item')] },
241
+ inner,
242
+ ],
243
+ },
244
+ ],
245
+ };
246
+ const doc = { type: 'document', children: [outer] };
247
+ const pdf = await exportAndLoad(doc);
248
+ expect(pdf.getPageCount()).toBeGreaterThanOrEqual(1);
249
+ });
250
+ });
251
+ // ============================================
252
+ // docToPdf convenience wrapper
253
+ // ============================================
254
+ describe('docToPdf', () => {
255
+ it('converts a Doc object to PDF', async () => {
256
+ const doc = {
257
+ articleId: 'test-article',
258
+ duration: 3,
259
+ audio: { segments: [] },
260
+ blocks: [
261
+ {
262
+ id: 'block-1',
263
+ startTime: 0,
264
+ duration: 3,
265
+ audioSegment: 0,
266
+ template: 'titleBlock',
267
+ },
268
+ ],
269
+ };
270
+ const buffer = await docToPdf(doc);
271
+ expect(buffer).toBeInstanceOf(ArrayBuffer);
272
+ expect(buffer.byteLength).toBeGreaterThan(0);
273
+ });
274
+ });
275
+ //# sourceMappingURL=pdfExport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfExport.test.js","sourceRoot":"","sources":["../../src/__tests__/pdfExport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests for PDF import: pdfToMarkdownDoc, pdfToDoc.
3
+ *
4
+ * Builds PDFs with pdf-lib (adding known text), then imports them
5
+ * via pdfToMarkdownDoc and inspects the resulting MarkdownDocument.
6
+ *
7
+ * NOTE: pdfjs-dist text extraction quality depends on the environment.
8
+ * Standard fonts embedded by pdf-lib should produce readable text items.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=pdfImport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfImport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pdfImport.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}