payload-plugin-marketing 0.9.0 → 0.9.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.
Files changed (66) hide show
  1. package/README.md +62 -32
  2. package/dist/adapters/mailchimp.cjs +2 -0
  3. package/dist/adapters/mailchimp.cjs.map +1 -0
  4. package/dist/adapters/mailchimp.js +2 -0
  5. package/dist/adapters/mailchimp.js.map +1 -0
  6. package/dist/adapters/resend.cjs +2 -0
  7. package/dist/adapters/resend.cjs.map +1 -0
  8. package/dist/adapters/resend.js +2 -0
  9. package/dist/adapters/resend.js.map +1 -0
  10. package/dist/admin/audience-buttons.d.ts +6 -0
  11. package/dist/admin/audience-buttons.d.ts.map +1 -0
  12. package/dist/admin/broadcasts-table.d.ts +14 -0
  13. package/dist/admin/broadcasts-table.d.ts.map +1 -0
  14. package/dist/admin/components.d.ts +2 -1
  15. package/dist/admin/components.d.ts.map +1 -1
  16. package/dist/admin/contacts-table.d.ts +12 -0
  17. package/dist/admin/contacts-table.d.ts.map +1 -0
  18. package/dist/admin/create-broadcast-button.d.ts +6 -0
  19. package/dist/admin/create-broadcast-button.d.ts.map +1 -0
  20. package/dist/admin/date-format.d.ts +2 -0
  21. package/dist/admin/date-format.d.ts.map +1 -0
  22. package/dist/admin/index.cjs +1 -1
  23. package/dist/admin/index.cjs.map +1 -1
  24. package/dist/admin/index.js +1 -1
  25. package/dist/admin/index.js.map +1 -1
  26. package/dist/admin/paths.d.ts +2 -0
  27. package/dist/admin/paths.d.ts.map +1 -0
  28. package/dist/admin/payload-modal.d.ts +13 -0
  29. package/dist/admin/payload-modal.d.ts.map +1 -0
  30. package/dist/admin/provider-dashboard-link.d.ts +8 -0
  31. package/dist/admin/provider-dashboard-link.d.ts.map +1 -0
  32. package/dist/admin/use-marketing-api.d.ts +5 -0
  33. package/dist/admin/use-marketing-api.d.ts.map +1 -0
  34. package/dist/endpoints/marketing-endpoints.d.ts +3 -0
  35. package/dist/endpoints/marketing-endpoints.d.ts.map +1 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.ts +5 -5
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/marketing-integration.d.ts +15 -0
  43. package/dist/marketing-integration.d.ts.map +1 -0
  44. package/dist/plugin.d.ts +1 -1
  45. package/dist/plugin.d.ts.map +1 -1
  46. package/dist/types.d.ts +27 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +9 -9
  49. package/dist/actions/factories.d.ts +0 -18
  50. package/dist/actions/factories.d.ts.map +0 -1
  51. package/dist/actions/index.cjs +0 -2
  52. package/dist/actions/index.cjs.map +0 -1
  53. package/dist/actions/index.d.ts +0 -2
  54. package/dist/actions/index.d.ts.map +0 -1
  55. package/dist/actions/index.js +0 -2
  56. package/dist/actions/index.js.map +0 -1
  57. package/dist/adapters/index.cjs +0 -2
  58. package/dist/adapters/index.cjs.map +0 -1
  59. package/dist/adapters/index.d.ts +0 -3
  60. package/dist/adapters/index.d.ts.map +0 -1
  61. package/dist/adapters/index.js +0 -2
  62. package/dist/adapters/index.js.map +0 -1
  63. package/dist/chunk-KBN7IE22.js +0 -2
  64. package/dist/chunk-KBN7IE22.js.map +0 -1
  65. package/dist/chunk-RBBHOL35.js +0 -2
  66. package/dist/chunk-RBBHOL35.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ import type { MarketingAdapter, MarketingEffectivePermissions, MarketingPluginPermissions } from "./types";
