@social-mail/shared 1.0.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 +16 -0
- package/.vscode/launch.json +21 -0
- package/.vscode/settings.json +55 -0
- package/README.md +3 -0
- package/dist/QueryIterator.js +28 -0
- package/dist/QueryIterator.js.map +1 -0
- package/dist/mime-parser/AttachmentFile.js +21 -0
- package/dist/mime-parser/AttachmentFile.js.map +1 -0
- package/dist/mime-parser/HeaderContentDisposition.js +32 -0
- package/dist/mime-parser/HeaderContentDisposition.js.map +1 -0
- package/dist/mime-parser/HeaderContentType.js +33 -0
- package/dist/mime-parser/HeaderContentType.js.map +1 -0
- package/dist/mime-parser/MimeMessage.js +99 -0
- package/dist/mime-parser/MimeMessage.js.map +1 -0
- package/dist/mime-parser/MimeNode.js +406 -0
- package/dist/mime-parser/MimeNode.js.map +1 -0
- package/dist/mime-parser/encoder/RawBuffer.js +57 -0
- package/dist/mime-parser/encoder/RawBuffer.js.map +1 -0
- package/dist/mime-parser/encoder/base64-to-blob.js +30 -0
- package/dist/mime-parser/encoder/base64-to-blob.js.map +1 -0
- package/dist/mime-parser/encoder/quoted-printable.js +71 -0
- package/dist/mime-parser/encoder/quoted-printable.js.map +1 -0
- package/dist/mime-parser/encoder/word-encoding.js +45 -0
- package/dist/mime-parser/encoder/word-encoding.js.map +1 -0
- package/dist/mime-parser/parsePairs.js +40 -0
- package/dist/mime-parser/parsePairs.js.map +1 -0
- package/dist/mime-parser/stream/LineStream.js +99 -0
- package/dist/mime-parser/stream/LineStream.js.map +1 -0
- package/dist/mime-parser/stream/TextWriter.js +36 -0
- package/dist/mime-parser/stream/TextWriter.js.map +1 -0
- package/dist/mime-parser/tokenizer.js +46 -0
- package/dist/mime-parser/tokenizer.js.map +1 -0
- package/dist/tests/mime/lines-test.js +19 -0
- package/dist/tests/mime/lines-test.js.map +1 -0
- package/dist/tests/mime/message1.js +58 -0
- package/dist/tests/mime/message1.js.map +1 -0
- package/dist/tests/mime/message2.js +77 -0
- package/dist/tests/mime/message2.js.map +1 -0
- package/dist/tests/mime/pairs.js +33 -0
- package/dist/tests/mime/pairs.js.map +1 -0
- package/dist/tests/mime/parse-headers.js +104 -0
- package/dist/tests/mime/parse-headers.js.map +1 -0
- package/dist/tests/mime/word-encoding-test.js +21 -0
- package/dist/tests/mime/word-encoding-test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/index.js +4 -0
- package/package.json +17 -0
- package/src/QueryIterator.js +33 -0
- package/src/mime-parser/AttachmentFile.js +29 -0
- package/src/mime-parser/HeaderContentDisposition.js +32 -0
- package/src/mime-parser/HeaderContentType.js +34 -0
- package/src/mime-parser/MimeMessage.js +100 -0
- package/src/mime-parser/MimeNode.js +435 -0
- package/src/mime-parser/encoder/RawBuffer.js +60 -0
- package/src/mime-parser/encoder/base64-to-blob.js +26 -0
- package/src/mime-parser/encoder/quoted-printable.js +118 -0
- package/src/mime-parser/encoder/word-encoding.js +43 -0
- package/src/mime-parser/parsePairs.js +34 -0
- package/src/mime-parser/stream/LineStream.js +85 -0
- package/src/mime-parser/stream/TextWriter.js +27 -0
- package/src/mime-parser/tokenizer.js +37 -0
- package/src/tests/mime/lines-test.js +17 -0
- package/src/tests/mime/message1.js +46 -0
- package/src/tests/mime/message2.js +73 -0
- package/src/tests/mime/pairs.js +38 -0
- package/src/tests/mime/parse-headers.js +90 -0
- package/src/tests/mime/word-encoding-test.js +13 -0
- package/test.js +70 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { MimeNode } from "../../mime-parser/MimeNode.js";
|
|
2
|
+
import { StringLineStream } from "../../mime-parser/stream/LineStream.js";
|
|
3
|
+
|
|
4
|
+
export default async function() {
|
|
5
|
+
const root = new MimeNode();
|
|
6
|
+
await root.parse(new StringLineStream(data));
|
|
7
|
+
|
|
8
|
+
const line = root.header("List-Unsubscribe");
|
|
9
|
+
console.log(line);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const data = `Delivered-To: ackava@gmail.com
|
|
13
|
+
Received: by 2002:ab3:fb12:0:b0:55d:606f:316e with SMTP id n18csp110497qnc;
|
|
14
|
+
Tue, 16 Jul 2024 00:23:51 -0700 (PDT)
|
|
15
|
+
X-Google-Smtp-Source: AGHT+IG1SNKA212/w5wgGPhsGwDhteJcLZxIoFYt5++EY6fqJsoA8eG3YioEOhn33fp7b/Ii1kTy
|
|
16
|
+
X-Received: by 2002:a05:6512:b84:b0:52c:95d1:87ae with SMTP id 2adb3069b0e04-52edef0e8acmr721947e87.12.1721114631113;
|
|
17
|
+
Tue, 16 Jul 2024 00:23:51 -0700 (PDT)
|
|
18
|
+
ARC-Seal: i=1; a=rsa-sha256; t=1721114631; cv=none;
|
|
19
|
+
d=google.com; s=arc-20160816;
|
|
20
|
+
b=h5iWpTD67iJQIPQ2rISbEeCRpR5O6TndQGDDEF3fiDa/oeu+TrOZ1HqC/ItpAW8DPM
|
|
21
|
+
uhHYiizYmwW55CqmX9WBz1ZXW/7UonlaueovDvS53gE2z7JZJTOYQ+0A2a5UOW1uUT20
|
|
22
|
+
gOtIDijsIJWslFbUHhylDntEYuKqhilu8CmPKq7JV9u0kvGmfu9o2nAlvAF9YTFoQWKg
|
|
23
|
+
oI64yIdppcVBKvrtY8IBErpSTdFLjTE8+gmyecrqSckiu8iVut98rCToLapPqJEPHqlk
|
|
24
|
+
SfJvj6GVm+uxrvibo7ZAp47t0SRolim2bmf98WyTP5cQNH8ArljitYXpPcR4pwjaRr09
|
|
25
|
+
ldVQ==
|
|
26
|
+
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
|
|
27
|
+
h=content-transfer-encoding:dkim-signature:date:mime-version
|
|
28
|
+
:message-id:feedback-id:list-unsubscribe-post:list-unsubscribe
|
|
29
|
+
:reply-to:to:from:subject:dkim-signature;
|
|
30
|
+
bh=0maos44Zuz8flcClsVew9ePIYSOCt14KoDH/LV+EAnU=;
|
|
31
|
+
fh=DKA8qbEmJrBdLQCfJ+uCkMwAeFQdRJbQdCs9kin0cIA=;
|
|
32
|
+
b=PQr4Z7hlUhnUUAZO7jTDPUWNy56d+ftqg2UnFkjLonrj3Fnvmp0k/VC4bajuvrl1q0
|
|
33
|
+
eC8b8LB1TVEwgakQRRdXBTx5Bavf6Hz+U5ma4ODhyB4h/ElvouY9jc+YfAVghMaaI7Xt
|
|
34
|
+
gz66knjcQEpomwIkiRPdrcqOFRUocGPCgkfSLMPHooT2xlH2ygGcM7OpF1d0apeLb06Y
|
|
35
|
+
xnHCp33ogJY1tOsNMcaq+CWIyA5JwIivTW9UDjxv6IEe+grgulh3ZGWH5OKNXjyIwkNn
|
|
36
|
+
FLWh64LGxGV8VkmwQz8irsNiSnleYiJ6DCWf0xLjbYWoRZdq0PCBmdbditGCwLI1hwgy
|
|
37
|
+
76EQ==;
|
|
38
|
+
dara=google.com
|
|
39
|
+
ARC-Authentication-Results: i=1; mx.google.com;
|
|
40
|
+
dkim=pass header.i=@mailer.dellyranks.com header.s=dellymail header.b=tXYXEFDD;
|
|
41
|
+
dkim=pass header.i=@mailer.dellyranks.com header.s=mailer header.b=qzKwQCsc;
|
|
42
|
+
spf=pass (google.com: domain of info@mailer.dellyranks.com designates 198.244.191.107 as permitted sender) smtp.mailfrom=info@mailer.dellyranks.com;
|
|
43
|
+
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=mailer.dellyranks.com
|
|
44
|
+
Return-Path: <info@mailer.dellyranks.com>
|
|
45
|
+
Received: from mailer.dellyranks.com (mailer.dellyranks.com. [198.244.191.107])
|
|
46
|
+
by mx.google.com with ESMTPS id 2adb3069b0e04-52ed25289b1si2008285e87.128.2024.07.16.00.23.50
|
|
47
|
+
for <ackava@gmail.com>
|
|
48
|
+
(version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256);
|
|
49
|
+
Tue, 16 Jul 2024 00:23:51 -0700 (PDT)
|
|
50
|
+
Received-SPF: pass (google.com: domain of info@mailer.dellyranks.com designates 198.244.191.107 as permitted sender) client-ip=198.244.191.107;
|
|
51
|
+
Authentication-Results: mx.google.com;
|
|
52
|
+
dkim=pass header.i=@mailer.dellyranks.com header.s=dellymail header.b=tXYXEFDD;
|
|
53
|
+
dkim=pass header.i=@mailer.dellyranks.com header.s=mailer header.b=qzKwQCsc;
|
|
54
|
+
spf=pass (google.com: domain of info@mailer.dellyranks.com designates 198.244.191.107 as permitted sender) smtp.mailfrom=info@mailer.dellyranks.com;
|
|
55
|
+
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=mailer.dellyranks.com
|
|
56
|
+
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=dellymail; d=mailer.dellyranks.com;
|
|
57
|
+
h=Subject:From:To:Reply-To:List-Unsubscribe:Feedback-ID:Message-ID:
|
|
58
|
+
MIME-Version:Date:Content-Type:Content-Transfer-Encoding;
|
|
59
|
+
i=info@mailer.dellyranks.com;
|
|
60
|
+
bh=0maos44Zuz8flcClsVew9ePIYSOCt14KoDH/LV+EAnU=;
|
|
61
|
+
b=tXYXEFDDK2TGnvSi537/Pze7NQn3mklPdoqeRogFSGXg2l/tCTeyLkg2cI119e6PmE7UTJo2LBK9
|
|
62
|
+
dTatP6Xnjl1SAbgxNccD5NONXQKJ1GOi8GhE7j7kkvRE+O7Jy3Cm2r7OO/6+MDjrcO2I5Kj1pjgD
|
|
63
|
+
6Omfmv14dAZBNlLdH0p45b4+afS5qkvkqH+13HCKLFwTi11KjAfR6MkMjkle0H5ml/1e8/FAATMN
|
|
64
|
+
pyakbrzNIlgEBKv6/y7332SlGxzdqcUcnMQ+iGV1Tzh4ViBtH+urwzZS7wmtvtW3MOqPFA/LFof7
|
|
65
|
+
Yz5fOGWkFJsNgPsfvcrMwEtNnFQC3IYBdWHbkA==
|
|
66
|
+
Subject: Lacoste Mega Clearance SALE =?utf-8?Q?=E2=9A=A1=EF=B8=8FUpto?= 50%
|
|
67
|
+
Off - Clothing, Shoes & Accessories -ackava@gmail.com
|
|
68
|
+
From: Lacoste IN <info@mailer.dellyranks.com>
|
|
69
|
+
To: "ackava@gmail.com" <ackava@gmail.com>
|
|
70
|
+
Reply-To: Lacoste IN <info@mailer.dellyranks.com>
|
|
71
|
+
List-Unsubscribe: <https://link.dellyranks.com/lists/aw175zeewnfff/unsubscribe/qp668otfdm9ff/ws6198a3vqfea?source=email-client-unsubscribe-button>,
|
|
72
|
+
<mailto:info@mailer.dellyranks.com?subject=Campaign-Uid%3Aws6198a3vqfea%20%2F%20Subscriber-Uid%3Aqp668otfdm9ff%20-%20Unsubscribe%20request&body=Please%20unsubscribe%20me%21>
|
|
73
|
+
List-Unsubscribe-Post: List-Unsubscribe=One-Click
|
|
74
|
+
Feedback-ID: ws6198a3vqfea:qp668otfdm9ff:aw175zeewnfff:xn945frfr4287
|
|
75
|
+
Message-ID: <520e90e95b74def5565ce1eaed5919f0a7e0b522@mailer.dellyranks.com>
|
|
76
|
+
MIME-Version: 1.0
|
|
77
|
+
Date: Tue, 16 Jul 2024 07:17:09 +0000
|
|
78
|
+
DKIM-Signature: v=1; q=dns/txt; a=rsa-sha256;
|
|
79
|
+
bh=0maos44Zuz8flcClsVew9ePIYSOCt14KoDH/LV+EAnU=; d=mailer.dellyranks.com;
|
|
80
|
+
h=Subject: From: To: Reply-To: List-Unsubscribe: List-Unsubscribe-Post:
|
|
81
|
+
Feedback-ID: MIME-Version: Date; i=@mailer.dellyranks.com; s=mailer;
|
|
82
|
+
t=1721114229; c=relaxed/relaxed;
|
|
83
|
+
b=qzKwQCscDn5GjAKWc23SZtiYeUTXP64pd/kwdbCojwmmfNv5Q4BjUmcVy/54VRPIKrnjjge2+
|
|
84
|
+
9LKgZeux4arQaWolfvqrhdpquWTLQv+H7Li08sQOGbiFXGtF+jBFKVUn5bHXog8u2/ysBggrj
|
|
85
|
+
VHbURpr3goUXxuQrsTaiUnmvsLxH0C1YzbPgzJf28gO49Eld5HgvJJwVl8CeFMwe1x9g1cVMN
|
|
86
|
+
os3CW3FqYLfxFymJxch24Vmsr2NjNX0yRZQ4TNhIV1PgiiQowGa29GfkCKZ1Sp/pUV55NIsZh
|
|
87
|
+
uCkrMcHF4Cdy8XTRe1eHz6H8CVjQR9hNQVlDEK4gE2G07KtXCQ==
|
|
88
|
+
Content-Type: text/html; charset=utf-8
|
|
89
|
+
Content-Transfer-Encoding: quoted-printable
|
|
90
|
+
`;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
import { wordEncoding } from "../../mime-parser/encoder/word-encoding.js";
|
|
3
|
+
|
|
4
|
+
export default function () {
|
|
5
|
+
|
|
6
|
+
assert.equal("a", wordEncoding.decode("a"));
|
|
7
|
+
assert.equal("Captives (1080 × 1080 px).png", wordEncoding.decode("=?UTF-8?B?Q2FwdGl2ZXMgKDEwODAgw5cgMTA4MCBweCkucG5n?="));
|
|
8
|
+
assert.equal("Captives (1080 × 1080 px).png", wordEncoding.decode(`=?UTF-8?B?Q2FwdGl2ZXMgKDEwODAgw5cgMTA4MCBweCk=?=
|
|
9
|
+
=?UTF-8?B?LnBuZw==?=`));
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
assert.equal("サンプルa b", wordEncoding.decode("=?UTF-8?Q?=E3=82=B5=E3=83=B3=E3=83=97=E3=83=ABa_b?="));
|
|
13
|
+
}
|
package/test.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readdir } from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
|
|
4
|
+
const results = [];
|
|
5
|
+
|
|
6
|
+
class TestRunner {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param {string} name
|
|
11
|
+
*/
|
|
12
|
+
static async runTest(name, thisParam) {
|
|
13
|
+
const moduleExports = await import(name);
|
|
14
|
+
const { default: d } = moduleExports;
|
|
15
|
+
if (!d) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
|
|
20
|
+
const r = d.call(thisParam);
|
|
21
|
+
if (r?.then) {
|
|
22
|
+
await r;
|
|
23
|
+
}
|
|
24
|
+
results.push({ name });
|
|
25
|
+
} catch (error) {
|
|
26
|
+
results.unshift({ name, error });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static async runAll(dir, db) {
|
|
31
|
+
const items = await readdir(dir, { withFileTypes: true });
|
|
32
|
+
const tasks = [];
|
|
33
|
+
for (const iterator of items) {
|
|
34
|
+
const next = dir + "/" + iterator.name;
|
|
35
|
+
if (iterator.isDirectory()) {
|
|
36
|
+
tasks.push(this.runAll(next, db));
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (iterator.name.endsWith(".js")) {
|
|
40
|
+
tasks.push(this.runTest(next, { }));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await Promise.all(tasks);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
await TestRunner.runAll( "./dist/tests");
|
|
49
|
+
|
|
50
|
+
let exitCode = 0;
|
|
51
|
+
let failed = 0;
|
|
52
|
+
|
|
53
|
+
for (const { error, name } of results) {
|
|
54
|
+
if (error) {
|
|
55
|
+
exitCode = 1;
|
|
56
|
+
failed++;
|
|
57
|
+
console.error(`${name} failed`);
|
|
58
|
+
console.error(error?.stack ?? error);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
console.log(`${name} executed.`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (exitCode === 0) {
|
|
65
|
+
console.log(`${results.length} tests ran successfully.`);
|
|
66
|
+
} else {
|
|
67
|
+
console.log(`${failed} Tests out of ${results.length} failed.`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
process.exit(exitCode);
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"skipLibCheck": true,
|
|
5
|
+
"skipDefaultLibCheck": true,
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"target": "ES6",
|
|
8
|
+
"module": "ES2022",
|
|
9
|
+
"sourceMap": true,
|
|
10
|
+
"incremental": true,
|
|
11
|
+
"moduleResolution": "Bundler"
|
|
12
|
+
},
|
|
13
|
+
"include": [
|
|
14
|
+
"src/**/*"
|
|
15
|
+
]
|
|
16
|
+
}
|