@c9up/rover 0.1.12 → 0.1.14
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/README.md +4 -1
- package/dist/Mail.d.ts +14 -6
- package/dist/Mail.d.ts.map +1 -1
- package/dist/Mail.js +42 -25
- package/dist/Mail.js.map +1 -1
- package/dist/MessageBuilder.js +4 -4
- package/dist/MessageBuilder.js.map +1 -1
- package/dist/RoverProvider.js +1 -1
- package/dist/RoverProvider.js.map +1 -1
- package/dist/config.d.ts +8 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -7
- package/dist/config.js.map +1 -1
- package/dist/configure.d.ts +18 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +39 -0
- package/dist/configure.js.map +1 -0
- package/dist/format.js +1 -1
- package/dist/format.js.map +1 -1
- package/dist/queue/MailJob.js +4 -4
- package/dist/queue/MailJob.js.map +1 -1
- package/dist/retry.d.ts +2 -2
- package/dist/retry.js +7 -7
- package/dist/retry.js.map +1 -1
- package/dist/templating/SimpleTemplate.js +8 -8
- package/dist/templating/SimpleTemplate.js.map +1 -1
- package/dist/templating/loadNapi.js +8 -8
- package/dist/templating/loadNapi.js.map +1 -1
- package/dist/transports/BrevoTransport.js +3 -3
- package/dist/transports/BrevoTransport.js.map +1 -1
- package/dist/transports/MailgunTransport.js +6 -6
- package/dist/transports/MailgunTransport.js.map +1 -1
- package/dist/transports/ResendTransport.js +3 -3
- package/dist/transports/ResendTransport.js.map +1 -1
- package/dist/transports/SendGridTransport.js +4 -4
- package/dist/transports/SendGridTransport.js.map +1 -1
- package/dist/transports/SesTransport.js +4 -4
- package/dist/transports/SesTransport.js.map +1 -1
- package/dist/transports/SparkPostTransport.js +3 -3
- package/dist/transports/SparkPostTransport.js.map +1 -1
- package/dist/transports/fetchError.d.ts +2 -2
- package/dist/transports/fetchError.js +4 -4
- package/dist/transports/fetchError.js.map +1 -1
- package/dist/webhooks/resend.d.ts.map +1 -1
- package/dist/webhooks/resend.js +21 -1
- package/dist/webhooks/resend.js.map +1 -1
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +5 -1
- package/src/Mail.ts +66 -30
- package/src/MessageBuilder.ts +4 -4
- package/src/RoverProvider.ts +1 -1
- package/src/config.ts +8 -7
- package/src/configure.ts +53 -0
- package/src/format.ts +1 -1
- package/src/queue/MailJob.ts +4 -4
- package/src/retry.ts +7 -7
- package/src/templating/SimpleTemplate.ts +8 -8
- package/src/templating/loadNapi.ts +8 -8
- package/src/transports/BrevoTransport.ts +3 -3
- package/src/transports/MailgunTransport.ts +6 -6
- package/src/transports/ResendTransport.ts +3 -3
- package/src/transports/SendGridTransport.ts +4 -4
- package/src/transports/SesTransport.ts +4 -4
- package/src/transports/SparkPostTransport.ts +3 -3
- package/src/transports/fetchError.ts +4 -4
- package/src/webhooks/resend.ts +26 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ream configure @c9up/rover` — wire mail in one command.
|
|
3
|
+
*
|
|
4
|
+
* The provider alone is not enough: it reads `config/mail.ts`, and a package
|
|
5
|
+
* registered without one falls back to a default that is rarely the one an
|
|
6
|
+
* application wants. Writing both together is what makes `ream add` mean
|
|
7
|
+
* installed AND working.
|
|
8
|
+
*/
|
|
9
|
+
export async function configure(codemods) {
|
|
10
|
+
// The config below reads these, so they are declared here. Writing the file
|
|
11
|
+
// without them leaves an application whose config asks the environment for
|
|
12
|
+
// something nothing ever put there.
|
|
13
|
+
await codemods.addEnvVars({
|
|
14
|
+
MAIL_MAILER: "log",
|
|
15
|
+
MAIL_FROM: "noreply@example.com",
|
|
16
|
+
SMTP_HOST: "",
|
|
17
|
+
SMTP_PORT: "587",
|
|
18
|
+
});
|
|
19
|
+
await codemods.addProvider("@c9up/rover/provider");
|
|
20
|
+
await codemods.writeFile("config/mail.ts", `import { defineConfig, transports } from '@c9up/rover'
|
|
21
|
+
import env from '#start/env'
|
|
22
|
+
|
|
23
|
+
export default defineConfig({
|
|
24
|
+
// Has to name one of the mailers below, or the application refuses to boot.
|
|
25
|
+
default: env.get('MAIL_MAILER', 'log'),
|
|
26
|
+
from: env.get('MAIL_FROM', 'noreply@example.com'),
|
|
27
|
+
|
|
28
|
+
mailers: {
|
|
29
|
+
// Writes to the logger instead of sending. The development mailer.
|
|
30
|
+
log: transports.log(),
|
|
31
|
+
|
|
32
|
+
smtp: transports.smtp({
|
|
33
|
+
host: env.get('SMTP_HOST', ''),
|
|
34
|
+
port: Number(env.get('SMTP_PORT', '587')),
|
|
35
|
+
}),
|
|
36
|
+
},
|
|
37
|
+
})`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB;IACjD,4EAA4E;IAC5E,2EAA2E;IAC3E,oCAAoC;IACpC,MAAM,QAAQ,CAAC,UAAU,CAAC;QACzB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,QAAQ,CAAC,SAAS,CACvB,gBAAgB,EAChB;;;;;;;;;;;;;;;;;GAiBC,CACD,CAAC;AACH,CAAC"}
|
package/dist/format.js
CHANGED
|
@@ -34,7 +34,7 @@ export function formatAddress(address, name) {
|
|
|
34
34
|
function assertHeaderSafe(value, what) {
|
|
35
35
|
if (!HEADER_BREAKERS.test(value))
|
|
36
36
|
return;
|
|
37
|
-
throw new RoverError("
|
|
37
|
+
throw new RoverError("E_MAIL_HEADER_INJECTION", `The ${what} contains a line break or NUL, which cannot appear in a mail header.`, {
|
|
38
38
|
hint: "Strip CR/LF/NUL from user-supplied names and addresses before building the message.",
|
|
39
39
|
});
|
|
40
40
|
}
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,4EAA4E;AAC5E,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAa;IAC3D,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;IACtD,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,2EAA2E;IAC3E,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,4EAA4E;AAC5E,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAa;IAC3D,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;IACtD,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,2EAA2E;IAC3E,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,IAAI,UAAU,CACnB,yBAAyB,EACzB,OAAO,IAAI,sEAAsE,EACjF;QACC,IAAI,EAAE,qFAAqF;KAC3F,CACD,CAAC;AACH,CAAC"}
|
package/dist/queue/MailJob.js
CHANGED
|
@@ -26,18 +26,18 @@ export class MailJobHandler {
|
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Narrow an `unknown` payload from the queue driver into a `MailJobPayload`.
|
|
29
|
-
* Throws `
|
|
29
|
+
* Throws `E_MAIL_JOB_MALFORMED` when the shape is unrecognisable so Bay records
|
|
30
30
|
* a clean failure rather than crashing inside `dispatchMessage` with a raw
|
|
31
31
|
* `TypeError`.
|
|
32
32
|
*/
|
|
33
33
|
function validatePayload(payload) {
|
|
34
34
|
if (!payload || typeof payload !== "object") {
|
|
35
|
-
throw new RoverError("
|
|
35
|
+
throw new RoverError("E_MAIL_JOB_MALFORMED", "Mail job payload is missing or not an object", { hint: "Queue driver returned a non-object — check serialisation." });
|
|
36
36
|
}
|
|
37
37
|
const asObj = payload;
|
|
38
38
|
const message = asObj.message;
|
|
39
39
|
if (!message || typeof message !== "object") {
|
|
40
|
-
throw new RoverError("
|
|
40
|
+
throw new RoverError("E_MAIL_JOB_MALFORMED", "Mail job payload.message is missing or not an object", {
|
|
41
41
|
hint: "Payload shape must be { message: MailMessage, transport?: string }.",
|
|
42
42
|
});
|
|
43
43
|
}
|
|
@@ -45,7 +45,7 @@ function validatePayload(payload) {
|
|
|
45
45
|
if (typeof m.from !== "string" ||
|
|
46
46
|
!Array.isArray(m.to) ||
|
|
47
47
|
!Array.isArray(m.attachments)) {
|
|
48
|
-
throw new RoverError("
|
|
48
|
+
throw new RoverError("E_MAIL_JOB_MALFORMED", "Mail job payload.message does not match MailMessage shape", {
|
|
49
49
|
hint: "Expected `{ from: string, to: string[], ..., attachments: [] }`.",
|
|
50
50
|
});
|
|
51
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MailJob.js","sourceRoot":"","sources":["../../src/queue/MailJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AAwCzC;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAC1B,KAAK,CAAiB;IAEtB,YAAY,IAAoB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAgB;QAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,wEAAwE;QACxE,wEAAwE;QACxE,wEAAwE;QACxE,sCAAsC;QACtC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE;YAC1E,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;SACT,CAAC,CAAC;IACJ,CAAC;CACD;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,OAAgB;IACxC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"MailJob.js","sourceRoot":"","sources":["../../src/queue/MailJob.ts"],"names":[],"mappings":"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"}
|
package/dist/retry.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export interface RetryConfig {
|
|
|
7
7
|
export declare const DEFAULT_RETRY_CONFIG: Required<RetryConfig>;
|
|
8
8
|
/**
|
|
9
9
|
* A failure is retryable when:
|
|
10
|
-
* - it's a `
|
|
11
|
-
* - or it's a `
|
|
10
|
+
* - it's a `E_MAIL_PROVIDER_ERROR` with `upstreamStatus` 429 or ≥ 500
|
|
11
|
+
* - or it's a `E_MAIL_PROVIDER_ERROR` whose `context.networkCode` is a known
|
|
12
12
|
* retryable Node errno (SDK wrappers surface the original errno this way
|
|
13
13
|
* when the HTTP layer never produced a status)
|
|
14
14
|
* - or it's a raw Error with a matching Node networking errno on `.code`
|
package/dist/retry.js
CHANGED
|
@@ -14,15 +14,15 @@ const RETRYABLE_ERRNO = new Set([
|
|
|
14
14
|
]);
|
|
15
15
|
/**
|
|
16
16
|
* A failure is retryable when:
|
|
17
|
-
* - it's a `
|
|
18
|
-
* - or it's a `
|
|
17
|
+
* - it's a `E_MAIL_PROVIDER_ERROR` with `upstreamStatus` 429 or ≥ 500
|
|
18
|
+
* - or it's a `E_MAIL_PROVIDER_ERROR` whose `context.networkCode` is a known
|
|
19
19
|
* retryable Node errno (SDK wrappers surface the original errno this way
|
|
20
20
|
* when the HTTP layer never produced a status)
|
|
21
21
|
* - or it's a raw Error with a matching Node networking errno on `.code`
|
|
22
22
|
* 4xx (non-429) is treated as permanent: retrying won't help.
|
|
23
23
|
*/
|
|
24
24
|
export function isRetryableError(err) {
|
|
25
|
-
if (err instanceof RoverError && err.code === "
|
|
25
|
+
if (err instanceof RoverError && err.code === "E_MAIL_PROVIDER_ERROR") {
|
|
26
26
|
const statusStr = err.context.upstreamStatus;
|
|
27
27
|
const status = Number(statusStr);
|
|
28
28
|
if (Number.isFinite(status)) {
|
|
@@ -59,7 +59,7 @@ export function computeBackoffMs(attempt, config, err) {
|
|
|
59
59
|
// SES/Resend transports capture it into `context.retryAfter`). Value is
|
|
60
60
|
// seconds per HTTP RFC 7231 §7.1.3; we cap at `maxDelayMs` so a malicious
|
|
61
61
|
// or mistaken provider can't force a very-long wait.
|
|
62
|
-
if (err instanceof RoverError && err.code === "
|
|
62
|
+
if (err instanceof RoverError && err.code === "E_MAIL_PROVIDER_ERROR") {
|
|
63
63
|
const hint = err.context.retryAfter;
|
|
64
64
|
if (hint) {
|
|
65
65
|
const seconds = Number(hint);
|
|
@@ -84,17 +84,17 @@ export function resolveRetryConfig(globalConfig, transportConfig) {
|
|
|
84
84
|
...strip(transportConfig),
|
|
85
85
|
};
|
|
86
86
|
if (!Number.isInteger(merged.maxAttempts) || merged.maxAttempts < 1) {
|
|
87
|
-
throw new RoverError("
|
|
87
|
+
throw new RoverError("E_MAIL_RETRY_CONFIG", `RetryConfig.maxAttempts must be an integer >= 1 (got ${merged.maxAttempts})`, { hint: "Set retry.maxAttempts to a positive integer." });
|
|
88
88
|
}
|
|
89
89
|
if (typeof merged.baseDelayMs !== "number" ||
|
|
90
90
|
!Number.isFinite(merged.baseDelayMs) ||
|
|
91
91
|
merged.baseDelayMs < 0) {
|
|
92
|
-
throw new RoverError("
|
|
92
|
+
throw new RoverError("E_MAIL_RETRY_CONFIG", `RetryConfig.baseDelayMs must be a non-negative finite number (got ${merged.baseDelayMs})`, { hint: "Use 0 or a positive number; the 50 ms floor kicks in anyway." });
|
|
93
93
|
}
|
|
94
94
|
if (typeof merged.factor !== "number" ||
|
|
95
95
|
!Number.isFinite(merged.factor) ||
|
|
96
96
|
merged.factor <= 0) {
|
|
97
|
-
throw new RoverError("
|
|
97
|
+
throw new RoverError("E_MAIL_RETRY_CONFIG", `RetryConfig.factor must be a positive finite number (got ${merged.factor})`, { hint: "Use >= 1 for exponential growth; 1 means constant delay." });
|
|
98
98
|
}
|
|
99
99
|
return merged;
|
|
100
100
|
}
|
package/dist/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAS7C,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IAC1D,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,GAAG;IAChB,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,MAAM;CAClB,CAAC;AAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC/B,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,WAAW;CACX,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC5C,IAAI,GAAG,YAAY,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,10 +67,10 @@ function dataReplacer(_key, value) {
|
|
|
67
67
|
if (value >= MIN_SAFE_BIGINT && value <= MAX_SAFE_BIGINT) {
|
|
68
68
|
return Number(value);
|
|
69
69
|
}
|
|
70
|
-
throw new RoverError("
|
|
70
|
+
throw new RoverError("E_MAIL_TEMPLATE_SYNTAX", `Cannot render bigint ${value} — it exceeds Number.MAX_SAFE_INTEGER and cannot cross the template engine boundary without precision loss; format it to a string before rendering`);
|
|
71
71
|
}
|
|
72
72
|
if (typeof value === "number" && !Number.isFinite(value)) {
|
|
73
|
-
throw new RoverError("
|
|
73
|
+
throw new RoverError("E_MAIL_TEMPLATE_SYNTAX", `Cannot render non-finite number ${value} — NaN and Infinity have no representation across the template engine boundary; format it to a string before rendering`);
|
|
74
74
|
}
|
|
75
75
|
return value;
|
|
76
76
|
}
|
|
@@ -98,7 +98,7 @@ function errnoCode(err) {
|
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Resolve + read + compile one template path, caching the compiled IR by its
|
|
101
|
-
* resolved absolute path. Owns the `
|
|
101
|
+
* resolved absolute path. Owns the `E_MAIL_TEMPLATE_NOT_FOUND` / `_READ_ERROR`
|
|
102
102
|
* raising (unchanged from the pre-migration engine).
|
|
103
103
|
*/
|
|
104
104
|
async function loadIr(viewPath, root) {
|
|
@@ -114,12 +114,12 @@ async function loadIr(viewPath, root) {
|
|
|
114
114
|
const code = errnoCode(err);
|
|
115
115
|
// Only ENOENT maps to NOT_FOUND; permission/io errors surface distinctly.
|
|
116
116
|
if (code !== "ENOENT") {
|
|
117
|
-
throw new RoverError("
|
|
117
|
+
throw new RoverError("E_MAIL_TEMPLATE_READ_ERROR", `Template read failed at ${resolved} (${code || "unknown"})`, {
|
|
118
118
|
hint: "Check filesystem permissions and file descriptor limits.",
|
|
119
119
|
context: { path: resolved, code, viewsRoot: root },
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
|
-
throw new RoverError("
|
|
122
|
+
throw new RoverError("E_MAIL_TEMPLATE_NOT_FOUND", `Template not found at ${resolved}`, {
|
|
123
123
|
hint: "Create the file or update config.mail.viewsRoot.",
|
|
124
124
|
context: {
|
|
125
125
|
path: resolved,
|
|
@@ -158,9 +158,9 @@ async function buildPartialMap(rootIr, root) {
|
|
|
158
158
|
// A partial referenced only inside a falsy `{{#if}}` is never
|
|
159
159
|
// rendered. The pre-migration engine loaded partials lazily, so a
|
|
160
160
|
// missing such partial did not error. Skip it here; if it IS reached
|
|
161
|
-
// at render time the Rust renderer raises
|
|
161
|
+
// at render time the Rust renderer raises E_MAIL_TEMPLATE_NOT_FOUND.
|
|
162
162
|
if (err instanceof RoverError &&
|
|
163
|
-
err.code === "
|
|
163
|
+
err.code === "E_MAIL_TEMPLATE_NOT_FOUND") {
|
|
164
164
|
continue;
|
|
165
165
|
}
|
|
166
166
|
throw err;
|
|
@@ -188,7 +188,7 @@ function resolveTemplatePath(viewPath, root) {
|
|
|
188
188
|
const candidate = path.resolve(withExt);
|
|
189
189
|
const rel = path.relative(rootAbs, candidate);
|
|
190
190
|
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
|
191
|
-
throw new RoverError("
|
|
191
|
+
throw new RoverError("E_MAIL_TEMPLATE_NOT_FOUND", `Template path "${viewPath}" resolves outside of viewsRoot`, {
|
|
192
192
|
hint: "Template names must stay under viewsRoot. Absolute paths and `..` traversals are rejected.",
|
|
193
193
|
context: { path: candidate, viewsRoot: rootAbs },
|
|
194
194
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleTemplate.js","sourceRoot":"","sources":["../../src/templating/SimpleTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAsB,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3E,gEAAgE;AAChE,4EAA4E;AAC5E,wEAAwE;AACxE,uEAAuE;AACvE,uEAAuE;AACvE,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAE/E,IAAI,SAAS,GAAG,wBAAwB,CAAC;AACzC,gFAAgF;AAChF,iFAAiF;AACjF,gDAAgD;AAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE/C,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,SAAS,GAAG,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,UAAU;IACzB,KAAK,CAAC,KAAK,EAAE,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,MAAc,EACd,IAA6B;IAE7B,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACtD,OAAO,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,QAAgB,EAChB,IAA6B,EAC7B,WAAwB,IAAI,GAAG,EAAE;AACjC,2EAA2E;AAC3E,4EAA4E;AAC5E,uEAAuE;AACvE,8EAA8E;AAC9E,iBAA0B;IAE1B,MAAM,IAAI,GAAG,iBAAiB,IAAI,SAAS,CAAC;IAC5C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,MAAc;IACpC,IAAI,CAAC;QACJ,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACF,CAAC;AAED,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAExD;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAAK,IAAI,eAAe,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;YAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"SimpleTemplate.js","sourceRoot":"","sources":["../../src/templating/SimpleTemplate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Loads the native `rover-template-engine-napi` binary built by
|
|
2
2
|
// `scripts/copy-napi.mjs` and re-throws load failures as
|
|
3
|
-
// `
|
|
3
|
+
// `E_MAIL_TEMPLATE_NAPI_REQUIRED` (D55.2.4) — actionable hint points at
|
|
4
4
|
// `pnpm --filter @c9up/rover build:napi`.
|
|
5
5
|
//
|
|
6
6
|
// Per cerebrum 2026-04-15 there is NO JS fallback. If the binary fails to load,
|
|
@@ -21,7 +21,7 @@ function platformSuffix() {
|
|
|
21
21
|
const key = `${platform}-${arch}`;
|
|
22
22
|
const suffix = SUFFIX_MAP[key];
|
|
23
23
|
if (typeof suffix !== "string") {
|
|
24
|
-
throw new RoverError("
|
|
24
|
+
throw new RoverError("E_MAIL_TEMPLATE_NAPI_REQUIRED", `Unsupported platform/arch '${key}' for @c9up/rover native binary. Supported: ${Object.keys(SUFFIX_MAP).join(", ")}.`, {
|
|
25
25
|
hint: "Build the native binary on a supported platform with 'pnpm --filter @c9up/rover build:napi'.",
|
|
26
26
|
});
|
|
27
27
|
}
|
|
@@ -61,12 +61,12 @@ export function getNative() {
|
|
|
61
61
|
const muslHint = suffix.endsWith("-gnu")
|
|
62
62
|
? " If you are on Alpine/musl, note the prebuilt binaries target glibc (musl is not a supported target)."
|
|
63
63
|
: "";
|
|
64
|
-
throw new RoverError("
|
|
64
|
+
throw new RoverError("E_MAIL_TEMPLATE_NAPI_REQUIRED", `@c9up/rover native binary 'index.${suffix}.node' not found or failed to load near ${here} — run 'pnpm --filter @c9up/rover build:napi' to build it.${muslHint} Cause: ${causeMessage}`, {
|
|
65
65
|
hint: "Run 'pnpm --filter @c9up/rover build:napi' to compile the native template engine.",
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
if (!isNativeExports(loaded)) {
|
|
69
|
-
throw new RoverError("
|
|
69
|
+
throw new RoverError("E_MAIL_TEMPLATE_NAPI_REQUIRED", "@c9up/rover native binary loaded but missing expected exports (engineVersion / compile / renderIr). Rebuild with 'pnpm --filter @c9up/rover build:napi'.", {
|
|
70
70
|
hint: "The native binary is stale — rebuild with 'pnpm --filter @c9up/rover build:napi'.",
|
|
71
71
|
});
|
|
72
72
|
}
|
|
@@ -81,9 +81,9 @@ function isNapiErrorPayload(value) {
|
|
|
81
81
|
}
|
|
82
82
|
/** Codes the Rust engine legitimately emits, with their actionable hints. */
|
|
83
83
|
const CODE_HINTS = {
|
|
84
|
-
|
|
84
|
+
E_MAIL_TEMPLATE_SYNTAX: "Check the template grammar: {{ var }}, {{{ raw }}}, {{#if x}}...{{/if}}, {{> partial}}.",
|
|
85
85
|
MAIL_TEMPLATE_RECURSION: "Break the cycle — a template cannot include itself (directly or via partials).",
|
|
86
|
-
|
|
86
|
+
E_MAIL_TEMPLATE_NOT_FOUND: "Create the referenced partial file or remove the {{> name}} reference.",
|
|
87
87
|
};
|
|
88
88
|
/**
|
|
89
89
|
* Translate a thrown value from a native call into a `RoverError`.
|
|
@@ -108,8 +108,8 @@ export function toReamError(err) {
|
|
|
108
108
|
return new RoverError(parsed.code, parsed.message, { hint });
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
return new RoverError("
|
|
111
|
+
return new RoverError("E_MAIL_TEMPLATE_SYNTAX", `Native template call failed: ${err.message}`);
|
|
112
112
|
}
|
|
113
|
-
return new RoverError("
|
|
113
|
+
return new RoverError("E_MAIL_TEMPLATE_SYNTAX", `Native template call failed with non-Error: ${String(err)}`);
|
|
114
114
|
}
|
|
115
115
|
//# sourceMappingURL=loadNapi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadNapi.js","sourceRoot":"","sources":["../../src/templating/loadNapi.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,yDAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"loadNapi.js","sourceRoot":"","sources":["../../src/templating/loadNapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export class BrevoTransport {
|
|
|
30
30
|
? normalizeConfig(config.key)
|
|
31
31
|
: "";
|
|
32
32
|
if (!apiKey) {
|
|
33
|
-
throw new RoverError("
|
|
33
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Brevo transport requires apiKey", { hint: "Set { apiKey } in your mail config." });
|
|
34
34
|
}
|
|
35
35
|
this.#apiKey = apiKey;
|
|
36
36
|
this.#baseUrl =
|
|
@@ -42,7 +42,7 @@ export class BrevoTransport {
|
|
|
42
42
|
if (message.to.length === 0 &&
|
|
43
43
|
message.cc.length === 0 &&
|
|
44
44
|
message.bcc.length === 0) {
|
|
45
|
-
throw new RoverError("
|
|
45
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Mail message has no recipients", { hint: "Set at least one `to`, `cc`, or `bcc` before sending." });
|
|
46
46
|
}
|
|
47
47
|
const body = {
|
|
48
48
|
sender: parseContact(message.from),
|
|
@@ -100,7 +100,7 @@ export class BrevoTransport {
|
|
|
100
100
|
};
|
|
101
101
|
if (retryAfter)
|
|
102
102
|
ctx.retryAfter = retryAfter;
|
|
103
|
-
throw new RoverError("
|
|
103
|
+
throw new RoverError("E_MAIL_PROVIDER_ERROR", `Brevo returned ${res.status}`, {
|
|
104
104
|
hint: "Inspect `context.upstreamStatus` to decide retry eligibility. `context.retryAfter` (when set) carries the provider's backoff hint in seconds.",
|
|
105
105
|
context: ctx,
|
|
106
106
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrevoTransport.js","sourceRoot":"","sources":["../../src/transports/BrevoTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAIN,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AACvC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CACxC,CAAC,CAAC,MAAM,IAAI,oBAAoB;IAC/B,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,gBAAgB,CAAC;AACxD,iFAAiF;AACjF,MAAM,aAAa,GAAG,CAAC,CAAS,EAAU,EAAE,CAC3C,CAAC;KACC,OAAO,CAAC,+BAA+B,EAAE,mBAAmB,CAAC;KAC7D,OAAO,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;AAoB3D;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAC1B,OAAO,CAAS;IAChB,QAAQ,CAAS;IAEjB,YAAY,MAA+B;QAC1C,MAAM,MAAM,GACX,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAChC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;gBAC/B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC7B,CAAC,CAAC,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"BrevoTransport.js","sourceRoot":"","sources":["../../src/transports/BrevoTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,19 +20,19 @@ export class MailgunTransport {
|
|
|
20
20
|
const apiKey = typeof config.apiKey === "string" ? normalizeConfig(config.apiKey) : "";
|
|
21
21
|
const domain = typeof config.domain === "string" ? normalizeConfig(config.domain) : "";
|
|
22
22
|
if (!apiKey || !domain) {
|
|
23
|
-
throw new RoverError("
|
|
23
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Mailgun transport requires apiKey and domain", { hint: "Set { apiKey, domain } in your mail config." });
|
|
24
24
|
}
|
|
25
25
|
this.#domain = domain;
|
|
26
26
|
// Region: reject non-string when *defined* (wrong type signals a config
|
|
27
27
|
// bug — defaulting to "us" under those conditions is a compliance risk).
|
|
28
28
|
if (config.region !== undefined && typeof config.region !== "string") {
|
|
29
|
-
throw new RoverError("
|
|
29
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", `Mailgun region must be a string ("us" or "eu"), got ${typeof config.region}`, { hint: "Set config.region explicitly as 'us' or 'eu'." });
|
|
30
30
|
}
|
|
31
31
|
const rawRegion = typeof config.region === "string"
|
|
32
32
|
? normalizeConfig(config.region).toLowerCase()
|
|
33
33
|
: "us";
|
|
34
34
|
if (rawRegion !== "us" && rawRegion !== "eu") {
|
|
35
|
-
throw new RoverError("
|
|
35
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", `Mailgun region must be "us" or "eu", got "${rawRegion}"`, {
|
|
36
36
|
hint: "Use { region: 'us' } or { region: 'eu' }. A typo silently routing EU traffic to US infrastructure is a compliance risk.",
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -61,7 +61,7 @@ export class MailgunTransport {
|
|
|
61
61
|
if (message.to.length === 0 &&
|
|
62
62
|
message.cc.length === 0 &&
|
|
63
63
|
message.bcc.length === 0) {
|
|
64
|
-
throw new RoverError("
|
|
64
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Mail message has no recipients", { hint: "Set at least one `to`, `cc`, or `bcc` before sending." });
|
|
65
65
|
}
|
|
66
66
|
// CRLF stripping is applied at the wire boundary regardless of SDK
|
|
67
67
|
// promises — defence-in-depth. Anti-pattern from spec Dev Notes:
|
|
@@ -116,7 +116,7 @@ export class MailgunTransport {
|
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* mailgun.js's own error shape is `{ status, details | message, ... }`.
|
|
119
|
-
* Map it to our uniform `
|
|
119
|
+
* Map it to our uniform `E_MAIL_PROVIDER_ERROR` so retry + observability
|
|
120
120
|
* consumers don't need to branch on provider.
|
|
121
121
|
*
|
|
122
122
|
* Bare `Error` (no `status`) — typical for network/ECONNRESET failures from
|
|
@@ -148,7 +148,7 @@ function wrapMailgunError(err) {
|
|
|
148
148
|
? (retryAfterHeader[0] ?? "")
|
|
149
149
|
: retryAfterHeader;
|
|
150
150
|
}
|
|
151
|
-
return new RoverError("
|
|
151
|
+
return new RoverError("E_MAIL_PROVIDER_ERROR", `Mailgun returned ${status || "unknown"}`, {
|
|
152
152
|
hint: "Inspect `context.upstreamStatus` (HTTP) or `context.networkCode` (ECONNRESET/etc.) to decide retry eligibility.",
|
|
153
153
|
context: ctx,
|
|
154
154
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MailgunTransport.js","sourceRoot":"","sources":["../../src/transports/MailgunTransport.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,2EAA2E;AAC3E,OAAO,aAAa,MAAM,YAAY,CAAC;AACvC,OAAO,EAIN,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AACvC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CACxC,CAAC,CAAC,MAAM,IAAI,oBAAoB;IAC/B,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,gBAAgB,CAAC;AAExD,MAAM,aAAa,GAAG,CAAC,CAAS,EAAU,EAAE,CAC3C,CAAC;KACC,OAAO,CAAC,+BAA+B,EAAE,mBAAmB,CAAC;KAC7D,OAAO,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;AAY3D,MAAM,OAAO,gBAAgB;IAC5B,OAAO,CAAoB;IAC3B,OAAO,CAAS;IAEhB,YAAY,MAA+B;QAC1C,MAAM,MAAM,GACX,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,MAAM,GACX,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"MailgunTransport.js","sourceRoot":"","sources":["../../src/transports/MailgunTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export class ResendTransport {
|
|
|
18
18
|
constructor(config) {
|
|
19
19
|
const apiKey = typeof config.apiKey === "string" ? normalizeConfig(config.apiKey) : "";
|
|
20
20
|
if (!apiKey) {
|
|
21
|
-
throw new RoverError("
|
|
21
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Resend transport requires apiKey", { hint: "Set { apiKey } in your mail config." });
|
|
22
22
|
}
|
|
23
23
|
this.#apiKey = apiKey;
|
|
24
24
|
}
|
|
@@ -26,7 +26,7 @@ export class ResendTransport {
|
|
|
26
26
|
if (message.to.length === 0 &&
|
|
27
27
|
message.cc.length === 0 &&
|
|
28
28
|
message.bcc.length === 0) {
|
|
29
|
-
throw new RoverError("
|
|
29
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Mail message has no recipients", { hint: "Set at least one `to`, `cc`, or `bcc` before sending." });
|
|
30
30
|
}
|
|
31
31
|
const body = {
|
|
32
32
|
from: stripCrlf(message.from),
|
|
@@ -93,7 +93,7 @@ export class ResendTransport {
|
|
|
93
93
|
};
|
|
94
94
|
if (retryAfter)
|
|
95
95
|
ctx.retryAfter = retryAfter;
|
|
96
|
-
throw new RoverError("
|
|
96
|
+
throw new RoverError("E_MAIL_PROVIDER_ERROR", `Resend returned ${res.status}`, {
|
|
97
97
|
hint: "Inspect `context.upstreamStatus` to decide retry eligibility. `context.retryAfter` (when set) carries the provider's backoff hint in seconds.",
|
|
98
98
|
context: ctx,
|
|
99
99
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResendTransport.js","sourceRoot":"","sources":["../../src/transports/ResendTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAIN,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AACvC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CACxC,CAAC,CAAC,MAAM,IAAI,oBAAoB;IAC/B,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,gBAAgB,CAAC;AACxD,iFAAiF;AACjF,MAAM,aAAa,GAAG,CAAC,CAAS,EAAU,EAAE,CAC3C,CAAC;KACC,OAAO,CAAC,+BAA+B,EAAE,mBAAmB,CAAC;KAC7D,OAAO,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;AAmB3D,MAAM,OAAO,eAAe;IAC3B,OAAO,CAAS;IAEhB,YAAY,MAA+B;QAC1C,MAAM,MAAM,GACX,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CACnB,
|
|
1
|
+
{"version":3,"file":"ResendTransport.js","sourceRoot":"","sources":["../../src/transports/ResendTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export class SendGridTransport {
|
|
|
16
16
|
constructor(config) {
|
|
17
17
|
const apiKey = typeof config.apiKey === "string" ? normalizeConfig(config.apiKey) : "";
|
|
18
18
|
if (!apiKey) {
|
|
19
|
-
throw new RoverError("
|
|
19
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "SendGrid transport requires apiKey", { hint: "Set { apiKey } in your mail config." });
|
|
20
20
|
}
|
|
21
21
|
// Dependency injection for tests — stronger guard than the old version
|
|
22
22
|
// (require both `send` AND `setApiKey` to pass through).
|
|
@@ -93,7 +93,7 @@ function assertHasRecipients(message) {
|
|
|
93
93
|
if (message.to.length === 0 &&
|
|
94
94
|
message.cc.length === 0 &&
|
|
95
95
|
message.bcc.length === 0) {
|
|
96
|
-
throw new RoverError("
|
|
96
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "Mail message has no recipients", { hint: "Set at least one `to`, `cc`, or `bcc` before sending." });
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
@@ -142,7 +142,7 @@ function wrapSendGridError(err) {
|
|
|
142
142
|
const retryAfter = anyErr.response?.headers?.["retry-after"];
|
|
143
143
|
if (retryAfter)
|
|
144
144
|
ctx.retryAfter = retryAfter;
|
|
145
|
-
return new RoverError("
|
|
145
|
+
return new RoverError("E_MAIL_PROVIDER_ERROR", `SendGrid returned ${status || "unknown"}`, {
|
|
146
146
|
hint: "Inspect `context.upstreamStatus` (HTTP) or `context.networkCode` (ECONNRESET/etc.) to decide retry eligibility. `context.retryAfter` (when set) carries the provider's backoff hint in seconds.",
|
|
147
147
|
context: ctx,
|
|
148
148
|
});
|
|
@@ -161,7 +161,7 @@ function resolveMailServiceCtor(mod) {
|
|
|
161
161
|
return candidate;
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
throw new RoverError("
|
|
164
|
+
throw new RoverError("E_MAIL_PROVIDER_CONFIG", "@sendgrid/mail runtime does not expose `.MailService` — upgrade to v8+", {
|
|
165
165
|
hint: "Expected `module.exports.MailService` to be the MailService class (index.js attaches it).",
|
|
166
166
|
});
|
|
167
167
|
}
|