@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.
- package/LICENSE +201 -0
- package/NOTICE +54 -0
- package/README.md +35 -2
- package/dist/capabilities.js +29 -0
- package/dist/capabilities.js.map +9 -0
- package/dist/chunks/index-4ntgtkmb.js +6783 -0
- package/dist/chunks/index-4ntgtkmb.js.map +13 -0
- package/dist/chunks/index-ans80t68.js +382 -0
- package/dist/chunks/index-ans80t68.js.map +9 -0
- package/dist/chunks/index-ax4aay30.js +315 -0
- package/dist/chunks/index-ax4aay30.js.map +10 -0
- package/dist/chunks/index-e49v2qpf.js +2177 -0
- package/dist/chunks/index-e49v2qpf.js.map +9 -0
- package/dist/chunks/index-m2845dn6.js +72 -0
- package/dist/chunks/index-m2845dn6.js.map +10 -0
- package/dist/chunks/index-md3hz6r2.js +3015 -0
- package/dist/chunks/index-md3hz6r2.js.map +19 -0
- package/dist/chunks/index-n0acffvs.js +366 -0
- package/dist/chunks/index-n0acffvs.js.map +10 -0
- package/dist/chunks/index-nrr8x2kq.js +259 -0
- package/dist/chunks/index-nrr8x2kq.js.map +10 -0
- package/dist/chunks/index-s3xjr701.js +170 -0
- package/dist/chunks/index-s3xjr701.js.map +10 -0
- package/dist/chunks/index-t89cvabm.js +2301 -0
- package/dist/chunks/index-t89cvabm.js.map +10 -0
- package/dist/chunks/index-zw0575tv.js +126 -0
- package/dist/chunks/index-zw0575tv.js.map +10 -0
- package/dist/consent.js +24 -0
- package/dist/consent.js.map +9 -0
- package/dist/index.js +526 -0
- package/dist/index.js.map +11 -0
- package/dist/lifecycle.js +11 -0
- package/dist/lifecycle.js.map +9 -0
- package/dist/outbox.js +27 -0
- package/dist/outbox.js.map +9 -0
- package/dist/pdf.js +15 -0
- package/dist/pdf.js.map +9 -0
- package/dist/providers.js +26 -0
- package/dist/providers.js.map +9 -0
- package/dist/runner.js +24 -0
- package/dist/runner.js.map +9 -0
- package/dist/tools.js +38 -0
- package/dist/tools.js.map +9 -0
- package/dist/types/domain-contract/src/app-records.d.ts +3148 -0
- package/dist/types/domain-contract/src/app-share.d.ts +222 -0
- package/dist/types/domain-contract/src/apps.d.ts +594 -0
- package/dist/types/eengine/fixtures/providers.json +55 -0
- package/dist/types/eengine/src/broker.d.ts +80 -0
- package/dist/types/eengine/src/capabilities.d.ts +86 -0
- package/dist/types/eengine/src/consent.d.ts +50 -0
- package/dist/types/eengine/src/index.d.ts +11 -0
- package/dist/types/eengine/src/instance.d.ts +122 -0
- package/dist/types/eengine/src/lifecycle.d.ts +64 -0
- package/dist/types/eengine/src/outbox.d.ts +3 -0
- package/dist/types/eengine/src/pdf.d.ts +36 -0
- package/dist/types/eengine/src/providers.d.ts +38 -0
- package/dist/types/eengine/src/runner.d.ts +82 -0
- package/dist/types/eengine/src/stores.d.ts +125 -0
- package/dist/types/eengine/src/tools.d.ts +79 -0
- package/dist/types/eengine/src/web/index.d.ts +20 -0
- package/dist/types/eengine/src/web/mcp.d.ts +27 -0
- package/dist/types/eengine/src/web/platform.d.ts +91 -0
- package/dist/types/eengine/src/web/stores.d.ts +125 -0
- package/dist/types/emcp/fixtures/automations.json +521 -0
- package/dist/types/emcp/fixtures/hub.json +498 -0
- package/dist/types/emcp/src/access.d.ts +55 -0
- package/dist/types/emcp/src/audit.d.ts +22 -0
- package/dist/types/emcp/src/automations.d.ts +111 -0
- package/dist/types/emcp/src/exposes.d.ts +242 -0
- package/dist/types/emcp/src/hub.d.ts +63 -0
- package/dist/types/emcp/src/index.d.ts +7 -0
- package/dist/types/emcp/src/pure.d.ts +11 -0
- package/dist/types/emcp/src/upstream.d.ts +288 -0
- package/dist/types/emcp/src/vault.d.ts +34 -0
- package/dist/web/index.js +791 -0
- package/dist/web/index.js.map +13 -0
- package/fixtures/bundle.json +1165 -0
- package/fixtures/capabilities.json +373 -0
- package/fixtures/consent.json +146 -0
- package/fixtures/lifecycle.json +125 -0
- package/fixtures/outbox.json +8 -0
- package/fixtures/providers.json +55 -0
- package/fixtures/runner.json +2167 -0
- 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
|
+
}
|