@c9up/rover 0.1.7 → 0.1.9

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.
Files changed (76) hide show
  1. package/README.md +1 -1
  2. package/dist/BaseMail.d.ts +30 -1
  3. package/dist/BaseMail.d.ts.map +1 -1
  4. package/dist/BaseMail.js +30 -0
  5. package/dist/BaseMail.js.map +1 -1
  6. package/dist/Mail.d.ts +32 -1
  7. package/dist/Mail.d.ts.map +1 -1
  8. package/dist/Mail.js +35 -1
  9. package/dist/Mail.js.map +1 -1
  10. package/dist/MessageBuilder.d.ts +197 -7
  11. package/dist/MessageBuilder.d.ts.map +1 -1
  12. package/dist/MessageBuilder.js +402 -8
  13. package/dist/MessageBuilder.js.map +1 -1
  14. package/dist/RoverProvider.d.ts +1 -1
  15. package/dist/RoverProvider.d.ts.map +1 -1
  16. package/dist/RoverProvider.js +6 -6
  17. package/dist/RoverProvider.js.map +1 -1
  18. package/dist/config.d.ts +38 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +34 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/format.d.ts +10 -0
  23. package/dist/format.d.ts.map +1 -1
  24. package/dist/format.js +28 -1
  25. package/dist/format.js.map +1 -1
  26. package/dist/index.d.ts +18 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +16 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/testing/FakeMail.d.ts +33 -0
  31. package/dist/testing/FakeMail.d.ts.map +1 -1
  32. package/dist/testing/FakeMail.js +28 -0
  33. package/dist/testing/FakeMail.js.map +1 -1
  34. package/dist/transports/BrevoTransport.d.ts.map +1 -1
  35. package/dist/transports/BrevoTransport.js +5 -4
  36. package/dist/transports/BrevoTransport.js.map +1 -1
  37. package/dist/transports/MailgunTransport.d.ts.map +1 -1
  38. package/dist/transports/MailgunTransport.js +3 -2
  39. package/dist/transports/MailgunTransport.js.map +1 -1
  40. package/dist/transports/ResendTransport.d.ts.map +1 -1
  41. package/dist/transports/ResendTransport.js +5 -4
  42. package/dist/transports/ResendTransport.js.map +1 -1
  43. package/dist/transports/SendGridTransport.d.ts.map +1 -1
  44. package/dist/transports/SendGridTransport.js +3 -2
  45. package/dist/transports/SendGridTransport.js.map +1 -1
  46. package/dist/transports/SesTransport.d.ts.map +1 -1
  47. package/dist/transports/SesTransport.js +7 -5
  48. package/dist/transports/SesTransport.js.map +1 -1
  49. package/dist/transports/SparkPostTransport.d.ts.map +1 -1
  50. package/dist/transports/SparkPostTransport.js +5 -4
  51. package/dist/transports/SparkPostTransport.js.map +1 -1
  52. package/dist/transports/fetchError.d.ts +10 -0
  53. package/dist/transports/fetchError.d.ts.map +1 -1
  54. package/dist/transports/fetchError.js +30 -0
  55. package/dist/transports/fetchError.js.map +1 -1
  56. package/index.darwin-arm64.node +0 -0
  57. package/index.darwin-x64.node +0 -0
  58. package/index.linux-arm64-gnu.node +0 -0
  59. package/index.linux-x64-gnu.node +0 -0
  60. package/index.win32-x64-msvc.node +0 -0
  61. package/package.json +6 -1
  62. package/src/BaseMail.ts +40 -1
  63. package/src/Mail.ts +55 -2
  64. package/src/MessageBuilder.ts +561 -11
  65. package/src/RoverProvider.ts +10 -7
  66. package/src/config.ts +46 -0
  67. package/src/format.ts +33 -1
  68. package/src/index.ts +28 -2
  69. package/src/testing/FakeMail.ts +46 -0
  70. package/src/transports/BrevoTransport.ts +5 -4
  71. package/src/transports/MailgunTransport.ts +3 -2
  72. package/src/transports/ResendTransport.ts +5 -4
  73. package/src/transports/SendGridTransport.ts +3 -2
  74. package/src/transports/SesTransport.ts +7 -5
  75. package/src/transports/SparkPostTransport.ts +15 -10
  76. package/src/transports/fetchError.ts +39 -0
@@ -1,5 +1,88 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import { fileURLToPath } from "node:url";
1
4
  import { formatAddress } from "./format.js";
5
+ import { RoverError } from "./RoverError.js";
2
6
  import { renderFile as renderTemplateFile } from "./templating/SimpleTemplate.js";
