Release Mail Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 10:47:30 +02:00
parent 9bc0870404
commit 2ab972a9f3
35 changed files with 2061 additions and 150 deletions
+27
View File
@@ -53,6 +53,33 @@ describe("MIME parser", () => {
});
});
it("preserves arbitrary source octets and exact multipart byte ranges", () => {
const prefix = new TextEncoder().encode(
"From: a@example.test\r\nContent-Type: multipart/mixed; boundary=x\r\n\r\n--x\r\nContent-Type: application/octet-stream\r\n\r\n",
);
const suffix = new TextEncoder().encode("\r\n--x--\r\n");
const bytes = new Uint8Array(prefix.length + 4 + suffix.length);
bytes.set(prefix);
bytes.set([0x80, 0x81, 0xfe, 0xff], prefix.length);
bytes.set(suffix, prefix.length + 4);
const parsed = parseMessage(bytes);
expect([...parsed.root.children[0]!.bytes]).toEqual([
0x80, 0x81, 0xfe, 0xff,
]);
expect([...parsed.rawBytes]).toEqual([...bytes]);
const range = parsed.root.children[0]!.sourceRange!;
expect([...parsed.rawBytes.slice(range.bodyStart, range.end)]).toEqual([
0x80, 0x81, 0xfe, 0xff,
]);
});
it("assembles RFC 2231 parameter continuations", () => {
const parsed = parseMessage(
"From: a@example.test\r\nContent-Type: application/octet-stream\r\nContent-Disposition: attachment; filename*0*=UTF-8''long%20; filename*1*=name%E2%9C%93.bin\r\n\r\ndata",
);
expect(attachments(parsed.root)[0]?.filename).toBe("long name✓.bin");
});
it("parses nested message/rfc822 entities", () => {
const parsed = parseMessage(
"From: a@example.test\nContent-Type: message/rfc822\n\nFrom: b@example.test\nContent-Type: text/plain\n\nnested",