2
+ import type { Payload, PayloadRequest } from "payload";
3
+ export declare const MARKETING_CUSTOM_CONFIG_KEY = "payloadPluginMarketing";
4
+ export interface MarketingIntegrationState {
5
+ adapter: MarketingAdapter;
6
+ adminBasePath: string;
7
+ permissions?: MarketingPluginPermissions;
8
+ }
9
+ /** Resolves endpoint access flags. If `permissions` is absent (plugin option omitted), all actions are allowed for authenticated users. */
10
+ export declare function resolveMarketingPermissions(permissions: MarketingPluginPermissions | undefined): MarketingEffectivePermissions;
11
+ export declare function marketingMetaAllowed(effective: MarketingEffectivePermissions): boolean;
12
+ export declare function getMarketingIntegration(payload: Payload): MarketingIntegrationState;
13
+ export declare function tryGetMarketingIntegration(payload: Payload): MarketingIntegrationState | undefined;
14
+ export declare function getMarketingIntegrationFromRequest(req: PayloadRequest): MarketingIntegrationState;
15
+ //# sourceMappingURL=marketing-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-integration.d.ts","sourceRoot":"","sources":["../src/marketing-integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEtD,eAAO,MAAM,2BAA2B,2BAA2B,CAAA;AAEnE,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,gBAAgB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,0BAA0B,CAAA;CACzC;AAYD,2IAA2I;AAC3I,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,0BAA0B,GAAG,SAAS,GAClD,6BAA6B,CAa/B;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,6BAA6B,GAAG,OAAO,CAEtF;AAcD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,CAQnF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,GAAG,SAAS,CAElG;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,cAAc,GAAG,yBAAyB,CAEjG"}
package/dist/plugin.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import type { PayloadMarketingPlugin, PayloadPluginMarketingOptions } from "./types";
2
- export declare function payloadMarketingPlugin(options: PayloadPluginMarketingOptions): PayloadMarketingPlugin;
2
+ export declare function marketingPlugin(options: PayloadPluginMarketingOptions): PayloadMarketingPlugin;
3
3
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAA;AAsDpF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,6BAA6B,GACrC,sBAAsB,CAaxB"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAA;AA6EpF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,6BAA6B,GACrC,sBAAsB,CAaxB"}
package/dist/types.d.ts CHANGED
@@ -116,8 +116,35 @@ export interface MarketingFormFieldOverrides {
116
116
  upload?: MarketingBlockOptions;
117
117
  url?: MarketingBlockOptions;
118
118
  }
