@growth-labs/mailer 0.5.1 → 0.6.3

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 CHANGED
@@ -14,6 +14,10 @@ Use `@growth-labs/mailer` (this package) for newsletter and campaign
14
14
  workflows. Use `@growth-labs/email` for transactional one-off sends.
15
15
  See the `@growth-labs/email` README for the full distinction.
16
16
 
17
+ Both integrations register the package's existing virtual config types through
18
+ Astro's `astro:config:done` type injection. No consumer-owned declaration is
19
+ needed for `virtual:growth-labs/mailer/config`; runtime route selection is unchanged.
20
+
17
21
  ## Config
18
22
 
19
23
  ```typescript
@@ -46,6 +50,34 @@ mailer({
46
50
  })
47
51
  ```
48
52
 
53
+ This integration registers the newsletter routes and components listed below.
54
+ For a new subscriber, the subscribe route records the subscriber and sends a
55
+ confirmation email when `doubleOptIn` is enabled, or a welcome email when it is not.
56
+
57
+ ### Components without delivery routes
58
+
59
+ Use `mailerComponents` instead of `mailer` when rendering `SubscribeForm` with
60
+ an endpoint owned by the consumer, or in a private preview with delivery disabled:
61
+
62
+ ```typescript
63
+ import { mailerComponents } from '@growth-labs/mailer'
64
+
65
+ mailerComponents({
66
+ turnstileSiteKey: 'public-site-key',
67
+ subscribePath: '/api/newsletter/subscribe', // Optional; this is the default
68
+ topics: ['daily-digest'], // Optional
69
+ })
70
+ ```
71
+
72
+ This installs only the existing form configuration Vite plugin. It injects no
73
+ routes or tracking middleware and requires no D1, Queue, sender or secret binding.
74
+ Only these three public options are accepted; secret and delivery options fail
75
+ validation. The form still submits to `subscribePath`: this integration does not
76
+ implement subscription delivery or disable the form. The consumer must provide a
77
+ Turnstile-protected endpoint, or keep delivery unavailable in its private preview.
78
+ Choose one mailer integration per site. The default `mailer` integration retains
79
+ its full route, middleware and runtime security behavior.
80
+
49
81
  ## Production patterns
50
82
 
51
83
  **`from` vs `replyTo`.** A common pattern is `fromAddress: 'noreply@mail.site.com'` paired with `replyTo: 'hello@site.com'`. The `from` lives on a domain you've verified with Cloudflare Email Sending (typically a `mail.` subdomain); `replyTo` points at a real human inbox readers can write back to. `replyTo` is also a per-message override on `sendTransactional` and a per-site field on `SiteMailerConfig` (realm pattern, since 0.4.0).
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import type { AstroIntegration } from 'astro';
2
- import type { MailerOptions } from './options.js';
2
+ import type { MailerComponentsOptions, MailerOptions } from './options.js';
3
3
  export default function mailer(userOptions: MailerOptions): AstroIntegration;
4
- export type { MailerOptions, ResolvedMailerOptions } from './options.js';
5
- export { mailerOptionsSchema } from './options.js';
4
+ /** Render package components without installing delivery routes or tracking. */
5
+ export declare function mailerComponents(userOptions: MailerComponentsOptions): AstroIntegration;
6
+ export type { MailerComponentsOptions, MailerOptions, ResolvedMailerComponentsOptions, ResolvedMailerOptions, } from './options.js';
7
+ export { mailerComponentsOptionsSchema, mailerOptionsSchema } from './options.js';
6
8
  export type { DigestItem, EmailProvider, EmailQueueMessage, EmailSend, EmailSendStatus, OutboundEmail, SendResult, SiteConfigLookup, SiteMailerConfig, Subscriber, SubscriberFilter, SubscriberStatus, TemplateData, TemplateName, } from './types.js';
7
9
  export type { BroadcastRecipient, SendBroadcastParams, SendBroadcastResult, } from './utils/broadcast.js';
8
10
  export { sendBroadcast } from './utils/broadcast.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAA;AAmBxE,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,gBAAgB,CAiE3E;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,EACX,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAA;AA4BjG,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,gBAAgB,CAkE3E;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,uBAAuB,GAAG,gBAAgB,CAWvF;AAED,YAAY,EACX,uBAAuB,EACvB,aAAa,EACb,+BAA+B,EAC/B,qBAAqB,GACrB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACjF,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,EACX,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,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
