@social-mail/shared 1.0.28 → 1.1.3
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/.gitlab-ci.yml +3 -3
- package/dist/.tsbuildinfo +1 -0
- package/dist/QueryIterator.d.ts +1 -9
- package/dist/QueryIterator.d.ts.map +1 -1
- package/dist/QueryIterator.js +3 -14
- package/dist/QueryIterator.js.map +1 -1
- package/dist/ical-parser/Calender.d.ts +6 -4
- package/dist/ical-parser/Calender.d.ts.map +1 -1
- package/dist/ical-parser/Calender.js +42 -90
- package/dist/ical-parser/Calender.js.map +1 -1
- package/dist/ical-parser/ics.d.ts +4 -0
- package/dist/ical-parser/ics.d.ts.map +1 -0
- package/dist/ical-parser/ics.js +6 -0
- package/dist/ical-parser/ics.js.map +1 -0
- package/dist/ical-parser/parseDate.js +1 -5
- package/dist/ical-parser/parseDate.js.map +1 -1
- package/dist/mime-parser/AttachmentFile.d.ts +5 -11
- package/dist/mime-parser/AttachmentFile.d.ts.map +1 -1
- package/dist/mime-parser/AttachmentFile.js +3 -8
- package/dist/mime-parser/AttachmentFile.js.map +1 -1
- package/dist/mime-parser/HeaderContentDisposition.d.ts +5 -5
- package/dist/mime-parser/HeaderContentDisposition.d.ts.map +1 -1
- package/dist/mime-parser/HeaderContentDisposition.js +2 -5
- package/dist/mime-parser/HeaderContentDisposition.js.map +1 -1
- package/dist/mime-parser/HeaderContentType.d.ts +5 -5
- package/dist/mime-parser/HeaderContentType.d.ts.map +1 -1
- package/dist/mime-parser/HeaderContentType.js +2 -5
- package/dist/mime-parser/HeaderContentType.js.map +1 -1
- package/dist/mime-parser/MimeMessage.d.ts +11 -11
- package/dist/mime-parser/MimeMessage.d.ts.map +1 -1
- package/dist/mime-parser/MimeMessage.js +46 -72
- package/dist/mime-parser/MimeMessage.js.map +1 -1
- package/dist/mime-parser/MimeNode.d.ts +28 -38
- package/dist/mime-parser/MimeNode.d.ts.map +1 -1
- package/dist/mime-parser/MimeNode.js +171 -295
- package/dist/mime-parser/MimeNode.js.map +1 -1
- package/dist/mime-parser/encoder/RawBuffer.d.ts +5 -5
- package/dist/mime-parser/encoder/RawBuffer.d.ts.map +1 -1
- package/dist/mime-parser/encoder/RawBuffer.js +7 -13
- package/dist/mime-parser/encoder/RawBuffer.js.map +1 -1
- package/dist/mime-parser/encoder/base64-to-blob.d.ts +1 -7
- package/dist/mime-parser/encoder/base64-to-blob.d.ts.map +1 -1
- package/dist/mime-parser/encoder/base64-to-blob.js +0 -6
- package/dist/mime-parser/encoder/base64-to-blob.js.map +1 -1
- package/dist/mime-parser/encoder/quoted-printable.d.ts +5 -8
- package/dist/mime-parser/encoder/quoted-printable.d.ts.map +1 -1
- package/dist/mime-parser/encoder/quoted-printable.js +3 -34
- package/dist/mime-parser/encoder/quoted-printable.js.map +1 -1
- package/dist/mime-parser/encoder/word-encoding.d.ts +4 -6
- package/dist/mime-parser/encoder/word-encoding.d.ts.map +1 -1
- package/dist/mime-parser/encoder/word-encoding.js +4 -5
- package/dist/mime-parser/encoder/word-encoding.js.map +1 -1
- package/dist/mime-parser/parsePairs.d.ts +1 -1
- package/dist/mime-parser/parsePairs.d.ts.map +1 -1
- package/dist/mime-parser/parsePairs.js +3 -7
- package/dist/mime-parser/parsePairs.js.map +1 -1
- package/dist/mime-parser/stream/LineStream.d.ts +10 -16
- package/dist/mime-parser/stream/LineStream.d.ts.map +1 -1
- package/dist/mime-parser/stream/LineStream.js +59 -94
- package/dist/mime-parser/stream/LineStream.js.map +1 -1
- package/dist/mime-parser/stream/TextWriter.d.ts +4 -3
- package/dist/mime-parser/stream/TextWriter.d.ts.map +1 -1
- package/dist/mime-parser/stream/TextWriter.js +2 -3
- package/dist/mime-parser/stream/TextWriter.js.map +1 -1
- package/dist/mime-parser/tokenizer.d.ts +3 -3
- package/dist/mime-parser/tokenizer.d.ts.map +1 -1
- package/dist/mime-parser/tokenizer.js +10 -17
- package/dist/mime-parser/tokenizer.js.map +1 -1
- package/package.json +3 -3
- package/src/{QueryIterator.js → QueryIterator.ts} +11 -12
- package/src/ical-parser/Calender.ts +12 -3
- package/src/ical-parser/ics.ts +7 -0
- package/src/mime-parser/AttachmentFile.ts +24 -0
- package/src/mime-parser/{HeaderContentDisposition.js → HeaderContentDisposition.ts} +7 -17
- package/src/mime-parser/{HeaderContentType.js → HeaderContentType.ts} +7 -18
- package/src/mime-parser/{MimeMessage.js → MimeMessage.ts} +25 -35
- package/src/mime-parser/{MimeNode.js → MimeNode.ts} +75 -133
- package/src/mime-parser/encoder/{RawBuffer.js → RawBuffer.ts} +15 -17
- package/src/mime-parser/encoder/{base64-to-blob.js → base64-to-blob.ts} +8 -8
- package/src/mime-parser/encoder/{quoted-printable.js → quoted-printable.ts} +9 -11
- package/src/mime-parser/encoder/{word-encoding.js → word-encoding.ts} +6 -6
- package/src/mime-parser/{parsePairs.js → parsePairs.ts} +5 -4
- package/src/mime-parser/stream/{LineStream.js → LineStream.ts} +12 -19
- package/src/mime-parser/stream/{TextWriter.js → TextWriter.ts} +5 -10
- package/src/mime-parser/{tokenizer.js → tokenizer.ts} +24 -21
- package/tsconfig.json +30 -9
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/mime-parser/AttachmentFile.js +0 -29
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextWriter.js","sourceRoot":"","sources":["../../../src/mime-parser/stream/TextWriter.
|
|
1
|
+
{"version":3,"file":"TextWriter.js","sourceRoot":"","sources":["../../../src/mime-parser/stream/TextWriter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,UAAU;IAC3B,SAAS,CAAC,IAAY;QAClB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;CACJ;AAED,MAAM,OAAO,UAAW,SAAQ,UAAU;IAA1C;;QACI,UAAK,GAAa,EAAE,CAAC;IAczB,CAAC;IAZG,SAAS,CAAC,IAAY;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function tokenize(text: string, sep?: string): Generator<string
|
|
2
|
-
export function tokenizeRFCHeaders(text: string): Generator<string
|
|
3
|
-
export function tokenizeMax(text: string, sep: string, max?: number): string[];
|
|
1
|
+
export declare function tokenize(text: string, sep?: string): Generator<string>;
|
|
2
|
+
export declare function tokenizeRFCHeaders(text: string): Generator<string>;
|
|
3
|
+
export declare function tokenizeMax(text: string, sep: string, max?: number): string[];
|
|
4
4
|
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/mime-parser/tokenizer.
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/mime-parser/tokenizer.ts"],"names":[],"mappings":"AAAA,wBAAiB,QAAQ,CACrB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAY,GAClB,SAAS,CAAC,MAAM,CAAC,CAWnB;AAED,wBAAiB,kBAAkB,CAC/B,IAAI,EAAE,MAAM,GACb,SAAS,CAAC,MAAM,CAAC,CAwBnB;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAgC,GACtC,MAAM,EAAE,CAiBV"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
export function* tokenize(
|
|
2
|
-
/** @type {string} */ text,
|
|
3
|
-
/** @type {string} */ sep = ",") {
|
|
1
|
+
export function* tokenize(text, sep = ",") {
|
|
4
2
|
let start = 0;
|
|
5
3
|
for (;;) {
|
|
6
4
|
const index = text.indexOf(sep, start);
|
|
@@ -12,36 +10,32 @@ export function* tokenize(
|
|
|
12
10
|
}
|
|
13
11
|
yield text.substring(start);
|
|
14
12
|
}
|
|
15
|
-
|
|
16
|
-
export function* tokenizeRFCHeaders(
|
|
17
|
-
/** @type {string} */ text) {
|
|
13
|
+
export function* tokenizeRFCHeaders(text) {
|
|
18
14
|
let start = 0;
|
|
19
15
|
const sep = "\n";
|
|
20
|
-
let last;
|
|
21
|
-
let stop =
|
|
16
|
+
let last = null;
|
|
17
|
+
let stop = false;
|
|
22
18
|
do {
|
|
23
19
|
const index = text.indexOf(sep, start);
|
|
24
20
|
stop = index === -1;
|
|
25
21
|
const line = stop ? text.substring(start) : text.substring(start, index);
|
|
26
22
|
if (/^\s+/i.test(line)) {
|
|
27
|
-
last
|
|
23
|
+
if (last !== null) {
|
|
24
|
+
last += line.trimStart();
|
|
25
|
+
}
|
|
28
26
|
continue;
|
|
29
27
|
}
|
|
30
|
-
if (last) {
|
|
28
|
+
if (last !== null) {
|
|
31
29
|
yield last;
|
|
32
30
|
}
|
|
33
31
|
last = line;
|
|
34
32
|
start = index + 1;
|
|
35
33
|
} while (stop);
|
|
36
|
-
if (last) {
|
|
34
|
+
if (last !== null) {
|
|
37
35
|
yield last;
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
|
-
|
|
41
|
-
export function tokenizeMax(
|
|
42
|
-
/** @type {string} */ text,
|
|
43
|
-
/** @type {string} */ sep,
|
|
44
|
-
/** @type {number} */ max = Number.MAX_SAFE_INTEGER) {
|
|
38
|
+
export function tokenizeMax(text, sep, max = Number.MAX_SAFE_INTEGER) {
|
|
45
39
|
let start = 0;
|
|
46
40
|
const items = [];
|
|
47
41
|
max--;
|
|
@@ -59,5 +53,4 @@ export function tokenizeMax(
|
|
|
59
53
|
items.push(text.substring(start));
|
|
60
54
|
return items;
|
|
61
55
|
}
|
|
62
|
-
;
|
|
63
56
|
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/mime-parser/tokenizer.
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/mime-parser/tokenizer.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,CAAC,CAAC,QAAQ,CACrB,IAAY,EACZ,MAAc,GAAG;IAEjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM;QACV,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,kBAAkB,CAC/B,IAAY;IAEZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,IAAI,CAAC;IACjB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChB,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,CAAC;YACD,SAAS;QACb,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC;QACf,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;QACZ,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC,QAAQ,IAAI,EAAE;IACf,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,CAAC;IACf,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CACvB,IAAY,EACZ,GAAW,EACX,MAAc,MAAM,CAAC,gBAAgB;IAErC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,GAAG,EAAE,CAAC;IACN,SAAS,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM;QACV,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACzC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;QAClB,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,MAAM;QACV,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@social-mail/shared",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Shared Repository that contains things like parser etc that is used by both client and server.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
7
|
"scripts": {
|
|
9
8
|
"test": "node --enable-source-maps ./test.js",
|
|
10
9
|
"postversion": "git push --follow-tags",
|
|
@@ -13,6 +12,7 @@
|
|
|
13
12
|
"author": "",
|
|
14
13
|
"license": "UNLICENSED",
|
|
15
14
|
"devDependencies": {
|
|
16
|
-
"@types/node": "^
|
|
15
|
+
"@types/node": "^26.0.0",
|
|
16
|
+
"typescript": "^6.0.3"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
export default class QueryIterator {
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* @template T
|
|
5
4
|
* @returns {T}
|
|
6
|
-
|
|
7
|
-
static first(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
) {
|
|
5
|
+
*/
|
|
6
|
+
static first<T>(
|
|
7
|
+
source: IterableIterator<T>,
|
|
8
|
+
fx: (item: T) => boolean
|
|
9
|
+
): T {
|
|
11
10
|
for (const iterator of source) {
|
|
12
11
|
if (fx(iterator)) {
|
|
13
12
|
return iterator;
|
|
@@ -18,16 +17,16 @@ export default class QueryIterator {
|
|
|
18
17
|
/**
|
|
19
18
|
* @template T
|
|
20
19
|
* @returns {T | null}
|
|
21
|
-
|
|
22
|
-
firstOrFail(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
) {
|
|
20
|
+
*/
|
|
21
|
+
static firstOrFail<T>(
|
|
22
|
+
source: IterableIterator<T>,
|
|
23
|
+
fx: (item: T) => boolean
|
|
24
|
+
): T | null {
|
|
26
25
|
for (const iterator of source) {
|
|
27
26
|
if (fx(iterator)) {
|
|
28
27
|
return iterator;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
|
-
|
|
30
|
+
return null;
|
|
32
31
|
}
|
|
33
32
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import LineStream, { StringLineStream } from "../mime-parser/stream/LineStream.js";
|
|
2
|
-
import {
|
|
2
|
+
import { tokenizeMax, tokenizeRFCHeaders } from "../mime-parser/tokenizer.js";
|
|
3
|
+
import { ics } from "./ics.js";
|
|
3
4
|
import parseDate from "./parseDate.js";
|
|
4
5
|
|
|
5
6
|
const startDateSymbol = Symbol("startDate");
|
|
@@ -60,15 +61,23 @@ export class CalendarEvent {
|
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
get summary() {
|
|
63
|
-
return this["SUMMARY"] ?? "";
|
|
64
|
+
return ics.unescape(this["SUMMARY"] ?? "");
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
set summary(v) {
|
|
67
68
|
this["SUMMARY"] = v;
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
get description() {
|
|
72
|
+
return ics.unescape(this["DESCRIPTION"] ?? "");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
set description(v) {
|
|
76
|
+
this["DESCRIPTION"] = v;
|
|
77
|
+
}
|
|
78
|
+
|
|
70
79
|
get location() {
|
|
71
|
-
return this["LOCATION"] ?? "";
|
|
80
|
+
return ics.unescape(this["LOCATION"] ?? "");
|
|
72
81
|
}
|
|
73
82
|
|
|
74
83
|
set location(v) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MimeNode } from "./MimeNode.js";
|
|
2
|
+
|
|
3
|
+
export class AttachmentFile extends File {
|
|
4
|
+
disposition: "inline" | "attachment";
|
|
5
|
+
contentId: string;
|
|
6
|
+
node: MimeNode;
|
|
7
|
+
|
|
8
|
+
constructor(
|
|
9
|
+
fileBits: BlobPart[],
|
|
10
|
+
fileName: string,
|
|
11
|
+
options: FilePropertyBag & {
|
|
12
|
+
disposition?: "inline" | "attachment";
|
|
13
|
+
contentId?: string;
|
|
14
|
+
}
|
|
15
|
+
) {
|
|
16
|
+
super(fileBits, fileName, options);
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
this.contentId = options.contentId ?? "";
|
|
20
|
+
this.disposition = options.disposition ?? "attachment";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
@@ -1,24 +1,14 @@
|
|
|
1
1
|
import { wordEncoding } from "./encoder/word-encoding.js";
|
|
2
2
|
import { parsePairs } from "./parsePairs.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
export class HeaderContentDisposition {
|
|
6
|
-
|
|
7
|
-
/** @type {string} */ type;
|
|
8
|
-
/** @type {string} */ filename;
|
|
9
|
-
/** @type {string} */ name;
|
|
10
|
-
|
|
11
5
|
constructor(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
) {
|
|
16
|
-
this.type = type;
|
|
17
|
-
this.filename = filename;
|
|
18
|
-
this.name = name;
|
|
19
|
-
}
|
|
6
|
+
public type?: string,
|
|
7
|
+
public filename?: string,
|
|
8
|
+
public name?: string
|
|
9
|
+
) {}
|
|
20
10
|
|
|
21
|
-
parse(
|
|
11
|
+
parse(text: string) {
|
|
22
12
|
const items = parsePairs(text, "type");
|
|
23
13
|
this.type = items.type;
|
|
24
14
|
this.filename = items.filename;
|
|
@@ -26,7 +16,7 @@ export class HeaderContentDisposition {
|
|
|
26
16
|
}
|
|
27
17
|
|
|
28
18
|
toString() {
|
|
29
|
-
return `${this.type};\r\n\t\tfilename="${wordEncoding.encode(
|
|
19
|
+
return `${this.type};\r\n\t\tfilename="${wordEncoding.encode(this.filename)}";`;
|
|
30
20
|
}
|
|
31
|
-
|
|
32
21
|
}
|
|
22
|
+
|
|
@@ -1,34 +1,23 @@
|
|
|
1
1
|
import { parsePairs } from "./parsePairs.js";
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
export class HeaderContentType {
|
|
5
|
-
|
|
6
|
-
/** @type {string} */ type;
|
|
7
|
-
/** @type {string} */ charset;
|
|
8
|
-
/** @type {string} */ boundary;
|
|
9
|
-
|
|
10
4
|
constructor(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
) {
|
|
15
|
-
this.type = type;
|
|
16
|
-
this.charset = charset;
|
|
17
|
-
this.boundary = boundary;
|
|
18
|
-
}
|
|
5
|
+
public type: string,
|
|
6
|
+
public charset: string = "UTF-8",
|
|
7
|
+
public boundary?: string
|
|
8
|
+
) {}
|
|
19
9
|
|
|
20
|
-
parse(
|
|
10
|
+
parse(text: string): void {
|
|
21
11
|
const items = parsePairs(text, "type");
|
|
22
12
|
this.type = items.type;
|
|
23
13
|
this.charset = items.charset;
|
|
24
14
|
this.boundary = items.boundary;
|
|
25
15
|
}
|
|
26
16
|
|
|
27
|
-
toString() {
|
|
17
|
+
toString(): string {
|
|
28
18
|
if (this.boundary) {
|
|
29
19
|
return `${this.type}; charset="${this.charset}"; boundary="${this.boundary}";`;
|
|
30
20
|
}
|
|
31
21
|
return `${this.type}; charset="${this.charset}";`;
|
|
32
22
|
}
|
|
33
|
-
}
|
|
34
|
-
|
|
23
|
+
}
|
|
@@ -4,12 +4,16 @@ import LineStream, { ReadableLineStream, StringLineStream } from "./stream/LineS
|
|
|
4
4
|
import { BlobWriter } from "./stream/TextWriter.js";
|
|
5
5
|
|
|
6
6
|
export default class MimeMessage {
|
|
7
|
+
constructor(
|
|
8
|
+
private node: MimeNode = new MimeNode("multipart/mixed"),
|
|
9
|
+
private attachments: AttachmentFile[] = []
|
|
10
|
+
) {}
|
|
7
11
|
|
|
8
12
|
static async load(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
) {
|
|
13
|
+
reader: ReadableStream | LineStream | string,
|
|
14
|
+
name: string,
|
|
15
|
+
inline: boolean
|
|
16
|
+
): Promise<MimeMessage> {
|
|
13
17
|
const node = new MimeNode();
|
|
14
18
|
if (name) {
|
|
15
19
|
node.setHeader("X-Name", name);
|
|
@@ -24,9 +28,6 @@ export default class MimeMessage {
|
|
|
24
28
|
await node.parse(stream);
|
|
25
29
|
const attachments = await node.attachments();
|
|
26
30
|
|
|
27
|
-
// we should inline the images and remove them from attachments array for simplicity
|
|
28
|
-
// this should be done when templates are imported from somewhere else
|
|
29
|
-
|
|
30
31
|
const msg = new MimeMessage(node, attachments);
|
|
31
32
|
if (inline) {
|
|
32
33
|
await msg.inlineImages();
|
|
@@ -34,16 +35,16 @@ export default class MimeMessage {
|
|
|
34
35
|
return msg;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
get name() {
|
|
38
|
-
return this.node.header("x-name");
|
|
38
|
+
get name(): string {
|
|
39
|
+
return this.node.header("x-name") || "";
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
get html() {
|
|
42
|
+
get html(): string {
|
|
42
43
|
const alternative = this.node.getFirstChild("multipart/alternative");
|
|
43
|
-
return alternative?.getFirstChild("text/html")?.text
|
|
44
|
+
return alternative?.getFirstChild("text/html")?.text || "";
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
set html(
|
|
47
|
+
set html(v: string) {
|
|
47
48
|
const alternative = this.node.getFirstChild("multipart/alternative", true);
|
|
48
49
|
const htmlMime = alternative.getFirstChild("text/html", true);
|
|
49
50
|
htmlMime.contentTransferEncoding = "quoted-printable";
|
|
@@ -51,44 +52,34 @@ export default class MimeMessage {
|
|
|
51
52
|
htmlMime.contentType.charset = "UTF-8";
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
get text() {
|
|
55
|
+
get text(): string {
|
|
55
56
|
const alternative = this.node.getFirstChild("multipart/alternative");
|
|
56
|
-
return alternative?.getFirstChild("text/plain")?.text
|
|
57
|
+
return alternative?.getFirstChild("text/plain")?.text || "";
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
set text(
|
|
60
|
+
set text(v: string) {
|
|
60
61
|
const alternative = this.node.getFirstChild("multipart/alternative", true);
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
const plainMime = alternative.getFirstChild("text/plain", true);
|
|
63
|
+
plainMime.contentTransferEncoding = "quoted-printable";
|
|
64
|
+
plainMime.text = v;
|
|
65
|
+
plainMime.contentType.charset = "UTF-8";
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
get subject() {
|
|
68
|
-
return this.node.header("subject")
|
|
68
|
+
get subject(): string {
|
|
69
|
+
return this.node.header("subject") || "";
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
set subject(
|
|
72
|
+
set subject(v: string) {
|
|
72
73
|
this.node.setHeader("subject", v);
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
/** @type {AttachmentFile[]} */ attachments;
|
|
77
|
-
|
|
78
|
-
constructor(
|
|
79
|
-
/** @type {MimeNode} */ node = new MimeNode("multipart/mixed"),
|
|
80
|
-
/** @type {AttachmentFile[]} */ attachments = []) {
|
|
81
|
-
this.node = node;
|
|
82
|
-
this.attachments = attachments;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async save() {
|
|
76
|
+
async save(): Promise<Blob> {
|
|
86
77
|
const blobWriter = new BlobWriter();
|
|
87
78
|
await this.node.save(blobWriter);
|
|
88
79
|
return blobWriter.toBlob();
|
|
89
80
|
}
|
|
90
81
|
|
|
91
|
-
async inlineImages() {
|
|
82
|
+
async inlineImages(): Promise<void> {
|
|
92
83
|
let text = this.html;
|
|
93
84
|
if (!text) {
|
|
94
85
|
return;
|
|
@@ -101,5 +92,4 @@ export default class MimeMessage {
|
|
|
101
92
|
}
|
|
102
93
|
}
|
|
103
94
|
}
|
|
104
|
-
|
|
105
95
|
}
|