payload-plugin-marketing 0.9.0

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.
Files changed (62) hide show
  1. package/README.md +252 -0
  2. package/dist/actions/factories.d.ts +18 -0
  3. package/dist/actions/factories.d.ts.map +1 -0
  4. package/dist/actions/index.cjs +2 -0
  5. package/dist/actions/index.cjs.map +1 -0
  6. package/dist/actions/index.d.ts +2 -0
  7. package/dist/actions/index.d.ts.map +1 -0
  8. package/dist/actions/index.js +2 -0
  9. package/dist/actions/index.js.map +1 -0
  10. package/dist/adapters/index.cjs +2 -0
  11. package/dist/adapters/index.cjs.map +1 -0
  12. package/dist/adapters/index.d.ts +3 -0
  13. package/dist/adapters/index.d.ts.map +1 -0
  14. package/dist/adapters/index.js +2 -0
  15. package/dist/adapters/index.js.map +1 -0
  16. package/dist/adapters/mailchimp.d.ts +45 -0
  17. package/dist/adapters/mailchimp.d.ts.map +1 -0
  18. package/dist/adapters/resend.d.ts +68 -0
  19. package/dist/adapters/resend.d.ts.map +1 -0
  20. package/dist/admin/components.d.ts +23 -0
  21. package/dist/admin/components.d.ts.map +1 -0
  22. package/dist/admin/index.cjs +2 -0
  23. package/dist/admin/index.cjs.map +1 -0
  24. package/dist/admin/index.d.ts +4 -0
  25. package/dist/admin/index.d.ts.map +1 -0
  26. package/dist/admin/index.js +2 -0
  27. package/dist/admin/index.js.map +1 -0
  28. package/dist/admin/views.d.ts +4 -0
  29. package/dist/admin/views.d.ts.map +1 -0
  30. package/dist/chunk-4RBNCG5Q.js +2 -0
  31. package/dist/chunk-4RBNCG5Q.js.map +1 -0
  32. package/dist/chunk-KBN7IE22.js +2 -0
  33. package/dist/chunk-KBN7IE22.js.map +1 -0
  34. package/dist/chunk-RBBHOL35.js +2 -0
  35. package/dist/chunk-RBBHOL35.js.map +1 -0
  36. package/dist/form-builder/fields.d.ts +7 -0
  37. package/dist/form-builder/fields.d.ts.map +1 -0
  38. package/dist/form-builder/hooks.d.ts +10 -0
  39. package/dist/form-builder/hooks.d.ts.map +1 -0
  40. package/dist/form-builder/index.cjs +2 -0
  41. package/dist/form-builder/index.cjs.map +1 -0
  42. package/dist/form-builder/index.d.ts +6 -0
  43. package/dist/form-builder/index.d.ts.map +1 -0
  44. package/dist/form-builder/index.js +2 -0
  45. package/dist/form-builder/index.js.map +1 -0
  46. package/dist/form-builder/mutate-collections.d.ts +4 -0
  47. package/dist/form-builder/mutate-collections.d.ts.map +1 -0
  48. package/dist/form-builder/mutate.d.ts +2 -0
  49. package/dist/form-builder/mutate.d.ts.map +1 -0
  50. package/dist/form-builder/submission.d.ts +34 -0
  51. package/dist/form-builder/submission.d.ts.map +1 -0
  52. package/dist/index.cjs +2 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.ts +7 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +2 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/plugin.d.ts +3 -0
  59. package/dist/plugin.d.ts.map +1 -0
  60. package/dist/types.d.ts +152 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/package.json +107 -0
