@exponential_app/engine 0.0.0-stage → 0.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 (84) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +35 -2
  4. package/dist/capabilities.js +29 -0
  5. package/dist/capabilities.js.map +9 -0
  6. package/dist/chunks/index-4ntgtkmb.js +6783 -0
  7. package/dist/chunks/index-4ntgtkmb.js.map +13 -0
  8. package/dist/chunks/index-ans80t68.js +382 -0
  9. package/dist/chunks/index-ans80t68.js.map +9 -0
  10. package/dist/chunks/index-ax4aay30.js +315 -0
  11. package/dist/chunks/index-ax4aay30.js.map +10 -0
  12. package/dist/chunks/index-e49v2qpf.js +2177 -0
  13. package/dist/chunks/index-e49v2qpf.js.map +9 -0
  14. package/dist/chunks/index-m2845dn6.js +72 -0
  15. package/dist/chunks/index-m2845dn6.js.map +10 -0
  16. package/dist/chunks/index-md3hz6r2.js +3015 -0
  17. package/dist/chunks/index-md3hz6r2.js.map +19 -0
  18. package/dist/chunks/index-n0acffvs.js +366 -0
  19. package/dist/chunks/index-n0acffvs.js.map +10 -0
  20. package/dist/chunks/index-nrr8x2kq.js +259 -0
  21. package/dist/chunks/index-nrr8x2kq.js.map +10 -0
  22. package/dist/chunks/index-s3xjr701.js +170 -0
  23. package/dist/chunks/index-s3xjr701.js.map +10 -0
  24. package/dist/chunks/index-t89cvabm.js +2301 -0
  25. package/dist/chunks/index-t89cvabm.js.map +10 -0
  26. package/dist/chunks/index-zw0575tv.js +126 -0
  27. package/dist/chunks/index-zw0575tv.js.map +10 -0
  28. package/dist/consent.js +24 -0
  29. package/dist/consent.js.map +9 -0
  30. package/dist/index.js +526 -0
  31. package/dist/index.js.map +11 -0
  32. package/dist/lifecycle.js +11 -0
  33. package/dist/lifecycle.js.map +9 -0
  34. package/dist/outbox.js +27 -0
  35. package/dist/outbox.js.map +9 -0
  36. package/dist/pdf.js +15 -0
  37. package/dist/pdf.js.map +9 -0
  38. package/dist/providers.js +26 -0
  39. package/dist/providers.js.map +9 -0
  40. package/dist/runner.js +24 -0
  41. package/dist/runner.js.map +9 -0
  42. package/dist/tools.js +38 -0
  43. package/dist/tools.js.map +9 -0
  44. package/dist/types/domain-contract/src/app-records.d.ts +3148 -0
  45. package/dist/types/domain-contract/src/app-share.d.ts +222 -0
  46. package/dist/types/domain-contract/src/apps.d.ts +594 -0
  47. package/dist/types/eengine/fixtures/providers.json +55 -0
  48. package/dist/types/eengine/src/broker.d.ts +80 -0
  49. package/dist/types/eengine/src/capabilities.d.ts +86 -0
  50. package/dist/types/eengine/src/consent.d.ts +50 -0
  51. package/dist/types/eengine/src/index.d.ts +11 -0
  52. package/dist/types/eengine/src/instance.d.ts +122 -0
  53. package/dist/types/eengine/src/lifecycle.d.ts +64 -0
  54. package/dist/types/eengine/src/outbox.d.ts +3 -0
  55. package/dist/types/eengine/src/pdf.d.ts +36 -0
  56. package/dist/types/eengine/src/providers.d.ts +38 -0
  57. package/dist/types/eengine/src/runner.d.ts +82 -0
  58. package/dist/types/eengine/src/stores.d.ts +125 -0
  59. package/dist/types/eengine/src/tools.d.ts +79 -0
  60. package/dist/types/eengine/src/web/index.d.ts +20 -0
  61. package/dist/types/eengine/src/web/mcp.d.ts +27 -0
  62. package/dist/types/eengine/src/web/platform.d.ts +91 -0
  63. package/dist/types/eengine/src/web/stores.d.ts +125 -0
  64. package/dist/types/emcp/fixtures/automations.json +521 -0
  65. package/dist/types/emcp/fixtures/hub.json +498 -0
  66. package/dist/types/emcp/src/access.d.ts +55 -0
  67. package/dist/types/emcp/src/audit.d.ts +22 -0
  68. package/dist/types/emcp/src/automations.d.ts +111 -0
  69. package/dist/types/emcp/src/exposes.d.ts +242 -0
  70. package/dist/types/emcp/src/hub.d.ts +63 -0
  71. package/dist/types/emcp/src/index.d.ts +7 -0
  72. package/dist/types/emcp/src/pure.d.ts +11 -0
  73. package/dist/types/emcp/src/upstream.d.ts +288 -0
  74. package/dist/types/emcp/src/vault.d.ts +34 -0
  75. package/dist/web/index.js +791 -0
  76. package/dist/web/index.js.map +13 -0
  77. package/fixtures/bundle.json +1165 -0
  78. package/fixtures/capabilities.json +373 -0
  79. package/fixtures/consent.json +146 -0
  80. package/fixtures/lifecycle.json +125 -0
  81. package/fixtures/outbox.json +8 -0
  82. package/fixtures/providers.json +55 -0
  83. package/fixtures/runner.json +2167 -0
  84. package/package.json +92 -4
