@social-mail/shared 1.0.29 → 1.1.4
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/.vscode/settings.json +1 -1
- 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.js +36 -92
- package/dist/ical-parser/Calender.js.map +1 -1
- 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/HeaderContactList.d.ts +15 -0
- package/dist/mime-parser/HeaderContactList.d.ts.map +1 -0
- package/dist/mime-parser/HeaderContactList.js +37 -0
- package/dist/mime-parser/HeaderContactList.js.map +1 -0
- package/dist/mime-parser/HeaderContentDisposition.d.ts +6 -6
- package/dist/mime-parser/HeaderContentDisposition.d.ts.map +1 -1
- package/dist/mime-parser/HeaderContentDisposition.js +5 -10
- package/dist/mime-parser/HeaderContentDisposition.js.map +1 -1
- package/dist/mime-parser/HeaderContentType.d.ts +6 -6
- package/dist/mime-parser/HeaderContentType.d.ts.map +1 -1
- package/dist/mime-parser/HeaderContentType.js +5 -10
- package/dist/mime-parser/HeaderContentType.js.map +1 -1
- package/dist/mime-parser/HeaderEmailAddress.d.ts +10 -0
- package/dist/mime-parser/HeaderEmailAddress.d.ts.map +1 -0
- package/dist/mime-parser/HeaderEmailAddress.js +27 -0
- package/dist/mime-parser/HeaderEmailAddress.js.map +1 -0
- package/dist/mime-parser/HeaderLinks.d.ts +9 -0
- package/dist/mime-parser/HeaderLinks.d.ts.map +1 -0
- package/dist/mime-parser/HeaderLinks.js +42 -0
- package/dist/mime-parser/HeaderLinks.js.map +1 -0
- package/dist/mime-parser/MimeEmailAddressParser.d.ts +13 -0
- package/dist/mime-parser/MimeEmailAddressParser.d.ts.map +1 -0
- package/dist/mime-parser/MimeEmailAddressParser.js +17 -0
- package/dist/mime-parser/MimeEmailAddressParser.js.map +1 -0
- package/dist/mime-parser/MimeHeaders.d.ts +19 -0
- package/dist/mime-parser/MimeHeaders.d.ts.map +1 -0
- package/dist/mime-parser/MimeHeaders.js +47 -0
- package/dist/mime-parser/MimeHeaders.js.map +1 -0
- package/dist/mime-parser/MimeMessage.d.ts +44 -11
- package/dist/mime-parser/MimeMessage.d.ts.map +1 -1
- package/dist/mime-parser/MimeMessage.js +81 -73
- package/dist/mime-parser/MimeMessage.js.map +1 -1
- package/dist/mime-parser/MimeNode.d.ts +32 -39
- package/dist/mime-parser/MimeNode.d.ts.map +1 -1
- package/dist/mime-parser/MimeNode.js +166 -298
- package/dist/mime-parser/MimeNode.js.map +1 -1
- package/dist/mime-parser/RegexGenerator.d.ts +9 -0
- package/dist/mime-parser/RegexGenerator.d.ts.map +1 -0
- package/dist/mime-parser/RegexGenerator.js +40 -0
- package/dist/mime-parser/RegexGenerator.js.map +1 -0
- 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 +5 -3
- package/dist/mime-parser/stream/TextWriter.d.ts.map +1 -1
- package/dist/mime-parser/stream/TextWriter.js +15 -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 +1 -1
- package/src/mime-parser/AttachmentFile.ts +24 -0
- package/src/mime-parser/HeaderContactList.ts +41 -0
- package/src/mime-parser/HeaderContentDisposition.ts +21 -0
- package/src/mime-parser/HeaderContentType.ts +22 -0
- package/src/mime-parser/HeaderEmailAddress.ts +38 -0
- package/src/mime-parser/HeaderLinks.ts +48 -0
- package/src/mime-parser/MimeEmailAddressParser.ts +22 -0
- package/src/mime-parser/MimeHeaders.ts +62 -0
- package/src/mime-parser/MimeMessage.ts +134 -0
- package/src/mime-parser/{MimeNode.js → MimeNode.ts} +92 -159
- package/src/mime-parser/RegexGenerator.ts +42 -0
- 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.ts +36 -0
- 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
- package/src/mime-parser/HeaderContentDisposition.js +0 -32
- package/src/mime-parser/HeaderContentType.js +0 -34
- package/src/mime-parser/MimeMessage.js +0 -105
- package/src/mime-parser/stream/TextWriter.js +0 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineStream.js","sourceRoot":"","sources":["../../../src/mime-parser/stream/LineStream.
|
|
1
|
+
{"version":3,"file":"LineStream.js","sourceRoot":"","sources":["../../../src/mime-parser/stream/LineStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export default class TextWriter {
|
|
2
2
|
writeLine(line: string): void;
|
|
3
|
+
writeLineMax80Chars(line: string, padPrefix?: string): void;
|
|
3
4
|
}
|
|
4
|
-
export class BlobWriter extends TextWriter {
|
|
5
|
-
/** @type {string[]} */
|
|
5
|
+
export declare class BlobWriter extends TextWriter {
|
|
6
6
|
lines: string[];
|
|
7
|
-
|
|
7
|
+
writeLine(line: string): void;
|
|
8
|
+
toBlob(): Blob;
|
|
9
|
+
toString(): string;
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=TextWriter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextWriter.d.ts","sourceRoot":"","sources":["../../../src/mime-parser/stream/TextWriter.
|
|
1
|
+
{"version":3,"file":"TextWriter.d.ts","sourceRoot":"","sources":["../../../src/mime-parser/stream/TextWriter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,UAAU;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK;CAanD;AAED,qBAAa,UAAW,SAAQ,UAAU;IACtC,KAAK,EAAE,MAAM,EAAE,CAAM;IAErB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,MAAM,IAAI,IAAI;IAKd,QAAQ,IAAI,MAAM;CAGrB"}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
export default class TextWriter {
|
|
2
|
-
writeLine(
|
|
2
|
+
writeLine(line) {
|
|
3
3
|
throw new Error("Not Implemented");
|
|
4
4
|
}
|
|
5
|
+
writeLineMax80Chars(line, padPrefix = "") {
|
|
6
|
+
let prefix = "";
|
|
7
|
+
for (;;) {
|
|
8
|
+
if (line.length <= 80) {
|
|
9
|
+
this.writeLine(prefix + line);
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
const firstSegment = line.substring(0, 80);
|
|
13
|
+
this.writeLine(prefix + firstSegment);
|
|
14
|
+
line = line.substring(80);
|
|
15
|
+
prefix = padPrefix;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
5
18
|
}
|
|
6
19
|
export class BlobWriter extends TextWriter {
|
|
7
20
|
constructor() {
|
|
8
21
|
super(...arguments);
|
|
9
|
-
/** @type {string[]} */
|
|
10
22
|
this.lines = [];
|
|
11
23
|
}
|
|
12
|
-
writeLine(
|
|
24
|
+
writeLine(line) {
|
|
13
25
|
this.lines.push(line);
|
|
14
26
|
}
|
|
15
27
|
toBlob() {
|
|
@@ -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;IAED,mBAAmB,CAAC,IAAY,EAAE,SAAS,GAAG,EAAE;QAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,SAAQ,CAAC;YACL,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;gBAC9B,MAAM;YACV,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;YACtC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,GAAG,SAAS,CAAC;QACvB,CAAC;IACL,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.4",
|
|
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,5 @@
|
|
|
1
1
|
import LineStream, { StringLineStream } from "../mime-parser/stream/LineStream.js";
|
|
2
|
-
import {
|
|
2
|
+
import { tokenizeMax, tokenizeRFCHeaders } from "../mime-parser/tokenizer.js";
|
|
3
3
|
import { ics } from "./ics.js";
|
|
4
4
|
import parseDate from "./parseDate.js";
|
|
5
5
|
|
|
@@ -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
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import HeaderEmailAddress from "./HeaderEmailAddress.js";
|
|
2
|
+
import MimeAddressParser from "./MimeEmailAddressParser.js";
|
|
3
|
+
|
|
4
|
+
export default class HeaderContactList {
|
|
5
|
+
|
|
6
|
+
static from(v: string | { emailAddress: string, name?: string } | { emailAddress: string, name?: string }[]) {
|
|
7
|
+
const h = new HeaderContactList();
|
|
8
|
+
if (typeof v === "string") {
|
|
9
|
+
if (v.includes("<")) {
|
|
10
|
+
h.addresses.push(HeaderEmailAddress.parse(v));
|
|
11
|
+
return h;
|
|
12
|
+
}
|
|
13
|
+
h.addresses.push(new HeaderEmailAddress(v));
|
|
14
|
+
return h;
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(v)) {
|
|
17
|
+
const h = new HeaderContactList();
|
|
18
|
+
for(const a of v) {
|
|
19
|
+
h.addresses.push(new HeaderEmailAddress(a.emailAddress, a.name));
|
|
20
|
+
}
|
|
21
|
+
return h;
|
|
22
|
+
}
|
|
23
|
+
return new HeaderContactList([ new HeaderEmailAddress(v.emailAddress, v.name) ]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static parse(lines: string) {
|
|
27
|
+
const h = new HeaderContactList();
|
|
28
|
+
for(const g of MimeAddressParser.parseContactAddressList(lines)) {
|
|
29
|
+
h.addresses.push(new HeaderEmailAddress(g.address, g.name));
|
|
30
|
+
}
|
|
31
|
+
return h;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
constructor(public addresses: HeaderEmailAddress[] = []) {
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
toString() {
|
|
39
|
+
return this.addresses.join(",");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { wordEncoding } from "./encoder/word-encoding.js";
|
|
2
|
+
import { parsePairs } from "./parsePairs.js";
|
|
3
|
+
|
|
4
|
+
export class HeaderContentDisposition {
|
|
5
|
+
|
|
6
|
+
static parse(text: string) {
|
|
7
|
+
const items = parsePairs(text, "type");
|
|
8
|
+
return new HeaderContentDisposition(items.type, items.filename, items.name);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
public type?: string,
|
|
13
|
+
public filename?: string,
|
|
14
|
+
public name?: string
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
toString() {
|
|
18
|
+
return `${this.type};\r\n\t\tfilename="${wordEncoding.encode(this.filename)}";`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parsePairs } from "./parsePairs.js";
|
|
2
|
+
|
|
3
|
+
export class HeaderContentType {
|
|
4
|
+
|
|
5
|
+
public static parse(text: string) {
|
|
6
|
+
const items = parsePairs(text, "type");
|
|
7
|
+
return new HeaderContentType(items.type, items.charset, items.boundary);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
constructor(
|
|
11
|
+
public type: string,
|
|
12
|
+
public charset: string = "UTF-8",
|
|
13
|
+
public boundary?: string
|
|
14
|
+
) {}
|
|
15
|
+
|
|
16
|
+
toString(): string {
|
|
17
|
+
if (this.boundary) {
|
|
18
|
+
return `${this.type}; charset="${this.charset}"; boundary="${this.boundary}";`;
|
|
19
|
+
}
|
|
20
|
+
return `${this.type}; charset="${this.charset}";`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import MimeAddressParser from "./MimeEmailAddressParser.js";
|
|
2
|
+
|
|
3
|
+
export default class HeaderEmailAddress {
|
|
4
|
+
|
|
5
|
+
static parse(text: string) {
|
|
6
|
+
if (/(\<|\>)/i.test(text)) {
|
|
7
|
+
for(const g of MimeAddressParser.parseContactAddressList(text)) {
|
|
8
|
+
const e1 = new HeaderEmailAddress(g.address, g.name);
|
|
9
|
+
return e1;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const e = new HeaderEmailAddress(text);
|
|
13
|
+
return e;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Username (part before the @ sign)
|
|
18
|
+
*/
|
|
19
|
+
public readonly username: string;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Domain name part of the email address
|
|
23
|
+
*/
|
|
24
|
+
public readonly domain: string;
|
|
25
|
+
|
|
26
|
+
constructor(public emailAddress: string, public name?: string) {
|
|
27
|
+
const r = MimeAddressParser.parseEmailAddress(emailAddress);
|
|
28
|
+
this.domain = r?.domain;
|
|
29
|
+
this.username = r?.user;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
toString() {
|
|
33
|
+
if (this.name) {
|
|
34
|
+
return `${this.name} <${this.emailAddress}>`;
|
|
35
|
+
}
|
|
36
|
+
return `<${this.emailAddress}>`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export default class HeaderLinks {
|
|
2
|
+
|
|
3
|
+
static parse(value: string) {
|
|
4
|
+
const h = new HeaderLinks();
|
|
5
|
+
const { urls, mailTos, rawLinks } = h;
|
|
6
|
+
for(const line of value.split(/\[\,\;]/g)) {
|
|
7
|
+
if (!line) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const a = /\<([^\>]+)\>/.exec(line.trim());
|
|
11
|
+
if(!a) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const s = a[1];
|
|
15
|
+
rawLinks.push(s);
|
|
16
|
+
if(/https?\:\/\//i.test(s)) {
|
|
17
|
+
try {
|
|
18
|
+
urls.push(new URL(s));
|
|
19
|
+
} catch {
|
|
20
|
+
// do nothing...
|
|
21
|
+
}
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if(/mailto\:/i.test(s)) {
|
|
25
|
+
try {
|
|
26
|
+
mailTos.push(new URL(s));
|
|
27
|
+
} catch {
|
|
28
|
+
// do nothing..
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return h;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public readonly urls = [] as URL[];
|
|
36
|
+
|
|
37
|
+
public readonly mailTos = [] as URL[];
|
|
38
|
+
|
|
39
|
+
public readonly rawLinks = [] as string[];
|
|
40
|
+
|
|
41
|
+
constructor() {
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
toString() {
|
|
46
|
+
return this.rawLinks.join(",");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import RegexGenerator from "./RegexGenerator.js";
|
|
2
|
+
|
|
3
|
+
export const emailAddressHeaderRegex = /(?<name>(("(("")|[^"])+")|([^\<]+)))?\s*\<(?<address>[^\>]+)\>/g;
|
|
4
|
+
|
|
5
|
+
export const emailAddressRegex = /(?<user>(("(""|[^"])+")|([^\@])+))\@(?<domain>[^\s\,\;]*)$/g;
|
|
6
|
+
|
|
7
|
+
export default class MimeAddressParser {
|
|
8
|
+
|
|
9
|
+
public static parseEmailAddress(text: string) {
|
|
10
|
+
const r = emailAddressRegex.exec(text);
|
|
11
|
+
return r?.groups as { user: string, domain: string } ;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static *parseContactAddressList(text: string) {
|
|
15
|
+
const rg = new RegexGenerator(emailAddressHeaderRegex);
|
|
16
|
+
for(const g of rg.groups(text)) {
|
|
17
|
+
const { name, address } = g.groups;
|
|
18
|
+
yield { name, address };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class MimeHeader {
|
|
2
|
+
|
|
3
|
+
public readonly keyLowerCase: string;
|
|
4
|
+
|
|
5
|
+
private lastParsed: { c, value };
|
|
6
|
+
|
|
7
|
+
constructor(public readonly key: string, public readonly value: string) {
|
|
8
|
+
this.keyLowerCase = key.toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
as<Parsable>(c: { parse(text: string): Parsable }): Parsable {
|
|
12
|
+
const { lastParsed } = this;
|
|
13
|
+
if (lastParsed?.c === c) {
|
|
14
|
+
return lastParsed.value;
|
|
15
|
+
}
|
|
16
|
+
const value = c.parse(this.value);
|
|
17
|
+
this.lastParsed = { c, value };
|
|
18
|
+
return value as Parsable;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* This class holds the headers in the way they were received.
|
|
24
|
+
* It has different methods to retrive headers.
|
|
25
|
+
* `first` will only display first header.
|
|
26
|
+
* `last` will only display last header in the order.
|
|
27
|
+
*/
|
|
28
|
+
export default class MimeHeaders {
|
|
29
|
+
|
|
30
|
+
private headers = [] as MimeHeader[];
|
|
31
|
+
|
|
32
|
+
private map = new Map<string, MimeHeader[]>()
|
|
33
|
+
|
|
34
|
+
public entries() {
|
|
35
|
+
return this.headers[Symbol.iterator]();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public append(key: string, value: string) {
|
|
39
|
+
const h = new MimeHeader(key, value);
|
|
40
|
+
this.headers.push(h);
|
|
41
|
+
const lowerKey = key.toLowerCase();
|
|
42
|
+
let existing = this.map.get(lowerKey);
|
|
43
|
+
if (!existing) {
|
|
44
|
+
existing = [];
|
|
45
|
+
this.map.set(lowerKey, existing);
|
|
46
|
+
}
|
|
47
|
+
existing.push(h);
|
|
48
|
+
return h;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public set(key: string, value: string) {
|
|
52
|
+
const lowerkey = key.toLowerCase();
|
|
53
|
+
this.headers = this.headers.filter((x) => x.keyLowerCase !== lowerkey);
|
|
54
|
+
this.map.delete(lowerkey);
|
|
55
|
+
this.append(key, value);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public first(key: string) {
|
|
59
|
+
return this.map.get(key.toLowerCase())?.[0];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { MimeNode } from "./MimeNode.js";
|
|
2
|
+
import { AttachmentFile } from "./AttachmentFile.js";
|
|
3
|
+
import LineStream, { ReadableLineStream, StringLineStream } from "./stream/LineStream.js";
|
|
4
|
+
import { BlobWriter } from "./stream/TextWriter.js";
|
|
5
|
+
import HeaderLinks from "./HeaderLinks.js";
|
|
6
|
+
import HeaderEmailAddress from "./HeaderEmailAddress.js";
|
|
7
|
+
import HeaderContactList from "./HeaderContactList.js";
|
|
8
|
+
|
|
9
|
+
export default class MimeMessage {
|
|
10
|
+
constructor(
|
|
11
|
+
private node: MimeNode = new MimeNode("multipart/mixed"),
|
|
12
|
+
private attachments: AttachmentFile[] = []
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
static async load(
|
|
16
|
+
reader: ReadableStream | LineStream | string,
|
|
17
|
+
name: string,
|
|
18
|
+
inline: boolean
|
|
19
|
+
): Promise<MimeMessage> {
|
|
20
|
+
const node = new MimeNode();
|
|
21
|
+
if (name) {
|
|
22
|
+
node.setHeader("X-Name", name);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const stream = typeof reader === "string"
|
|
26
|
+
? new StringLineStream(reader)
|
|
27
|
+
: (reader instanceof LineStream
|
|
28
|
+
? reader
|
|
29
|
+
: new ReadableLineStream(reader));
|
|
30
|
+
|
|
31
|
+
await node.parse(stream);
|
|
32
|
+
const attachments = await node.attachments();
|
|
33
|
+
|
|
34
|
+
const msg = new MimeMessage(node, attachments);
|
|
35
|
+
if (inline) {
|
|
36
|
+
await msg.inlineImages();
|
|
37
|
+
}
|
|
38
|
+
return msg;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get name(): string {
|
|
42
|
+
return this.node.firstHeaderString("x-name") || "";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get html(): string {
|
|
46
|
+
const alternative = this.node.getFirstChild("multipart/alternative");
|
|
47
|
+
return alternative?.getFirstChild("text/html")?.text || "";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get listUnsubscribe() {
|
|
51
|
+
return this.node.firstHeaderObject("list-unsubscribe")?.as(HeaderLinks);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set html(v: string) {
|
|
55
|
+
const alternative = this.node.getFirstChild("multipart/alternative", true);
|
|
56
|
+
const htmlMime = alternative.getFirstChild("text/html", true);
|
|
57
|
+
htmlMime.contentTransferEncoding = "quoted-printable";
|
|
58
|
+
htmlMime.text = v;
|
|
59
|
+
htmlMime.contentType.charset = "UTF-8";
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get text(): string {
|
|
63
|
+
const alternative = this.node.getFirstChild("multipart/alternative");
|
|
64
|
+
return alternative?.getFirstChild("text/plain")?.text || "";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
set text(v: string) {
|
|
68
|
+
const alternative = this.node.getFirstChild("multipart/alternative", true);
|
|
69
|
+
const plainMime = alternative.getFirstChild("text/plain", true);
|
|
70
|
+
plainMime.contentTransferEncoding = "quoted-printable";
|
|
71
|
+
plainMime.text = v;
|
|
72
|
+
plainMime.contentType.charset = "UTF-8";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get subject(): string {
|
|
76
|
+
return this.node.firstHeaderString("subject") || "";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
set subject(v: string) {
|
|
80
|
+
this.node.setHeader("Subject", v);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
get from(): HeaderEmailAddress {
|
|
84
|
+
return this.node.firstHeaderObject("from")?.as(HeaderEmailAddress);
|
|
85
|
+
}
|
|
86
|
+
set from(v: string | { name: string, emailAddress: string }) {
|
|
87
|
+
if (typeof v === "string") {
|
|
88
|
+
this.node.setHeader("From", v);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.node.setHeader("From", new HeaderEmailAddress(v.emailAddress, v.name).toString());
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
get to(): HeaderContactList {
|
|
95
|
+
return this.node.firstHeaderObject("to")?.as(HeaderContactList);
|
|
96
|
+
}
|
|
97
|
+
set to(v: string | { name: string, emailAddress: string } | { name: string, emailAddress: string }[]) {
|
|
98
|
+
this.node.setHeader("To", HeaderContactList.from(v).toString());
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
get cc(): HeaderContactList {
|
|
102
|
+
return this.node.firstHeaderObject("cc")?.as(HeaderContactList);
|
|
103
|
+
}
|
|
104
|
+
set cc(v: string | { name: string, emailAddress: string } | { name: string, emailAddress: string }[]) {
|
|
105
|
+
this.node.setHeader("Cc", HeaderContactList.from(v).toString());
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
get bcc(): HeaderContactList {
|
|
109
|
+
return this.node.firstHeaderObject("bcc")?.as(HeaderContactList);
|
|
110
|
+
}
|
|
111
|
+
set bcc(v: string | { name: string, emailAddress: string } | { name: string, emailAddress: string }[]) {
|
|
112
|
+
this.node.setHeader("Bcc", HeaderContactList.from(v).toString());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async save(): Promise<Blob> {
|
|
116
|
+
const blobWriter = new BlobWriter();
|
|
117
|
+
await this.node.save(blobWriter);
|
|
118
|
+
return blobWriter.toBlob();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async inlineImages(): Promise<void> {
|
|
122
|
+
let text = this.html;
|
|
123
|
+
if (!text) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (const iterator of this.attachments) {
|
|
128
|
+
if (iterator.contentId) {
|
|
129
|
+
const encoded = iterator.node.encoded;
|
|
130
|
+
text = text.split(`cid:${iterator.contentId}`).join(`data://${iterator.type},${encoded}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|