payload-plugin-newsletter 0.20.0 → 0.20.2
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/CHANGELOG.md +43 -0
- package/dist/admin.d.ts +706 -0
- package/dist/{components.js → admin.js} +832 -1458
- package/dist/broadcast-VMCYSZRY.js +6 -0
- package/dist/chunk-XVMYJQRQ.js +490 -0
- package/dist/client.d.ts +131 -15
- package/dist/client.js +1 -1
- package/dist/server.d.ts +735 -0
- package/dist/{index.js → server.js} +30 -654
- package/package.json +17 -27
- package/ESM_FIX_SUMMARY.md +0 -74
- package/PREVIEW_CUSTOMIZATION_TASK.md +0 -201
- package/dist/client.cjs +0 -891
- package/dist/client.cjs.map +0 -1
- package/dist/client.d.cts +0 -53
- package/dist/client.js.map +0 -1
- package/dist/components.cjs +0 -2460
- package/dist/components.cjs.map +0 -1
- package/dist/components.d.cts +0 -66
- package/dist/components.d.ts +0 -66
- package/dist/components.js.map +0 -1
- package/dist/index.cjs +0 -5545
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -90
- package/dist/index.d.ts +0 -90
- package/dist/index.js.map +0 -1
|
@@ -1,538 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
// src/types/newsletter.ts
|
|
12
|
-
var NewsletterProviderError;
|
|
13
|
-
var init_newsletter = __esm({
|
|
14
|
-
"src/types/newsletter.ts"() {
|
|
15
|
-
"use strict";
|
|
16
|
-
NewsletterProviderError = class extends Error {
|
|
17
|
-
constructor(message, code, provider, details) {
|
|
18
|
-
super(message);
|
|
19
|
-
this.code = code;
|
|
20
|
-
this.provider = provider;
|
|
21
|
-
this.details = details;
|
|
22
|
-
this.name = "NewsletterProviderError";
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
// src/types/broadcast.ts
|
|
29
|
-
var BroadcastProviderError;
|
|
30
|
-
var init_broadcast = __esm({
|
|
31
|
-
"src/types/broadcast.ts"() {
|
|
32
|
-
"use strict";
|
|
33
|
-
init_newsletter();
|
|
34
|
-
BroadcastProviderError = class extends Error {
|
|
35
|
-
constructor(message, code, provider, details) {
|
|
36
|
-
super(message);
|
|
37
|
-
this.code = code;
|
|
38
|
-
this.provider = provider;
|
|
39
|
-
this.details = details;
|
|
40
|
-
this.name = "BroadcastProviderError";
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// src/types/providers.ts
|
|
47
|
-
var BaseBroadcastProvider;
|
|
48
|
-
var init_providers = __esm({
|
|
49
|
-
"src/types/providers.ts"() {
|
|
50
|
-
"use strict";
|
|
51
|
-
init_broadcast();
|
|
52
|
-
init_newsletter();
|
|
53
|
-
BaseBroadcastProvider = class {
|
|
54
|
-
constructor(config) {
|
|
55
|
-
this.config = config;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Schedule a broadcast - default implementation throws not supported
|
|
59
|
-
*/
|
|
60
|
-
async schedule(_id, _scheduledAt) {
|
|
61
|
-
const capabilities = this.getCapabilities();
|
|
62
|
-
if (!capabilities.supportsScheduling) {
|
|
63
|
-
throw new BroadcastProviderError(
|
|
64
|
-
"Scheduling is not supported by this provider",
|
|
65
|
-
"NOT_SUPPORTED" /* NOT_SUPPORTED */,
|
|
66
|
-
this.name
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
throw new Error("Method not implemented");
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Cancel scheduled broadcast - default implementation throws not supported
|
|
73
|
-
*/
|
|
74
|
-
async cancelSchedule(_id) {
|
|
75
|
-
const capabilities = this.getCapabilities();
|
|
76
|
-
if (!capabilities.supportsScheduling) {
|
|
77
|
-
throw new BroadcastProviderError(
|
|
78
|
-
"Scheduling is not supported by this provider",
|
|
79
|
-
"NOT_SUPPORTED" /* NOT_SUPPORTED */,
|
|
80
|
-
this.name
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
throw new Error("Method not implemented");
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get analytics - default implementation returns zeros
|
|
87
|
-
*/
|
|
88
|
-
async getAnalytics(_id) {
|
|
89
|
-
const capabilities = this.getCapabilities();
|
|
90
|
-
if (!capabilities.supportsAnalytics) {
|
|
91
|
-
throw new BroadcastProviderError(
|
|
92
|
-
"Analytics are not supported by this provider",
|
|
93
|
-
"NOT_SUPPORTED" /* NOT_SUPPORTED */,
|
|
94
|
-
this.name
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
sent: 0,
|
|
99
|
-
delivered: 0,
|
|
100
|
-
opened: 0,
|
|
101
|
-
clicked: 0,
|
|
102
|
-
bounced: 0,
|
|
103
|
-
complained: 0,
|
|
104
|
-
unsubscribed: 0
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Helper method to validate required fields
|
|
109
|
-
*/
|
|
110
|
-
validateRequiredFields(data, fields) {
|
|
111
|
-
const missing = fields.filter((field) => !data[field]);
|
|
112
|
-
if (missing.length > 0) {
|
|
113
|
-
throw new BroadcastProviderError(
|
|
114
|
-
`Missing required fields: ${missing.join(", ")}`,
|
|
115
|
-
"VALIDATION_ERROR" /* VALIDATION_ERROR */,
|
|
116
|
-
this.name
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Helper method to check if a status transition is allowed
|
|
122
|
-
*/
|
|
123
|
-
canEditInStatus(status) {
|
|
124
|
-
const capabilities = this.getCapabilities();
|
|
125
|
-
return capabilities.editableStatuses.includes(status);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Helper to build pagination response
|
|
129
|
-
*/
|
|
130
|
-
buildListResponse(items, total, options = {}) {
|
|
131
|
-
const limit = options.limit || 20;
|
|
132
|
-
const offset = options.offset || 0;
|
|
133
|
-
return {
|
|
134
|
-
items,
|
|
135
|
-
total,
|
|
136
|
-
limit,
|
|
137
|
-
offset,
|
|
138
|
-
hasMore: offset + items.length < total
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
// src/types/index.ts
|
|
146
|
-
var init_types = __esm({
|
|
147
|
-
"src/types/index.ts"() {
|
|
148
|
-
"use strict";
|
|
149
|
-
init_broadcast();
|
|
150
|
-
init_providers();
|
|
151
|
-
init_newsletter();
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
// src/providers/broadcast/broadcast.ts
|
|
156
|
-
var broadcast_exports = {};
|
|
157
|
-
__export(broadcast_exports, {
|
|
158
|
-
BroadcastApiProvider: () => BroadcastApiProvider
|
|
159
|
-
});
|
|
160
|
-
var BroadcastApiProvider;
|
|
161
|
-
var init_broadcast2 = __esm({
|
|
162
|
-
"src/providers/broadcast/broadcast.ts"() {
|
|
163
|
-
"use strict";
|
|
164
|
-
init_types();
|
|
165
|
-
BroadcastApiProvider = class extends BaseBroadcastProvider {
|
|
166
|
-
constructor(config) {
|
|
167
|
-
super(config);
|
|
168
|
-
this.name = "broadcast";
|
|
169
|
-
this.apiUrl = config.apiUrl.replace(/\/$/, "");
|
|
170
|
-
this.token = config.token;
|
|
171
|
-
if (!this.token) {
|
|
172
|
-
throw new BroadcastProviderError(
|
|
173
|
-
"Broadcast API token is required",
|
|
174
|
-
"CONFIGURATION_ERROR" /* CONFIGURATION_ERROR */,
|
|
175
|
-
this.name
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// Broadcast Management Methods
|
|
180
|
-
async list(options) {
|
|
181
|
-
try {
|
|
182
|
-
const params = new URLSearchParams();
|
|
183
|
-
if (options?.limit) params.append("limit", options.limit.toString());
|
|
184
|
-
if (options?.offset) params.append("offset", options.offset.toString());
|
|
185
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts?${params}`, {
|
|
186
|
-
method: "GET",
|
|
187
|
-
headers: {
|
|
188
|
-
"Authorization": `Bearer ${this.token}`,
|
|
189
|
-
"Content-Type": "application/json"
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
if (!response.ok) {
|
|
193
|
-
const error = await response.text();
|
|
194
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
195
|
-
}
|
|
196
|
-
const data = await response.json();
|
|
197
|
-
const broadcasts = data.data.map((broadcast) => this.transformBroadcastFromApi(broadcast));
|
|
198
|
-
return this.buildListResponse(broadcasts, data.total, options);
|
|
199
|
-
} catch (error) {
|
|
200
|
-
throw new BroadcastProviderError(
|
|
201
|
-
`Failed to list broadcasts: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
202
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
203
|
-
this.name,
|
|
204
|
-
error
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
async get(id) {
|
|
209
|
-
try {
|
|
210
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}`, {
|
|
211
|
-
method: "GET",
|
|
212
|
-
headers: {
|
|
213
|
-
"Authorization": `Bearer ${this.token}`,
|
|
214
|
-
"Content-Type": "application/json"
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
if (!response.ok) {
|
|
218
|
-
if (response.status === 404) {
|
|
219
|
-
throw new BroadcastProviderError(
|
|
220
|
-
`Broadcast not found: ${id}`,
|
|
221
|
-
"NOT_FOUND" /* NOT_FOUND */,
|
|
222
|
-
this.name
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
const error = await response.text();
|
|
226
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
227
|
-
}
|
|
228
|
-
const broadcast = await response.json();
|
|
229
|
-
return this.transformBroadcastFromApi(broadcast);
|
|
230
|
-
} catch (error) {
|
|
231
|
-
if (error instanceof BroadcastProviderError) throw error;
|
|
232
|
-
throw new BroadcastProviderError(
|
|
233
|
-
`Failed to get broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
234
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
235
|
-
this.name,
|
|
236
|
-
error
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
async create(data) {
|
|
241
|
-
try {
|
|
242
|
-
this.validateRequiredFields(data, ["name", "subject", "content"]);
|
|
243
|
-
const requestBody = {
|
|
244
|
-
broadcast: {
|
|
245
|
-
name: data.name,
|
|
246
|
-
subject: data.subject,
|
|
247
|
-
preheader: data.preheader,
|
|
248
|
-
body: data.content,
|
|
249
|
-
html_body: true,
|
|
250
|
-
track_opens: data.trackOpens ?? true,
|
|
251
|
-
track_clicks: data.trackClicks ?? true,
|
|
252
|
-
reply_to: data.replyTo,
|
|
253
|
-
segment_ids: data.audienceIds
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
console.log("[BroadcastApiProvider] Creating broadcast:", {
|
|
257
|
-
url: `${this.apiUrl}/api/v1/broadcasts`,
|
|
258
|
-
method: "POST",
|
|
259
|
-
hasToken: !!this.token,
|
|
260
|
-
tokenLength: this.token?.length,
|
|
261
|
-
body: JSON.stringify(requestBody, null, 2)
|
|
262
|
-
});
|
|
263
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts`, {
|
|
264
|
-
method: "POST",
|
|
265
|
-
headers: {
|
|
266
|
-
"Authorization": `Bearer ${this.token}`,
|
|
267
|
-
"Content-Type": "application/json"
|
|
268
|
-
},
|
|
269
|
-
body: JSON.stringify(requestBody)
|
|
270
|
-
});
|
|
271
|
-
console.log("[BroadcastApiProvider] Response status:", response.status);
|
|
272
|
-
console.log("[BroadcastApiProvider] Response headers:", Object.fromEntries(response.headers.entries()));
|
|
273
|
-
if (!response.ok) {
|
|
274
|
-
const errorText = await response.text();
|
|
275
|
-
console.error("[BroadcastApiProvider] Error response body:", errorText);
|
|
276
|
-
let errorDetails;
|
|
277
|
-
try {
|
|
278
|
-
errorDetails = JSON.parse(errorText);
|
|
279
|
-
console.error("[BroadcastApiProvider] Parsed error:", errorDetails);
|
|
280
|
-
} catch {
|
|
281
|
-
}
|
|
282
|
-
throw new Error(`Broadcast API error: ${response.status} - ${errorText}`);
|
|
283
|
-
}
|
|
284
|
-
const result = await response.json();
|
|
285
|
-
return this.get(result.id.toString());
|
|
286
|
-
} catch (error) {
|
|
287
|
-
if (error instanceof BroadcastProviderError) throw error;
|
|
288
|
-
throw new BroadcastProviderError(
|
|
289
|
-
`Failed to create broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
290
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
291
|
-
this.name,
|
|
292
|
-
error
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
async update(id, data) {
|
|
297
|
-
try {
|
|
298
|
-
const existing = await this.get(id);
|
|
299
|
-
if (!this.canEditInStatus(existing.sendStatus)) {
|
|
300
|
-
throw new BroadcastProviderError(
|
|
301
|
-
`Cannot update broadcast in status: ${existing.sendStatus}`,
|
|
302
|
-
"INVALID_STATUS" /* INVALID_STATUS */,
|
|
303
|
-
this.name
|
|
304
|
-
);
|
|
305
|
-
}
|
|
306
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}`, {
|
|
307
|
-
method: "PATCH",
|
|
308
|
-
headers: {
|
|
309
|
-
"Authorization": `Bearer ${this.token}`,
|
|
310
|
-
"Content-Type": "application/json"
|
|
311
|
-
},
|
|
312
|
-
body: JSON.stringify({
|
|
313
|
-
broadcast: {
|
|
314
|
-
name: data.name,
|
|
315
|
-
subject: data.subject,
|
|
316
|
-
preheader: data.preheader,
|
|
317
|
-
body: data.content,
|
|
318
|
-
track_opens: data.trackOpens,
|
|
319
|
-
track_clicks: data.trackClicks,
|
|
320
|
-
reply_to: data.replyTo,
|
|
321
|
-
segment_ids: data.audienceIds
|
|
322
|
-
}
|
|
323
|
-
})
|
|
324
|
-
});
|
|
325
|
-
if (!response.ok) {
|
|
326
|
-
const error = await response.text();
|
|
327
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
328
|
-
}
|
|
329
|
-
const broadcast = await response.json();
|
|
330
|
-
return this.transformBroadcastFromApi(broadcast);
|
|
331
|
-
} catch (error) {
|
|
332
|
-
if (error instanceof BroadcastProviderError) throw error;
|
|
333
|
-
throw new BroadcastProviderError(
|
|
334
|
-
`Failed to update broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
335
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
336
|
-
this.name,
|
|
337
|
-
error
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
async delete(id) {
|
|
342
|
-
try {
|
|
343
|
-
const existing = await this.get(id);
|
|
344
|
-
if (!this.canEditInStatus(existing.sendStatus)) {
|
|
345
|
-
throw new BroadcastProviderError(
|
|
346
|
-
`Cannot delete broadcast in status: ${existing.sendStatus}`,
|
|
347
|
-
"INVALID_STATUS" /* INVALID_STATUS */,
|
|
348
|
-
this.name
|
|
349
|
-
);
|
|
350
|
-
}
|
|
351
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}`, {
|
|
352
|
-
method: "DELETE",
|
|
353
|
-
headers: {
|
|
354
|
-
"Authorization": `Bearer ${this.token}`,
|
|
355
|
-
"Content-Type": "application/json"
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
if (!response.ok) {
|
|
359
|
-
const error = await response.text();
|
|
360
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
361
|
-
}
|
|
362
|
-
} catch (error) {
|
|
363
|
-
if (error instanceof BroadcastProviderError) throw error;
|
|
364
|
-
throw new BroadcastProviderError(
|
|
365
|
-
`Failed to delete broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
366
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
367
|
-
this.name,
|
|
368
|
-
error
|
|
369
|
-
);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
async send(id, options) {
|
|
373
|
-
try {
|
|
374
|
-
if (options?.testMode && options.testRecipients?.length) {
|
|
375
|
-
throw new BroadcastProviderError(
|
|
376
|
-
"Test send is not yet implemented for Broadcast provider",
|
|
377
|
-
"NOT_SUPPORTED" /* NOT_SUPPORTED */,
|
|
378
|
-
this.name
|
|
379
|
-
);
|
|
380
|
-
}
|
|
381
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}/send_broadcast`, {
|
|
382
|
-
method: "POST",
|
|
383
|
-
headers: {
|
|
384
|
-
"Authorization": `Bearer ${this.token}`,
|
|
385
|
-
"Content-Type": "application/json"
|
|
386
|
-
},
|
|
387
|
-
body: JSON.stringify({
|
|
388
|
-
segment_ids: options?.audienceIds
|
|
389
|
-
})
|
|
390
|
-
});
|
|
391
|
-
if (!response.ok) {
|
|
392
|
-
const error = await response.text();
|
|
393
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
394
|
-
}
|
|
395
|
-
const result = await response.json();
|
|
396
|
-
return this.get(result.id.toString());
|
|
397
|
-
} catch (error) {
|
|
398
|
-
if (error instanceof BroadcastProviderError) throw error;
|
|
399
|
-
throw new BroadcastProviderError(
|
|
400
|
-
`Failed to send broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
401
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
402
|
-
this.name,
|
|
403
|
-
error
|
|
404
|
-
);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
async schedule(id, scheduledAt) {
|
|
408
|
-
try {
|
|
409
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}`, {
|
|
410
|
-
method: "PATCH",
|
|
411
|
-
headers: {
|
|
412
|
-
"Authorization": `Bearer ${this.token}`,
|
|
413
|
-
"Content-Type": "application/json"
|
|
414
|
-
},
|
|
415
|
-
body: JSON.stringify({
|
|
416
|
-
broadcast: {
|
|
417
|
-
scheduled_send_at: scheduledAt.toISOString(),
|
|
418
|
-
// TODO: Handle timezone properly
|
|
419
|
-
scheduled_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
420
|
-
}
|
|
421
|
-
})
|
|
422
|
-
});
|
|
423
|
-
if (!response.ok) {
|
|
424
|
-
const error = await response.text();
|
|
425
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
426
|
-
}
|
|
427
|
-
const broadcast = await response.json();
|
|
428
|
-
return this.transformBroadcastFromApi(broadcast);
|
|
429
|
-
} catch (error) {
|
|
430
|
-
throw new BroadcastProviderError(
|
|
431
|
-
`Failed to schedule broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
432
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
433
|
-
this.name,
|
|
434
|
-
error
|
|
435
|
-
);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
async cancelSchedule(id) {
|
|
439
|
-
try {
|
|
440
|
-
const response = await fetch(`${this.apiUrl}/api/v1/broadcasts/${id}`, {
|
|
441
|
-
method: "PATCH",
|
|
442
|
-
headers: {
|
|
443
|
-
"Authorization": `Bearer ${this.token}`,
|
|
444
|
-
"Content-Type": "application/json"
|
|
445
|
-
},
|
|
446
|
-
body: JSON.stringify({
|
|
447
|
-
broadcast: {
|
|
448
|
-
scheduled_send_at: null,
|
|
449
|
-
scheduled_timezone: null
|
|
450
|
-
}
|
|
451
|
-
})
|
|
452
|
-
});
|
|
453
|
-
if (!response.ok) {
|
|
454
|
-
const error = await response.text();
|
|
455
|
-
throw new Error(`Broadcast API error: ${response.status} - ${error}`);
|
|
456
|
-
}
|
|
457
|
-
const broadcast = await response.json();
|
|
458
|
-
return this.transformBroadcastFromApi(broadcast);
|
|
459
|
-
} catch (error) {
|
|
460
|
-
throw new BroadcastProviderError(
|
|
461
|
-
`Failed to cancel scheduled broadcast: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
462
|
-
"PROVIDER_ERROR" /* PROVIDER_ERROR */,
|
|
463
|
-
this.name,
|
|
464
|
-
error
|
|
465
|
-
);
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
async getAnalytics(_id) {
|
|
469
|
-
throw new BroadcastProviderError(
|
|
470
|
-
"Analytics API not yet implemented for Broadcast provider",
|
|
471
|
-
"NOT_SUPPORTED" /* NOT_SUPPORTED */,
|
|
472
|
-
this.name
|
|
473
|
-
);
|
|
474
|
-
}
|
|
475
|
-
getCapabilities() {
|
|
476
|
-
return {
|
|
477
|
-
supportsScheduling: true,
|
|
478
|
-
supportsSegmentation: true,
|
|
479
|
-
supportsAnalytics: false,
|
|
480
|
-
// Not documented yet
|
|
481
|
-
supportsABTesting: false,
|
|
482
|
-
supportsTemplates: false,
|
|
483
|
-
supportsPersonalization: true,
|
|
484
|
-
supportsMultipleChannels: false,
|
|
485
|
-
supportsChannelSegmentation: false,
|
|
486
|
-
editableStatuses: ["draft" /* DRAFT */, "scheduled" /* SCHEDULED */],
|
|
487
|
-
supportedContentTypes: ["html", "text"]
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
async validateConfiguration() {
|
|
491
|
-
try {
|
|
492
|
-
await this.list({ limit: 1 });
|
|
493
|
-
return true;
|
|
494
|
-
} catch {
|
|
495
|
-
return false;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
transformBroadcastFromApi(broadcast) {
|
|
499
|
-
return {
|
|
500
|
-
id: broadcast.id.toString(),
|
|
501
|
-
name: broadcast.name,
|
|
502
|
-
subject: broadcast.subject,
|
|
503
|
-
preheader: broadcast.preheader,
|
|
504
|
-
content: broadcast.body,
|
|
505
|
-
sendStatus: this.mapBroadcastStatus(broadcast.status),
|
|
506
|
-
trackOpens: broadcast.track_opens,
|
|
507
|
-
trackClicks: broadcast.track_clicks,
|
|
508
|
-
replyTo: broadcast.reply_to,
|
|
509
|
-
recipientCount: broadcast.total_recipients,
|
|
510
|
-
sentAt: broadcast.sent_at ? new Date(broadcast.sent_at) : void 0,
|
|
511
|
-
scheduledAt: broadcast.scheduled_send_at ? new Date(broadcast.scheduled_send_at) : void 0,
|
|
512
|
-
createdAt: new Date(broadcast.created_at),
|
|
513
|
-
updatedAt: new Date(broadcast.updated_at),
|
|
514
|
-
providerData: { broadcast },
|
|
515
|
-
providerId: broadcast.id.toString(),
|
|
516
|
-
providerType: "broadcast"
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
mapBroadcastStatus(status) {
|
|
520
|
-
const statusMap = {
|
|
521
|
-
"draft": "draft" /* DRAFT */,
|
|
522
|
-
"scheduled": "scheduled" /* SCHEDULED */,
|
|
523
|
-
"queueing": "sending" /* SENDING */,
|
|
524
|
-
"sending": "sending" /* SENDING */,
|
|
525
|
-
"sent": "sent" /* SENT */,
|
|
526
|
-
"failed": "failed" /* FAILED */,
|
|
527
|
-
"partial_failure": "failed" /* FAILED */,
|
|
528
|
-
"paused": "paused" /* PAUSED */,
|
|
529
|
-
"aborted": "canceled" /* CANCELED */
|
|
530
|
-
};
|
|
531
|
-
return statusMap[status] || "draft" /* DRAFT */;
|
|
532
|
-
}
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
});
|
|
1
|
+
import {
|
|
2
|
+
BaseBroadcastProvider,
|
|
3
|
+
BroadcastApiProvider,
|
|
4
|
+
BroadcastProviderError,
|
|
5
|
+
NewsletterProviderError
|
|
6
|
+
} from "./chunk-XVMYJQRQ.js";
|
|
536
7
|
|
|
537
8
|
// src/utils/access.ts
|
|
538
9
|
var isAdmin = (user, config) => {
|
|
@@ -3155,9 +2626,6 @@ var createUnsubscribeSyncJob = (pluginConfig) => {
|
|
|
3155
2626
|
};
|
|
3156
2627
|
};
|
|
3157
2628
|
|
|
3158
|
-
// src/collections/Broadcasts.ts
|
|
3159
|
-
init_types();
|
|
3160
|
-
|
|
3161
2629
|
// src/fields/emailContent.ts
|
|
3162
2630
|
import {
|
|
3163
2631
|
BoldFeature,
|
|
@@ -4013,9 +3481,6 @@ async function getBroadcastConfig(req, pluginConfig) {
|
|
|
4013
3481
|
}
|
|
4014
3482
|
}
|
|
4015
3483
|
|
|
4016
|
-
// src/endpoints/broadcasts/send.ts
|
|
4017
|
-
init_types();
|
|
4018
|
-
|
|
4019
3484
|
// src/utils/auth.ts
|
|
4020
3485
|
async function getAuthenticatedUser(req) {
|
|
4021
3486
|
try {
|
|
@@ -4103,7 +3568,7 @@ var createSendBroadcastEndpoint = (config, collectionSlug) => {
|
|
|
4103
3568
|
error: "Broadcast provider not configured in Newsletter Settings or environment variables"
|
|
4104
3569
|
}, { status: 500 });
|
|
4105
3570
|
}
|
|
4106
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
3571
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
4107
3572
|
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4108
3573
|
const broadcast = await provider.send(broadcastDoc.providerId, data);
|
|
4109
3574
|
await req.payload.update({
|
|
@@ -4139,7 +3604,6 @@ var createSendBroadcastEndpoint = (config, collectionSlug) => {
|
|
|
4139
3604
|
};
|
|
4140
3605
|
|
|
4141
3606
|
// src/endpoints/broadcasts/schedule.ts
|
|
4142
|
-
init_types();
|
|
4143
3607
|
var createScheduleBroadcastEndpoint = (config, collectionSlug) => {
|
|
4144
3608
|
return {
|
|
4145
3609
|
path: "/:id/schedule",
|
|
@@ -4207,7 +3671,7 @@ var createScheduleBroadcastEndpoint = (config, collectionSlug) => {
|
|
|
4207
3671
|
error: "Broadcast provider not configured"
|
|
4208
3672
|
}, { status: 500 });
|
|
4209
3673
|
}
|
|
4210
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
3674
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
4211
3675
|
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4212
3676
|
const broadcast = await provider.schedule(broadcastDoc.providerId, scheduledDate);
|
|
4213
3677
|
await req.payload.update({
|
|
@@ -4723,7 +4187,7 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
4723
4187
|
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
4724
4188
|
return doc;
|
|
4725
4189
|
}
|
|
4726
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
4190
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
4727
4191
|
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4728
4192
|
req.payload.logger.info("Populating media fields and converting content to HTML...");
|
|
4729
4193
|
const populatedContent = await populateMediaFields(doc.contentSection?.content, req.payload, pluginConfig);
|
|
@@ -4818,7 +4282,7 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
4818
4282
|
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
4819
4283
|
return doc;
|
|
4820
4284
|
}
|
|
4821
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
4285
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
4822
4286
|
const provider = new BroadcastApiProvider2(providerConfig);
|
|
4823
4287
|
if (!doc.providerId) {
|
|
4824
4288
|
if (!doc.subject || !doc.contentSection?.content) {
|
|
@@ -4963,7 +4427,7 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
4963
4427
|
return doc;
|
|
4964
4428
|
}
|
|
4965
4429
|
if (broadcastConfig && broadcastConfig.token) {
|
|
4966
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
4430
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
4967
4431
|
const provider = new BroadcastApiProvider2(broadcastConfig);
|
|
4968
4432
|
await provider.send(doc.providerId);
|
|
4969
4433
|
}
|
|
@@ -5014,7 +4478,7 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
5014
4478
|
req.payload.logger.error("Broadcast provider not configured in Newsletter Settings or environment variables");
|
|
5015
4479
|
return doc;
|
|
5016
4480
|
}
|
|
5017
|
-
const { BroadcastApiProvider: BroadcastApiProvider2 } = await
|
|
4481
|
+
const { BroadcastApiProvider: BroadcastApiProvider2 } = await import("./broadcast-VMCYSZRY.js");
|
|
5018
4482
|
const provider = new BroadcastApiProvider2(providerConfig);
|
|
5019
4483
|
const capabilities = provider.getCapabilities();
|
|
5020
4484
|
if (capabilities.editableStatuses.includes(doc.sendStatus)) {
|
|
@@ -5040,11 +4504,7 @@ var createBroadcastsCollection = (pluginConfig) => {
|
|
|
5040
4504
|
};
|
|
5041
4505
|
};
|
|
5042
4506
|
|
|
5043
|
-
// src/index.ts
|
|
5044
|
-
init_broadcast2();
|
|
5045
|
-
|
|
5046
4507
|
// src/providers/resend/broadcast.ts
|
|
5047
|
-
init_types();
|
|
5048
4508
|
import { Resend as Resend2 } from "resend";
|
|
5049
4509
|
var ResendBroadcastProvider = class extends BaseBroadcastProvider {
|
|
5050
4510
|
constructor(config) {
|
|
@@ -5257,100 +4717,16 @@ var ResendBroadcastProvider = class extends BaseBroadcastProvider {
|
|
|
5257
4717
|
}
|
|
5258
4718
|
};
|
|
5259
4719
|
|
|
5260
|
-
// src/
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
const cookies = req.cookies || req.headers?.cookie;
|
|
5264
|
-
if (!cookies) return null;
|
|
5265
|
-
if (typeof cookies === "string") {
|
|
5266
|
-
const parsed = cookies.split(";").reduce((acc, cookie) => {
|
|
5267
|
-
const [key, value] = cookie.trim().split("=");
|
|
5268
|
-
acc[key] = value;
|
|
5269
|
-
return acc;
|
|
5270
|
-
}, {});
|
|
5271
|
-
return parsed["newsletter-auth"] || null;
|
|
5272
|
-
}
|
|
5273
|
-
return cookies["newsletter-auth"] || null;
|
|
5274
|
-
};
|
|
5275
|
-
var verifyToken = (token, secret) => {
|
|
5276
|
-
try {
|
|
5277
|
-
const decoded = jwt2.verify(token, secret);
|
|
5278
|
-
return decoded;
|
|
5279
|
-
} catch {
|
|
5280
|
-
return null;
|
|
5281
|
-
}
|
|
5282
|
-
};
|
|
5283
|
-
var getServerSideAuth = async (context, secret) => {
|
|
5284
|
-
const token = getTokenFromRequest(context.req);
|
|
5285
|
-
if (!token) {
|
|
5286
|
-
return { subscriber: null, isAuthenticated: false };
|
|
5287
|
-
}
|
|
5288
|
-
const payloadSecret = secret || process.env.PAYLOAD_SECRET;
|
|
5289
|
-
if (!payloadSecret) {
|
|
5290
|
-
console.error("No secret provided for token verification");
|
|
5291
|
-
return { subscriber: null, isAuthenticated: false };
|
|
5292
|
-
}
|
|
5293
|
-
const decoded = verifyToken(token, payloadSecret);
|
|
5294
|
-
if (!decoded) {
|
|
5295
|
-
return { subscriber: null, isAuthenticated: false };
|
|
5296
|
-
}
|
|
5297
|
-
return {
|
|
5298
|
-
subscriber: decoded,
|
|
5299
|
-
isAuthenticated: true
|
|
5300
|
-
};
|
|
4720
|
+
// src/contexts/ServerContext.ts
|
|
4721
|
+
var configStore = {
|
|
4722
|
+
config: null
|
|
5301
4723
|
};
|
|
5302
|
-
var
|
|
5303
|
-
|
|
5304
|
-
const { isAuthenticated: isAuthenticated2, subscriber } = await getServerSideAuth(context);
|
|
5305
|
-
if (!isAuthenticated2) {
|
|
5306
|
-
return {
|
|
5307
|
-
redirect: {
|
|
5308
|
-
destination: "/auth/signin",
|
|
5309
|
-
permanent: false
|
|
5310
|
-
}
|
|
5311
|
-
};
|
|
5312
|
-
}
|
|
5313
|
-
if (gssp) {
|
|
5314
|
-
const result = await gssp(context);
|
|
5315
|
-
return {
|
|
5316
|
-
...result,
|
|
5317
|
-
props: {
|
|
5318
|
-
...result.props,
|
|
5319
|
-
subscriber
|
|
5320
|
-
}
|
|
5321
|
-
};
|
|
5322
|
-
}
|
|
5323
|
-
return {
|
|
5324
|
-
props: {
|
|
5325
|
-
subscriber
|
|
5326
|
-
}
|
|
5327
|
-
};
|
|
5328
|
-
};
|
|
5329
|
-
};
|
|
5330
|
-
var isAuthenticated = (req, secret) => {
|
|
5331
|
-
const token = getTokenFromRequest(req);
|
|
5332
|
-
if (!token) return false;
|
|
5333
|
-
const decoded = verifyToken(token, secret);
|
|
5334
|
-
return !!decoded;
|
|
4724
|
+
var setPluginConfig = (config) => {
|
|
4725
|
+
configStore.config = config;
|
|
5335
4726
|
};
|
|
5336
4727
|
|
|
5337
|
-
// src/
|
|
5338
|
-
import
|
|
5339
|
-
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
5340
|
-
var PluginConfigContext = createContext(null);
|
|
5341
|
-
var PluginConfigProvider = ({ config, children }) => {
|
|
5342
|
-
return /* @__PURE__ */ jsx5(PluginConfigContext.Provider, { value: config, children });
|
|
5343
|
-
};
|
|
5344
|
-
var usePluginConfig = () => {
|
|
5345
|
-
const config = useContext(PluginConfigContext);
|
|
5346
|
-
if (!config) {
|
|
5347
|
-
throw new Error("usePluginConfig must be used within PluginConfigProvider");
|
|
5348
|
-
}
|
|
5349
|
-
return config;
|
|
5350
|
-
};
|
|
5351
|
-
var usePluginConfigOptional = () => {
|
|
5352
|
-
return useContext(PluginConfigContext);
|
|
5353
|
-
};
|
|
4728
|
+
// src/utilities/session.ts
|
|
4729
|
+
import jwt2 from "jsonwebtoken";
|
|
5354
4730
|
|
|
5355
4731
|
// src/index.ts
|
|
5356
4732
|
var newsletterPlugin = (pluginConfig) => (incomingConfig) => {
|
|
@@ -5366,6 +4742,7 @@ var newsletterPlugin = (pluginConfig) => (incomingConfig) => {
|
|
|
5366
4742
|
},
|
|
5367
4743
|
...pluginConfig
|
|
5368
4744
|
};
|
|
4745
|
+
setPluginConfig(config);
|
|
5369
4746
|
if (!config.enabled) {
|
|
5370
4747
|
return incomingConfig;
|
|
5371
4748
|
}
|
|
@@ -5528,15 +4905,14 @@ var newsletterPlugin = (pluginConfig) => (incomingConfig) => {
|
|
|
5528
4905
|
return modifiedConfig;
|
|
5529
4906
|
};
|
|
5530
4907
|
export {
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
|
|
5540
|
-
|
|
4908
|
+
BroadcastProvider,
|
|
4909
|
+
ResendProvider,
|
|
4910
|
+
createBroadcastsCollection,
|
|
4911
|
+
createNewsletterSettingsGlobal,
|
|
4912
|
+
createPreferencesEndpoint,
|
|
4913
|
+
createSubscribeEndpoint,
|
|
4914
|
+
createSubscribersCollection,
|
|
4915
|
+
createUnsubscribeEndpoint,
|
|
4916
|
+
createVerifyMagicLinkEndpoint,
|
|
4917
|
+
newsletterPlugin
|
|
5541
4918
|
};
|
|
5542
|
-
//# sourceMappingURL=index.js.map
|