@growth-labs/mailer 0.3.0 → 0.4.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/dist/_internal/schema-probe.d.ts +6 -0
- package/dist/_internal/schema-probe.d.ts.map +1 -1
- package/dist/_internal/schema-probe.js +36 -0
- package/dist/_internal/schema-probe.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +24 -14
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +4 -0
- package/dist/options.js.map +1 -1
- package/dist/queue/consumer.d.ts +9 -8
- package/dist/queue/consumer.d.ts.map +1 -1
- package/dist/queue/consumer.js +68 -17
- package/dist/queue/consumer.js.map +1 -1
- package/dist/routes/track-click.js +1 -1
- package/dist/routes/track-click.js.map +1 -1
- package/dist/routes/track-open.js +1 -1
- package/dist/routes/track-open.js.map +1 -1
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/sends.d.ts +312 -0
- package/dist/schema/sends.d.ts.map +1 -0
- package/dist/schema/sends.js +26 -0
- package/dist/schema/sends.js.map +1 -0
- package/dist/schema/subscribers.d.ts +253 -0
- package/dist/schema/subscribers.d.ts.map +1 -0
- package/dist/schema/subscribers.js +21 -0
- package/dist/schema/subscribers.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/analytics.d.ts +7 -3
- package/dist/utils/analytics.d.ts.map +1 -1
- package/dist/utils/analytics.js.map +1 -1
- package/dist/utils/bounce.d.ts.map +1 -1
- package/dist/utils/bounce.js +2 -1
- package/dist/utils/bounce.js.map +1 -1
- package/dist/utils/send.d.ts +7 -4
- package/dist/utils/send.d.ts.map +1 -1
- package/dist/utils/send.js +24 -9
- package/dist/utils/send.js.map +1 -1
- package/dist/utils/subscribers.js +1 -1
- package/dist/utils/subscribers.js.map +1 -1
- package/package.json +12 -4
- package/src/_internal/schema-probe.ts +41 -0
- package/src/index.ts +2 -1
- package/src/options.ts +6 -0
- package/src/queue/consumer.ts +142 -42
- package/src/routes/track-click.ts +1 -1
- package/src/routes/track-open.ts +1 -1
- package/src/schema/index.ts +2 -0
- package/src/schema/sends.ts +30 -0
- package/src/schema/subscribers.ts +25 -0
- package/src/types.ts +34 -0
- package/src/utils/analytics.ts +8 -4
- package/src/utils/bounce.ts +2 -1
- package/src/utils/send.ts +43 -12
- package/src/utils/subscribers.ts +1 -1
- package/src/virtual.d.ts +4 -0
- package/src/schema.ts +0 -56
|
@@ -20,6 +20,12 @@ export declare function _resetSchemaProbeCache(): void;
|
|
|
20
20
|
* than silent.
|
|
21
21
|
*/
|
|
22
22
|
export declare function probeMailerSchema(db: D1DatabaseLike | undefined, d1Binding: string): Promise<ProbeResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Probe only `gl_email_sends`. Realm queue consumers keep subscriber tables in
|
|
25
|
+
* each site D1, so the realm D1 must be allowed to contain sends without
|
|
26
|
+
* subscribers.
|
|
27
|
+
*/
|
|
28
|
+
export declare function probeMailerSendsSchema(db: D1DatabaseLike | undefined, d1Binding: string): Promise<ProbeResult>;
|
|
23
29
|
/**
|
|
24
30
|
* Helper: build the standard 503 response mailer routes return on schema
|
|
25
31
|
* miss. The body shape is stable so observability dashboards can match on
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-probe.d.ts","sourceRoot":"","sources":["../../src/_internal/schema-probe.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzC,UAAU,mBAAmB;IAC5B,KAAK,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,UAAU,cAAc;IACvB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;CAC3C;
|
|
1
|
+
{"version":3,"file":"schema-probe.d.ts","sourceRoot":"","sources":["../../src/_internal/schema-probe.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzC,UAAU,mBAAmB;IAC5B,KAAK,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,UAAU,cAAc;IACvB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;CAC3C;AAKD,4DAA4D;AAC5D,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACtC,EAAE,EAAE,cAAc,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,EAAE,EAAE,cAAc,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAiBtB;AA4BD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,CAQhD"}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
// body, observability gets one loud error per instance startup.
|
|
10
10
|
export const GL_MAILER_SCHEMA_MISSING = 'GL_MAILER_SCHEMA_MISSING';
|
|
11
11
|
let _cached = null;
|
|
12
|
+
let _sendsCached = null;
|
|
12
13
|
/** @internal Reset the module-scoped cache — tests only. */
|
|
13
14
|
export function _resetSchemaProbeCache() {
|
|
14
15
|
_cached = null;
|
|
16
|
+
_sendsCached = null;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Probe the configured D1 binding for `gl_subscribers` AND `gl_email_sends`.
|
|
@@ -43,6 +45,31 @@ export async function probeMailerSchema(db, d1Binding) {
|
|
|
43
45
|
return _cached;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Probe only `gl_email_sends`. Realm queue consumers keep subscriber tables in
|
|
50
|
+
* each site D1, so the realm D1 must be allowed to contain sends without
|
|
51
|
+
* subscribers.
|
|
52
|
+
*/
|
|
53
|
+
export async function probeMailerSendsSchema(db, d1Binding) {
|
|
54
|
+
if (_sendsCached)
|
|
55
|
+
return _sendsCached;
|
|
56
|
+
if (!db) {
|
|
57
|
+
logSendsSchemaMissing(d1Binding, 'D1 binding is not bound');
|
|
58
|
+
_sendsCached = { ok: false };
|
|
59
|
+
return _sendsCached;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await db.prepare('SELECT 1 FROM gl_email_sends LIMIT 1').first();
|
|
63
|
+
_sendsCached = { ok: true };
|
|
64
|
+
return _sendsCached;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
logSendsSchemaMissing(d1Binding, message);
|
|
69
|
+
_sendsCached = { ok: false };
|
|
70
|
+
return _sendsCached;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
46
73
|
function logSchemaMissing(d1Binding, underlying) {
|
|
47
74
|
console.error(`[${GL_MAILER_SCHEMA_MISSING}] @growth-labs/mailer: D1 binding "${d1Binding}" is ` +
|
|
48
75
|
'missing one or both of the gl_subscribers / gl_email_sends tables.\n' +
|
|
@@ -54,6 +81,15 @@ function logSchemaMissing(d1Binding, underlying) {
|
|
|
54
81
|
'Mailer routes return 503 until the schema is present. ' +
|
|
55
82
|
`Underlying error: ${underlying}`);
|
|
56
83
|
}
|
|
84
|
+
function logSendsSchemaMissing(d1Binding, underlying) {
|
|
85
|
+
console.error(`[${GL_MAILER_SCHEMA_MISSING}] @growth-labs/mailer: D1 binding "${d1Binding}" is ` +
|
|
86
|
+
'missing the gl_email_sends table.\n' +
|
|
87
|
+
'Remediation:\n' +
|
|
88
|
+
' 1. Add a sends-only migration for @growth-labs/mailer/schema/sends\n' +
|
|
89
|
+
` 2. Run: pnpm exec wrangler d1 migrations apply ${d1Binding} --remote\n` +
|
|
90
|
+
'Realm queue consumers ack messages until the schema is present. ' +
|
|
91
|
+
`Underlying error: ${underlying}`);
|
|
92
|
+
}
|
|
57
93
|
/**
|
|
58
94
|
* Helper: build the standard 503 response mailer routes return on schema
|
|
59
95
|
* miss. The body shape is stable so observability dashboards can match on
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-probe.js","sourceRoot":"","sources":["../../src/_internal/schema-probe.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,6DAA6D;AAC7D,EAAE;AACF,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E;AAC3E,gEAAgE;AAEhE,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAA;AAYlE,IAAI,OAAO,GAAuB,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"schema-probe.js","sourceRoot":"","sources":["../../src/_internal/schema-probe.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,7 @@ import type { MailerOptions } from './options.js';
|
|
|
3
3
|
export default function mailer(userOptions: MailerOptions): AstroIntegration;
|
|
4
4
|
export type { MailerOptions, ResolvedMailerOptions } from './options.js';
|
|
5
5
|
export { mailerOptionsSchema } from './options.js';
|
|
6
|
-
export {
|
|
7
|
-
export type { DigestItem, EmailProvider, EmailQueueMessage, EmailSend, EmailSendStatus, OutboundEmail, SendResult, Subscriber, SubscriberFilter, SubscriberStatus, TemplateData, TemplateName, } from './types.js';
|
|
6
|
+
export type { DigestItem, EmailProvider, EmailQueueMessage, EmailSend, EmailSendStatus, OutboundEmail, SendResult, SiteConfigLookup, SiteMailerConfig, Subscriber, SubscriberFilter, SubscriberStatus, TemplateData, TemplateName, } from './types.js';
|
|
8
7
|
export type { CampaignSchedule, DigestSchedule } from './utils/scheduling.js';
|
|
9
8
|
export { executeCampaignSchedule, executeDigestSchedule, prepareCampaign, prepareDigest, sendBatchCampaigns, } from './utils/scheduling.js';
|
|
10
9
|
export type { MailerEnv } from './utils/send.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAA;AAIxE,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,gBAAgB,CA0D3E;AAED,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAA;AAIxE,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,gBAAgB,CA0D3E;AAED,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EACX,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACZ,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,kBAAkB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -56,7 +56,6 @@ export default function mailer(userOptions) {
|
|
|
56
56
|
}
|
|
57
57
|
// Re-export options and types
|
|
58
58
|
export { mailerOptionsSchema } from './options.js';
|
|
59
|
-
export { handleEmailQueue } from './queue/consumer.js';
|
|
60
59
|
export { executeCampaignSchedule, executeDigestSchedule, prepareCampaign, prepareDigest, sendBatchCampaigns, } from './utils/scheduling.js';
|
|
61
60
|
// Re-export utilities for standalone use
|
|
62
61
|
export { sendCampaign, sendDigest, sendTransactional } from './utils/send.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAA0B;IACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAA0B,CAAA;IAE/E,OAAO;QACN,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE;YACN,oBAAoB,EAAE,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC3F,qCAAqC;gBACrC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAC1C,CAAA;gBACD,IAAI,YAAY,EAAE,CAAC;oBAClB,CAAC;oBAAC,OAAmC,CAAC,gBAAgB,GAAG,IAAI,CAAA;gBAC9D,CAAC;gBAED,yCAAyC;gBACzC,YAAY,CAAC;oBACZ,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE;iBACpD,CAAC,CAAA;gBAEF,gBAAgB;gBAChB,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,aAAa;oBAC9B,UAAU,EAAE,sCAAsC;iBAClD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,WAAW;oBAC5B,UAAU,EAAE,oCAAoC;iBAChD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,eAAe;oBAChC,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,eAAe;oBAChC,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,WAAW;oBAC5B,UAAU,EAAE,oCAAoC;iBAChD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,eAAe;oBAChD,UAAU,EAAE,uCAAuC;iBACnD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,eAAe;oBACjD,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBAEF,0BAA0B;gBAC1B,aAAa,CAAC;oBACb,UAAU,EAAE,yCAAyC;oBACrD,KAAK,EAAE,MAAM;iBACb,CAAC,CAAA;YACH,CAAC;SACD;KACD,CAAA;AACF,CAAC;AAGD,8BAA8B;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAA0B;IACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAA0B,CAAA;IAE/E,OAAO;QACN,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE;YACN,oBAAoB,EAAE,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC3F,qCAAqC;gBACrC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAC1C,CAAA;gBACD,IAAI,YAAY,EAAE,CAAC;oBAClB,CAAC;oBAAC,OAAmC,CAAC,gBAAgB,GAAG,IAAI,CAAA;gBAC9D,CAAC;gBAED,yCAAyC;gBACzC,YAAY,CAAC;oBACZ,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE;iBACpD,CAAC,CAAA;gBAEF,gBAAgB;gBAChB,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,aAAa;oBAC9B,UAAU,EAAE,sCAAsC;iBAClD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,WAAW;oBAC5B,UAAU,EAAE,oCAAoC;iBAChD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,eAAe;oBAChC,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,eAAe;oBAChC,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,WAAW;oBAC5B,UAAU,EAAE,oCAAoC;iBAChD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,eAAe;oBAChD,UAAU,EAAE,uCAAuC;iBACnD,CAAC,CAAA;gBACF,WAAW,CAAC;oBACX,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,eAAe;oBACjD,UAAU,EAAE,wCAAwC;iBACpD,CAAC,CAAA;gBAEF,0BAA0B;gBAC1B,aAAa,CAAC;oBACb,UAAU,EAAE,yCAAyC;oBACrD,KAAK,EAAE,MAAM;iBACb,CAAC,CAAA;YACH,CAAC;SACD;KACD,CAAA;AACF,CAAC;AAGD,8BAA8B;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAkBlD,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,kBAAkB,GAClB,MAAM,uBAAuB,CAAA;AAE9B,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/options.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import type { SiteConfigLookup } from './types.js';
|
|
2
3
|
export declare const mailerOptionsSchema: z.ZodObject<{
|
|
4
|
+
siteId: z.ZodString;
|
|
3
5
|
senderName: z.ZodString;
|
|
4
6
|
fromAddress: z.ZodString;
|
|
5
7
|
replyTo: z.ZodOptional<z.ZodString>;
|
|
6
8
|
d1Binding: z.ZodDefault<z.ZodString>;
|
|
7
9
|
queueBinding: z.ZodDefault<z.ZodString>;
|
|
10
|
+
senderBinding: z.ZodDefault<z.ZodString>;
|
|
11
|
+
siteConfigLookup: z.ZodOptional<z.ZodType<SiteConfigLookup, z.ZodTypeDef, SiteConfigLookup>>;
|
|
8
12
|
turnstileSiteKey: z.ZodString;
|
|
9
13
|
turnstileSecretKey: z.ZodString;
|
|
10
14
|
doubleOptIn: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -73,9 +77,18 @@ export declare const mailerOptionsSchema: z.ZodObject<{
|
|
|
73
77
|
analyticsBinding: z.ZodDefault<z.ZodString>;
|
|
74
78
|
}, "strip", z.ZodTypeAny, {
|
|
75
79
|
senderName: string;
|
|
80
|
+
siteUrl: string;
|
|
81
|
+
brand: {
|
|
82
|
+
primaryColor: string;
|
|
83
|
+
accentColor: string;
|
|
84
|
+
logoUrl?: string | undefined;
|
|
85
|
+
footerText?: string | undefined;
|
|
86
|
+
};
|
|
87
|
+
siteId: string;
|
|
76
88
|
fromAddress: string;
|
|
77
89
|
d1Binding: string;
|
|
78
90
|
queueBinding: string;
|
|
91
|
+
senderBinding: string;
|
|
79
92
|
turnstileSiteKey: string;
|
|
80
93
|
turnstileSecretKey: string;
|
|
81
94
|
doubleOptIn: boolean;
|
|
@@ -99,28 +112,31 @@ export declare const mailerOptionsSchema: z.ZodObject<{
|
|
|
99
112
|
};
|
|
100
113
|
trackOpenPath: string;
|
|
101
114
|
trackClickPath: string;
|
|
102
|
-
siteUrl: string;
|
|
103
|
-
brand: {
|
|
104
|
-
primaryColor: string;
|
|
105
|
-
accentColor: string;
|
|
106
|
-
logoUrl?: string | undefined;
|
|
107
|
-
footerText?: string | undefined;
|
|
108
|
-
};
|
|
109
115
|
batchSize: number;
|
|
110
116
|
analyticsEnabled: boolean;
|
|
111
117
|
analyticsBinding: string;
|
|
112
118
|
replyTo?: string | undefined;
|
|
119
|
+
siteConfigLookup?: SiteConfigLookup | undefined;
|
|
113
120
|
topics?: string[] | undefined;
|
|
114
121
|
}, {
|
|
115
122
|
senderName: string;
|
|
123
|
+
siteUrl: string;
|
|
124
|
+
siteId: string;
|
|
116
125
|
fromAddress: string;
|
|
117
126
|
turnstileSiteKey: string;
|
|
118
127
|
turnstileSecretKey: string;
|
|
119
128
|
signingSecret: string;
|
|
120
|
-
|
|
129
|
+
brand?: {
|
|
130
|
+
logoUrl?: string | undefined;
|
|
131
|
+
primaryColor?: string | undefined;
|
|
132
|
+
accentColor?: string | undefined;
|
|
133
|
+
footerText?: string | undefined;
|
|
134
|
+
} | undefined;
|
|
121
135
|
replyTo?: string | undefined;
|
|
122
136
|
d1Binding?: string | undefined;
|
|
123
137
|
queueBinding?: string | undefined;
|
|
138
|
+
senderBinding?: string | undefined;
|
|
139
|
+
siteConfigLookup?: SiteConfigLookup | undefined;
|
|
124
140
|
doubleOptIn?: boolean | undefined;
|
|
125
141
|
topics?: string[] | undefined;
|
|
126
142
|
subscribePath?: string | undefined;
|
|
@@ -142,12 +158,6 @@ export declare const mailerOptionsSchema: z.ZodObject<{
|
|
|
142
158
|
} | undefined;
|
|
143
159
|
trackOpenPath?: string | undefined;
|
|
144
160
|
trackClickPath?: string | undefined;
|
|
145
|
-
brand?: {
|
|
146
|
-
logoUrl?: string | undefined;
|
|
147
|
-
primaryColor?: string | undefined;
|
|
148
|
-
accentColor?: string | undefined;
|
|
149
|
-
footerText?: string | undefined;
|
|
150
|
-
} | undefined;
|
|
151
161
|
batchSize?: number | undefined;
|
|
152
162
|
analyticsEnabled?: boolean | undefined;
|
|
153
163
|
analyticsBinding?: string | undefined;
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8E9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
|
package/dist/options.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export const mailerOptionsSchema = z.object({
|
|
3
3
|
// ─── Required ───
|
|
4
|
+
siteId: z.string().min(1),
|
|
4
5
|
senderName: z.string(),
|
|
5
6
|
fromAddress: z.string().email(),
|
|
6
7
|
// ─── Reply-to ───
|
|
@@ -8,6 +9,9 @@ export const mailerOptionsSchema = z.object({
|
|
|
8
9
|
// ─── Cloudflare bindings ───
|
|
9
10
|
d1Binding: z.string().default('SITE_DB'),
|
|
10
11
|
queueBinding: z.string().default('EMAIL_QUEUE'),
|
|
12
|
+
senderBinding: z.string().default('EMAIL_SENDER'),
|
|
13
|
+
// ─── Realm-level multi-tenant lookup (optional) ───
|
|
14
|
+
siteConfigLookup: z.custom().optional(),
|
|
11
15
|
// ─── Turnstile (subscribe form) ───
|
|
12
16
|
turnstileSiteKey: z.string(),
|
|
13
17
|
turnstileSecretKey: z.string(),
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
package/dist/queue/consumer.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
1
|
+
import type { EmailQueueMessage, SiteConfigLookup } from '../types.js';
|
|
2
|
+
export type { SiteConfigLookup, SiteMailerConfig } from '../types.js';
|
|
3
|
+
export interface MailerConsumerOptions {
|
|
4
|
+
d1Binding: string;
|
|
5
|
+
senderBinding: string;
|
|
6
|
+
analyticsBinding?: string;
|
|
7
|
+
siteConfigLookup: SiteConfigLookup;
|
|
8
|
+
}
|
|
9
|
+
export declare function handleEmailQueue(batch: MessageBatch<EmailQueueMessage>, env: Record<string, unknown>, options: MailerConsumerOptions): Promise<void>;
|
|
9
10
|
//# sourceMappingURL=consumer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/queue/consumer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/queue/consumer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AAMxF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAErE,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,gBAAgB,CAAA;CAClC;AAuBD,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,YAAY,CAAC,iBAAiB,CAAC,EACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA8Jf"}
|
package/dist/queue/consumer.js
CHANGED
|
@@ -1,33 +1,72 @@
|
|
|
1
1
|
import { drizzle } from 'drizzle-orm/d1';
|
|
2
|
-
import {
|
|
2
|
+
import { probeMailerSendsSchema } from '../_internal/schema-probe.js';
|
|
3
3
|
import { emitMailerAnalyticsEvent } from '../utils/analytics.js';
|
|
4
4
|
import { updateSendStatus } from '../utils/bounce.js';
|
|
5
5
|
import { CloudflareEmailProvider, sleep } from '../utils/providers.js';
|
|
6
|
+
function applySiteConfig(config) {
|
|
7
|
+
return {
|
|
8
|
+
siteUrl: config.siteUrl,
|
|
9
|
+
unsubscribePath: config.unsubscribePath ?? '/api/newsletter/unsubscribe',
|
|
10
|
+
preferencesPath: config.preferencesPath ?? '/email/preferences',
|
|
11
|
+
senderName: config.senderName,
|
|
12
|
+
fromAddress: config.fromAddress,
|
|
13
|
+
replyTo: config.replyTo,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
6
16
|
export async function handleEmailQueue(batch, env, options) {
|
|
17
|
+
const d1 = env[options.d1Binding];
|
|
18
|
+
if (!d1) {
|
|
19
|
+
throw new Error(`[mailer] env.${options.d1Binding} is undefined; ` +
|
|
20
|
+
'pass d1Binding option to the mailer integration or bind that name in wrangler.toml.');
|
|
21
|
+
}
|
|
22
|
+
const sender = env[options.senderBinding];
|
|
23
|
+
if (!sender) {
|
|
24
|
+
throw new Error(`[mailer] env.${options.senderBinding} is undefined; ` +
|
|
25
|
+
'pass senderBinding option to the mailer integration or bind a [[send_email]] entry of that name.');
|
|
26
|
+
}
|
|
7
27
|
// Schema probe — runs once per Worker instance. On miss the probe logs
|
|
8
28
|
// GL_MAILER_SCHEMA_MISSING and we ack every message in the batch without
|
|
9
29
|
// retry. Re-queueing without the schema would cycle indefinitely and burn
|
|
10
30
|
// Cloudflare Queue retry budget.
|
|
11
|
-
const schemaProbe = await
|
|
31
|
+
const schemaProbe = await probeMailerSendsSchema(d1, options.d1Binding);
|
|
12
32
|
if (!schemaProbe.ok) {
|
|
33
|
+
console.error('[mailer] gl_email_sends not found in env.' +
|
|
34
|
+
options.d1Binding +
|
|
35
|
+
' — apply mailer migrations before processing queue. ' +
|
|
36
|
+
'Acking ' +
|
|
37
|
+
batch.messages.length +
|
|
38
|
+
' message(s) to avoid retry storm.');
|
|
13
39
|
for (const message of batch.messages) {
|
|
14
40
|
message.ack();
|
|
15
41
|
}
|
|
16
42
|
return;
|
|
17
43
|
}
|
|
18
|
-
const db = drizzle(
|
|
19
|
-
const provider =
|
|
20
|
-
? new CloudflareEmailProvider(env.EMAIL_SENDER)
|
|
21
|
-
: new CloudflareEmailProvider({
|
|
22
|
-
send: () => Promise.reject(new Error('No email sender configured')),
|
|
23
|
-
});
|
|
44
|
+
const db = drizzle(d1);
|
|
45
|
+
const provider = new CloudflareEmailProvider(sender);
|
|
24
46
|
for (const message of batch.messages) {
|
|
47
|
+
const siteConfig = await options.siteConfigLookup(message.body.siteId, env);
|
|
48
|
+
if (!siteConfig) {
|
|
49
|
+
console.error(`[mailer] No SiteMailerConfig for siteId=${message.body.siteId}; acking without send.`);
|
|
50
|
+
message.ack();
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const effective = applySiteConfig(siteConfig);
|
|
25
54
|
const { recipients, htmlTemplate, subject, from, replyTo, headers, type } = message.body;
|
|
55
|
+
if (type !== 'transactional' && !effective.siteUrl) {
|
|
56
|
+
console.error(`[mailer] SiteMailerConfig for siteId=${message.body.siteId} is missing siteUrl; acking without send.`);
|
|
57
|
+
message.ack();
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const effectiveFrom = effective.fromAddress
|
|
61
|
+
? formatFromHeader(effective.senderName ?? effective.fromAddress, effective.fromAddress)
|
|
62
|
+
: from;
|
|
63
|
+
const effectiveReplyTo = effective.replyTo ?? replyTo;
|
|
26
64
|
for (const recipient of recipients) {
|
|
27
65
|
let html = htmlTemplate;
|
|
28
66
|
if (type !== 'transactional') {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
67
|
+
const siteUrl = effective.siteUrl ?? '';
|
|
68
|
+
const unsubscribeUrl = `${siteUrl}${effective.unsubscribePath}?token=${recipient.unsubscribeToken}`;
|
|
69
|
+
const preferencesUrl = `${siteUrl}${effective.preferencesPath}?token=${recipient.preferencesToken}`;
|
|
31
70
|
html = html
|
|
32
71
|
.replaceAll('{{TRACKING_ID}}', recipient.trackingId)
|
|
33
72
|
.replaceAll('{{UNSUBSCRIBE_URL}}', unsubscribeUrl)
|
|
@@ -36,14 +75,14 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
36
75
|
const recipientHeaders = type !== 'transactional'
|
|
37
76
|
? {
|
|
38
77
|
...headers,
|
|
39
|
-
'List-Unsubscribe': `<${
|
|
78
|
+
'List-Unsubscribe': `<${effective.siteUrl ?? ''}${effective.unsubscribePath}?token=${recipient.unsubscribeToken}>`,
|
|
40
79
|
'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click',
|
|
41
80
|
}
|
|
42
81
|
: headers;
|
|
43
82
|
let result = await provider.send({
|
|
44
83
|
to: recipient.email,
|
|
45
|
-
from,
|
|
46
|
-
replyTo,
|
|
84
|
+
from: effectiveFrom,
|
|
85
|
+
replyTo: effectiveReplyTo,
|
|
47
86
|
subject,
|
|
48
87
|
html,
|
|
49
88
|
headers: recipientHeaders,
|
|
@@ -53,8 +92,8 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
53
92
|
await sleep(2 ** attempt * 1000);
|
|
54
93
|
result = await provider.send({
|
|
55
94
|
to: recipient.email,
|
|
56
|
-
from,
|
|
57
|
-
replyTo,
|
|
95
|
+
from: effectiveFrom,
|
|
96
|
+
replyTo: effectiveReplyTo,
|
|
58
97
|
subject,
|
|
59
98
|
html,
|
|
60
99
|
headers: recipientHeaders,
|
|
@@ -67,7 +106,7 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
67
106
|
await updateSendStatus(db, recipient.trackingId, 'sent', {
|
|
68
107
|
sentAt: new Date().toISOString(),
|
|
69
108
|
});
|
|
70
|
-
emitMailerAnalyticsEvent(options, env, 'newsletter_sent', {
|
|
109
|
+
emitMailerAnalyticsEvent(analyticsOptions(options, effective, message.body.siteId), env, 'newsletter_sent', {
|
|
71
110
|
contentSlug: recipient.trackingId,
|
|
72
111
|
label: {
|
|
73
112
|
trackingId: recipient.trackingId,
|
|
@@ -75,6 +114,7 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
75
114
|
email: recipient.email,
|
|
76
115
|
campaignId: message.body.campaignId,
|
|
77
116
|
type,
|
|
117
|
+
siteId: message.body.siteId,
|
|
78
118
|
},
|
|
79
119
|
});
|
|
80
120
|
}
|
|
@@ -83,7 +123,7 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
83
123
|
bouncedAt: new Date().toISOString(),
|
|
84
124
|
bounceType: 'hard',
|
|
85
125
|
});
|
|
86
|
-
emitMailerAnalyticsEvent(options, env, 'newsletter_send_failed', {
|
|
126
|
+
emitMailerAnalyticsEvent(analyticsOptions(options, effective, message.body.siteId), env, 'newsletter_send_failed', {
|
|
87
127
|
contentSlug: recipient.trackingId,
|
|
88
128
|
label: {
|
|
89
129
|
trackingId: recipient.trackingId,
|
|
@@ -91,6 +131,7 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
91
131
|
email: recipient.email,
|
|
92
132
|
campaignId: message.body.campaignId,
|
|
93
133
|
type,
|
|
134
|
+
siteId: message.body.siteId,
|
|
94
135
|
error: result.error,
|
|
95
136
|
},
|
|
96
137
|
});
|
|
@@ -100,4 +141,14 @@ export async function handleEmailQueue(batch, env, options) {
|
|
|
100
141
|
message.ack();
|
|
101
142
|
}
|
|
102
143
|
}
|
|
144
|
+
function formatFromHeader(senderName, fromAddress) {
|
|
145
|
+
return `${senderName} <${fromAddress}>`;
|
|
146
|
+
}
|
|
147
|
+
function analyticsOptions(options, effective, siteId) {
|
|
148
|
+
return {
|
|
149
|
+
siteUrl: effective.siteUrl ?? `https://${siteId}`,
|
|
150
|
+
analyticsEnabled: Boolean(options.analyticsBinding),
|
|
151
|
+
analyticsBinding: options.analyticsBinding ?? 'ANALYTICS',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
103
154
|
//# sourceMappingURL=consumer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/queue/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/queue/consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { config } from 'virtual:growth-labs/mailer/config';
|
|
|
3
3
|
import { and, eq, inArray } from 'drizzle-orm';
|
|
4
4
|
import { drizzle } from 'drizzle-orm/d1';
|
|
5
5
|
import { probeMailerSchema } from '../_internal/schema-probe.js';
|
|
6
|
-
import { emailSends } from '../schema.js';
|
|
6
|
+
import { emailSends } from '../schema/sends.js';
|
|
7
7
|
import { emitMailerAnalyticsEvent } from '../utils/analytics.js';
|
|
8
8
|
export const GET = async (context) => {
|
|
9
9
|
const { params, request, url } = context;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../src/routes/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAE1D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../src/routes/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAE1D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;IACpC,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAE/C,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,qEAAqE;IACrE,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACzD,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,wEAAwE;IACxE,kCAAkC;IAClC,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,aAAwC,CAAA;QAC5D,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAe,CAAA;YACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;gBACtB,MAAM,EAAE;qBACN,MAAM,CAAC,UAAU,CAAC;qBAClB,GAAG,CAAC;oBACJ,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACnC,CAAC;qBACD,KAAK,CACL,GAAG,CACF,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,EACrC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAC3D,CACD,CAAA;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;IACxC,CAAC;IAED,wBAAwB,CAAC,MAAM,EAAE,aAAwC,EAAE,oBAAoB,EAAE;QAChG,OAAO;QACP,OAAO;QACP,WAAW,EAAE,UAAU;QACvB,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE;KAClC,CAAC,CAAA;IAEF,uCAAuC;IACvC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACzB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE;KAClC,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { config } from 'virtual:growth-labs/mailer/config';
|
|
|
3
3
|
import { and, eq, inArray } from 'drizzle-orm';
|
|
4
4
|
import { drizzle } from 'drizzle-orm/d1';
|
|
5
5
|
import { probeMailerSchema } from '../_internal/schema-probe.js';
|
|
6
|
-
import { emailSends } from '../schema.js';
|
|
6
|
+
import { emailSends } from '../schema/sends.js';
|
|
7
7
|
import { emitMailerAnalyticsEvent } from '../utils/analytics.js';
|
|
8
8
|
import { TRANSPARENT_GIF } from '../utils/tracking.js';
|
|
9
9
|
export const GET = async (context) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-open.js","sourceRoot":"","sources":["../../src/routes/track-open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAE1D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"track-open.js","sourceRoot":"","sources":["../../src/routes/track-open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAE1D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,GAAG,GAAa,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,sEAAsE;IACtE,gEAAgE;IAChE,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,aAAwC,CAAA;QAC5D,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAe,CAAA;YACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;gBACtB,MAAM,EAAE;qBACN,MAAM,CAAC,UAAU,CAAC;qBAClB,GAAG,CAAC;oBACJ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAClC,CAAC;qBACD,KAAK,CACL,GAAG,CACF,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,EACrC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CACjD,CACD,CAAA;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,6CAA6C;IAC9C,CAAC;IAED,wBAAwB,CAAC,MAAM,EAAE,aAAwC,EAAE,mBAAmB,EAAE;QAC/F,OAAO;QACP,OAAO;QACP,WAAW,EAAE,UAAU;QACvB,KAAK,EAAE,EAAE,UAAU,EAAE;KACrB,CAAC,CAAA;IAEF,sBAAsB;IACtB,OAAO,IAAI,QAAQ,CAAC,eAAe,EAAE;QACpC,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACR,cAAc,EAAE,WAAW;YAC3B,eAAe,EAAE,qCAAqC;YACtD,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;SAChD;KACD,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|