119
+ /** Per-resource flags for plugin HTTP endpoints (`/api/.../marketing/*`). Omitted flags default to `true` when `permissions` is set. If `permissions` is omitted entirely, all operations stay allowed for authenticated users. */
120
+ export interface MarketingResourcePermissions {
121
+ read?: boolean;
122
+ write?: boolean;
123
+ }
124
+ export interface MarketingPluginPermissions {
125
+ audiences?: MarketingResourcePermissions;
126
+ broadcasts?: MarketingResourcePermissions;
127
+ contacts?: MarketingResourcePermissions;
128
+ }
129
+ /** Resolved read/write flags for marketing HTTP endpoints. */
130
+ export interface MarketingEffectivePermissions {
131
+ audiences: {
132
+ read: boolean;
133
+ write: boolean;
134
+ };
135
+ broadcasts: {
136
+ read: boolean;
137
+ write: boolean;
138
+ };
139
+ contacts: {
140
+ read: boolean;
141
+ write: boolean;
142
+ };
143
+ }
119
144
  export interface PayloadPluginMarketingOptions {
120
145
  adapter: MarketingAdapter;
146
+ /** Restrict marketing REST endpoints by resource. See `MarketingPluginPermissions`. */
147
+ permissions?: MarketingPluginPermissions;
121
148
  admin?: {
122
149
  basePath?: string;
123
150
  components?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-plugin-marketing",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Payload CMS plugin for marketing forms, audiences, contacts, and broadcasts.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -29,15 +29,15 @@
29
29
  "import": "./dist/index.js",
30
30
  "require": "./dist/index.cjs"
31
31
  },
32
- "./adapters": {
33
- "types": "./dist/adapters/index.d.ts",
34
- "import": "./dist/adapters/index.js",
35
- "require": "./dist/adapters/index.cjs"
32
+ "./adapters/resend": {
33
+ "types": "./dist/adapters/resend.d.ts",
34
+ "import": "./dist/adapters/resend.js",
35
+ "require": "./dist/adapters/resend.cjs"
36
36
  },
37
- "./actions": {
38
- "types": "./dist/actions/index.d.ts",
39
- "import": "./dist/actions/index.js",
40
- "require": "./dist/actions/index.cjs"
37
+ "./adapters/mailchimp": {
38
+ "types": "./dist/adapters/mailchimp.d.ts",
39
+ "import": "./dist/adapters/mailchimp.js",
40
+ "require": "./dist/adapters/mailchimp.cjs"
41
41
  },
42
42
  "./admin": {
43
43
  "types": "./dist/admin/index.d.ts",
@@ -1,18 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,2 +0,0 @@
1
- export { createMarketingActions, type CreateMarketingActionsOptions } from "./factories";
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- import{a}from"../chunk-RBBHOL35.js";export{a as createMarketingActions};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,3 +0,0 @@
1
- export { mailchimpAdapter, type MailchimpAdapterOptions } from "./mailchimp";
2
- export { resendAdapter, type ResendAdapterOptions } from "./resend";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- import{a,b}from"../chunk-KBN7IE22.js";export{a as mailchimpAdapter,b as resendAdapter};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,2 +0,0 @@
1
- import{createHash as w}from"crypto";function p(n){return w("md5").update(n.toLowerCase()).digest("hex")}function f(n){let a=n.includes("-")?n.split("-").pop():void 0;if(!a)throw new Error("MAILCHIMP_API_KEY must include a datacenter suffix (e.g. key-us21).");return a}function y(n){let a=n?.tags;return a==null?[]:String(a).split(",").map(e=>e.trim()).filter(Boolean)}function o(n,a=""){return typeof n=="string"?n:typeof n=="number"&&Number.isFinite(n)?String(n):a}function b(n){let a=!1,e=async()=>{let t=n.client??(await import("@mailchimp/mailchimp_marketing")).default;return a||(t.setConfig({apiKey:n.apiKey,server:f(n.apiKey)}),a=!0),t},r=`https://${f(n.apiKey)}.admin.mailchimp.com`;return{provider:"mailchimp",label:"Mailchimp",urls:{audiences:`${r}/audience/`,broadcasts:`${r}/campaigns/`},audiences:{async create(t){await(await e()).lists.createList({name:t.name,permission_reminder:`You're receiving this email because you opted in via ${n.siteName}.`,email_type_option:!0,contact:{company:n.siteName,address1:"Address on file",city:"N/A",state:"N/A",zip:"00000",country:"US"},campaign_defaults:{from_name:n.siteName,from_email:n.defaultSender,subject:" ",language:"en"}})},async delete(t){await(await e()).lists.deleteList(t.audienceId)},async get(t){let s=await(await e()).lists.getList(t);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(t){await(await e()).lists.deleteListMember(t.audienceId,t.contactId)},async list(t){return((await(await e()).lists.getListMembersInfo(t.audienceId)).members??[]).map(i=>{let d=i.merge_fields;return{createdAt:typeof i.timestamp_signup=="string"?i.timestamp_signup:void 0,email:o(i.email_address),firstName:typeof d?.FNAME=="string"?d.FNAME:null,id:o(i.id,o(i.email_address)),lastName:typeof d?.LNAME=="string"?d.LNAME:null,subscribed:i.status==="subscribed"}})},async upsert(t){let s=await e(),i=t.id??p(t.email),d=t.id?t.subscribed?"subscribed":"unsubscribed":t.subscribed?"subscribed":"pending";await s.lists.setListMember(t.audienceId,i,{email_address:t.email,status:d,merge_fields:{FNAME:t.firstName??"",LNAME:t.lastName??""}},{skipMergeValidation:!0});let m=y(t.properties);m.length>0&&await s.lists.updateListMemberTags(t.audienceId,p(t.email),{tags:m.map(l=>({name:l,status:"active"}))})}},broadcasts:{async create(t){let s=await e(),i=t.templateId!=null&&String(t.templateId).trim()!==""?String(t.templateId).trim():void 0,d;if(i!=null){let l=t.html;if(l!=null&&l!=="")throw new Error("Mailchimp broadcast: use either templateId (cloud template) or html, not both.");let g=Number.parseInt(i,10);if(!Number.isFinite(g))throw new Error(`Invalid Mailchimp template id: "${i}".`);d=g}let m=await s.campaigns.create({type:"regular",recipients:{list_id:t.audienceId},settings:{authenticate:!0,auto_footer:!1,from_email:n.defaultSender,from_name:n.siteName,inline_css:!1,reply_to:t.replyTo?.trim()||n.defaultSender,subject_line:t.subject,title:t.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:t.html??""})},async delete(t){await(await e()).campaigns.remove(t.broadcastId)},async list(){return((await(await e()).campaigns.list({count:500})).campaigns??[]).map(s=>{let i=s.settings,d=typeof s.send_time=="string"?s.send_time:null;return{id:o(s.id),name:o(i?.title,o(s.id)),scheduledAt:d,sentAt:d,status:s.status==="save"?"draft":o(s.status,"draft")}})},async send(t){let s=await e(),i=t.scheduledAt?.trim();i?await s.campaigns.schedule(t.broadcastId,{schedule_time:i}):await s.campaigns.send(t.broadcastId)}}}}function c(n){let a=typeof n=="object"&&n&&"error"in n?n.error:void 0;if(a&&typeof a=="object"&&"message"in a)throw new Error(String(a.message))}function u(n,a){return typeof n=="string"?n:typeof n=="number"&&Number.isFinite(n)?String(n):a}function h(n){return{id:u(n.id,""),name:u(n.name,""),scheduledAt:typeof n.scheduled_at=="string"?n.scheduled_at:null,sentAt:typeof n.sent_at=="string"?n.sent_at:null,status:u(n.status,"draft")}}function k(n){let a=async()=>{if(n.client)return n.client;let e=await import("resend");return new e.Resend(n.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 r=await(await a()).segments.get(e);return c(r),r.data?{id:r.data.id,name:r.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 r=await(await a()).contacts.list({audienceId:e.audienceId});return c(r),(r.data?.data??[]).map(t=>({createdAt:typeof t.created_at=="string"?t.created_at:void 0,email:u(t.email,""),firstName:typeof t.first_name=="string"?t.first_name:null,id:String(t.id),lastName:typeof t.last_name=="string"?t.last_name:null,subscribed:t.unsubscribed===!1}))},async upsert(e){let r=await a(),t=!e.subscribed,s={audienceId:e.audienceId,email:e.email,firstName:e.firstName,lastName:e.lastName,unsubscribed:t};c(e.id?await r.contacts.update({...s,id:e.id}):await r.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:n.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(r=>h(r))},async send(e){c(await(await a()).broadcasts.send(e.broadcastId,{scheduledAt:e.scheduledAt}))}}}}export{b as a,k as b};
2
- //# sourceMappingURL=chunk-KBN7IE22.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters/mailchimp.ts","../src/adapters/resend.ts"],"sourcesContent":["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":["createHash","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"]}
@@ -1,2 +0,0 @@
1
- function a({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}}}export{a};
2
- //# sourceMappingURL=chunk-RBBHOL35.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/actions/factories.ts"],"sourcesContent":["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":"AAeO,SAASA,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":["createMarketingActions","adapter","input","audienceId"]}