@@ -1,22 +1,29 @@
1
1
  import { fileURLToPath } from 'node:url';
2
- import { mailerOptionsSchema } from './options.js';
2
+ import { mailerComponentsOptionsSchema, mailerOptionsSchema } from './options.js';
3
3
  import { growthLabsMailerPlugin } from './vite-plugin.js';
4
4
  function isSourceEntrypoint() {
5
5
  return typeof import.meta.url === 'string' && import.meta.url.endsWith('.ts');
6
6
  }
7
7
  const ENTRYPOINT_EXTENSION = isSourceEntrypoint() ? '.ts' : '.js';
8
8
  function resolveEntrypoint(path) {
9
- if (path.endsWith('.astro')) {
9
+ if (path.endsWith('.astro') || path.endsWith('.d.ts')) {
10
10
  const sourcePath = isSourceEntrypoint() ? path : `../src/${path.replace(/^\.\//, '')}`;
11
11
  return fileURLToPath(new URL(sourcePath, import.meta.url));
12
12
  }
13
13
  return fileURLToPath(new URL(`${path}${ENTRYPOINT_EXTENSION}`, import.meta.url));
14
14
  }
15
+ const injectMailerTypes = ({ injectTypes, }) => {
16
+ injectTypes({
17
+ filename: 'config.d.ts',
18
+ content: `/// <reference path="${resolveEntrypoint('./virtual.d.ts')}" />`,
19
+ });
20
+ };
15
21
  export default function mailer(userOptions) {
16
22
  const options = mailerOptionsSchema.parse(userOptions);
17
23
  return {
18
24
  name: '@growth-labs/mailer',
19
25
  hooks: {
26
+ 'astro:config:done': injectMailerTypes,
20
27
  'astro:config:setup': ({ injectRoute, addMiddleware, updateConfig, config: astroConfig }) => {
21
28
  // Auto-detect @growth-labs/analytics
22
29
  const hasAnalytics = astroConfig.integrations.some((i) => i.name === '@growth-labs/analytics');
@@ -73,8 +80,21 @@ export default function mailer(userOptions) {
73
80
  },
74
81
  };
75
82
  }
83
+ /** Render package components without installing delivery routes or tracking. */
84
+ export function mailerComponents(userOptions) {
85
+ const options = mailerComponentsOptionsSchema.parse(userOptions);
86
+ return {
87
+ name: '@growth-labs/mailer/components',
88
+ hooks: {
89
+ 'astro:config:done': injectMailerTypes,
90
+ 'astro:config:setup': ({ updateConfig }) => {
91
+ updateConfig({ vite: { plugins: [growthLabsMailerPlugin(options)] } });
92
+ },
93
+ },
94
+ };
95
+ }
76
96
  // Re-export options and types
77
- export { mailerOptionsSchema } from './options.js';
97
+ export { mailerComponentsOptionsSchema, mailerOptionsSchema } from './options.js';
78
98
  export { sendBroadcast } from './utils/broadcast.js';
79
99
  export { executeCampaignSchedule, executeDigestSchedule, prepareCampaign, prepareDigest, sendBatchCampaigns, } from './utils/scheduling.js';
80
100
  // Re-export utilities for standalone use
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/options.d.ts CHANGED
@@ -173,4 +173,93 @@ export declare const mailerOptionsSchema: z.ZodObject<{
173
173
  }>;
174
174
  export type MailerOptions = z.input<typeof mailerOptionsSchema>;
175
175
  export type ResolvedMailerOptions = z.output<typeof mailerOptionsSchema>;
176
+ export declare const mailerComponentsOptionsSchema: z.ZodObject<Pick<{
177
+ siteId: z.ZodString;
178
+ senderName: z.ZodString;
179
+ fromAddress: z.ZodString;
180
+ replyTo: z.ZodOptional<z.ZodString>;
181
+ d1Binding: z.ZodDefault<z.ZodString>;
182
+ sendsD1Binding: z.ZodOptional<z.ZodString>;
183
+ queueBinding: z.ZodDefault<z.ZodString>;
184
+ senderBinding: z.ZodDefault<z.ZodString>;
185
+ siteConfigLookup: z.ZodOptional<z.ZodType<SiteConfigLookup, z.ZodTypeDef, SiteConfigLookup>>;
186
+ turnstileSiteKey: z.ZodString;
187
+ turnstileSecretBinding: z.ZodDefault<z.ZodString>;
188
+ turnstileSecretKey: z.ZodOptional<z.ZodString>;
189
+ doubleOptIn: z.ZodDefault<z.ZodBoolean>;
190
+ topics: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
191
+ signingSecretBinding: z.ZodDefault<z.ZodString>;
192
+ signingSecret: z.ZodOptional<z.ZodString>;
193
+ subscribePath: z.ZodDefault<z.ZodString>;
194
+ confirmPath: z.ZodDefault<z.ZodString>;
195
+ unsubscribePath: z.ZodDefault<z.ZodString>;
196
+ preferencesPath: z.ZodDefault<z.ZodString>;
197
+ webhookPath: z.ZodDefault<z.ZodString>;
198
+ webhookSignature: z.ZodDefault<z.ZodDiscriminatedUnion<"enabled", [z.ZodObject<{
199
+ enabled: z.ZodLiteral<false>;
200
+ header: z.ZodDefault<z.ZodString>;
201
+ timestampHeader: z.ZodDefault<z.ZodString>;
202
+ toleranceSeconds: z.ZodDefault<z.ZodNumber>;
203
+ }, "strip", z.ZodTypeAny, {
204
+ enabled: false;
205
+ header: string;
206
+ timestampHeader: string;
207
+ toleranceSeconds: number;
208
+ }, {
209
+ enabled: false;
210
+ header?: string | undefined;
211
+ timestampHeader?: string | undefined;
212
+ toleranceSeconds?: number | undefined;
213
+ }>, z.ZodObject<{
214
+ enabled: z.ZodLiteral<true>;
215
+ secret: z.ZodString;
216
+ header: z.ZodDefault<z.ZodString>;
217
+ timestampHeader: z.ZodDefault<z.ZodString>;
218
+ toleranceSeconds: z.ZodDefault<z.ZodNumber>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ enabled: true;
221
+ header: string;
222
+ timestampHeader: string;
223
+ toleranceSeconds: number;
224
+ secret: string;
225
+ }, {
226
+ enabled: true;
227
+ secret: string;
228
+ header?: string | undefined;
229
+ timestampHeader?: string | undefined;
230
+ toleranceSeconds?: number | undefined;
231
+ }>]>>;
232
+ trackOpenPath: z.ZodDefault<z.ZodString>;
233
+ trackClickPath: z.ZodDefault<z.ZodString>;
234
+ siteUrl: z.ZodString;
235
+ brand: z.ZodDefault<z.ZodObject<{
236
+ logoUrl: z.ZodOptional<z.ZodString>;
237
+ primaryColor: z.ZodDefault<z.ZodString>;
238
+ accentColor: z.ZodDefault<z.ZodString>;
239
+ footerText: z.ZodOptional<z.ZodString>;
240
+ }, "strip", z.ZodTypeAny, {
241
+ primaryColor: string;
242
+ accentColor: string;
243
+ logoUrl?: string | undefined;
244
+ footerText?: string | undefined;
245
+ }, {
246
+ logoUrl?: string | undefined;
247
+ primaryColor?: string | undefined;
248
+ accentColor?: string | undefined;
249
+ footerText?: string | undefined;
250
+ }>>;
251
+ batchSize: z.ZodDefault<z.ZodNumber>;
252
+ analyticsEnabled: z.ZodDefault<z.ZodBoolean>;
253
+ analyticsBinding: z.ZodDefault<z.ZodString>;
254
+ }, "turnstileSiteKey" | "topics" | "subscribePath">, "strict", z.ZodTypeAny, {
255
+ turnstileSiteKey: string;
256
+ subscribePath: string;
257
+ topics?: string[] | undefined;
258
+ }, {
259
+ turnstileSiteKey: string;
260
+ topics?: string[] | undefined;
261
+ subscribePath?: string | undefined;
262
+ }>;
263
+ export type MailerComponentsOptions = z.input<typeof mailerComponentsOptionsSchema>;
264
+ export type ResolvedMailerComponentsOptions = z.output<typeof mailerComponentsOptionsSchema>;
176
265
  //# sourceMappingURL=options.d.ts.map
@@ -1 +1 @@
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqF9B,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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqF9B,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;AAIxE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEhC,CAAA;AAEV,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAA;AACnF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAA"}
package/dist/options.js CHANGED
@@ -74,4 +74,9 @@ export const mailerOptionsSchema = z.object({
74
74
  analyticsEnabled: z.boolean().default(false),
75
75
  analyticsBinding: z.string().default('ANALYTICS'),
76
76
  });
77
+ // Only the public configuration read by SubscribeForm. No delivery credentials
78
+ // or Worker bindings are needed when a consumer supplies its own endpoint.
79
+ export const mailerComponentsOptionsSchema = mailerOptionsSchema
80
+ .pick({ turnstileSiteKey: true, topics: true, subscribePath: true })
81
+ .strict();
77
82
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,mBAAmB;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IAE/B,mBAAmB;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;IAEtC,8BAA8B;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACxC,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IAC/C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;IAEjD,qDAAqD;IACrD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAoB,CAAC,QAAQ,EAAE;IAEzD,qCAAqC;IACrC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACzE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEzC,+BAA+B;IAC/B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEtC,wBAAwB;IACxB,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACxE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEpC,iBAAiB;IACjB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC;IAC1D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC;IAClE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACrD,gBAAgB,EAAE,CAAC;SACjB,kBAAkB,CAAC,SAAS,EAAE;QAC9B,CAAC,CAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;YACnD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;YAC5D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;SAChD,CAAC;QACF,CAAC,CAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;YACnD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;YAC5D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;SAChD,CAAC;KACF,CAAC;SACD,OAAO,CAAC;QACR,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,uBAAuB;QAC/B,eAAe,EAAE,uBAAuB;QACxC,gBAAgB,EAAE,GAAG;KACrB,CAAC;IAEH,mBAAmB;IACnB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC;IACpD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAEzB,4CAA4C;IAC5C,KAAK,EAAE,CAAC;SACN,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACjC,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IAEb,yBAAyB;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAElD,mCAAmC;IACnC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;CACjD,CAAC,CAAA"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { Plugin } from 'vite';
2
- import type { ResolvedMailerOptions } from './options.js';
3
- export declare function renderMailerConfigModule(config: ResolvedMailerOptions, command: 'build' | 'serve'): string;
4
- export declare function growthLabsMailerPlugin(config: ResolvedMailerOptions): Plugin;
2
+ import type { ResolvedMailerComponentsOptions, ResolvedMailerOptions } from './options.js';
3
+ type MailerConfig = ResolvedMailerOptions | ResolvedMailerComponentsOptions;
4
+ export declare function renderMailerConfigModule(config: MailerConfig, command: 'build' | 'serve'): string;
5
+ export declare function growthLabsMailerPlugin(config: MailerConfig): Plugin;
6
+ export {};
5
7
  //# sourceMappingURL=vite-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAKzD,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,OAAO,GAAG,OAAO,GACxB,MAAM,CAOR;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAmB5E"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAE1F,KAAK,YAAY,GAAG,qBAAqB,GAAG,+BAA+B,CAAA;AAK3E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAOjG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAmBnE"}
@@ -3,8 +3,10 @@ const RESOLVED_VIRTUAL_MODULE_ID = `\0${VIRTUAL_MODULE_ID}`;
3
3
  export function renderMailerConfigModule(config, command) {
4
4
  const serializableConfig = { ...config };
5
5
  if (command !== 'serve') {
6
- delete serializableConfig.turnstileSecretKey;
7
- delete serializableConfig.signingSecret;
6
+ if ('turnstileSecretKey' in serializableConfig)
7
+ delete serializableConfig.turnstileSecretKey;
8
+ if ('signingSecret' in serializableConfig)
9
+ delete serializableConfig.signingSecret;
8
10
  }
9
11
  return `export const config = ${JSON.stringify(serializableConfig)};`;
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB,GAAG,mCAAmC,CAAA;AAC7D,MAAM,0BAA0B,GAAG,KAAK,iBAAiB,EAAE,CAAA;AAE3D,MAAM,UAAU,wBAAwB,CACvC,MAA6B,EAC7B,OAA0B;IAE1B,MAAM,kBAAkB,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACxC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,kBAAkB,CAAC,kBAAkB,CAAA;QAC5C,OAAO,kBAAkB,CAAC,aAAa,CAAA;IACxC,CAAC;IACD,OAAO,yBAAyB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA6B;IACnE,IAAI,OAAO,GAAsB,OAAO,CAAA;IAExC,OAAO;QACN,IAAI,EAAE,2BAA2B;QACjC,cAAc,CAAC,cAAc;YAC5B,OAAO,GAAG,cAAc,CAAC,OAAO,CAAA;QACjC,CAAC;QACD,SAAS,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,0BAA0B,CAAA;YAClC,CAAC;QACF,CAAC;QACD,IAAI,CAAC,EAAE;YACN,IAAI,EAAE,KAAK,0BAA0B,EAAE,CAAC;gBACvC,OAAO,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjD,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAKA,MAAM,iBAAiB,GAAG,mCAAmC,CAAA;AAC7D,MAAM,0BAA0B,GAAG,KAAK,iBAAiB,EAAE,CAAA;AAE3D,MAAM,UAAU,wBAAwB,CAAC,MAAoB,EAAE,OAA0B;IACxF,MAAM,kBAAkB,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACxC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,oBAAoB,IAAI,kBAAkB;YAAE,OAAO,kBAAkB,CAAC,kBAAkB,CAAA;QAC5F,IAAI,eAAe,IAAI,kBAAkB;YAAE,OAAO,kBAAkB,CAAC,aAAa,CAAA;IACnF,CAAC;IACD,OAAO,yBAAyB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IAC1D,IAAI,OAAO,GAAsB,OAAO,CAAA;IAExC,OAAO;QACN,IAAI,EAAE,2BAA2B;QACjC,cAAc,CAAC,cAAc;YAC5B,OAAO,GAAG,cAAc,CAAC,OAAO,CAAA;QACjC,CAAC;QACD,SAAS,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,0BAA0B,CAAA;YAClC,CAAC;QACF,CAAC;QACD,IAAI,CAAC,EAAE;YACN,IAAI,EAAE,KAAK,0BAA0B,EAAE,CAAC;gBACvC,OAAO,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjD,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/mailer",
3
- "version": "0.5.1",
3
+ "version": "0.6.3",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { fileURLToPath } from 'node:url'
2
2
  import type { AstroIntegration } from 'astro'
3
- import type { MailerOptions, ResolvedMailerOptions } from './options.js'
4
- import { mailerOptionsSchema } from './options.js'
3
+ import type { MailerComponentsOptions, MailerOptions, ResolvedMailerOptions } from './options.js'
4
+ import { mailerComponentsOptionsSchema, mailerOptionsSchema } from './options.js'
5
5
  import { growthLabsMailerPlugin } from './vite-plugin.js'
6
6
 
7
7
  function isSourceEntrypoint(): boolean {
@@ -11,7 +11,7 @@ function isSourceEntrypoint(): boolean {
11
11
  const ENTRYPOINT_EXTENSION = isSourceEntrypoint() ? '.ts' : '.js'
12
12
 
13
13
  function resolveEntrypoint(path: string): string {
14
- if (path.endsWith('.astro')) {
14
+ if (path.endsWith('.astro') || path.endsWith('.d.ts')) {
15
15
  const sourcePath = isSourceEntrypoint() ? path : `../src/${path.replace(/^\.\//, '')}`
16
16
  return fileURLToPath(new URL(sourcePath, import.meta.url))
17
17
  }
@@ -19,12 +19,22 @@ function resolveEntrypoint(path: string): string {
19
19
  return fileURLToPath(new URL(`${path}${ENTRYPOINT_EXTENSION}`, import.meta.url))
20
20
  }
21
21
 
22
+ const injectMailerTypes: NonNullable<AstroIntegration['hooks']['astro:config:done']> = ({
23
+ injectTypes,
24
+ }) => {
25
+ injectTypes({
26
+ filename: 'config.d.ts',
27
+ content: `/// <reference path="${resolveEntrypoint('./virtual.d.ts')}" />`,
28
+ })
29
+ }
30
+
22
31
  export default function mailer(userOptions: MailerOptions): AstroIntegration {
23
32
  const options = mailerOptionsSchema.parse(userOptions) as ResolvedMailerOptions
24
33
 
25
34
  return {
26
35
  name: '@growth-labs/mailer',
27
36
  hooks: {
37
+ 'astro:config:done': injectMailerTypes,
28
38
  'astro:config:setup': ({ injectRoute, addMiddleware, updateConfig, config: astroConfig }) => {
29
39
  // Auto-detect @growth-labs/analytics
30
40
  const hasAnalytics = astroConfig.integrations.some(
@@ -86,9 +96,28 @@ export default function mailer(userOptions: MailerOptions): AstroIntegration {
86
96
  }
87
97
  }
88
98
 
89
- export type { MailerOptions, ResolvedMailerOptions } from './options.js'
99
+ /** Render package components without installing delivery routes or tracking. */
100
+ export function mailerComponents(userOptions: MailerComponentsOptions): AstroIntegration {
101
+ const options = mailerComponentsOptionsSchema.parse(userOptions)
102
+ return {
103
+ name: '@growth-labs/mailer/components',
104
+ hooks: {
105
+ 'astro:config:done': injectMailerTypes,
106
+ 'astro:config:setup': ({ updateConfig }) => {
107
+ updateConfig({ vite: { plugins: [growthLabsMailerPlugin(options)] } })
108
+ },
109
+ },
110
+ }
111
+ }
112
+
113
+ export type {
114
+ MailerComponentsOptions,
115
+ MailerOptions,
116
+ ResolvedMailerComponentsOptions,
117
+ ResolvedMailerOptions,
118
+ } from './options.js'
90
119
  // Re-export options and types
91
- export { mailerOptionsSchema } from './options.js'
120
+ export { mailerComponentsOptionsSchema, mailerOptionsSchema } from './options.js'
92
121
  export type {
93
122
  DigestItem,
94
123
  EmailProvider,
package/src/options.ts CHANGED
@@ -90,3 +90,12 @@ export const mailerOptionsSchema = z.object({
90
90
 
91
91
  export type MailerOptions = z.input<typeof mailerOptionsSchema>
92
92
  export type ResolvedMailerOptions = z.output<typeof mailerOptionsSchema>
93
+
94
+ // Only the public configuration read by SubscribeForm. No delivery credentials
95
+ // or Worker bindings are needed when a consumer supplies its own endpoint.
96
+ export const mailerComponentsOptionsSchema = mailerOptionsSchema
97
+ .pick({ turnstileSiteKey: true, topics: true, subscribePath: true })
98
+ .strict()
99
+
100
+ export type MailerComponentsOptions = z.input<typeof mailerComponentsOptionsSchema>
101
+ export type ResolvedMailerComponentsOptions = z.output<typeof mailerComponentsOptionsSchema>
@@ -67,8 +67,8 @@ if (!d1) {
67
67
  }
68
68
  const db = drizzle(d1);
69
69
 
70
- // Handle POST (form submission)
71
- if (Astro.request.method === "POST") {
70
+ // Form data is parsed only for POST requests.
71
+ if (formData) {
72
72
  const action = formData.get("action");
73
73
 
74
74
  if (action === "unsubscribe") {
@@ -1,22 +1,21 @@
1
1
  import type { Plugin } from 'vite'
2
- import type { ResolvedMailerOptions } from './options.js'
2
+ import type { ResolvedMailerComponentsOptions, ResolvedMailerOptions } from './options.js'
3
+
4
+ type MailerConfig = ResolvedMailerOptions | ResolvedMailerComponentsOptions
3
5
 
4
6
  const VIRTUAL_MODULE_ID = 'virtual:growth-labs/mailer/config'
5
7
  const RESOLVED_VIRTUAL_MODULE_ID = `\0${VIRTUAL_MODULE_ID}`
6
8
 
7
- export function renderMailerConfigModule(
8
- config: ResolvedMailerOptions,
9
- command: 'build' | 'serve',
10
- ): string {
9
+ export function renderMailerConfigModule(config: MailerConfig, command: 'build' | 'serve'): string {
11
10
  const serializableConfig = { ...config }
12
11
  if (command !== 'serve') {
13
- delete serializableConfig.turnstileSecretKey
14
- delete serializableConfig.signingSecret
12
+ if ('turnstileSecretKey' in serializableConfig) delete serializableConfig.turnstileSecretKey
13
+ if ('signingSecret' in serializableConfig) delete serializableConfig.signingSecret
15
14
  }
16
15
  return `export const config = ${JSON.stringify(serializableConfig)};`
17
16
  }
18
17
 
19
- export function growthLabsMailerPlugin(config: ResolvedMailerOptions): Plugin {
18
+ export function growthLabsMailerPlugin(config: MailerConfig): Plugin {
20
19
  let command: 'build' | 'serve' = 'build'
21
20
 
22
21
  return {