aiplang 2.0.0 → 2.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/bin/aiplang.js +7 -7
- package/package.json +7 -5
- package/server/node_modules/.package-lock.json +9 -0
- package/server/node_modules/nodemailer/.gitattributes +6 -0
- package/server/node_modules/nodemailer/.ncurc.js +9 -0
- package/server/node_modules/nodemailer/.prettierignore +8 -0
- package/server/node_modules/nodemailer/.prettierrc +12 -0
- package/server/node_modules/nodemailer/.prettierrc.js +10 -0
- package/server/node_modules/nodemailer/.release-please-config.json +9 -0
- package/server/node_modules/nodemailer/CHANGELOG.md +976 -0
- package/server/node_modules/nodemailer/CODE_OF_CONDUCT.md +76 -0
- package/server/node_modules/nodemailer/LICENSE +16 -0
- package/server/node_modules/nodemailer/README.md +86 -0
- package/server/node_modules/nodemailer/SECURITY.txt +22 -0
- package/server/node_modules/nodemailer/eslint.config.js +88 -0
- package/server/node_modules/nodemailer/lib/addressparser/index.js +382 -0
- package/server/node_modules/nodemailer/lib/base64/index.js +140 -0
- package/server/node_modules/nodemailer/lib/dkim/index.js +245 -0
- package/server/node_modules/nodemailer/lib/dkim/message-parser.js +154 -0
- package/server/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/server/node_modules/nodemailer/lib/dkim/sign.js +116 -0
- package/server/node_modules/nodemailer/lib/errors.js +58 -0
- package/server/node_modules/nodemailer/lib/fetch/cookies.js +276 -0
- package/server/node_modules/nodemailer/lib/fetch/index.js +278 -0
- package/server/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/server/node_modules/nodemailer/lib/mail-composer/index.js +599 -0
- package/server/node_modules/nodemailer/lib/mailer/index.js +446 -0
- package/server/node_modules/nodemailer/lib/mailer/mail-message.js +312 -0
- package/server/node_modules/nodemailer/lib/mime-funcs/index.js +610 -0
- package/server/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2109 -0
- package/server/node_modules/nodemailer/lib/mime-node/index.js +1334 -0
- package/server/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/server/node_modules/nodemailer/lib/mime-node/le-unix.js +40 -0
- package/server/node_modules/nodemailer/lib/mime-node/le-windows.js +49 -0
- package/server/node_modules/nodemailer/lib/nodemailer.js +151 -0
- package/server/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/server/node_modules/nodemailer/lib/qp/index.js +230 -0
- package/server/node_modules/nodemailer/lib/sendmail-transport/index.js +205 -0
- package/server/node_modules/nodemailer/lib/ses-transport/index.js +223 -0
- package/server/node_modules/nodemailer/lib/shared/index.js +698 -0
- package/server/node_modules/nodemailer/lib/smtp-connection/data-stream.js +105 -0
- package/server/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +144 -0
- package/server/node_modules/nodemailer/lib/smtp-connection/index.js +1903 -0
- package/server/node_modules/nodemailer/lib/smtp-pool/index.js +641 -0
- package/server/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +256 -0
- package/server/node_modules/nodemailer/lib/smtp-transport/index.js +402 -0
- package/server/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/server/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/server/node_modules/nodemailer/lib/well-known/services.json +619 -0
- package/server/node_modules/nodemailer/lib/xoauth2/index.js +436 -0
- package/server/node_modules/nodemailer/package.json +48 -0
- package/server/server.js +686 -865
- /package/{FLUX-PROJECT-KNOWLEDGE.md → aiplang-knowledge.md} +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Transform } = require('stream');
|
|
4
|
+
|
|
5
|
+
class LastNewline extends Transform {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
this.lastByte = false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_transform(chunk, encoding, done) {
|
|
12
|
+
if (chunk.length) {
|
|
13
|
+
this.lastByte = chunk[chunk.length - 1];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
this.push(chunk);
|
|
17
|
+
done();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
_flush(done) {
|
|
21
|
+
if (this.lastByte === 0x0a) {
|
|
22
|
+
return done();
|
|
23
|
+
}
|
|
24
|
+
if (this.lastByte === 0x0d) {
|
|
25
|
+
this.push(Buffer.from('\n'));
|
|
26
|
+
return done();
|
|
27
|
+
}
|
|
28
|
+
this.push(Buffer.from('\r\n'));
|
|
29
|
+
return done();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = LastNewline;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Transform } = require('stream');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Ensures that only <LF> is used for linebreaks
|
|
7
|
+
*
|
|
8
|
+
* @param {Object} options Stream options
|
|
9
|
+
*/
|
|
10
|
+
class LeUnix extends Transform {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
super(options);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Escapes dots
|
|
17
|
+
*/
|
|
18
|
+
_transform(chunk, encoding, done) {
|
|
19
|
+
let buf;
|
|
20
|
+
let lastPos = 0;
|
|
21
|
+
|
|
22
|
+
for (let i = 0, len = chunk.length; i < len; i++) {
|
|
23
|
+
if (chunk[i] === 0x0d) {
|
|
24
|
+
// \r
|
|
25
|
+
buf = chunk.slice(lastPos, i);
|
|
26
|
+
lastPos = i + 1;
|
|
27
|
+
this.push(buf);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (lastPos && lastPos < chunk.length) {
|
|
31
|
+
buf = chunk.slice(lastPos);
|
|
32
|
+
this.push(buf);
|
|
33
|
+
} else if (!lastPos) {
|
|
34
|
+
this.push(chunk);
|
|
35
|
+
}
|
|
36
|
+
done();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = LeUnix;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Transform } = require('stream');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Ensures that only <CR><LF> sequences are used for linebreaks
|
|
7
|
+
*
|
|
8
|
+
* @param {Object} options Stream options
|
|
9
|
+
*/
|
|
10
|
+
class LeWindows extends Transform {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
super(options);
|
|
13
|
+
this.lastByte = false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Escapes dots
|
|
18
|
+
*/
|
|
19
|
+
_transform(chunk, encoding, done) {
|
|
20
|
+
let buf;
|
|
21
|
+
let lastPos = 0;
|
|
22
|
+
|
|
23
|
+
for (let i = 0, len = chunk.length; i < len; i++) {
|
|
24
|
+
if (chunk[i] === 0x0a) {
|
|
25
|
+
// \n
|
|
26
|
+
if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {
|
|
27
|
+
if (i > lastPos) {
|
|
28
|
+
buf = chunk.slice(lastPos, i);
|
|
29
|
+
this.push(buf);
|
|
30
|
+
}
|
|
31
|
+
this.push(Buffer.from('\r\n'));
|
|
32
|
+
lastPos = i + 1;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (lastPos && lastPos < chunk.length) {
|
|
38
|
+
buf = chunk.slice(lastPos);
|
|
39
|
+
this.push(buf);
|
|
40
|
+
} else if (!lastPos) {
|
|
41
|
+
this.push(chunk);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
this.lastByte = chunk[chunk.length - 1];
|
|
45
|
+
done();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = LeWindows;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Mailer = require('./mailer');
|
|
4
|
+
const shared = require('./shared');
|
|
5
|
+
const SMTPPool = require('./smtp-pool');
|
|
6
|
+
const SMTPTransport = require('./smtp-transport');
|
|
7
|
+
const SendmailTransport = require('./sendmail-transport');
|
|
8
|
+
const StreamTransport = require('./stream-transport');
|
|
9
|
+
const JSONTransport = require('./json-transport');
|
|
10
|
+
const SESTransport = require('./ses-transport');
|
|
11
|
+
const errors = require('./errors');
|
|
12
|
+
const nmfetch = require('./fetch');
|
|
13
|
+
const packageData = require('../package.json');
|
|
14
|
+
|
|
15
|
+
const ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\/+$/, '');
|
|
16
|
+
const ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\/+$/, '');
|
|
17
|
+
const ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\s*/g, '') || null;
|
|
18
|
+
const ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());
|
|
19
|
+
|
|
20
|
+
let testAccount = false;
|
|
21
|
+
|
|
22
|
+
module.exports.createTransport = function (transporter, defaults) {
|
|
23
|
+
let options;
|
|
24
|
+
|
|
25
|
+
if (
|
|
26
|
+
// provided transporter is a configuration object, not transporter plugin
|
|
27
|
+
(typeof transporter === 'object' && typeof transporter.send !== 'function') ||
|
|
28
|
+
// provided transporter looks like a connection url
|
|
29
|
+
(typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))
|
|
30
|
+
) {
|
|
31
|
+
const urlConfig = typeof transporter === 'string' ? transporter : transporter.url;
|
|
32
|
+
if (urlConfig) {
|
|
33
|
+
// parse a configuration URL into configuration options
|
|
34
|
+
options = shared.parseConnectionUrl(urlConfig);
|
|
35
|
+
} else {
|
|
36
|
+
options = transporter;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (options.pool) {
|
|
40
|
+
transporter = new SMTPPool(options);
|
|
41
|
+
} else if (options.sendmail) {
|
|
42
|
+
transporter = new SendmailTransport(options);
|
|
43
|
+
} else if (options.streamTransport) {
|
|
44
|
+
transporter = new StreamTransport(options);
|
|
45
|
+
} else if (options.jsonTransport) {
|
|
46
|
+
transporter = new JSONTransport(options);
|
|
47
|
+
} else if (options.SES) {
|
|
48
|
+
if (options.SES.ses && options.SES.aws) {
|
|
49
|
+
const error = new Error(
|
|
50
|
+
'Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/'
|
|
51
|
+
);
|
|
52
|
+
error.code = errors.ECONFIG;
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
transporter = new SESTransport(options);
|
|
56
|
+
} else {
|
|
57
|
+
transporter = new SMTPTransport(options);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return new Mailer(transporter, options, defaults);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
module.exports.createTestAccount = function (apiUrl, callback) {
|
|
65
|
+
let promise;
|
|
66
|
+
|
|
67
|
+
if (!callback && typeof apiUrl === 'function') {
|
|
68
|
+
callback = apiUrl;
|
|
69
|
+
apiUrl = false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!callback) {
|
|
73
|
+
promise = new Promise((resolve, reject) => {
|
|
74
|
+
callback = shared.callbackPromise(resolve, reject);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (ETHEREAL_CACHE && testAccount) {
|
|
79
|
+
setImmediate(() => callback(null, testAccount));
|
|
80
|
+
return promise;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
apiUrl = apiUrl || ETHEREAL_API;
|
|
84
|
+
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let chunklen = 0;
|
|
87
|
+
|
|
88
|
+
const requestHeaders = {};
|
|
89
|
+
const requestBody = {
|
|
90
|
+
requestor: packageData.name,
|
|
91
|
+
version: packageData.version
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
if (ETHEREAL_API_KEY) {
|
|
95
|
+
requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const req = nmfetch(apiUrl + '/user', {
|
|
99
|
+
contentType: 'application/json',
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: requestHeaders,
|
|
102
|
+
body: Buffer.from(JSON.stringify(requestBody))
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
req.on('readable', () => {
|
|
106
|
+
let chunk;
|
|
107
|
+
while ((chunk = req.read()) !== null) {
|
|
108
|
+
chunks.push(chunk);
|
|
109
|
+
chunklen += chunk.length;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
req.once('error', err => callback(err));
|
|
114
|
+
|
|
115
|
+
req.once('end', () => {
|
|
116
|
+
const res = Buffer.concat(chunks, chunklen);
|
|
117
|
+
let data;
|
|
118
|
+
try {
|
|
119
|
+
data = JSON.parse(res.toString());
|
|
120
|
+
} catch (E) {
|
|
121
|
+
return callback(E);
|
|
122
|
+
}
|
|
123
|
+
if (data.status !== 'success' || data.error) {
|
|
124
|
+
return callback(new Error(data.error || 'Request failed'));
|
|
125
|
+
}
|
|
126
|
+
delete data.status;
|
|
127
|
+
testAccount = data;
|
|
128
|
+
callback(null, testAccount);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return promise;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
module.exports.getTestMessageUrl = function (info) {
|
|
135
|
+
if (!info || !info.response) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const infoProps = new Map();
|
|
140
|
+
info.response.replace(/\[([^\]]+)\]$/, (m, props) => {
|
|
141
|
+
props.replace(/\b([A-Z0-9]+)=([^\s]+)/g, (m, key, value) => {
|
|
142
|
+
infoProps.set(key, value);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
if (infoProps.has('STATUS') && infoProps.has('MSGID')) {
|
|
147
|
+
return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return false;
|
|
151
|
+
};
|