@@ -0,0 +1,315 @@
1
+ import {
2
+ capabilities_default
3
+ } from "./index-ans80t68.js";
4
+
5
+ // packages/eengine/src/pdf.ts
6
+ var [PAGE_W, PAGE_H] = capabilities_default.pdf.page;
7
+ var MARGIN = capabilities_default.pdf.margin;
8
+ var TOP = PAGE_H - MARGIN;
9
+ var WIDTH = PAGE_W - 2 * MARGIN;
10
+ var IMAGE_MAX_H = TOP - MARGIN;
11
+ var WIDTHS = { F1: capabilities_default.pdf.widths.Helvetica, F2: capabilities_default.pdf.widths[`Helvetica-Bold`] };
12
+ var WIN_ANSI = new Map(Object.entries(capabilities_default.pdf.winAnsi).map(([cp, code]) => [Number(cp), code]));
13
+ function winAnsi(cp) {
14
+ if (cp === 9)
15
+ return 32;
16
+ if (cp >= 32 && cp <= 126 || cp >= 160 && cp <= 255)
17
+ return cp;
18
+ if (cp < 32 || cp >= 127 && cp <= 159)
19
+ return null;
20
+ return WIN_ANSI.get(cp) ?? 63;
21
+ }
22
+ var encode = (s) => [...s].map((c) => winAnsi(c.codePointAt(0))).filter((b) => b !== null);
23
+ var widthSum = (font, bytes) => bytes.reduce((sum, b) => sum + WIDTHS[font][b], 0);
24
+ var fits = (font, size, bytes) => widthSum(font, bytes) * size <= WIDTH * 1000;
25
+ function wrapLines2(text, font, size) {
26
+ const lines = [];
27
+ for (const paragraph of text.split(`
28
+ `)) {
29
+ const words = [];
30
+ let word = [];
31
+ for (const b of encode(paragraph)) {
32
+ if (b === 32) {
33
+ if (word.length)
34
+ words.push(word);
35
+ word = [];
36
+ } else
37
+ word.push(b);
38
+ }
39
+ if (word.length)
40
+ words.push(word);
41
+ if (!words.length) {
42
+ lines.push([]);
43
+ continue;
44
+ }
45
+ let line = [];
46
+ for (let w of words) {
47
+ if (line.length) {
48
+ const joined = [...line, 32, ...w];
49
+ if (fits(font, size, joined)) {
50
+ line = joined;
51
+ continue;
52
+ }
53
+ lines.push(line);
54
+ line = [];
55
+ }
56
+ while (!fits(font, size, w)) {
57
+ let n = 1;
58
+ while (n < w.length && fits(font, size, w.slice(0, n + 1)))
59
+ n++;
60
+ lines.push(w.slice(0, n));
61
+ w = w.slice(n);
62
+ }
63
+ line = w;
64
+ }
65
+ lines.push(line);
66
+ }
67
+ return lines;
68
+ }
69
+ function pdfNumber2(x) {
70
+ const r = Math.sign(x) * Math.round(Math.abs(x) * 100);
71
+ if (r === 0)
72
+ return `0`;
73
+ const abs = Math.abs(r);
74
+ const whole = Math.floor(abs / 100);
75
+ const frac = abs % 100;
76
+ const sign = r < 0 ? `-` : ``;
77
+ if (frac === 0)
78
+ return `${sign}${whole}`;
79
+ const digits = String(frac).padStart(2, `0`).replace(/0$/, ``);
80
+ return `${sign}${whole}.${digits}`;
81
+ }
82
+ function pdfString(bytes) {
83
+ let out = `(`;
84
+ for (const b of bytes) {
85
+ if (b === 40 || b === 41 || b === 92)
86
+ out += `\\${String.fromCharCode(b)}`;
87
+ else if (b >= 128)
88
+ out += `\\${b.toString(8).padStart(3, `0`)}`;
89
+ else
90
+ out += String.fromCharCode(b);
91
+ }
92
+ return `${out})`;
93
+ }
94
+ var u16 = (b, i) => b[i] << 8 | b[i + 1];
95
+ var u32 = (b, i) => (b[i] << 24 >>> 0) + (b[i + 1] << 16 | b[i + 2] << 8 | b[i + 3]);
96
+ var PNG_SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];
97
+ function jpegImage(b) {
98
+ let i = 2;
99
+ while (i + 4 <= b.length) {
100
+ if (b[i] !== 255)
101
+ return null;
102
+ const marker = b[i + 1];
103
+ if (marker === 255) {
104
+ i++;
105
+ continue;
106
+ }
107
+ if (marker === 1 || marker >= 208 && marker <= 216) {
108
+ i += 2;
109
+ continue;
110
+ }
111
+ if (marker === 217 || marker === 218)
112
+ return null;
113
+ const length = u16(b, i + 2);
114
+ if (length < 2)
115
+ return null;
116
+ if (marker >= 192 && marker <= 195) {
117
+ if (i + 10 > b.length)
118
+ return null;
119
+ const height = u16(b, i + 5);
120
+ const width = u16(b, i + 7);
121
+ const components = b[i + 9];
122
+ const space = components === 1 ? `DeviceGray` : components === 3 ? `DeviceRGB` : components === 4 ? `DeviceCMYK` : null;
123
+ if (!space || !width || !height)
124
+ return null;
125
+ return { width, height, dict: `/Type /XObject /Subtype /Image /Width ${width} /Height ${height} /ColorSpace /${space} /BitsPerComponent 8 /Filter /DCTDecode`, data: b };
126
+ }
127
+ i += 2 + length;
128
+ }
129
+ return null;
130
+ }
131
+ function pngImage(b) {
132
+ let i = 8;
133
+ let header = null;
134
+ const idat = [];
135
+ while (i + 8 <= b.length) {
136
+ const length = u32(b, i);
137
+ const type = String.fromCharCode(b[i + 4], b[i + 5], b[i + 6], b[i + 7]);
138
+ const data = b.subarray(i + 8, i + 8 + length);
139
+ if (data.length < length)
140
+ return null;
141
+ if (!header) {
142
+ if (type !== `IHDR` || length < 13)
143
+ return null;
144
+ const width = u32(data, 0);
145
+ const height = u32(data, 4);
146
+ const [depth, colorType, compression, filter, interlace] = data.subarray(8, 13);
147
+ if (depth !== 8 || colorType !== 0 && colorType !== 2 || compression !== 0 || filter !== 0 || interlace !== 0 || !width || !height)
148
+ return null;
149
+ header = { width, height, colors: colorType === 0 ? 1 : 3 };
150
+ } else if (type === `IDAT`)
151
+ idat.push(data);
152
+ else if (type === `IEND`)
153
+ break;
154
+ i += 12 + length;
155
+ }
156
+ if (!header || !idat.length)
157
+ return null;
158
+ const joined = new Uint8Array(idat.reduce((n, d) => n + d.length, 0));
159
+ let o = 0;
160
+ for (const d of idat) {
161
+ joined.set(d, o);
162
+ o += d.length;
163
+ }
164
+ const { width, height, colors } = header;
165
+ const space = colors === 1 ? `DeviceGray` : `DeviceRGB`;
166
+ return {
167
+ width,
168
+ height,
169
+ dict: `/Type /XObject /Subtype /Image /Width ${width} /Height ${height} /ColorSpace /${space} /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Colors ${colors} /BitsPerComponent 8 /Columns ${width} >>`,
170
+ data: joined
171
+ };
172
+ }
173
+ function pdfImage2(bytes) {
174
+ if (bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255)
175
+ return jpegImage(bytes);
176
+ if (PNG_SIGNATURE.every((v, k) => bytes[k] === v))
177
+ return pngImage(bytes);
178
+ return null;
179
+ }
180
+ var utf16Hex = (s) => {
181
+ let out = `FEFF`;
182
+ for (let i = 0;i < s.length; i++)
183
+ out += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, `0`);
184
+ return out;
185
+ };
186
+ async function renderPdf2(args, getBlob) {
187
+ const pages = [{ ops: [], images: [] }];
188
+ const images = [];
189
+ let y = TOP;
190
+ const page = () => pages[pages.length - 1];
191
+ const empty = () => y === TOP;
192
+ const newPage = () => {
193
+ pages.push({ ops: [], images: [] });
194
+ y = TOP;
195
+ };
196
+ const lines = (text, font, size, leading) => {
197
+ for (const line of wrapLines2(text, font, size)) {
198
+ if (!empty() && y - leading < MARGIN)
199
+ newPage();
200
+ if (line.length)
201
+ page().ops.push(`BT /${font} ${size} Tf ${MARGIN} ${pdfNumber2(y - size)} Td ${pdfString(line)} Tj ET`);
202
+ y -= leading;
203
+ }
204
+ };
205
+ for (const block of args.blocks) {
206
+ if (`heading` in block) {
207
+ if (!empty())
208
+ y -= 12;
209
+ lines(block.heading, `F2`, 18, 24);
210
+ y -= 4;
211
+ } else if (`text` in block) {
212
+ lines(block.text, `F1`, 11, 15);
213
+ y -= 6;
214
+ } else if (`image` in block) {
215
+ let k = images.findIndex((i) => i.id === block.image);
216
+ if (k < 0) {
217
+ const bytes = await getBlob(block.image);
218
+ if (!bytes)
219
+ return { error: `notFound: ${block.image}` };
220
+ const image = pdfImage2(bytes);
221
+ if (!image)
222
+ return { error: `unsupportedImage: ${block.image}` };
223
+ images.push({ id: block.image, image });
224
+ k = images.length - 1;
225
+ }
226
+ const { width, height } = images[k].image;
227
+ const scale = Math.min(WIDTH / width, IMAGE_MAX_H / height, 1);
228
+ const w = width * scale;
229
+ const h = height * scale;
230
+ if (!empty() && y - h < MARGIN)
231
+ newPage();
232
+ page().ops.push(`q ${pdfNumber2(w)} 0 0 ${pdfNumber2(h)} ${MARGIN} ${pdfNumber2(y - h)} cm /Im${k + 1} Do Q`);
233
+ if (!page().images.includes(k + 1))
234
+ page().images.push(k + 1);
235
+ y -= h;
236
+ if (block.caption !== undefined) {
237
+ y -= 4;
238
+ lines(block.caption, `F1`, 9, 12);
239
+ }
240
+ y -= 6;
241
+ } else if (!empty())
242
+ newPage();
243
+ }
244
+ if (pages.length > 1 && empty())
245
+ pages.pop();
246
+ const chunks = [];
247
+ let offset = 0;
248
+ const offsets = [];
249
+ const latin = (s) => Uint8Array.from(s, (c) => c.charCodeAt(0));
250
+ const push = (bytes) => {
251
+ chunks.push(bytes);
252
+ offset += bytes.length;
253
+ };
254
+ const object = (body, stream) => {
255
+ offsets.push(offset);
256
+ const n = offsets.length;
257
+ if (stream) {
258
+ push(latin(`${n} 0 obj
259
+ << ${body}${body ? ` ` : ``}/Length ${stream.length} >>
260
+ stream
261
+ `));
262
+ push(stream);
263
+ push(latin(`
264
+ endstream
265
+ endobj
266
+ `));
267
+ } else
268
+ push(latin(`${n} 0 obj
269
+ ${body}
270
+ endobj
271
+ `));
272
+ };
273
+ push(Uint8Array.from([37, 80, 68, 70, 45, 49, 46, 52, 10, 37, 226, 227, 207, 211, 10]));
274
+ const firstPage = 6 + images.length;
275
+ const kids = pages.map((_, i) => `${firstPage + 2 * i} 0 R`).join(` `);
276
+ object(`<< /Type /Catalog /Pages 2 0 R >>`);
277
+ object(`<< /Type /Pages /Kids [${kids}] /Count ${pages.length} >>`);
278
+ object(`<< /Type /Font /Subtype /Type1 /BaseFont /${capabilities_default.pdf.fonts.F1} /Encoding /WinAnsiEncoding >>`);
279
+ object(`<< /Type /Font /Subtype /Type1 /BaseFont /${capabilities_default.pdf.fonts.F2} /Encoding /WinAnsiEncoding >>`);
280
+ object(`<< /Title <${utf16Hex(args.title)}> /Producer (Exponential Engine) >>`);
281
+ for (const { image } of images)
282
+ object(image.dict, image.data);
283
+ pages.forEach((p, i) => {
284
+ const xobjects = [...p.images].sort((a, b) => a - b).map((k) => `/Im${k} ${5 + k} 0 R`);
285
+ const resources = `<< /Font << /F1 3 0 R /F2 4 0 R >>${xobjects.length ? ` /XObject << ${xobjects.join(` `)} >>` : ``} >>`;
286
+ object(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${PAGE_W} ${PAGE_H}] /Resources ${resources} /Contents ${firstPage + 2 * i + 1} 0 R >>`);
287
+ object(``, latin(p.ops.join(`
288
+ `)));
289
+ });
290
+ const xref = offset;
291
+ const size = offsets.length + 1;
292
+ push(latin(`xref
293
+ 0 ${size}
294
+ 0000000000 65535 f
295
+ ${offsets.map((o) => `${String(o).padStart(10, `0`)} 00000 n
296
+ `).join(``)}`));
297
+ push(latin(`trailer
298
+ << /Size ${size} /Root 1 0 R /Info 5 0 R >>
299
+ startxref
300
+ ${xref}
301
+ %%EOF
302
+ `));
303
+ const bytes = new Uint8Array(offset);
304
+ let at = 0;
305
+ for (const c of chunks) {
306
+ bytes.set(c, at);
307
+ at += c.length;
308
+ }
309
+ return { bytes, pages: pages.length };
310
+ }
311
+
312
+ export { wrapLines2, pdfNumber2, pdfImage2, renderPdf2 };
313
+
314
+ //# debugId=434A59D2B116CFC664756E2164756E21
315
+ //# sourceMappingURL=index-ax4aay30.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/eengine/src/pdf.ts"],
4
+ "sourcesContent": [
5
+ "// VAPP-265: `print.pdf`, the Engine's own tool. ONE layout and ONE writer both\n// twins produce byte for byte (capabilities.json `pdf`, `pdfCases`: sha256 + size\n// locked). Pure and browser-safe; the arguments arrive validated.\n\nimport fixture from \"../fixtures/capabilities.json\" with { type: \"json\" }\n\nexport type PdfBlock = { heading: string } | { text: string } | { image: string; caption?: string } | { pageBreak: true }\n\nexport interface PdfArguments {\n title: string\n name?: string\n blocks: readonly PdfBlock[]\n}\n\nexport type PdfResult = { bytes: Uint8Array; pages: number } | { error: string }\n\nconst [PAGE_W, PAGE_H] = fixture.pdf.page as [number, number]\nconst MARGIN = fixture.pdf.margin\nconst TOP = PAGE_H - MARGIN\nconst WIDTH = PAGE_W - 2 * MARGIN\nconst IMAGE_MAX_H = TOP - MARGIN\nconst WIDTHS: Record<`F1` | `F2`, readonly number[]> = { F1: fixture.pdf.widths.Helvetica, F2: fixture.pdf.widths[`Helvetica-Bold`] }\nconst WIN_ANSI = new Map(Object.entries(fixture.pdf.winAnsi as Record<string, number>).map(([cp, code]) => [Number(cp), code]))\n\n/** A code point → its WinAnsi byte; null = dropped (a control). */\nfunction winAnsi(cp: number): number | null {\n if (cp === 9) return 0x20\n if ((cp >= 0x20 && cp <= 0x7e) || (cp >= 0xa0 && cp <= 0xff)) return cp\n if (cp < 0x20 || (cp >= 0x7f && cp <= 0x9f)) return null\n return WIN_ANSI.get(cp) ?? 0x3f\n}\n\nconst encode = (s: string): number[] => [...s].map((c) => winAnsi(c.codePointAt(0) as number)).filter((b): b is number => b !== null)\nconst widthSum = (font: `F1` | `F2`, bytes: readonly number[]) => bytes.reduce((sum, b) => sum + WIDTHS[font][b], 0)\nconst fits = (font: `F1` | `F2`, size: number, bytes: readonly number[]) => widthSum(font, bytes) * size <= WIDTH * 1000\n\n/** A paragraph per `\\n`, words on runs of spaces, greedy; a too-wide word breaks at its longest fitting prefix. */\nexport function wrapLines(text: string, font: `F1` | `F2`, size: number): number[][] {\n const lines: number[][] = []\n for (const paragraph of text.split(`\\n`)) {\n const words: number[][] = []\n let word: number[] = []\n for (const b of encode(paragraph)) {\n if (b === 0x20) {\n if (word.length) words.push(word)\n word = []\n } else word.push(b)\n }\n if (word.length) words.push(word)\n if (!words.length) {\n lines.push([])\n continue\n }\n let line: number[] = []\n for (let w of words) {\n if (line.length) {\n const joined = [...line, 0x20, ...w]\n if (fits(font, size, joined)) {\n line = joined\n continue\n }\n lines.push(line)\n line = []\n }\n while (!fits(font, size, w)) {\n let n = 1\n while (n < w.length && fits(font, size, w.slice(0, n + 1))) n++\n lines.push(w.slice(0, n))\n w = w.slice(n)\n }\n line = w\n }\n lines.push(line)\n }\n return lines\n}\n\n/** A number rounded to 2 decimals, shortest form (`12`, `12.5`, `-0.25`). */\nexport function pdfNumber(x: number): string {\n const r = Math.sign(x) * Math.round(Math.abs(x) * 100)\n if (r === 0) return `0`\n const abs = Math.abs(r)\n const whole = Math.floor(abs / 100)\n const frac = abs % 100\n const sign = r < 0 ? `-` : ``\n if (frac === 0) return `${sign}${whole}`\n const digits = String(frac).padStart(2, `0`).replace(/0$/, ``)\n return `${sign}${whole}.${digits}`\n}\n\nfunction pdfString(bytes: readonly number[]): string {\n let out = `(`\n for (const b of bytes) {\n if (b === 0x28 || b === 0x29 || b === 0x5c) out += `\\\\${String.fromCharCode(b)}`\n else if (b >= 0x80) out += `\\\\${b.toString(8).padStart(3, `0`)}`\n else out += String.fromCharCode(b)\n }\n return `${out})`\n}\n\ninterface PdfImage {\n width: number\n height: number\n dict: string\n data: Uint8Array\n}\n\nconst u16 = (b: Uint8Array, i: number) => (b[i] << 8) | b[i + 1]\nconst u32 = (b: Uint8Array, i: number) => ((b[i] << 24) >>> 0) + ((b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3])\nconst PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]\n\nfunction jpegImage(b: Uint8Array): PdfImage | null {\n let i = 2\n while (i + 4 <= b.length) {\n if (b[i] !== 0xff) return null\n const marker = b[i + 1]\n if (marker === 0xff) {\n i++\n continue\n }\n if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd8)) {\n i += 2\n continue\n }\n if (marker === 0xd9 || marker === 0xda) return null\n const length = u16(b, i + 2)\n if (length < 2) return null\n if (marker >= 0xc0 && marker <= 0xc3) {\n if (i + 10 > b.length) return null\n const height = u16(b, i + 5)\n const width = u16(b, i + 7)\n const components = b[i + 9]\n const space = components === 1 ? `DeviceGray` : components === 3 ? `DeviceRGB` : components === 4 ? `DeviceCMYK` : null\n if (!space || !width || !height) return null\n return { width, height, dict: `/Type /XObject /Subtype /Image /Width ${width} /Height ${height} /ColorSpace /${space} /BitsPerComponent 8 /Filter /DCTDecode`, data: b }\n }\n i += 2 + length\n }\n return null\n}\n\nfunction pngImage(b: Uint8Array): PdfImage | null {\n let i = 8\n let header: { width: number; height: number; colors: number } | null = null\n const idat: Uint8Array[] = []\n while (i + 8 <= b.length) {\n const length = u32(b, i)\n const type = String.fromCharCode(b[i + 4], b[i + 5], b[i + 6], b[i + 7])\n const data = b.subarray(i + 8, i + 8 + length)\n if (data.length < length) return null\n if (!header) {\n if (type !== `IHDR` || length < 13) return null\n const width = u32(data, 0)\n const height = u32(data, 4)\n const [depth, colorType, compression, filter, interlace] = data.subarray(8, 13)\n if (depth !== 8 || (colorType !== 0 && colorType !== 2) || compression !== 0 || filter !== 0 || interlace !== 0 || !width || !height) return null\n header = { width, height, colors: colorType === 0 ? 1 : 3 }\n } else if (type === `IDAT`) idat.push(data)\n else if (type === `IEND`) break\n i += 12 + length\n }\n if (!header || !idat.length) return null\n const joined = new Uint8Array(idat.reduce((n, d) => n + d.length, 0))\n let o = 0\n for (const d of idat) {\n joined.set(d, o)\n o += d.length\n }\n const { width, height, colors } = header\n const space = colors === 1 ? `DeviceGray` : `DeviceRGB`\n return {\n width,\n height,\n dict: `/Type /XObject /Subtype /Image /Width ${width} /Height ${height} /ColorSpace /${space} /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Colors ${colors} /BitsPerComponent 8 /Columns ${width} >>`,\n data: joined,\n }\n}\n\n/** A JPEG or a supported PNG → its XObject, else null. */\nexport function pdfImage(bytes: Uint8Array): PdfImage | null {\n if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) return jpegImage(bytes)\n if (PNG_SIGNATURE.every((v, k) => bytes[k] === v)) return pngImage(bytes)\n return null\n}\n\ninterface Page {\n ops: string[]\n images: number[]\n}\n\nconst utf16Hex = (s: string): string => {\n let out = `FEFF`\n for (let i = 0; i < s.length; i++) out += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, `0`)\n return out\n}\n\n/** Lays out and writes the document. `getBlob` resolves an app file id. */\nexport async function renderPdf(args: PdfArguments, getBlob: (id: string) => Promise<Uint8Array | null>): Promise<PdfResult> {\n const pages: Page[] = [{ ops: [], images: [] }]\n const images: { id: string; image: PdfImage }[] = []\n let y = TOP\n const page = () => pages[pages.length - 1]\n const empty = () => y === TOP\n const newPage = () => {\n pages.push({ ops: [], images: [] })\n y = TOP\n }\n const lines = (text: string, font: `F1` | `F2`, size: number, leading: number) => {\n for (const line of wrapLines(text, font, size)) {\n if (!empty() && y - leading < MARGIN) newPage()\n if (line.length) page().ops.push(`BT /${font} ${size} Tf ${MARGIN} ${pdfNumber(y - size)} Td ${pdfString(line)} Tj ET`)\n y -= leading\n }\n }\n for (const block of args.blocks) {\n if (`heading` in block) {\n if (!empty()) y -= 12\n lines(block.heading, `F2`, 18, 24)\n y -= 4\n } else if (`text` in block) {\n lines(block.text, `F1`, 11, 15)\n y -= 6\n } else if (`image` in block) {\n let k = images.findIndex((i) => i.id === block.image)\n if (k < 0) {\n const bytes = await getBlob(block.image)\n if (!bytes) return { error: `notFound: ${block.image}` }\n const image = pdfImage(bytes)\n if (!image) return { error: `unsupportedImage: ${block.image}` }\n images.push({ id: block.image, image })\n k = images.length - 1\n }\n const { width, height } = images[k].image\n const scale = Math.min(WIDTH / width, IMAGE_MAX_H / height, 1)\n const w = width * scale\n const h = height * scale\n if (!empty() && y - h < MARGIN) newPage()\n page().ops.push(`q ${pdfNumber(w)} 0 0 ${pdfNumber(h)} ${MARGIN} ${pdfNumber(y - h)} cm /Im${k + 1} Do Q`)\n if (!page().images.includes(k + 1)) page().images.push(k + 1)\n y -= h\n if (block.caption !== undefined) {\n y -= 4\n lines(block.caption, `F1`, 9, 12)\n }\n y -= 6\n } else if (!empty()) newPage()\n }\n if (pages.length > 1 && empty()) pages.pop()\n\n // The file.\n const chunks: Uint8Array[] = []\n let offset = 0\n const offsets: number[] = []\n const latin = (s: string) => Uint8Array.from(s, (c) => c.charCodeAt(0))\n const push = (bytes: Uint8Array) => {\n chunks.push(bytes)\n offset += bytes.length\n }\n const object = (body: string, stream?: Uint8Array) => {\n offsets.push(offset)\n const n = offsets.length\n if (stream) {\n push(latin(`${n} 0 obj\\n<< ${body}${body ? ` ` : ``}/Length ${stream.length} >>\\nstream\\n`))\n push(stream)\n push(latin(`\\nendstream\\nendobj\\n`))\n } else push(latin(`${n} 0 obj\\n${body}\\nendobj\\n`))\n }\n push(Uint8Array.from([0x25, 0x50, 0x44, 0x46, 0x2d, 0x31, 0x2e, 0x34, 0x0a, 0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a]))\n const firstPage = 6 + images.length\n const kids = pages.map((_, i) => `${firstPage + 2 * i} 0 R`).join(` `)\n object(`<< /Type /Catalog /Pages 2 0 R >>`)\n object(`<< /Type /Pages /Kids [${kids}] /Count ${pages.length} >>`)\n object(`<< /Type /Font /Subtype /Type1 /BaseFont /${fixture.pdf.fonts.F1} /Encoding /WinAnsiEncoding >>`)\n object(`<< /Type /Font /Subtype /Type1 /BaseFont /${fixture.pdf.fonts.F2} /Encoding /WinAnsiEncoding >>`)\n object(`<< /Title <${utf16Hex(args.title)}> /Producer (Exponential Engine) >>`)\n for (const { image } of images) object(image.dict, image.data)\n pages.forEach((p, i) => {\n const xobjects = [...p.images].sort((a, b) => a - b).map((k) => `/Im${k} ${5 + k} 0 R`)\n const resources = `<< /Font << /F1 3 0 R /F2 4 0 R >>${xobjects.length ? ` /XObject << ${xobjects.join(` `)} >>` : ``} >>`\n object(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${PAGE_W} ${PAGE_H}] /Resources ${resources} /Contents ${firstPage + 2 * i + 1} 0 R >>`)\n object(``, latin(p.ops.join(`\\n`)))\n })\n const xref = offset\n const size = offsets.length + 1\n push(latin(`xref\\n0 ${size}\\n0000000000 65535 f \\n${offsets.map((o) => `${String(o).padStart(10, `0`)} 00000 n \\n`).join(``)}`))\n push(latin(`trailer\\n<< /Size ${size} /Root 1 0 R /Info 5 0 R >>\\nstartxref\\n${xref}\\n%%EOF\\n`))\n const bytes = new Uint8Array(offset)\n let at = 0\n for (const c of chunks) {\n bytes.set(c, at)\n at += c.length\n }\n return { bytes, pages: pages.length }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "434A59D2B116CFC664756E2164756E21",
9
+ "names": []
10
+ }