package/README.md ADDED
@@ -0,0 +1,252 @@
1
+ # payload-plugin-marketing
2
+
3
+ Payload CMS plugin for marketing forms, audiences, contacts, and broadcasts.
4
+
5
+ ## Installation
6
+
7
+ ```sh
8
+ pnpm add payload-plugin-marketing @payloadcms/plugin-form-builder
9
+ ```
10
+
11
+ Install provider SDKs for the adapters you use:
12
+
13
+ ```sh
14
+ pnpm add resend
15
+ pnpm add @mailchimp/mailchimp_marketing
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Call `formBuilderPlugin(...)` yourself, then add `payloadMarketingPlugin(...)` after it:
21
+
22
+ ```ts
23
+ import { formBuilderPlugin } from "@payloadcms/plugin-form-builder"
24
+ import { buildConfig } from "payload"
25
+ import { payloadMarketingPlugin, resendAdapter } from "payload-plugin-marketing"
26
+
27
+ export default buildConfig({
28
+ plugins: [
29
+ formBuilderPlugin({
30
+ defaultToEmail: process.env.EMAIL_DEFAULT_RECEIVER,
31
+ }),
32
+ payloadMarketingPlugin({
33
+ adapter: resendAdapter({ apiKey: process.env.RESEND_API_KEY }),
34
+ }),
35
+ ],
36
+ })
37
+ ```
38
+
39
+ The plugin mutates the generated `forms` and `form-submissions` collections. If your form-builder
40
+ slugs are customized, pass them explicitly:
41
+
42
+ ```ts
43
+ payloadMarketingPlugin({
44
+ adapter: resendAdapter({ apiKey: process.env.RESEND_API_KEY }),
45
+ formBuilder: {
46
+ formsSlug: "marketing-forms",
47
+ submissionsSlug: "marketing-form-submissions",
48
+ },
49
+ })
50
+ ```
51
+
52
+ ## Form Builder
53
+
54
+ The plugin adds `url`, `phone`, and `acceptance` blocks to the generated forms collection. You can
55
+ also spread the blocks into the form-builder `fields` option:
56
+
57
+ ```ts
58
+ import { createMarketingFormFields } from "payload-plugin-marketing"
59
+
60
+ formBuilderPlugin({
61
+ fields: {
62
+ text: true,
63
+ email: true,
64
+ ...createMarketingFormFields(),
65
+ },
66
+ })
67
+ ```
68
+
69
+ ## Field Overrides
70
+
71
+ Customize block labels and nested field config from the marketing plugin:
72
+
73
+ ```ts
74
+ payloadMarketingPlugin({
75
+ adapter: resendAdapter({ apiKey: process.env.RESEND_API_KEY }),
76
+ formBuilder: {
77
+ fields: {
78
+ acceptance: {
79
+ labels: { singular: "Consent", plural: "Consents" },
80
+ fields: {
81
+ label: {
82
+ localized: false,
83
+ overrides: { admin: { width: "75%" } },
84
+ },
85
+ },
86
+ },
87
+ },
88
+ },
89
+ })
90
+ ```
91
+
92
+ ## Lead Forms
93
+
94
+ Forms receive `event`, `audienceId`, and `tags` fields. Set `event` to `lead` and choose an audience
95
+ to upsert contacts on submission.
96
+
97
+ Tags are comma-separated and support submitted value placeholders:
98
+
99
+ ```txt
100
+ newsletter, {{firstName}}, product-interest
101
+ ```
102
+
103
+ ## Resend
104
+
105
+ ```ts
106
+ import { resendAdapter } from "payload-plugin-marketing"
107
+
108
+ payloadMarketingPlugin({
109
+ adapter: resendAdapter({
110
+ apiKey: process.env.RESEND_API_KEY,
111
+ defaultSender: "hello@example.com",
112
+ }),
113
+ })
114
+ ```
115
+
116
+ ## Mailchimp
117
+
118
+ ```ts
119
+ import { mailchimpAdapter } from "payload-plugin-marketing"
120
+
121
+ payloadMarketingPlugin({
122
+ adapter: mailchimpAdapter({
123
+ apiKey: process.env.MAILCHIMP_API_KEY!,
124
+ defaultSender: "hello@example.com",
125
+ siteName: "Example",
126
+ }),
127
+ })
128
+ ```
129
+
130
+ Use **`createBroadcast`** together with **`templateId`** for Mailchimp saved templates (see [Broadcasts](#broadcasts)). The Resend adapter does not accept **`templateId`**; pass **`html`** or **`react`** instead.
131
+
132
+ ## Admin Components
133
+
134
+ Default admin views are registered for audience and broadcast management. Override component paths
135
+ through plugin options:
136
+
137
+ ```ts
138
+ payloadMarketingPlugin({
139
+ adapter: resendAdapter({ apiKey: process.env.RESEND_API_KEY }),
140
+ admin: {
141
+ basePath: "/marketing",
142
+ components: {
143
+ audienceList: {
144
+ path: "@/components/payload/audience-list",
145
+ },
146
+ audienceSelect: {
147
+ path: "@/components/payload/audience-select",
148
+ },
149
+ },
150
+ },
151
+ })
152
+ ```
153
+
154
+ Components are also exported from `payload-plugin-marketing/admin`.
155
+
156
+ ## Actions
157
+
158
+ Create adapter-backed actions with `createMarketingActions`:
159
+
160
+ ```ts
161
+ import { createMarketingActions, resendAdapter } from "payload-plugin-marketing"
162
+
163
+ const actions = createMarketingActions({
164
+ adapter: resendAdapter({ apiKey: process.env.RESEND_API_KEY }),
165
+ })
166
+
167
+ await actions.createAudience({ name: "Newsletter" })
168
+ await actions.newsletterSubscribe({ email: "person@example.com" })
169
+ ```
170
+
171
+ ## Broadcasts
172
+
173
+ Use `createMarketingActions` with the same adapter as the plugin. `createBroadcast` and `sendBroadcast`
174
+ return a boolean; `broadcastId` for send/delete comes from your provider (for example `adapter.broadcasts.list()` after create, or the provider dashboard).
175
+
176
+ ### Resend (HTML or React)
177
+
178
+ `defaultSender` on `resendAdapter` is sent as `from`. **`templateId` is not supported** and will throw.
179
+
180
+ ```ts
181
+ import { createMarketingActions, resendAdapter } from "payload-plugin-marketing"
182
+
183
+ const adapter = resendAdapter({
184
+ apiKey: process.env.RESEND_API_KEY!,
185
+ defaultSender: "Acme <newsletter@example.com>",
186
+ })
187
+ const actions = createMarketingActions({ adapter })
188
+
189
+ await actions.createBroadcast({
190
+ audienceId: "<segment-or-audience-id>",
191
+ name: "January update",
192
+ subject: "What we shipped",
193
+ html: "<p>Hello {{{contact.first_name|there}}}, …</p>",
194
+ replyTo: "support@example.com", // optional
195
+ // react: WelcomeEmail, // Resend Node SDK only, alternative to html
196
+ })
197
+
198
+ const drafts = await adapter.broadcasts.list()
199
+ const id = drafts[0]?.id
200
+ if (id) {
201
+ await actions.sendBroadcast({ broadcastId: id })
202
+ // optional ISO 8601 or natural language, depending on Resend SDK:
203
+ // await actions.sendBroadcast({ broadcastId: id, scheduledAt: "2026-12-01T15:00:00.000Z" })
204
+ }
205
+ ```
206
+
207
+ ### Mailchimp (HTML body)
208
+
209
+ ```ts
210
+ import { createMarketingActions, mailchimpAdapter } from "payload-plugin-marketing"
211
+
212
+ const adapter = mailchimpAdapter({
213
+ apiKey: process.env.MAILCHIMP_API_KEY!,
214
+ defaultSender: "newsletter@example.com",
215
+ siteName: "Acme",
216
+ })
217
+ const actions = createMarketingActions({ adapter })
218
+
219
+ await actions.createBroadcast({
220
+ audienceId: "<list-id>",
221
+ name: "January update",
222
+ subject: "What we shipped",
223
+ html: "<p>Hello *|FNAME|*, …</p>",
224
+ })
225
+
226
+ const campaigns = await adapter.broadcasts.list()
227
+ const id = campaigns[0]?.id
228
+ if (id) {
229
+ await actions.sendBroadcast({ broadcastId: id })
230
+ // or schedule:
231
+ // await actions.sendBroadcast({ broadcastId: id, scheduledAt: "2026-12-01T15:00:00.000Z" })
232
+ }
233
+ ```
234
+
235
+ ### Mailchimp (saved template)
236
+
237
+ Use the numeric template id from your Mailchimp account as a string. Do not pass **`html`** in the same call. Reuse `actions` from the Mailchimp example above (same adapter and `createMarketingActions`).
238
+
239
+ ```ts
240
+ await actions.createBroadcast({
241
+ audienceId: "<list-id>",
242
+ name: "Monthly newsletter",
243
+ subject: "News from Acme",
244
+ templateId: "1000094",
245
+ })
246
+ ```
247
+
248
+ ### Delete a draft broadcast
249
+
250
+ ```ts
251
+ await actions.deleteBroadcast({ broadcastId: "<broadcast-or-campaign-id>" })
252
+ ```
@@ -0,0 +1,18 @@
1
+ import type { CreateAudienceInput, CreateBroadcastInput, DeleteAudienceInput, DeleteBroadcastInput, DeleteContactInput, MarketingAdapter, SendBroadcastInput, UpsertContactInput } from "../types";
2
+ export interface CreateMarketingActionsOptions {
3
+ adapter: MarketingAdapter;
4
+ }
5
+ export declare function createMarketingActions({ adapter }: CreateMarketingActionsOptions): {
6
+ createAudience(input: CreateAudienceInput): Promise<boolean>;
7
+ createBroadcast(input: CreateBroadcastInput): Promise<boolean>;
8
+ deleteAudience(input: DeleteAudienceInput): Promise<boolean>;
9
+ deleteBroadcast(input: DeleteBroadcastInput): Promise<boolean>;
10
+ deleteContact(input: DeleteContactInput): Promise<boolean>;
11
+ newsletterSubscribe(input: {
12
+ audienceId?: string;
13
+ email: string;
14
+ }): Promise<boolean>;
15
+ sendBroadcast(input: SendBroadcastInput): Promise<boolean>;
16
+ updateContact(input: UpsertContactInput): Promise<boolean>;
17
+ };
18
+ //# sourceMappingURL=factories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../../src/actions/factories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,EAAE,6BAA6B;0BAEjD,mBAAmB;2BAIlB,oBAAoB;0BAIrB,mBAAmB;2BAIlB,oBAAoB;yBAItB,kBAAkB;+BAIZ;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;yBAQ5C,kBAAkB;yBAIlB,kBAAkB;EAKhD"}
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},p=(t,e,n,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of u(e))!o.call(t,a)&&a!==n&&r(t,a,{get:()=>e[a],enumerable:!(c=i(e,a))||c.enumerable});return t};var l=t=>p(r({},"__esModule",{value:!0}),t);var I={};d(I,{createMarketingActions:()=>s});module.exports=l(I);function s({adapter:t}){return{async createAudience(e){return await t.audiences.create(e),!0},async createBroadcast(e){return await t.broadcasts.create(e),!0},async deleteAudience(e){return await t.audiences.delete(e),!0},async deleteBroadcast(e){return await t.broadcasts.delete(e),!0},async deleteContact(e){return await t.contacts.delete(e),!0},async newsletterSubscribe(e){let n=e.audienceId??(await t.audiences.list())[0]?.id;if(!n)throw new Error("No audience found. Create one in the admin first.");return await t.contacts.upsert({audienceId:n,email:e.email,subscribed:!0}),!0},async sendBroadcast(e){return await t.broadcasts.send(e),!0},async updateContact(e){return await t.contacts.upsert(e),!0}}}0&&(module.exports={createMarketingActions});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/actions/index.ts","../../src/actions/factories.ts"],"sourcesContent":["export { createMarketingActions, type CreateMarketingActionsOptions } from \"./factories\"\n","import type {\n CreateAudienceInput,\n CreateBroadcastInput,\n DeleteAudienceInput,\n DeleteBroadcastInput,\n DeleteContactInput,\n MarketingAdapter,\n SendBroadcastInput,\n UpsertContactInput,\n} from \"../types\"\n\nexport interface CreateMarketingActionsOptions {\n adapter: MarketingAdapter\n}\n\nexport function createMarketingActions({ adapter }: CreateMarketingActionsOptions) {\n return {\n async createAudience(input: CreateAudienceInput) {\n await adapter.audiences.create(input)\n return true\n },\n async createBroadcast(input: CreateBroadcastInput) {\n await adapter.broadcasts.create(input)\n return true\n },\n async deleteAudience(input: DeleteAudienceInput) {\n await adapter.audiences.delete(input)\n return true\n },\n async deleteBroadcast(input: DeleteBroadcastInput) {\n await adapter.broadcasts.delete(input)\n return true\n },\n async deleteContact(input: DeleteContactInput) {\n await adapter.contacts.delete(input)\n return true\n },\n async newsletterSubscribe(input: { audienceId?: string; email: string }) {\n const audienceId = input.audienceId ?? (await adapter.audiences.list())[0]?.id\n if (!audienceId) {\n throw new Error(\"No audience found. Create one in the admin first.\")\n }\n await adapter.contacts.upsert({ audienceId, email: input.email, subscribed: true })\n return true\n },\n async sendBroadcast(input: SendBroadcastInput) {\n await adapter.broadcasts.send(input)\n return true\n },\n async updateContact(input: UpsertContactInput) {\n await adapter.contacts.upsert(input)\n return true\n },\n }\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GCeO,SAASI,EAAuB,CAAE,QAAAC,CAAQ,EAAkC,CACjF,MAAO,CACL,MAAM,eAAeC,EAA4B,CAC/C,aAAMD,EAAQ,UAAU,OAAOC,CAAK,EAC7B,EACT,EACA,MAAM,gBAAgBA,EAA6B,CACjD,aAAMD,EAAQ,WAAW,OAAOC,CAAK,EAC9B,EACT,EACA,MAAM,eAAeA,EAA4B,CAC/C,aAAMD,EAAQ,UAAU,OAAOC,CAAK,EAC7B,EACT,EACA,MAAM,gBAAgBA,EAA6B,CACjD,aAAMD,EAAQ,WAAW,OAAOC,CAAK,EAC9B,EACT,EACA,MAAM,cAAcA,EAA2B,CAC7C,aAAMD,EAAQ,SAAS,OAAOC,CAAK,EAC5B,EACT,EACA,MAAM,oBAAoBA,EAA+C,CACvE,IAAMC,EAAaD,EAAM,aAAe,MAAMD,EAAQ,UAAU,KAAK,GAAG,CAAC,GAAG,GAC5E,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,mDAAmD,EAErE,aAAMF,EAAQ,SAAS,OAAO,CAAE,WAAAE,EAAY,MAAOD,EAAM,MAAO,WAAY,EAAK,CAAC,EAC3E,EACT,EACA,MAAM,cAAcA,EAA2B,CAC7C,aAAMD,EAAQ,WAAW,KAAKC,CAAK,EAC5B,EACT,EACA,MAAM,cAAcA,EAA2B,CAC7C,aAAMD,EAAQ,SAAS,OAAOC,CAAK,EAC5B,EACT,CACF,CACF","names":["actions_exports","__export","createMarketingActions","__toCommonJS","createMarketingActions","adapter","input","audienceId"]}
@@ -0,0 +1,2 @@
1
+ export { createMarketingActions, type CreateMarketingActionsOptions } from "./factories";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{a}from"../chunk-RBBHOL35.js";export{a as createMarketingActions};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";var I=Object.create;var u=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var L=(t,a)=>{for(var e in a)u(t,e,{get:a[e],enumerable:!0})},f=(t,a,e,i)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of _(a))!N.call(t,n)&&n!==e&&u(t,n,{get:()=>a[n],enumerable:!(i=M(a,n))||i.enumerable});return t};var w=(t,a,e)=>(e=t!=null?I(P(t)):{},f(a||!t||!t.__esModule?u(e,"default",{value:t,enumerable:!0}):e,t)),R=t=>f(u({},"__esModule",{value:!0}),t);var v={};L(v,{mailchimpAdapter:()=>k,resendAdapter:()=>A});module.exports=R(v);var h=require("crypto");function y(t){return(0,h.createHash)("md5").update(t.toLowerCase()).digest("hex")}function b(t){let a=t.includes("-")?t.split("-").pop():void 0;if(!a)throw new Error("MAILCHIMP_API_KEY must include a datacenter suffix (e.g. key-us21).");return a}function E(t){let a=t?.tags;return a==null?[]:String(a).split(",").map(e=>e.trim()).filter(Boolean)}function o(t,a=""){return typeof t=="string"?t:typeof t=="number"&&Number.isFinite(t)?String(t):a}function k(t){let a=!1,e=async()=>{let n=t.client??(await import("@mailchimp/mailchimp_marketing")).default;return a||(n.setConfig({apiKey:t.apiKey,server:b(t.apiKey)}),a=!0),n},i=`https://${b(t.apiKey)}.admin.mailchimp.com`;return{provider:"mailchimp",label:"Mailchimp",urls:{audiences:`${i}/audience/`,broadcasts:`${i}/campaigns/`},audiences:{async create(n){await(await e()).lists.createList({name:n.name,permission_reminder:`You're receiving this email because you opted in via ${t.siteName}.`,email_type_option:!0,contact:{company:t.siteName,address1:"Address on file",city:"N/A",state:"N/A",zip:"00000",country:"US"},campaign_defaults:{from_name:t.siteName,from_email:t.defaultSender,subject:" ",language:"en"}})},async delete(n){await(await e()).lists.deleteList(n.audienceId)},async get(n){let s=await(await e()).lists.getList(n);return{id:s.id,name:s.name}},async list(){return((await(await e()).lists.getAllLists({count:500})).lists??[]).map(s=>({id:s.id,name:s.name}))}},contacts:{async delete(n){await(await e()).lists.deleteListMember(n.audienceId,n.contactId)},async list(n){return((await(await e()).lists.getListMembersInfo(n.audienceId)).members??[]).map(r=>{let d=r.merge_fields;return{createdAt:typeof r.timestamp_signup=="string"?r.timestamp_signup:void 0,email:o(r.email_address),firstName:typeof d?.FNAME=="string"?d.FNAME:null,id:o(r.id,o(r.email_address)),lastName:typeof d?.LNAME=="string"?d.LNAME:null,subscribed:r.status==="subscribed"}})},async upsert(n){let s=await e(),r=n.id??y(n.email),d=n.id?n.subscribed?"subscribed":"unsubscribed":n.subscribed?"subscribed":"pending";await s.lists.setListMember(n.audienceId,r,{email_address:n.email,status:d,merge_fields:{FNAME:n.firstName??"",LNAME:n.lastName??""}},{skipMergeValidation:!0});let m=E(n.properties);m.length>0&&await s.lists.updateListMemberTags(n.audienceId,y(n.email),{tags:m.map(l=>({name:l,status:"active"}))})}},broadcasts:{async create(n){let s=await e(),r=n.templateId!=null&&String(n.templateId).trim()!==""?String(n.templateId).trim():void 0,d;if(r!=null){let l=n.html;if(l!=null&&l!=="")throw new Error("Mailchimp broadcast: use either templateId (cloud template) or html, not both.");let p=Number.parseInt(r,10);if(!Number.isFinite(p))throw new Error(`Invalid Mailchimp template id: "${r}".`);d=p}let m=await s.campaigns.create({type:"regular",recipients:{list_id:n.audienceId},settings:{authenticate:!0,auto_footer:!1,from_email:t.defaultSender,from_name:t.siteName,inline_css:!1,reply_to:n.replyTo?.trim()||t.defaultSender,subject_line:n.subject,title:n.name,to_name:"*|FNAME|*"}});if(!m.id)throw new Error("Mailchimp did not return a campaign id.");d!=null?await s.campaigns.setContent(m.id,{template:{id:d}}):await s.campaigns.setContent(m.id,{html:n.html??""})},async delete(n){await(await e()).campaigns.remove(n.broadcastId)},async list(){return((await(await e()).campaigns.list({count:500})).campaigns??[]).map(s=>{let r=s.settings,d=typeof s.send_time=="string"?s.send_time:null;return{id:o(s.id),name:o(r?.title,o(s.id)),scheduledAt:d,sentAt:d,status:s.status==="save"?"draft":o(s.status,"draft")}})},async send(n){let s=await e(),r=n.scheduledAt?.trim();r?await s.campaigns.schedule(n.broadcastId,{schedule_time:r}):await s.campaigns.send(n.broadcastId)}}}}function c(t){let a=typeof t=="object"&&t&&"error"in t?t.error:void 0;if(a&&typeof a=="object"&&"message"in a)throw new Error(String(a.message))}function g(t,a){return typeof t=="string"?t:typeof t=="number"&&Number.isFinite(t)?String(t):a}function S(t){return{id:g(t.id,""),name:g(t.name,""),scheduledAt:typeof t.scheduled_at=="string"?t.scheduled_at:null,sentAt:typeof t.sent_at=="string"?t.sent_at:null,status:g(t.status,"draft")}}function A(t){let a=async()=>{if(t.client)return t.client;let e=await import("resend");return new e.Resend(t.apiKey)};return{provider:"resend",label:"Resend",urls:{audiences:"https://resend.com/audiences",audience:e=>`https://resend.com/audiences/${e}`,broadcasts:"https://resend.com/broadcasts",broadcast:e=>`https://resend.com/broadcasts/${e}`},audiences:{async create(e){c(await(await a()).segments.create({name:e.name}))},async delete(e){c(await(await a()).segments.remove(e.audienceId))},async get(e){let i=await(await a()).segments.get(e);return c(i),i.data?{id:i.data.id,name:i.data.name}:null},async list(){let e=await(await a()).segments.list();return c(e),e.data?.data??[]}},contacts:{async delete(e){c(await(await a()).contacts.remove({audienceId:e.audienceId,id:e.contactId}))},async list(e){let i=await(await a()).contacts.list({audienceId:e.audienceId});return c(i),(i.data?.data??[]).map(n=>({createdAt:typeof n.created_at=="string"?n.created_at:void 0,email:g(n.email,""),firstName:typeof n.first_name=="string"?n.first_name:null,id:String(n.id),lastName:typeof n.last_name=="string"?n.last_name:null,subscribed:n.unsubscribed===!1}))},async upsert(e){let i=await a(),n=!e.subscribed,s={audienceId:e.audienceId,email:e.email,firstName:e.firstName,lastName:e.lastName,unsubscribed:n};c(e.id?await i.contacts.update({...s,id:e.id}):await i.contacts.create(s))}},broadcasts:{async create(e){if(e.templateId!=null&&String(e.templateId).trim()!=="")throw new Error("Resend broadcasts do not support templateId; use html or react, or use the Mailchimp adapter for cloud templates.");c(await(await a()).broadcasts.create({audienceId:e.audienceId,from:t.defaultSender,html:e.html,name:e.name,react:e.react,replyTo:e.replyTo,subject:e.subject}))},async delete(e){c(await(await a()).broadcasts.remove(e.broadcastId))},async list(){let e=await(await a()).broadcasts.list();return c(e),(e.data?.data??[]).map(i=>S(i))},async send(e){c(await(await a()).broadcasts.send(e.broadcastId,{scheduledAt:e.scheduledAt}))}}}}0&&(module.exports={mailchimpAdapter,resendAdapter});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/index.ts","../../src/adapters/mailchimp.ts","../../src/adapters/resend.ts"],"sourcesContent":["export { mailchimpAdapter, type MailchimpAdapterOptions } from \"./mailchimp\"\nexport { resendAdapter, type ResendAdapterOptions } from \"./resend\"\n","import { createHash } from \"node:crypto\"\n\nimport type { MarketingAdapter } from \"../types\"\n\ninterface MailchimpLike {\n campaigns: {\n create(input: unknown): Promise<{ id?: string }>\n list(input?: unknown): Promise<{ campaigns?: Array<Record<string, unknown>> }>\n remove(id: string): Promise<unknown>\n schedule(id: string, input: unknown): Promise<unknown>\n send(id: string): Promise<unknown>\n setContent(id: string, input: unknown): Promise<unknown>\n }\n lists: {\n createList(input: unknown): Promise<unknown>\n deleteList(id: string): Promise<unknown>\n deleteListMember(listId: string, contactId: string): Promise<unknown>\n getAllLists(input?: unknown): Promise<{ lists?: Array<{ id: string; name: string }> }>\n getList(id: string): Promise<{ id: string; name: string }>\n getListMembersInfo(input: string): Promise<{ members?: Array<Record<string, unknown>> }>\n setListMember(listId: string, hash: string, input: unknown, options?: unknown): Promise<unknown>\n updateListMemberTags(listId: string, hash: string, input: unknown): Promise<unknown>\n }\n setConfig(input: unknown): void\n}\n\nexport interface MailchimpAdapterOptions {\n apiKey: string\n client?: MailchimpLike\n defaultSender: string\n siteName: string\n}\n\nfunction subscriberHash(email: string): string {\n return createHash(\"md5\").update(email.toLowerCase()).digest(\"hex\")\n}\n\nfunction serverFromApiKey(apiKey: string): string {\n const server = apiKey.includes(\"-\") ? apiKey.split(\"-\").pop() : undefined\n if (!server) {\n throw new Error(\"MAILCHIMP_API_KEY must include a datacenter suffix (e.g. key-us21).\")\n }\n return server\n}\n\nfunction tagNamesFromProperties(properties?: Record<string, string | number | null>): string[] {\n const raw = properties?.tags\n if (raw == null) {\n return []\n }\n return String(raw)\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean)\n}\n\nfunction stringValue(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") {\n return value\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value)\n }\n return fallback\n}\n\nexport function mailchimpAdapter(options: MailchimpAdapterOptions): MarketingAdapter {\n let configured = false\n const getClient = async (): Promise<MailchimpLike> => {\n const client =\n options.client ??\n ((await import(\"@mailchimp/mailchimp_marketing\")) as { default: MailchimpLike }).default\n if (!configured) {\n client.setConfig({ apiKey: options.apiKey, server: serverFromApiKey(options.apiKey) })\n configured = true\n }\n return client\n }\n const adminBase = `https://${serverFromApiKey(options.apiKey)}.admin.mailchimp.com`\n\n return {\n provider: \"mailchimp\",\n label: \"Mailchimp\",\n urls: {\n audiences: `${adminBase}/audience/`,\n broadcasts: `${adminBase}/campaigns/`,\n },\n audiences: {\n async create(input) {\n await (\n await getClient()\n ).lists.createList({\n name: input.name,\n permission_reminder: `You're receiving this email because you opted in via ${options.siteName}.`,\n email_type_option: true,\n contact: {\n company: options.siteName,\n address1: \"Address on file\",\n city: \"N/A\",\n state: \"N/A\",\n zip: \"00000\",\n country: \"US\",\n },\n campaign_defaults: {\n from_name: options.siteName,\n from_email: options.defaultSender,\n subject: \" \",\n language: \"en\",\n },\n })\n },\n async delete(input) {\n await (await getClient()).lists.deleteList(input.audienceId)\n },\n async get(id) {\n const list = await (await getClient()).lists.getList(id)\n return { id: list.id, name: list.name }\n },\n async list() {\n const result = await (await getClient()).lists.getAllLists({ count: 500 })\n return (result.lists ?? []).map((list) => ({ id: list.id, name: list.name }))\n },\n },\n contacts: {\n async delete(input) {\n await (await getClient()).lists.deleteListMember(input.audienceId, input.contactId)\n },\n async list(input) {\n const result = await (await getClient()).lists.getListMembersInfo(input.audienceId)\n return (result.members ?? []).map((member) => {\n const mergeFields = member.merge_fields as Record<string, unknown> | undefined\n return {\n createdAt:\n typeof member.timestamp_signup === \"string\" ? member.timestamp_signup : undefined,\n email: stringValue(member.email_address),\n firstName: typeof mergeFields?.FNAME === \"string\" ? mergeFields.FNAME : null,\n id: stringValue(member.id, stringValue(member.email_address)),\n lastName: typeof mergeFields?.LNAME === \"string\" ? mergeFields.LNAME : null,\n subscribed: member.status === \"subscribed\",\n }\n })\n },\n async upsert(input) {\n const client = await getClient()\n const hash = input.id ?? subscriberHash(input.email)\n const status = input.id\n ? input.subscribed\n ? \"subscribed\"\n : \"unsubscribed\"\n : input.subscribed\n ? \"subscribed\"\n : \"pending\"\n await client.lists.setListMember(\n input.audienceId,\n hash,\n {\n email_address: input.email,\n status,\n merge_fields: { FNAME: input.firstName ?? \"\", LNAME: input.lastName ?? \"\" },\n },\n { skipMergeValidation: true },\n )\n const tags = tagNamesFromProperties(input.properties)\n if (tags.length > 0) {\n await client.lists.updateListMemberTags(input.audienceId, subscriberHash(input.email), {\n tags: tags.map((name) => ({ name, status: \"active\" })),\n })\n }\n },\n },\n broadcasts: {\n async create(input) {\n const client = await getClient()\n const templateIdRaw =\n input.templateId != null && String(input.templateId).trim() !== \"\"\n ? String(input.templateId).trim()\n : undefined\n let templateIdParsed: number | undefined\n if (templateIdRaw != null) {\n const html = input.html\n if (html != null && html !== \"\") {\n throw new Error(\n \"Mailchimp broadcast: use either templateId (cloud template) or html, not both.\",\n )\n }\n const parsed = Number.parseInt(templateIdRaw, 10)\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid Mailchimp template id: \"${templateIdRaw}\".`)\n }\n templateIdParsed = parsed\n }\n const campaign = await client.campaigns.create({\n type: \"regular\",\n recipients: { list_id: input.audienceId },\n settings: {\n authenticate: true,\n auto_footer: false,\n from_email: options.defaultSender,\n from_name: options.siteName,\n inline_css: false,\n reply_to: input.replyTo?.trim() || options.defaultSender,\n subject_line: input.subject,\n title: input.name,\n to_name: \"*|FNAME|*\",\n },\n })\n if (!campaign.id) {\n throw new Error(\"Mailchimp did not return a campaign id.\")\n }\n if (templateIdParsed != null) {\n await client.campaigns.setContent(campaign.id, {\n template: { id: templateIdParsed },\n })\n } else {\n await client.campaigns.setContent(campaign.id, { html: input.html ?? \"\" })\n }\n },\n async delete(input) {\n await (await getClient()).campaigns.remove(input.broadcastId)\n },\n async list() {\n const result = await (await getClient()).campaigns.list({ count: 500 })\n return (result.campaigns ?? []).map((campaign) => {\n const settings = campaign.settings as Record<string, unknown> | undefined\n const sentAt = typeof campaign.send_time === \"string\" ? campaign.send_time : null\n return {\n id: stringValue(campaign.id),\n name: stringValue(settings?.title, stringValue(campaign.id)),\n scheduledAt: sentAt,\n sentAt,\n status: campaign.status === \"save\" ? \"draft\" : stringValue(campaign.status, \"draft\"),\n }\n })\n },\n async send(input) {\n const client = await getClient()\n const scheduledAt = input.scheduledAt?.trim()\n if (scheduledAt) {\n await client.campaigns.schedule(input.broadcastId, { schedule_time: scheduledAt })\n } else {\n await client.campaigns.send(input.broadcastId)\n }\n },\n },\n }\n}\n","import type { MarketingAdapter, MarketingBroadcast } from \"../types\"\n\ninterface ResendLike {\n broadcasts: {\n create(input: unknown): Promise<unknown>\n list(): Promise<{\n data?: { data?: Array<Record<string, unknown>> }\n error?: { message?: string }\n }>\n remove(id: string): Promise<unknown>\n send(id: string, input: unknown): Promise<unknown>\n }\n contacts: {\n create(input: unknown): Promise<{ data?: { id?: string }; error?: { message?: string } }>\n list(\n input: unknown,\n ): Promise<{ data?: { data?: Array<Record<string, unknown>> }; error?: { message?: string } }>\n remove(input: unknown): Promise<unknown>\n update(input: unknown): Promise<unknown>\n }\n segments: {\n create(input: unknown): Promise<unknown>\n get(id: string): Promise<{ data?: { id: string; name: string }; error?: { message?: string } }>\n list(): Promise<{\n data?: { data?: Array<{ id: string; name: string }> }\n error?: { message?: string }\n }>\n remove(id: string): Promise<unknown>\n }\n}\n\nexport interface ResendAdapterOptions {\n apiKey?: string\n client?: ResendLike\n defaultSender?: string\n}\n\nfunction assertNoResendError(result: unknown) {\n const error = typeof result === \"object\" && result && \"error\" in result ? result.error : undefined\n if (error && typeof error === \"object\" && \"message\" in error) {\n throw new Error(String(error.message))\n }\n}\n\nfunction stringifyFromRecord(value: unknown, fallback: string): string {\n if (typeof value === \"string\") {\n return value\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value)\n }\n return fallback\n}\n\nfunction mapBroadcast(row: Record<string, unknown>): MarketingBroadcast {\n return {\n id: stringifyFromRecord(row.id, \"\"),\n name: stringifyFromRecord(row.name, \"\"),\n scheduledAt: typeof row.scheduled_at === \"string\" ? row.scheduled_at : null,\n sentAt: typeof row.sent_at === \"string\" ? row.sent_at : null,\n status: stringifyFromRecord(row.status, \"draft\"),\n }\n}\n\nexport function resendAdapter(options: ResendAdapterOptions): MarketingAdapter {\n const getClient = async (): Promise<ResendLike> => {\n if (options.client) {\n return options.client\n }\n const resendModule = (await import(\"resend\")) as { Resend: new (key?: string) => unknown }\n return new resendModule.Resend(options.apiKey) as ResendLike\n }\n\n return {\n provider: \"resend\",\n label: \"Resend\",\n urls: {\n audiences: \"https://resend.com/audiences\",\n audience: (id) => `https://resend.com/audiences/${id}`,\n broadcasts: \"https://resend.com/broadcasts\",\n broadcast: (id) => `https://resend.com/broadcasts/${id}`,\n },\n audiences: {\n async create(input) {\n assertNoResendError(await (await getClient()).segments.create({ name: input.name }))\n },\n async delete(input) {\n assertNoResendError(await (await getClient()).segments.remove(input.audienceId))\n },\n async get(id) {\n const result = await (await getClient()).segments.get(id)\n assertNoResendError(result)\n return result.data ? { id: result.data.id, name: result.data.name } : null\n },\n async list() {\n const result = await (await getClient()).segments.list()\n assertNoResendError(result)\n return result.data?.data ?? []\n },\n },\n contacts: {\n async delete(input) {\n assertNoResendError(\n await (\n await getClient()\n ).contacts.remove({ audienceId: input.audienceId, id: input.contactId }),\n )\n },\n async list(input) {\n const result = await (await getClient()).contacts.list({ audienceId: input.audienceId })\n assertNoResendError(result)\n return (result.data?.data ?? []).map((row) => ({\n createdAt: typeof row.created_at === \"string\" ? row.created_at : undefined,\n email: stringifyFromRecord(row.email, \"\"),\n firstName: typeof row.first_name === \"string\" ? row.first_name : null,\n id: String(row.id),\n lastName: typeof row.last_name === \"string\" ? row.last_name : null,\n subscribed: row.unsubscribed === false,\n }))\n },\n async upsert(input) {\n const client = await getClient()\n const unsubscribed = !input.subscribed\n const payload = {\n audienceId: input.audienceId,\n email: input.email,\n firstName: input.firstName,\n lastName: input.lastName,\n unsubscribed,\n }\n assertNoResendError(\n input.id\n ? await client.contacts.update({ ...payload, id: input.id })\n : await client.contacts.create(payload),\n )\n },\n },\n broadcasts: {\n async create(input) {\n if (input.templateId != null && String(input.templateId).trim() !== \"\") {\n throw new Error(\n \"Resend broadcasts do not support templateId; use html or react, or use the Mailchimp adapter for cloud templates.\",\n )\n }\n assertNoResendError(\n await (\n await getClient()\n ).broadcasts.create({\n audienceId: input.audienceId,\n from: options.defaultSender,\n html: input.html,\n name: input.name,\n react: input.react,\n replyTo: input.replyTo,\n subject: input.subject,\n }),\n )\n },\n async delete(input) {\n assertNoResendError(await (await getClient()).broadcasts.remove(input.broadcastId))\n },\n async list() {\n const result = await (await getClient()).broadcasts.list()\n assertNoResendError(result)\n return (result.data?.data ?? []).map((row) => mapBroadcast(row))\n },\n async send(input) {\n assertNoResendError(\n await (\n await getClient()\n ).broadcasts.send(input.broadcastId, { scheduledAt: input.scheduledAt }),\n )\n },\n },\n }\n}\n"],"mappings":"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","names":["adapters_exports","__export","mailchimpAdapter","resendAdapter","__toCommonJS","import_node_crypto","subscriberHash","email","serverFromApiKey","apiKey","server","tagNamesFromProperties","properties","raw","tag","stringValue","value","fallback","mailchimpAdapter","options","configured","getClient","client","adminBase","input","id","list","member","mergeFields","hash","status","tags","name","templateIdRaw","templateIdParsed","html","parsed","campaign","settings","sentAt","scheduledAt","assertNoResendError","result","error","stringifyFromRecord","value","fallback","mapBroadcast","row","resendAdapter","options","getClient","resendModule","id","input","client","unsubscribed","payload"]}
@@ -0,0 +1,3 @@
1
+ export { mailchimpAdapter, type MailchimpAdapterOptions } from "./mailchimp";
2
+ export { resendAdapter, type ResendAdapterOptions } from "./resend";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{a,b}from"../chunk-KBN7IE22.js";export{a as mailchimpAdapter,b as resendAdapter};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,45 @@
1
+ import type { MarketingAdapter } from "../types";
2
+ interface MailchimpLike {
3
+ campaigns: {
4
+ create(input: unknown): Promise<{
5
+ id?: string;
6
+ }>;
7
+ list(input?: unknown): Promise<{
8
+ campaigns?: Array<Record<string, unknown>>;
9
+ }>;
10
+ remove(id: string): Promise<unknown>;
11
+ schedule(id: string, input: unknown): Promise<unknown>;
12
+ send(id: string): Promise<unknown>;
13
+ setContent(id: string, input: unknown): Promise<unknown>;
14
+ };
15
+ lists: {
16
+ createList(input: unknown): Promise<unknown>;
17
+ deleteList(id: string): Promise<unknown>;
18
+ deleteListMember(listId: string, contactId: string): Promise<unknown>;
19
+ getAllLists(input?: unknown): Promise<{
20
+ lists?: Array<{
21
+ id: string;
22
+ name: string;
23
+ }>;
24
+ }>;
25
+ getList(id: string): Promise<{
26
+ id: string;
27
+ name: string;
28
+ }>;
29
+ getListMembersInfo(input: string): Promise<{
30
+ members?: Array<Record<string, unknown>>;
31
+ }>;
32
+ setListMember(listId: string, hash: string, input: unknown, options?: unknown): Promise<unknown>;
33
+ updateListMemberTags(listId: string, hash: string, input: unknown): Promise<unknown>;
34
+ };
35
+ setConfig(input: unknown): void;
36
+ }
37
+ export interface MailchimpAdapterOptions {
38
+ apiKey: string;
39
+ client?: MailchimpLike;
40
+ defaultSender: string;
41
+ siteName: string;
42
+ }
43
+ export declare function mailchimpAdapter(options: MailchimpAdapterOptions): MarketingAdapter;
44
+ export {};
45
+ //# sourceMappingURL=mailchimp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailchimp.d.ts","sourceRoot":"","sources":["../../src/adapters/mailchimp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,UAAU,aAAa;IACrB,SAAS,EAAE;QACT,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;YAAE,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAChD,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;YAAE,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;SAAE,CAAC,CAAA;QAC9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAClC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACzD,CAAA;IACD,KAAK,EAAE;QACL,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC5C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACrE,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;YAAE,KAAK,CAAC,EAAE,KAAK,CAAC;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC,CAAA;QACtF,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC1D,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;SAAE,CAAC,CAAA;QACxF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAChG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACrF,CAAA;IACD,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAmCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CAmLnF"}
@@ -0,0 +1,68 @@
1
+ import type { MarketingAdapter } from "../types";
2
+ interface ResendLike {
3
+ broadcasts: {
4
+ create(input: unknown): Promise<unknown>;
5
+ list(): Promise<{
6
+ data?: {
7
+ data?: Array<Record<string, unknown>>;
8
+ };
9
+ error?: {
10
+ message?: string;
11
+ };
12
+ }>;
13
+ remove(id: string): Promise<unknown>;
14
+ send(id: string, input: unknown): Promise<unknown>;
15
+ };
16
+ contacts: {
17
+ create(input: unknown): Promise<{
18
+ data?: {
19
+ id?: string;
20
+ };
21
+ error?: {
22
+ message?: string;
23
+ };
24
+ }>;
25
+ list(input: unknown): Promise<{
26
+ data?: {
27
+ data?: Array<Record<string, unknown>>;
28
+ };
29
+ error?: {
30
+ message?: string;
31
+ };
32
+ }>;
33
+ remove(input: unknown): Promise<unknown>;
34
+ update(input: unknown): Promise<unknown>;
35
+ };
36
+ segments: {
37
+ create(input: unknown): Promise<unknown>;
38
+ get(id: string): Promise<{
39
+ data?: {
40
+ id: string;
41
+ name: string;
42
+ };
43
+ error?: {
44
+ message?: string;
45
+ };
46
+ }>;
47
+ list(): Promise<{
48
+ data?: {
49
+ data?: Array<{
50
+ id: string;
51
+ name: string;
52
+ }>;
53
+ };
54
+ error?: {
55
+ message?: string;
56
+ };
57
+ }>;
58
+ remove(id: string): Promise<unknown>;
59
+ };
60
+ }
61
+ export interface ResendAdapterOptions {
62
+ apiKey?: string;
63
+ client?: ResendLike;
64
+ defaultSender?: string;
65
+ }
66
+ export declare function resendAdapter(options: ResendAdapterOptions): MarketingAdapter;
67
+ export {};
68
+ //# sourceMappingURL=resend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../src/adapters/resend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,UAAU,CAAA;AAEpE,UAAU,UAAU;IAClB,UAAU,EAAE;QACV,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,IAAI,OAAO,CAAC;YACd,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;aAAE,CAAA;YAChD,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAC7B,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACnD,CAAA;IACD,QAAQ,EAAE;QACR,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,EAAE,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;QACzF,IAAI,CACF,KAAK,EAAE,OAAO,GACb,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;aAAE,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;QAC9F,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACzC,CAAA;IACD,QAAQ,EAAE;QACR,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;QAC/F,IAAI,IAAI,OAAO,CAAC;YACd,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,KAAK,CAAC;oBAAE,EAAE,EAAE,MAAM,CAAC;oBAAC,IAAI,EAAE,MAAM,CAAA;iBAAE,CAAC,CAAA;aAAE,CAAA;YACrD,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAC7B,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACrC,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA6BD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,gBAAgB,CA+G7E"}
@@ -0,0 +1,23 @@
1
+ export declare function AudienceSelect(): null;
2
+ export declare function MarketingMenu({ basePath }: {
3
+ basePath?: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ export declare function AudienceTable({ audiences }: {
6
+ audiences: Array<{
7
+ id: string;
8
+ name: string;
9
+ }>;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ export declare function ContactsTable({ contacts }: {
12
+ contacts: Array<{
13
+ email: string;
14
+ id: string;
15
+ }>;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ export declare function BroadcastsTable({ broadcasts, }: {
18
+ broadcasts: Array<{
19
+ id: string;
20
+ name: string;
21
+ }>;
22
+ }): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/admin/components.tsx"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,SAE7B;AAOD,wBAAgB,aAAa,CAAC,EAAE,QAAa,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,2CAOrE;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2CAY9F;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2CAY7F;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,GACX,EAAE;IACD,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD,2CAYA"}
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var v=(e,t)=>{for(var r in t)d(e,r,{get:t[r],enumerable:!0})},B=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of y(t))!x.call(e,i)&&i!==r&&d(e,i,{get:()=>t[i],enumerable:!(o=A(t,i))||o.enumerable});return e};var k=e=>B(d({},"__esModule",{value:!0}),e);var L={};v(L,{AudienceDetail:()=>f,AudienceList:()=>b,AudienceSelect:()=>u,AudienceTable:()=>l,BroadcastList:()=>g,BroadcastsTable:()=>p,ContactsTable:()=>m,MarketingMenu:()=>s,defaultAdminComponentPath:()=>T});module.exports=k(L);var n=require("react/jsx-runtime");function u(){return null}function c(e,t){return["/admin",e?.replace(/^\/+|\/+$/g,""),t].filter(Boolean).join("/")}function s({basePath:e=""}){return(0,n.jsxs)("nav",{children:[(0,n.jsx)("a",{href:c(e,"audience"),children:"Audience"}),(0,n.jsx)("a",{href:c(e,"broadcast"),children:"Broadcasts"})]})}function l({audiences:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.name})},t.id))})})}function m({contacts:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.email})},t.id))})})}function p({broadcasts:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.name})},t.id))})})}var a=require("react/jsx-runtime");function b(){return(0,a.jsx)("div",{children:"Audience"})}function f(){return(0,a.jsx)("div",{children:"Audience Detail"})}function g(){return(0,a.jsx)("div",{children:"Broadcasts"})}var T="payload-plugin-marketing/admin";0&&(module.exports={AudienceDetail,AudienceList,AudienceSelect,AudienceTable,BroadcastList,BroadcastsTable,ContactsTable,MarketingMenu,defaultAdminComponentPath});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/index.ts","../../src/admin/components.tsx","../../src/admin/views.tsx"],"sourcesContent":["export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n\nexport {\n AudienceSelect,\n AudienceTable,\n BroadcastsTable,\n ContactsTable,\n MarketingMenu,\n} from \"./components\"\nexport { AudienceDetail, AudienceList, BroadcastList } from \"./views\"\n","\"use client\"\n\nimport React from \"react\"\n\nexport function AudienceSelect() {\n return null\n}\n\nfunction adminHref(basePath: string | undefined, segment: string): string {\n const normalized = basePath?.replace(/^\\/+|\\/+$/g, \"\")\n return [\"/admin\", normalized, segment].filter(Boolean).join(\"/\")\n}\n\nexport function MarketingMenu({ basePath = \"\" }: { basePath?: string }) {\n return (\n <nav>\n <a href={adminHref(basePath, \"audience\")}>Audience</a>\n <a href={adminHref(basePath, \"broadcast\")}>Broadcasts</a>\n </nav>\n )\n}\n\nexport function AudienceTable({ audiences }: { audiences: Array<{ id: string; name: string }> }) {\n return (\n <table>\n <tbody>\n {audiences.map((audience) => (\n <tr key={audience.id}>\n <td>{audience.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function ContactsTable({ contacts }: { contacts: Array<{ email: string; id: string }> }) {\n return (\n <table>\n <tbody>\n {contacts.map((contact) => (\n <tr key={contact.id}>\n <td>{contact.email}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function BroadcastsTable({\n broadcasts,\n}: {\n broadcasts: Array<{ id: string; name: string }>\n}) {\n return (\n <table>\n <tbody>\n {broadcasts.map((broadcast) => (\n <tr key={broadcast.id}>\n <td>{broadcast.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","import React from \"react\"\n\nexport function AudienceList() {\n return <div>Audience</div>\n}\n\nexport function AudienceDetail() {\n return <div>Audience Detail</div>\n}\n\nexport function BroadcastList() {\n return <div>Broadcasts</div>\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,iBAAAC,EAAA,mBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,oBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAX,GCeI,IAAAY,EAAA,6BAXG,SAASC,GAAiB,CAC/B,OAAO,IACT,CAEA,SAASC,EAAUC,EAA8BC,EAAyB,CAExE,MAAO,CAAC,SADWD,GAAU,QAAQ,aAAc,EAAE,EACvBC,CAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CACjE,CAEO,SAASC,EAAc,CAAE,SAAAF,EAAW,EAAG,EAA0B,CACtE,SACE,QAAC,OACC,oBAAC,KAAE,KAAMD,EAAUC,EAAU,UAAU,EAAG,oBAAQ,KAClD,OAAC,KAAE,KAAMD,EAAUC,EAAU,WAAW,EAAG,sBAAU,GACvD,CAEJ,CAEO,SAASG,EAAc,CAAE,UAAAC,CAAU,EAAuD,CAC/F,SACE,OAAC,SACC,mBAAC,SACE,SAAAA,EAAU,IAAKC,MACd,OAAC,MACC,mBAAC,MAAI,SAAAA,EAAS,KAAK,GADZA,EAAS,EAElB,CACD,EACH,EACF,CAEJ,CAEO,SAASC,EAAc,CAAE,SAAAC,CAAS,EAAuD,CAC9F,SACE,OAAC,SACC,mBAAC,SACE,SAAAA,EAAS,IAAKC,MACb,OAAC,MACC,mBAAC,MAAI,SAAAA,EAAQ,MAAM,GADZA,EAAQ,EAEjB,CACD,EACH,EACF,CAEJ,CAEO,SAASC,EAAgB,CAC9B,WAAAC,CACF,EAEG,CACD,SACE,OAAC,SACC,mBAAC,SACE,SAAAA,EAAW,IAAKC,MACf,OAAC,MACC,mBAAC,MAAI,SAAAA,EAAU,KAAK,GADbA,EAAU,EAEnB,CACD,EACH,EACF,CAEJ,CC/DS,IAAAC,EAAA,6BADF,SAASC,GAAe,CAC7B,SAAO,OAAC,OAAI,oBAAQ,CACtB,CAEO,SAASC,GAAiB,CAC/B,SAAO,OAAC,OAAI,2BAAe,CAC7B,CAEO,SAASC,GAAgB,CAC9B,SAAO,OAAC,OAAI,sBAAU,CACxB,CFZO,IAAMC,EAA4B","names":["admin_exports","__export","AudienceDetail","AudienceList","AudienceSelect","AudienceTable","BroadcastList","BroadcastsTable","ContactsTable","MarketingMenu","defaultAdminComponentPath","__toCommonJS","import_jsx_runtime","AudienceSelect","adminHref","basePath","segment","MarketingMenu","AudienceTable","audiences","audience","ContactsTable","contacts","contact","BroadcastsTable","broadcasts","broadcast","import_jsx_runtime","AudienceList","AudienceDetail","BroadcastList","defaultAdminComponentPath"]}
@@ -0,0 +1,4 @@
1
+ export declare const defaultAdminComponentPath = "payload-plugin-marketing/admin";
2
+ export { AudienceSelect, AudienceTable, BroadcastsTable, ContactsTable, MarketingMenu, } from "./components";
3
+ export { AudienceDetail, AudienceList, BroadcastList } from "./views";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,mCAAmC,CAAA;AAEzE,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as s}from"react/jsx-runtime";function a(){return null}function i(e,n){return["/admin",e?.replace(/^\/+|\/+$/g,""),n].filter(Boolean).join("/")}function d({basePath:e=""}){return s("nav",{children:[t("a",{href:i(e,"audience"),children:"Audience"}),t("a",{href:i(e,"broadcast"),children:"Broadcasts"})]})}function o({audiences:e}){return t("table",{children:t("tbody",{children:e.map(n=>t("tr",{children:t("td",{children:n.name})},n.id))})})}function c({contacts:e}){return t("table",{children:t("tbody",{children:e.map(n=>t("tr",{children:t("td",{children:n.email})},n.id))})})}function u({broadcasts:e}){return t("table",{children:t("tbody",{children:e.map(n=>t("tr",{children:t("td",{children:n.name})},n.id))})})}import{jsx as r}from"react/jsx-runtime";function l(){return r("div",{children:"Audience"})}function m(){return r("div",{children:"Audience Detail"})}function p(){return r("div",{children:"Broadcasts"})}var x="payload-plugin-marketing/admin";export{m as AudienceDetail,l as AudienceList,a as AudienceSelect,o as AudienceTable,p as BroadcastList,u as BroadcastsTable,c as ContactsTable,d as MarketingMenu,x as defaultAdminComponentPath};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/components.tsx","../../src/admin/views.tsx","../../src/admin/index.ts"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\n\nexport function AudienceSelect() {\n return null\n}\n\nfunction adminHref(basePath: string | undefined, segment: string): string {\n const normalized = basePath?.replace(/^\\/+|\\/+$/g, \"\")\n return [\"/admin\", normalized, segment].filter(Boolean).join(\"/\")\n}\n\nexport function MarketingMenu({ basePath = \"\" }: { basePath?: string }) {\n return (\n <nav>\n <a href={adminHref(basePath, \"audience\")}>Audience</a>\n <a href={adminHref(basePath, \"broadcast\")}>Broadcasts</a>\n </nav>\n )\n}\n\nexport function AudienceTable({ audiences }: { audiences: Array<{ id: string; name: string }> }) {\n return (\n <table>\n <tbody>\n {audiences.map((audience) => (\n <tr key={audience.id}>\n <td>{audience.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function ContactsTable({ contacts }: { contacts: Array<{ email: string; id: string }> }) {\n return (\n <table>\n <tbody>\n {contacts.map((contact) => (\n <tr key={contact.id}>\n <td>{contact.email}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function BroadcastsTable({\n broadcasts,\n}: {\n broadcasts: Array<{ id: string; name: string }>\n}) {\n return (\n <table>\n <tbody>\n {broadcasts.map((broadcast) => (\n <tr key={broadcast.id}>\n <td>{broadcast.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","import React from \"react\"\n\nexport function AudienceList() {\n return <div>Audience</div>\n}\n\nexport function AudienceDetail() {\n return <div>Audience Detail</div>\n}\n\nexport function BroadcastList() {\n return <div>Broadcasts</div>\n}\n","export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n\nexport {\n AudienceSelect,\n AudienceTable,\n BroadcastsTable,\n ContactsTable,\n MarketingMenu,\n} from \"./components\"\nexport { AudienceDetail, AudienceList, BroadcastList } from \"./views\"\n"],"mappings":"AAeI,OACE,OAAAA,EADF,QAAAC,MAAA,oBAXG,SAASC,GAAiB,CAC/B,OAAO,IACT,CAEA,SAASC,EAAUC,EAA8BC,EAAyB,CAExE,MAAO,CAAC,SADWD,GAAU,QAAQ,aAAc,EAAE,EACvBC,CAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CACjE,CAEO,SAASC,EAAc,CAAE,SAAAF,EAAW,EAAG,EAA0B,CACtE,OACEH,EAAC,OACC,UAAAD,EAAC,KAAE,KAAMG,EAAUC,EAAU,UAAU,EAAG,oBAAQ,EAClDJ,EAAC,KAAE,KAAMG,EAAUC,EAAU,WAAW,EAAG,sBAAU,GACvD,CAEJ,CAEO,SAASG,EAAc,CAAE,UAAAC,CAAU,EAAuD,CAC/F,OACER,EAAC,SACC,SAAAA,EAAC,SACE,SAAAQ,EAAU,IAAKC,GACdT,EAAC,MACC,SAAAA,EAAC,MAAI,SAAAS,EAAS,KAAK,GADZA,EAAS,EAElB,CACD,EACH,EACF,CAEJ,CAEO,SAASC,EAAc,CAAE,SAAAC,CAAS,EAAuD,CAC9F,OACEX,EAAC,SACC,SAAAA,EAAC,SACE,SAAAW,EAAS,IAAKC,GACbZ,EAAC,MACC,SAAAA,EAAC,MAAI,SAAAY,EAAQ,MAAM,GADZA,EAAQ,EAEjB,CACD,EACH,EACF,CAEJ,CAEO,SAASC,EAAgB,CAC9B,WAAAC,CACF,EAEG,CACD,OACEd,EAAC,SACC,SAAAA,EAAC,SACE,SAAAc,EAAW,IAAKC,GACff,EAAC,MACC,SAAAA,EAAC,MAAI,SAAAe,EAAU,KAAK,GADbA,EAAU,EAEnB,CACD,EACH,EACF,CAEJ,CC/DS,cAAAC,MAAA,oBADF,SAASC,GAAe,CAC7B,OAAOD,EAAC,OAAI,oBAAQ,CACtB,CAEO,SAASE,GAAiB,CAC/B,OAAOF,EAAC,OAAI,2BAAe,CAC7B,CAEO,SAASG,GAAgB,CAC9B,OAAOH,EAAC,OAAI,sBAAU,CACxB,CCZO,IAAMI,EAA4B","names":["jsx","jsxs","AudienceSelect","adminHref","basePath","segment","MarketingMenu","AudienceTable","audiences","audience","ContactsTable","contacts","contact","BroadcastsTable","broadcasts","broadcast","jsx","AudienceList","AudienceDetail","BroadcastList","defaultAdminComponentPath"]}
@@ -0,0 +1,4 @@
1
+ export declare function AudienceList(): import("react/jsx-runtime").JSX.Element;
2
+ export declare function AudienceDetail(): import("react/jsx-runtime").JSX.Element;
3
+ export declare function BroadcastList(): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/admin/views.tsx"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,4CAE3B;AAED,wBAAgB,cAAc,4CAE7B;AAED,wBAAgB,aAAa,4CAE5B"}
@@ -0,0 +1,2 @@
1
+ function d(e,n){if(!n)return e;let{overrides:r,...t}=n;return{...e,...t,...r??{},admin:{..."admin"in e?e.admin:void 0,...t.admin??{},...r?.admin??{}}}}function f(e){return{type:"row",fields:e}}function B(e,n,r){let t=r?.fields??{};return{...{slug:e,labels:r?.labels??n,fields:[f([d({name:"name",type:"text",label:"Name (lowercase, no special characters)",required:!0,admin:{width:"50%"}},t.name),d({name:"label",type:"text",label:"Label",localized:!0,admin:{width:"50%"}},t.label)]),f([d({name:"width",type:"number",label:"Field Width (percentage)",admin:{width:"33%"}},t.width),d({name:"placeholder",type:"text",label:"Placeholder",localized:!0,admin:{width:"33%"}},t.placeholder),d({name:"defaultValue",type:"text",label:"Default Value",localized:!0,admin:{width:"33%"}},t.defaultValue)]),d({name:"required",type:"checkbox",label:"Required"},t.required)]},...r?.overrides??{}}}function C(e){let n=e?.fields??{};return{...{slug:"acceptance",labels:e?.labels??{singular:"Acceptance",plural:"Acceptances"},fields:[d({name:"name",type:"text",label:"Name (lowercase, no special characters)",required:!0,admin:{width:"50%"}},n.name),d({name:"label",type:"richText",label:"Label",localized:!0,admin:{width:"50%"}},n.label),f([d({name:"width",type:"number",label:"Field Width (percentage)",admin:{width:"50%"}},n.width),d({name:"required",type:"checkbox",label:"Required"},n.required)])]},...e?.overrides??{}}}function p(e={}){return{url:B("url",{singular:"URL",plural:"URLs"},e.url||void 0),phone:B("phone",{singular:"Phone",plural:"Phones"},e.phone||void 0),acceptance:C(e.acceptance||void 0)}}var g="__website",b="__startedAt",A=1500,_={acceptance:5,checkbox:5,country:200,date:100,email:320,message:5e3,number:64,payment:1e3,phone:50,select:200,state:200,text:200,textarea:5e3,upload:1e3,url:2048};function R(e){return e===g||e===b}function D(e){let n=e.find(t=>t.field===g)?.value,r=e.find(t=>t.field===b)?.value;return{honeypot:typeof n=="string"?n:"",startedAt:typeof r=="string"||typeof r=="number"?String(r):""}}function v(e){return typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)?String(e):typeof e=="string"?e.trim():""}function N(e,n){if(!n)return!e.required;if(n.length>(_[e.blockType]??1e3))return!1;if(e.blockType==="email")return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n);if(e.blockType==="url")try{return new URL(n),!0}catch{return!1}return e.blockType==="number"?Number.isFinite(Number(n)):e.blockType==="checkbox"||e.blockType==="acceptance"?n==="true"||n==="false":e.blockType==="select"&&e.options?.length?e.options.some(r=>r.value===n):!0}function V(e,n){return e.required?e.blockType==="acceptance"?n==="true":!!n:!0}function k(e){let n=D(e.submissionData??[]);if(n.honeypot.trim())return{ok:!1,error:"Invalid submission."};let r=Number(n.startedAt);if(!Number.isFinite(r))return{ok:!1,error:"Invalid submission."};if(e.now-r<1500)return{ok:!1,error:"Form submitted too quickly."};let t=e.formFields.flatMap(o=>o.name&&o.blockType in _?[{...o,name:o.name}]:[]),l=new Map(t.map(o=>[o.name,o])),a=[],u=new Set;for(let o of e.submissionData??[]){let i=o.field?.trim();if(!i||R(i))continue;if(u.has(i))return{ok:!1,error:`Field "${i}" was submitted more than once.`};u.add(i);let c=l.get(i);if(!c)return{ok:!1,error:`Unexpected field "${i}".`};let s=v(o.value);if(!N(c,s))return{ok:!1,error:`Field "${i}" is invalid.`};a.push({field:i,value:s})}for(let o of t){let i=a.find(c=>c.field===o.name)?.value;if(!V(o,i))return{ok:!1,error:`Field "${o.name}" is required.`}}return{ok:!0,data:a}}function F(e){return Object.fromEntries(e.flatMap(n=>n.field?[[n.field,v(n.value)]]:[]))}function O(e,n){return e.replace(/\{\{\s*([\w.-]+)\s*\}\}/g,(r,t)=>n[t]??"")}function y(e,n){return(e??"").split(",").map(r=>O(r,n).trim()).filter(Boolean)}function S(e,n){let r=e.submissionData?.find(t=>t.field===n)?.value;if(typeof r=="string")return r;if(r!=null&&(typeof r=="number"&&Number.isFinite(r)||typeof r=="boolean"))return String(r)}async function I(e,n,r="forms"){return typeof e.form=="string"?await n.payload.findByID({collection:r,depth:0,id:e.form,overrideAccess:!0}):e.form}function h(e={}){return async({data:n,operation:r,req:t})=>{if(r!=="create")return n;let l=await I(n,t,e.formsSlug),a=k({formFields:l?.fields??[],now:Date.now(),submissionData:n?.submissionData??[]});if(!a.ok)throw new Error(a.error);return n.submissionData=a.data,n}}function w(e,n={}){return async({data:r,operation:t,req:l})=>{if(t!=="create")return r;let u=await I(r,l,n.formsSlug);if(u?.event!=="lead"||!u.audienceId)return r;let o=r,i=S(o,"email");if(!i)return r;let c=F(o.submissionData??[]),s=y(u.tags,c);return await e.contacts.upsert({audienceId:u.audienceId,email:i,firstName:S(o,"firstName"),lastName:S(o,"lastName"),properties:s.length>0?{tags:s.join(",")}:void 0,subscribed:!0}),r}}function M(e,n){return"name"in e&&e.name===n}function T(e){return!!(e&&typeof e=="object"&&"slug"in e&&typeof e.slug=="string")}function E(e){return!!(e&&typeof e=="object")}function P(e,n){return!("name"in n)||!n.name?[...e,n]:e.some(r=>M(r,n.name))?e.map(r=>M(r,n.name)?n:r):[...e,n]}function q(e){let n=e.admin?.components?.audienceSelect??{path:"payload-plugin-marketing/admin",exportName:"AudienceSelect"};return[{name:"event",type:"select",defaultValue:"submission",options:[{label:"Submission",value:"submission"},{label:"Lead",value:"lead"}]},{name:"audienceId",type:"text",label:"Audience ID",required:!1,admin:{condition:(r,t)=>t?.event==="lead",components:{Field:n}},validate:(r,{siblingData:t}={})=>t?.event==="lead"&&!r?"Audience is required for lead forms.":!0},{name:"tags",type:"textarea",label:"Tags",admin:{condition:(r,t)=>t?.event==="lead",description:"Optional comma-separated tags. Use {{fieldName}} to insert submitted values."}}]}function L(e,n){let r=[...e.fields],t=r.findIndex(s=>M(s,"fields")&&s.type==="blocks");if(t<0){if(n.formBuilder?.strict===!1)return e;throw new Error(`Could not find a blocks field named "fields" on form-builder forms collection "${e.slug}".`)}let l=r[t],a=Array.isArray(l.blocks)?l.blocks:[],u=n.formBuilder?.fields??{},o=a.map(s=>{if(!T(s))return s;let m=u[s.slug];return!m||!E(s)?s:{...s,...m.overrides??{},...m.labels?{labels:m.labels}:{}}}),i=new Set(o.flatMap(s=>T(s)?[s.slug]:[])),c=Object.values(p(n.formBuilder?.fields)).filter(s=>!i.has(s.slug));r[t]={...l,blocks:[...o,...c]};for(let s of q(n))r.splice(0,r.length,...P(r,s));return{...e,fields:r}}function H(e,n){let r=e.hooks??{};return{...e,hooks:{...r,beforeChange:[...r.beforeChange??[],h({formsSlug:n.formBuilder?.formsSlug}),w(n.adapter,{formsSlug:n.formBuilder?.formsSlug})]}}}function x(e,n){let r=n.formBuilder?.formsSlug??"forms",t=n.formBuilder?.submissionsSlug??"form-submissions",l=n.formBuilder?.strict??!0,a=e??[],u=a.some(i=>i.slug===r),o=a.some(i=>i.slug===t);if(l&&!u)throw new Error(`Could not find form-builder forms collection "${r}".`);if(l&&!o)throw new Error(`Could not find form-builder submissions collection "${t}".`);return a.map(i=>i.slug===r?L(i,n):i.slug===t?H(i,n):i)}export{C as a,p as b,g as c,b as d,A as e,k as f,F as g,O as h,y as i,h as j,w as k,x as l};
2
+ //# sourceMappingURL=chunk-4RBNCG5Q.js.map