@farm.js/email 0.1.0-beta.99 → 0.1.1-beta.1
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 +2 -2
- package/dist/client.d.ts +0 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/index.d.ts +25 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -6
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Email and Resend integration for Farm.js
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
See [Stability and Support](https://farmjs.dev/docs/stability) for what this package guarantees.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @farm.js/email
|
|
8
|
+
npm install @farm.js/email
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
See the [Farm.js repository](https://github.com/farming-labs/farm.js) for documentation, examples, and support.
|
package/dist/client.d.ts
CHANGED
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,MAAM,sBAAsB,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG;IACjE,YAAY,CAAC,EAAE,KAAK,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,aAAa,CAAC,KAAK;IAClC,SAAS,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;CACjG;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,MAAM,MAAM,iBAAiB,CAAC,SAAS,IACrC,SAAS,SAAS,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AAE/D,wBAAgB,QAAQ,CAAC,UAAU,SAAS,sBAAsB,CAAC,GAAG,CAAC,EACrE,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,GACnE,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAK3C;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,16 @@ export interface ResendIntegrationDefaults {
|
|
|
14
14
|
from?: string;
|
|
15
15
|
replyTo?: string | string[];
|
|
16
16
|
}
|
|
17
|
+
/** Which mounted route an authorization decision is being made for. */
|
|
18
|
+
export interface ResendEmailAuthorizeContext {
|
|
19
|
+
route: "send" | "schedule" | "preview";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether a caller may use the mounted email routes. Return `true` to
|
|
23
|
+
* allow, `false` for a generic 401, or a `Response` to answer the caller
|
|
24
|
+
* directly (for example a redirect or a domain-specific error body).
|
|
25
|
+
*/
|
|
26
|
+
export type ResendEmailAuthorize = (request: Request, context: ResendEmailAuthorizeContext) => boolean | Response | Promise<boolean | Response>;
|
|
17
27
|
export interface ResendIntegrationInput<TTemplates extends EmailTemplates = EmailTemplates> {
|
|
18
28
|
apiKey?: string;
|
|
19
29
|
instance?: ResendIntegrationInstance;
|
|
@@ -22,6 +32,19 @@ export interface ResendIntegrationInput<TTemplates extends EmailTemplates = Emai
|
|
|
22
32
|
templates: TTemplates;
|
|
23
33
|
webhooks?: ResendWebhookConfig;
|
|
24
34
|
log?: FarmIntegrationLogger;
|
|
35
|
+
/**
|
|
36
|
+
* Required to expose the send, schedule, and preview routes. These routes
|
|
37
|
+
* spend the application's own Resend credits and send from its verified
|
|
38
|
+
* domain, so they are never anonymously callable by default.
|
|
39
|
+
*/
|
|
40
|
+
authorize?: ResendEmailAuthorize;
|
|
41
|
+
/**
|
|
42
|
+
* Serve the routes with no authorization at all. Only for an application
|
|
43
|
+
* that already gates the base path in middleware or at the edge.
|
|
44
|
+
*/
|
|
45
|
+
allowUnauthenticated?: boolean;
|
|
46
|
+
/** Extra trusted origins, using the `serverActions.allowedOrigins` syntax. */
|
|
47
|
+
allowedOrigins?: readonly string[];
|
|
25
48
|
}
|
|
26
49
|
interface ResolvedResendConfig {
|
|
27
50
|
apiKey?: string;
|
|
@@ -41,7 +64,7 @@ export declare function resend<const TTemplates extends EmailTemplates>(input: R
|
|
|
41
64
|
templateIds: string[];
|
|
42
65
|
liveMode: boolean;
|
|
43
66
|
};
|
|
44
|
-
config: import("@farm.js/core").FarmIntegrationConfigDefinition<ResolvedResendConfig, import("@farm.js/core").
|
|
67
|
+
config: import("@farm.js/core").FarmIntegrationConfigDefinition<ResolvedResendConfig, import("@farm.js/core").FarmSchema | undefined>;
|
|
45
68
|
api: {
|
|
46
69
|
send: {
|
|
47
70
|
post: {
|
|
@@ -125,6 +148,6 @@ export declare function resend<const TTemplates extends EmailTemplates>(input: R
|
|
|
125
148
|
};
|
|
126
149
|
};
|
|
127
150
|
log: FarmIntegrationLogger | undefined;
|
|
128
|
-
routes: (import("@farm.js/core").FarmTypedIntegrationRoute<string, never, never, import("@farm.js/integration-utils").FarmWebhookAckResult, false, "POST", import("@farm.js/core").
|
|
151
|
+
routes: (import("@farm.js/core").FarmTypedIntegrationRoute<string, never, never, import("@farm.js/integration-utils").FarmWebhookAckResult, false, "POST", import("@farm.js/core").FarmSchema | undefined> | import("@farm.js/core").FarmTypedIntegrationRoute<`${string}/send`, ResendEmailSendInput<TTemplates>, never, ResendEmailSendResult<TTemplates>, false, "POST", import("@farm.js/core").FarmSchema | undefined> | import("@farm.js/core").FarmTypedIntegrationRoute<`${string}/schedule`, ResendEmailScheduleInput<TTemplates>, never, ResendEmailScheduleResult<TTemplates>, false, "POST", import("@farm.js/core").FarmSchema | undefined> | import("@farm.js/core").FarmTypedIntegrationRoute<`${string}/preview`, ResendEmailPreviewInput<TTemplates>, never, ResendEmailPreviewResult<TTemplates>, false, "POST", import("@farm.js/core").FarmSchema | undefined> | import("@farm.js/core").FarmTypedIntegrationRoute<`${string}/templates`, never, never, ResendEmailTemplateInfo<TTemplates>[], false, "GET", import("@farm.js/core").FarmSchema | undefined>)[];
|
|
129
152
|
}>;
|
|
130
153
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { render, toPlainText } from "@react-email/render";
|
|
2
|
-
import { defineIntegration, integrationRoute } from "@farm.js/core";
|
|
2
|
+
import { defineIntegration, describeIntegrationOriginRejection, integrationRoute, validateIntegrationRequestOrigin, } from "@farm.js/core";
|
|
3
3
|
import { integrationConfig, normalizeWebhookConfig } from "@farm.js/integration-utils";
|
|
4
4
|
import { createResendClientApi, } from "./client.js";
|
|
5
5
|
import { createElement } from "react";
|
|
@@ -10,6 +10,53 @@ export { emailSchedule } from "./schedule.js";
|
|
|
10
10
|
function createResendApi(input = {}) {
|
|
11
11
|
return createResendClientApi(input);
|
|
12
12
|
}
|
|
13
|
+
const MISSING_EMAIL_AUTHORIZE_ERROR = "The email routes are not authorized. These routes spend your Resend credits and send " +
|
|
14
|
+
"from your verified domain, so they refuse anonymous callers. Pass `authorize` to the " +
|
|
15
|
+
"email integration, or set `allowUnauthenticated: true` if the base path is already " +
|
|
16
|
+
"gated by your own middleware.";
|
|
17
|
+
/**
|
|
18
|
+
* Gate a mounted email route.
|
|
19
|
+
*
|
|
20
|
+
* Two layers, because either alone is insufficient. The origin check stops a
|
|
21
|
+
* cross-site page from spending the application's credits through a visitor's
|
|
22
|
+
* session, but it cannot stop a visitor on the application's own origin from
|
|
23
|
+
* calling the route directly. `authorize` is therefore the real gate, and the
|
|
24
|
+
* route fails closed without it. Origin metadata is not required, so a
|
|
25
|
+
* server-to-server caller that authenticates through `authorize` still works.
|
|
26
|
+
*/
|
|
27
|
+
async function guardEmailRoute(request, route, input) {
|
|
28
|
+
const origin = validateIntegrationRequestOrigin(request, {
|
|
29
|
+
allowedOrigins: input.allowedOrigins,
|
|
30
|
+
requireOriginMetadata: false,
|
|
31
|
+
});
|
|
32
|
+
if (!origin.ok) {
|
|
33
|
+
return Response.json({ error: describeIntegrationOriginRejection(origin.reason) }, { status: 403 });
|
|
34
|
+
}
|
|
35
|
+
if (input.authorize) {
|
|
36
|
+
const decision = await input.authorize(request, { route });
|
|
37
|
+
if (decision instanceof Response)
|
|
38
|
+
return decision;
|
|
39
|
+
if (decision !== true) {
|
|
40
|
+
return Response.json({ error: "Unauthorized email request." }, { status: 401 });
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
if (input.allowUnauthenticated === true)
|
|
45
|
+
return null;
|
|
46
|
+
return Response.json({ error: MISSING_EMAIL_AUTHORIZE_ERROR }, { status: 401 });
|
|
47
|
+
}
|
|
48
|
+
async function readEmailRouteJson(request) {
|
|
49
|
+
try {
|
|
50
|
+
const body = await request.json();
|
|
51
|
+
if (body && typeof body === "object" && !Array.isArray(body)) {
|
|
52
|
+
return body;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Report malformed input below without leaking the parser error.
|
|
57
|
+
}
|
|
58
|
+
return Response.json({ error: "Email request body must be a valid JSON object." }, { status: 400 });
|
|
59
|
+
}
|
|
13
60
|
function normalizeBasePath(path) {
|
|
14
61
|
if (!path) {
|
|
15
62
|
return "/api/email";
|
|
@@ -174,7 +221,13 @@ export function resend(input) {
|
|
|
174
221
|
integrationRoute.post(sendPath, {
|
|
175
222
|
responseFormat: "json",
|
|
176
223
|
async handler(request, context) {
|
|
177
|
-
const
|
|
224
|
+
const denied = await guardEmailRoute(request, "send", input);
|
|
225
|
+
if (denied)
|
|
226
|
+
return denied;
|
|
227
|
+
const parsedBody = await readEmailRouteJson(request);
|
|
228
|
+
if (parsedBody instanceof Response)
|
|
229
|
+
return parsedBody;
|
|
230
|
+
const body = parsedBody;
|
|
178
231
|
const resolved = await resolveTemplate(body.templateId);
|
|
179
232
|
if (!resolved) {
|
|
180
233
|
return Response.json({
|
|
@@ -217,7 +270,6 @@ export function resend(input) {
|
|
|
217
270
|
replyTo: replyTo ?? undefined,
|
|
218
271
|
subject,
|
|
219
272
|
react: reactNode,
|
|
220
|
-
headers: body.headers,
|
|
221
273
|
tags: body.tags,
|
|
222
274
|
attachments: body.attachments,
|
|
223
275
|
topicId: body.topicId,
|
|
@@ -244,7 +296,13 @@ export function resend(input) {
|
|
|
244
296
|
integrationRoute.post(schedulePath, {
|
|
245
297
|
responseFormat: "json",
|
|
246
298
|
async handler(request, context) {
|
|
247
|
-
const
|
|
299
|
+
const denied = await guardEmailRoute(request, "schedule", input);
|
|
300
|
+
if (denied)
|
|
301
|
+
return denied;
|
|
302
|
+
const parsedBody = await readEmailRouteJson(request);
|
|
303
|
+
if (parsedBody instanceof Response)
|
|
304
|
+
return parsedBody;
|
|
305
|
+
const body = parsedBody;
|
|
248
306
|
let when;
|
|
249
307
|
try {
|
|
250
308
|
when = resolveEmailScheduleWhen(body.when);
|
|
@@ -299,7 +357,6 @@ export function resend(input) {
|
|
|
299
357
|
replyTo: replyTo ?? undefined,
|
|
300
358
|
subject,
|
|
301
359
|
react: reactNode,
|
|
302
|
-
headers: body.headers,
|
|
303
360
|
tags: body.tags,
|
|
304
361
|
attachments: body.attachments,
|
|
305
362
|
topicId: body.topicId,
|
|
@@ -327,7 +384,13 @@ export function resend(input) {
|
|
|
327
384
|
integrationRoute.post(previewPath, {
|
|
328
385
|
responseFormat: "json",
|
|
329
386
|
async handler(request, context) {
|
|
330
|
-
const
|
|
387
|
+
const denied = await guardEmailRoute(request, "preview", input);
|
|
388
|
+
if (denied)
|
|
389
|
+
return denied;
|
|
390
|
+
const parsedBody = await readEmailRouteJson(request);
|
|
391
|
+
if (parsedBody instanceof Response)
|
|
392
|
+
return parsedBody;
|
|
393
|
+
const body = parsedBody;
|
|
331
394
|
const resolved = await resolveTemplate(body.templateId);
|
|
332
395
|
if (!resolved) {
|
|
333
396
|
return Response.json({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farm.js/email",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1-beta.1",
|
|
4
4
|
"description": "Email and Resend integration for Farm.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@react-email/render": "2.0.6",
|
|
37
37
|
"resend": "6.10.0",
|
|
38
|
-
"@farm.js/
|
|
39
|
-
"@farm.js/
|
|
38
|
+
"@farm.js/core": "0.1.1-beta.1",
|
|
39
|
+
"@farm.js/integration-utils": "0.1.1-beta.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/react": "19.2.13"
|
|
@@ -48,6 +48,6 @@
|
|
|
48
48
|
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc",
|
|
49
49
|
"dev": "tsc --watch",
|
|
50
50
|
"type-check": "tsc --noEmit",
|
|
51
|
-
"test": "
|
|
51
|
+
"test": "pnpm run build && node --test test/*.test.mjs"
|
|
52
52
|
}
|
|
53
53
|
}
|