7
+ /** Whether `list` holds `address`, or anything at all when it is omitted. */
8
+ function contains(list, address) {
9
+ if (address === undefined)
10
+ return list.length > 0;
11
+ // Addresses are stored formatted (`"Name" <a@b.c>`), so an assertion on the
12
+ // bare address has to match inside the display form too.
13
+ return list.some((entry) => entry === address || entry.includes(`<${address}>`));
14
+ }
15
+ /**
16
+ * The parts a transport with no calendar field must send: the declared
17
+ * attachments, plus the invitation rendered as a `text/calendar` part.
18
+ *
19
+ * Only nodemailer has a native `icalEvent`; the provider HTTP APIs carry an
20
+ * invitation the way every mail client reads it anyway — as an attachment with
21
+ * the right media type and `method` parameter.
22
+ */
23
+ export function attachmentsFor(message) {
24
+ const ical = message.icalEvent;
25
+ if (ical === undefined)
26
+ return message.attachments;
27
+ if (ical.content === undefined) {
28
+ // `icalEventFromUrl` leaves only an href, which nodemailer fetches for
29
+ // SMTP. An HTTP provider takes the bytes, and silently dropping the
30
+ // invitation would be worse than saying so.
31
+ throw new RoverError("ICAL_HREF_UNSUPPORTED", "icalEventFromUrl() is only supported by the SMTP transport, which fetches the URL itself.", {
32
+ hint: "Fetch the ICS yourself and pass it to icalEvent(contents), or use icalEventFromFile().",
33
+ });
34
+ }
35
+ const method = ical.method ?? "PUBLISH";
36
+ return [
37
+ ...message.attachments,
38
+ {
39
+ filename: ical.filename ?? "invite.ics",
40
+ content: ical.content,
41
+ contentType: `text/calendar; charset=utf-8; method=${method}`,
42
+ encoding: ical.encoding,
43
+ },
44
+ ];
45
+ }
46
+ /** Read a file declared by `attach()` / `embed()` / `icalEventFromFile()`. */
47
+ async function readAttachment(path, label) {
48
+ try {
49
+ return await readFile(path);
50
+ }
51
+ catch (err) {
52
+ throw new RoverError("ATTACHMENT_UNREADABLE", `Could not read ${label} from "${path}": ${err instanceof Error ? err.message : String(err)}`, {
53
+ hint: "Give an absolute path, or attach the bytes with attachData() / embedData().",
54
+ });
55
+ }
56
+ }
57
+ /** Every URL inside a `List-*` value, whatever nesting form it was written in. */
58
+ function listUrls(value) {
59
+ if (typeof value === "string")
60
+ return [value];
61
+ if (Array.isArray(value))
62
+ return value.flatMap((entry) => listUrls(entry));
63
+ return [value.url];
64
+ }
65
+ /** `unsubscribe` → `Unsubscribe`, `unsubscribe-post` → `Unsubscribe-Post`. */
66
+ function titleCaseKey(key) {
67
+ return key
68
+ .split("-")
69
+ .map((part) => (part ? part[0].toUpperCase() + part.slice(1) : part))
70
+ .join("-");
71
+ }
72
+ /** Render one `List-*` value the way RFC 2369 writes it: `<url> (comment)`. */
73
+ function renderListHeader(value) {
74
+ if (typeof value === "string")
75
+ return `<${value}>`;
76
+ if (Array.isArray(value)) {
77
+ return value.map((entry) => renderListHeader(entry)).join(", ");
78
+ }
79
+ return value.comment ? `<${value.url}> (${value.comment})` : `<${value.url}>`;
80
+ }
81
+ function expect(passed, expectation, actual) {
82
+ if (passed)
83
+ return;
84
+ throw new RoverError("ASSERTION_FAILED", `Expected the message ${expectation}, got ${JSON.stringify(actual)}`);
85
+ }
3
86
  export class MessageBuilder {
4
87
  #msg = {
5
88
  from: "",
@@ -11,6 +94,158 @@ export class MessageBuilder {
11
94
  headers: {},
12
95
  };
13
96
  #pendingView = null;
97
+ #pendingTextView = null;
98
+ /**
99
+ * Render a template as the PLAIN-TEXT body (AdonisJS `textView`).
100
+ *
101
+ * The counterpart of `htmlView`. A message with only an HTML part scores
102
+ * worse with spam filters and is unreadable in a text-only client, which is
103
+ * why upstream offers both.
104
+ */
105
+ textView(path, data = {}) {
106
+ this.#pendingTextView = { path, data };
107
+ return this;
108
+ }
109
+ /**
110
+ * Override the SMTP envelope — who the message is really from and to, as
111
+ * far as the mail servers are concerned (AdonisJS `envelope`).
112
+ *
113
+ * Distinct from the `From`/`To` HEADERS: a bounce goes to the envelope
114
+ * sender, which is how VERP and mailing lists route failures away from the
115
+ * visible author.
116
+ */
117
+ envelope(envelope) {
118
+ this.#msg.envelope = envelope;
119
+ return this;
120
+ }
121
+ /**
122
+ * The message as built so far — what the `has*` / `assert*` helpers read.
123
+ *
124
+ * Exposed because a test asserts against a mail it never sent, and the
125
+ * alternative is rebuilding the message just to look at it.
126
+ */
127
+ toObject() {
128
+ return this.#msg;
129
+ }
130
+ toJSON() {
131
+ return this.toObject();
132
+ }
133
+ // ── Inspection ────────────────────────────────────────────────────────
134
+ // `has*` answers, `assert*` throws. Both exist because a test reads better
135
+ // as an assertion and a conditional reads better as a question.
136
+ hasTo(address) {
137
+ return contains(this.#msg.to, address);
138
+ }
139
+ hasCc(address) {
140
+ return contains(this.#msg.cc, address);
141
+ }
142
+ hasBcc(address) {
143
+ return contains(this.#msg.bcc, address);
144
+ }
145
+ hasFrom(address) {
146
+ return contains(this.#msg.from ? [this.#msg.from] : [], address);
147
+ }
148
+ hasReplyTo(address) {
149
+ return contains(this.#msg.replyTo ? [this.#msg.replyTo] : [], address);
150
+ }
151
+ hasSubject(subject) {
152
+ if (subject === undefined)
153
+ return this.#msg.subject !== "";
154
+ return this.#msg.subject === subject;
155
+ }
156
+ /**
157
+ * Whether the message carries an attachment — any at all, one with this
158
+ * filename or source path, or one a predicate accepts (AdonisJS
159
+ * `hasAttachment`, whose overloads are the same three).
160
+ */
161
+ hasAttachment(match) {
162
+ if (match === undefined)
163
+ return this.#msg.attachments.length > 0;
164
+ if (typeof match === "function")
165
+ return this.#msg.attachments.some(match);
166
+ const needle = match instanceof URL ? fileURLToPath(match) : match;
167
+ return this.#msg.attachments.some((a) => a.filename === needle || a.path === needle);
168
+ }
169
+ /**
170
+ * Whether `address` is a recipient in ANY field (AdonisJS `hasRecipient`).
171
+ * Without one, whether the message has a recipient at all.
172
+ */
173
+ hasRecipient(address) {
174
+ return this.hasTo(address) || this.hasCc(address) || this.hasBcc(address);
175
+ }
176
+ /**
177
+ * Whether the given text appears in the HTML body or the plain-text one
178
+ * (AdonisJS `hasContent`). The field-specific assertions are
179
+ * {@link assertHtmlIncludes} and {@link assertTextIncludes}.
180
+ */
181
+ hasContent(needle) {
182
+ return ((this.#msg.html?.includes(needle) ?? false) ||
183
+ (this.#msg.text?.includes(needle) ?? false));
184
+ }
185
+ /** Whether a `List-<key>` header was defined. */
186
+ hasListHeader(key, url) {
187
+ const value = this.#msg.list?.[key];
188
+ if (value === undefined)
189
+ return false;
190
+ if (url === undefined)
191
+ return true;
192
+ return listUrls(value).includes(url);
193
+ }
194
+ hasHeader(name, value) {
195
+ const found = this.#msg.headers[name];
196
+ if (found === undefined)
197
+ return false;
198
+ if (value === undefined)
199
+ return true;
200
+ return Array.isArray(found) ? found.includes(value) : found === value;
201
+ }
202
+ assertTo(address) {
203
+ expect(this.hasTo(address), `to include "${address}"`, this.#msg.to);
204
+ }
205
+ assertFrom(address) {
206
+ expect(this.hasFrom(address), `from to be "${address}"`, this.#msg.from);
207
+ }
208
+ assertCc(address) {
209
+ expect(this.hasCc(address), `cc to include "${address}"`, this.#msg.cc);
210
+ }
211
+ assertBcc(address) {
212
+ expect(this.hasBcc(address), `bcc to include "${address}"`, this.#msg.bcc);
213
+ }
214
+ assertReplyTo(address) {
215
+ expect(this.hasReplyTo(address), `replyTo to be "${address}"`, this.#msg.replyTo);
216
+ }
217
+ assertSubject(subject) {
218
+ expect(this.hasSubject(subject), `subject to be "${subject}"`, this.#msg.subject);
219
+ }
220
+ assertAttachment(match) {
221
+ expect(this.hasAttachment(match), typeof match === "function"
222
+ ? "an attachment matching the predicate"
223
+ : `an attachment named "${String(match)}"`, this.#msg.attachments.map((a) => a.path ?? a.filename));
224
+ }
225
+ /** `address` is a recipient in some field (AdonisJS `assertRecipient`). */
226
+ assertRecipient(address) {
227
+ expect(this.hasRecipient(address), `to reach "${address}"`, {
228
+ to: this.#msg.to,
229
+ cc: this.#msg.cc,
230
+ bcc: this.#msg.bcc,
231
+ });
232
+ }
233
+ /** The text appears in the HTML or the plain-text body (AdonisJS `assertContent`). */
234
+ assertContent(needle) {
235
+ expect(this.hasContent(needle), `to contain "${needle}"`, {
236
+ html: this.#msg.html,
237
+ text: this.#msg.text,
238
+ });
239
+ }
240
+ assertHeader(name, value) {
241
+ expect(this.hasHeader(name, value), value === undefined ? `a "${name}" header` : `${name}: ${value}`, this.#msg.headers[name]);
242
+ }
243
+ assertHtmlIncludes(substring) {
244
+ expect((this.#msg.html ?? "").includes(substring), `html to include "${substring}"`, this.#msg.html);
245
+ }
246
+ assertTextIncludes(substring) {
247
+ expect((this.#msg.text ?? "").includes(substring), `text to include "${substring}"`, this.#msg.text);
248
+ }
14
249
  from(address, name) {
15
250
  this.#msg.from = formatAddress(address, name);
16
251
  return this;
@@ -63,24 +298,160 @@ export class MessageBuilder {
63
298
  this.#msg.references = messageIds.slice();
64
299
  return this;
65
300
  }
66
- attach(filename, content, contentType) {
67
- this.#msg.attachments.push({ filename, content, contentType });
301
+ /**
302
+ * Attach a FILE by path or `file://` URL (AdonisJS `attach`). The bytes are
303
+ * read at {@link build} time, so the fluent chain stays synchronous.
304
+ *
305
+ * The filename defaults to the file's own basename. For bytes you already
306
+ * hold, use {@link attachData}.
307
+ */
308
+ attach(file, options) {
309
+ const path = file instanceof URL ? fileURLToPath(file) : file;
310
+ this.#msg.attachments.push({
311
+ filename: options?.filename ?? basename(path),
312
+ // Filled in by `build()`; an unread attachment must never ship as an
313
+ // empty part, so `build()` failing to read is an error, not a warning.
314
+ content: "",
315
+ path,
316
+ contentType: options?.contentType,
317
+ contentDisposition: options?.contentDisposition,
318
+ encoding: options?.encoding,
319
+ headers: options?.headers,
320
+ });
68
321
  return this;
69
322
  }
70
323
  /**
71
- * Embed inline content referenced by a Content-ID. Use `cid:<cid>` inside the
72
- * HTML body to reference it. Content-based (rover is agnostic / no-fs): the
73
- * path-based `embed(file, cid)` form from `@adonisjs/mail` is a deliberate
74
- * divergence — pass the bytes directly instead.
324
+ * Attach bytes you already hold (AdonisJS `attachData`). `filename` is
325
+ * required — there is no path to take it from.
75
326
  */
76
- embedData(content, cid, contentType) {
77
- this.#msg.attachments.push({ filename: cid, content, contentType, cid });
327
+ attachData(content, options) {
328
+ this.#msg.attachments.push({
329
+ filename: options.filename,
330
+ content,
331
+ contentType: options.contentType,
332
+ contentDisposition: options.contentDisposition,
333
+ encoding: options.encoding,
334
+ headers: options.headers,
335
+ });
336
+ return this;
337
+ }
338
+ /**
339
+ * Embed a FILE inline, referenced by `cid:<cid>` in the HTML body (AdonisJS
340
+ * `embed`). Read at {@link build} time, like {@link attach}.
341
+ */
342
+ embed(file, cid, options) {
343
+ const path = file instanceof URL ? fileURLToPath(file) : file;
344
+ this.#msg.attachments.push({
345
+ filename: options?.filename ?? basename(path),
346
+ content: "",
347
+ path,
348
+ cid,
349
+ contentType: options?.contentType,
350
+ contentDisposition: options?.contentDisposition ?? "inline",
351
+ encoding: options?.encoding,
352
+ headers: options?.headers,
353
+ });
354
+ return this;
355
+ }
356
+ /**
357
+ * Embed bytes you already hold, referenced by `cid:<cid>` in the HTML body
358
+ * (AdonisJS `embedData`).
359
+ */
360
+ embedData(content, cid, options) {
361
+ this.#msg.attachments.push({
362
+ filename: options?.filename ?? cid,
363
+ content,
364
+ cid,
365
+ contentType: options?.contentType,
366
+ contentDisposition: options?.contentDisposition ?? "inline",
367
+ encoding: options?.encoding,
368
+ headers: options?.headers,
369
+ });
78
370
  return this;
79
371
  }
80
372
  header(key, value) {
81
373
  this.#msg.headers[key] = value;
82
374
  return this;
83
375
  }
376
+ /**
377
+ * Body transfer encoding (AdonisJS `encoding`) — `7bit`, `base64`,
378
+ * `quoted-printable`… SMTP only: the provider HTTP APIs encode the payload
379
+ * themselves and expose no equivalent.
380
+ */
381
+ encoding(encoding) {
382
+ this.#msg.encoding = encoding;
383
+ return this;
384
+ }
385
+ // ── RFC 2369 List-* headers ───────────────────────────────────────────
386
+ /**
387
+ * Define a `List-<key>` header (AdonisJS `addListHeader`). `key` carries no
388
+ * `List-` prefix — `addListHeader('archive', url)` emits `List-Archive`.
389
+ * Calling it again for the same key replaces the value.
390
+ */
391
+ addListHeader(key, value) {
392
+ this.#msg.list ??= {};
393
+ this.#msg.list[key] = value;
394
+ return this;
395
+ }
396
+ /**
397
+ * `List-Unsubscribe` (AdonisJS `listUnsubscribe`).
398
+ *
399
+ * `{ oneClick: true }` also emits the RFC 8058 `List-Unsubscribe-Post`
400
+ * header. Gmail and Yahoo require BOTH for bulk senders, and only a `https:`
401
+ * URL is a valid one-click target — a `mailto:` cannot answer a POST, so
402
+ * pairing them is refused rather than silently shipped.
403
+ */
404
+ listUnsubscribe(value, options) {
405
+ if (options?.oneClick === true) {
406
+ for (const url of listUrls(value)) {
407
+ if (!url.toLowerCase().startsWith("http")) {
408
+ throw new RoverError("INVALID_LIST_HEADER", `listUnsubscribe({ oneClick: true }) needs an https URL that can answer a POST, got "${url}".`, {
409
+ hint: "Keep the mailto: form without oneClick, or add an https endpoint alongside it.",
410
+ });
411
+ }
412
+ }
413
+ // A RAW header, not a `List-*` entry: nodemailer wraps every list value
414
+ // in angle brackets, and `<List-Unsubscribe=One-Click>` is not what
415
+ // RFC 8058 specifies — receivers would ignore it.
416
+ this.#msg.headers["List-Unsubscribe-Post"] = "List-Unsubscribe=One-Click";
417
+ }
418
+ return this.addListHeader("unsubscribe", value);
419
+ }
420
+ /** `List-Subscribe` (AdonisJS `listSubscribe`). */
421
+ listSubscribe(value) {
422
+ return this.addListHeader("subscribe", value);
423
+ }
424
+ /** `List-Help` (AdonisJS `listHelp`). */
425
+ listHelp(value) {
426
+ return this.addListHeader("help", value);
427
+ }
428
+ // ── Calendar invitations ──────────────────────────────────────────────
429
+ /**
430
+ * Attach a calendar invitation from an ICS string (AdonisJS `icalEvent`).
431
+ *
432
+ * Named deviation: upstream also accepts a `(calendar: ICalCalendar) => void`
433
+ * builder, which is `ical-generator`'s API. rover carries no such
434
+ * dependency, so it takes the ICS text — produced by whichever generator you
435
+ * prefer. {@link icalEventFromFile} and {@link icalEventFromUrl} are the
436
+ * other two upstream forms, unchanged.
437
+ */
438
+ icalEvent(contents, options) {
439
+ this.#msg.icalEvent = { ...options, content: contents };
440
+ return this;
441
+ }
442
+ /** Calendar invitation read from a file at {@link build} time (AdonisJS `icalEventFromFile`). */
443
+ icalEventFromFile(file, options) {
444
+ this.#msg.icalEvent = {
445
+ ...options,
446
+ path: file instanceof URL ? fileURLToPath(file) : file,
447
+ };
448
+ return this;
449
+ }
450
+ /** Calendar invitation the transport fetches from a URL (AdonisJS `icalEventFromUrl`). */
451
+ icalEventFromUrl(url, options) {
452
+ this.#msg.icalEvent = { ...options, href: url };
453
+ return this;
454
+ }
84
455
  /**
85
456
  * Queue an HTML template render. The render happens lazily at `build()` time
86
457
  * so the fluent chain stays synchronous; `build()` is async and awaits the
@@ -101,6 +472,29 @@ export class MessageBuilder {
101
472
  this.#msg.html = await renderTemplateFile(this.#pendingView.path, this.#pendingView.data, undefined, viewsRoot);
102
473
  this.#pendingView = null;
103
474
  }
475
+ if (this.#pendingTextView !== null) {
476
+ this.#msg.text = await renderTemplateFile(this.#pendingTextView.path, this.#pendingTextView.data, undefined, viewsRoot);
477
+ this.#pendingTextView = null;
478
+ }
479
+ // Path-based attachments and invitations are read here, not when they were
480
+ // declared, so the fluent chain stays synchronous. A read failure raises:
481
+ // an attachment the recipient expects must never ship as an empty part.
482
+ for (const attachment of this.#msg.attachments) {
483
+ if (attachment.path === undefined)
484
+ continue;
485
+ attachment.content = await readAttachment(attachment.path, attachment.filename);
486
+ }
487
+ const ical = this.#msg.icalEvent;
488
+ if (ical?.path !== undefined && ical.content === undefined) {
489
+ ical.content = (await readAttachment(ical.path, "the calendar event")).toString("utf8");
490
+ }
491
+ // `List-*` headers are rendered here, once, rather than in each transport:
492
+ // every transport already forwards `headers`, and only nodemailer has a
493
+ // structured `list` field. `#msg.list` stays as the structured record the
494
+ // `hasListHeader` inspection reads.
495
+ for (const [key, value] of Object.entries(this.#msg.list ?? {})) {
496
+ this.#msg.headers[`List-${titleCaseKey(key)}`] = renderListHeader(value);
497
+ }
104
498
  return this.#msg;
105
499
  }
106
500
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MessageBuilder.js","sourceRoot":"","sources":["../src/MessageBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageBuilder.js","sourceRoot":"","sources":["../src/MessageBuilder.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  interface RoverContainer {
6
6
  singleton(token: unknown, factory: () => unknown): void;
7
- resolve<T = unknown>(token: unknown): T;
7
+ resolve<T = unknown>(token: unknown): Promise<T>;
8
8
  }
9
9
  interface RoverConfigStore {
10
10
  get<T = unknown>(key: string): T | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"RoverProvider.d.ts","sourceRoot":"","sources":["../src/RoverProvider.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,UAAU,cAAc;IACvB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;CACxC;AACD,UAAU,gBAAgB;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC7C;AACD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,SAAS,CAAC,GAAG,EAAE,eAAe;gBAApB,GAAG,EAAE,eAAe;IAE1C,QAAQ;IA0BF,IAAI;IAOJ,QAAQ;CACd"}
1
+ {"version":3,"file":"RoverProvider.d.ts","sourceRoot":"","sources":["../src/RoverProvider.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,UAAU,cAAc;IACvB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACjD;AACD,UAAU,gBAAgB;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC7C;AACD,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,SAAS,CAAC,GAAG,EAAE,eAAe;gBAApB,GAAG,EAAE,eAAe;IAE1C,QAAQ;IA0BF,IAAI;IAOJ,QAAQ;CACd"}
@@ -6,7 +6,7 @@ export default class RoverProvider {
6
6
  this.app = app;
7
7
  }
8
8
  register() {
9
- this.app.container.singleton(Mail, () => {
9
+ this.app.container.singleton(Mail, async () => {
10
10
  const config = this.app.config.get("mail");
11
11
  return new Mail(config ?? {
12
12
  default: "log",
@@ -17,10 +17,10 @@ export default class RoverProvider {
17
17
  // `QueueManager` is registered in the container, Mail gets
18
18
  // queue support for `sendLater()`. If not, `sendLater()`
19
19
  // throws `MAIL_QUEUE_REQUIRED` at call time (by design).
20
- queue: tryResolve(this.app, "QueueManager"),
20
+ queue: await tryResolve(this.app, "QueueManager"),
21
21
  // Same pattern for the event bus `Emitter` — enables `mail.sent`
22
22
  // / `mail.failed` emission when available.
23
- emitter: tryResolve(this.app, "Emitter"),
23
+ emitter: await tryResolve(this.app, "Emitter"),
24
24
  });
25
25
  });
26
26
  this.app.container.singleton("mail", () => {
@@ -31,7 +31,7 @@ export default class RoverProvider {
31
31
  // Populate the `@c9up/rover/services/main` singleton with the
32
32
  // container-resolved Mail instance so apps can
33
33
  // `import mail from '@c9up/rover/services/main'` from anywhere.
34
- setMail(this.app.container.resolve(Mail));
34
+ setMail(await this.app.container.resolve(Mail));
35
35
  }
36
36
  async shutdown() { }
37
37
  }
@@ -40,9 +40,9 @@ export default class RoverProvider {
40
40
  * registered. Rover never hard-depends on Bay or the event bus — both wire-points
41
41
  * are purely opt-in.
42
42
  */
43
- function tryResolve(app, token) {
43
+ async function tryResolve(app, token) {
44
44
  try {
45
- return app.container.resolve(token);
45
+ return await app.container.resolve(token);
46
46
  }
47
47
  catch {
48
48
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"RoverProvider.js","sourceRoot":"","sources":["../src/RoverProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAkB7C,MAAM,CAAC,OAAO,OAAO,aAAa;IACX;IAAtB,YAAsB,GAAoB;QAApB,QAAG,GAAH,GAAG,CAAiB;IAAG,CAAC;IAE9C,QAAQ;QACP,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAa,MAAM,CAAC,CAAC;YACvD,OAAO,IAAI,IAAI,CACd,MAAM,IAAI;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,mBAAmB;gBACzB,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;aACzC,EACD;gBACC,4DAA4D;gBAC5D,2DAA2D;gBAC3D,yDAAyD;gBACzD,yDAAyD;gBACzD,KAAK,EAAE,UAAU,CAAe,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;gBACzD,iEAAiE;gBACjE,2CAA2C;gBAC3C,OAAO,EAAE,UAAU,CAAc,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;aACrD,CACD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;YACzC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAO,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,8DAA8D;QAC9D,+CAA+C;QAC/C,gEAAgE;QAChE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAO,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,QAAQ,KAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAI,GAAoB,EAAE,KAAa;IACzD,IAAI,CAAC;QACJ,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,CAAI,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"RoverProvider.js","sourceRoot":"","sources":["../src/RoverProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAkB7C,MAAM,CAAC,OAAO,OAAO,aAAa;IACX;IAAtB,YAAsB,GAAoB;QAApB,QAAG,GAAH,GAAG,CAAiB;IAAG,CAAC;IAE9C,QAAQ;QACP,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAa,MAAM,CAAC,CAAC;YACvD,OAAO,IAAI,IAAI,CACd,MAAM,IAAI;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,mBAAmB;gBACzB,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;aACzC,EACD;gBACC,4DAA4D;gBAC5D,2DAA2D;gBAC3D,yDAAyD;gBACzD,yDAAyD;gBACzD,KAAK,EAAE,MAAM,UAAU,CAAe,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;gBAC/D,iEAAiE;gBACjE,2CAA2C;gBAC3C,OAAO,EAAE,MAAM,UAAU,CAAc,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;aAC3D,CACD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;YACzC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAO,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,8DAA8D;QAC9D,+CAA+C;QAC/C,gEAAgE;QAChE,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAO,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,QAAQ,KAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,KAAK,UAAU,UAAU,CACxB,GAAoB,EACpB,KAAa;IAEb,IAAI,CAAC;QACJ,OAAO,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAI,KAAK,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,4 +1,42 @@
1
1
  import type { MailConfig } from "./Mail.js";
2
+ import type { RetryConfig } from "./retry.js";
2
3
  export declare function defineConfig(config: MailConfig): MailConfig;
4
+ /** One mailer's settings — the transport name plus whatever it reads. */
5
+ export interface TransportDescriptor {
6
+ transport: string;
7
+ retry?: RetryConfig;
8
+ [key: string]: unknown;
9
+ }
10
+ type Options = Record<string, unknown> & {
11
+ retry?: RetryConfig;
12
+ };
13
+ /**
14
+ * Mailer descriptors for `defineConfig`, matching the AdonisJS call site:
15
+ *
16
+ * defineConfig({
17
+ * default: 'smtp',
18
+ * from: 'noreply@acme.com',
19
+ * mailers: { smtp: transports.smtp({ host: env.get('SMTP_HOST') }) },
20
+ * })
21
+ *
22
+ * Named deviation: upstream returns a config PROVIDER that lazily imports the
23
+ * transport. Rover returns the plain descriptor its config can persist, and the
24
+ * transport registers itself on import.
25
+ *
26
+ * Postmark has no helper here on purpose: rover has no Postmark transport, so a
27
+ * migrated config naming it fails to COMPILE — which says so plainly — instead
28
+ * of throwing at boot.
29
+ */
30
+ export declare const transports: {
31
+ smtp: (config?: Options) => TransportDescriptor;
32
+ ses: (config?: Options) => TransportDescriptor;
33
+ mailgun: (config?: Options) => TransportDescriptor;
34
+ sparkpost: (config?: Options) => TransportDescriptor;
35
+ resend: (config?: Options) => TransportDescriptor;
36
+ brevo: (config?: Options) => TransportDescriptor;
37
+ sendgrid: (config?: Options) => TransportDescriptor;
38
+ /** Writes to the logger instead of sending — the local-development mailer. */
39
+ log: (config?: Options) => TransportDescriptor;
40
+ };
3
41
  export type { MailConfig };
4
42
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,YAAY,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AASjE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,UAAU;oBAvBN,OAAO,KAAQ,mBAAmB;mBAAlC,OAAO,KAAQ,mBAAmB;uBAAlC,OAAO,KAAQ,mBAAmB;yBAAlC,OAAO,KAAQ,mBAAmB;sBAAlC,OAAO,KAAQ,mBAAmB;qBAAlC,OAAO,KAAQ,mBAAmB;wBAAlC,OAAO,KAAQ,mBAAmB;IA+BlD,8EAA8E;mBA/B9D,OAAO,KAAQ,mBAAmB;CAiClD,CAAC;AAEF,YAAY,EAAE,UAAU,EAAE,CAAC"}
package/dist/config.js CHANGED
@@ -1,4 +1,38 @@
1
1
  export function defineConfig(config) {
2
2
  return config;
3
3
  }
4
+ function describe(transport) {
5
+ return (config = {}) => ({
6
+ ...config,
7
+ transport,
8
+ });
9
+ }
10
+ /**
11
+ * Mailer descriptors for `defineConfig`, matching the AdonisJS call site:
12
+ *
13
+ * defineConfig({
14
+ * default: 'smtp',
15
+ * from: 'noreply@acme.com',
16
+ * mailers: { smtp: transports.smtp({ host: env.get('SMTP_HOST') }) },
17
+ * })
18
+ *
19
+ * Named deviation: upstream returns a config PROVIDER that lazily imports the
20
+ * transport. Rover returns the plain descriptor its config can persist, and the
21
+ * transport registers itself on import.
22
+ *
23
+ * Postmark has no helper here on purpose: rover has no Postmark transport, so a
24
+ * migrated config naming it fails to COMPILE — which says so plainly — instead
25
+ * of throwing at boot.
26
+ */
27
+ export const transports = {
28
+ smtp: describe("smtp"),
29
+ ses: describe("ses"),
30
+ mailgun: describe("mailgun"),
31
+ sparkpost: describe("sparkpost"),
32
+ resend: describe("resend"),
33
+ brevo: describe("brevo"),
34
+ sendgrid: describe("sendgrid"),
35
+ /** Writes to the logger instead of sending — the local-development mailer. */
36
+ log: describe("log"),
37
+ };
4
38
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC9C,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC9C,OAAO,MAAM,CAAC;AACf,CAAC;AAWD,SAAS,QAAQ,CAAC,SAAiB;IAClC,OAAO,CAAC,SAAkB,EAAE,EAAuB,EAAE,CAAC,CAAC;QACtD,GAAG,MAAM;QACT,SAAS;KACT,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;IACtB,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC;IACpB,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC;IAC5B,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC;IAChC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC;IAC9B,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC;CACpB,CAAC"}
package/dist/format.d.ts CHANGED
@@ -7,6 +7,16 @@
7
7
  * Format a recipient address with an optional display name into the
8
8
  * `"Name" <address>` form (RFC 5322 quoted display name). A bare address —
9
9
  * or an empty/whitespace-only name — is returned unchanged.
10
+ *
11
+ * The display name is a QUOTED string, so a `"` inside it would close the quote
12
+ * early: a name of `x" <evil@example.com>, "y` would otherwise forge a second
13
+ * recipient. Backslash and quote are escaped, which is what a quoted-string
14
+ * allows.
15
+ *
16
+ * A line break cannot be escaped in a header — it ENDS the header — so a value
17
+ * carrying CR, LF or NUL is rejected rather than mangled. Accepting it is how a
18
+ * contact form turns into an open relay: one `\r\nBcc:` and the message goes
19
+ * wherever the attacker asked.
10
20
  */
11
21
  export declare function formatAddress(address: string, name?: string): string;
12
22
  //# sourceMappingURL=format.d.ts.map