payload-plugin-newsletter 0.4.4 → 0.6.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 (150) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/ESM_FIX_SUMMARY.md +74 -0
  3. package/dist/client.cjs +899 -0
  4. package/dist/client.cjs.map +1 -0
  5. package/dist/client.d.cts +52 -0
  6. package/dist/client.d.ts +52 -0
  7. package/dist/client.js +867 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/components.cjs +899 -0
  10. package/dist/components.cjs.map +1 -0
  11. package/dist/components.d.cts +4 -0
  12. package/dist/components.d.ts +4 -0
  13. package/dist/components.js +867 -0
  14. package/dist/components.js.map +1 -0
  15. package/dist/index.cjs +1928 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +11 -0
  18. package/dist/index.d.ts +6 -5
  19. package/dist/index.js +1891 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/types.cjs +19 -0
  22. package/dist/types.cjs.map +1 -0
  23. package/dist/{types/index.d.ts → types.d.cts} +20 -18
  24. package/dist/types.d.ts +350 -0
  25. package/dist/types.js +1 -0
  26. package/dist/types.js.map +1 -0
  27. package/package.json +40 -17
  28. package/dist/.tsbuildinfo +0 -1
  29. package/dist/collections/NewsletterSettings.d.ts +0 -4
  30. package/dist/collections/NewsletterSettings.d.ts.map +0 -1
  31. package/dist/collections/Subscribers.d.ts +0 -4
  32. package/dist/collections/Subscribers.d.ts.map +0 -1
  33. package/dist/components/MagicLinkVerify.d.ts +0 -27
  34. package/dist/components/MagicLinkVerify.d.ts.map +0 -1
  35. package/dist/components/NewsletterForm.d.ts +0 -5
  36. package/dist/components/NewsletterForm.d.ts.map +0 -1
  37. package/dist/components/PreferencesForm.d.ts +0 -5
  38. package/dist/components/PreferencesForm.d.ts.map +0 -1
  39. package/dist/components/index.d.ts +0 -5
  40. package/dist/components/index.d.ts.map +0 -1
  41. package/dist/endpoints/index.d.ts +0 -4
  42. package/dist/endpoints/index.d.ts.map +0 -1
  43. package/dist/endpoints/preferences.d.ts +0 -5
  44. package/dist/endpoints/preferences.d.ts.map +0 -1
  45. package/dist/endpoints/subscribe.d.ts +0 -4
  46. package/dist/endpoints/subscribe.d.ts.map +0 -1
  47. package/dist/endpoints/unsubscribe.d.ts +0 -4
  48. package/dist/endpoints/unsubscribe.d.ts.map +0 -1
  49. package/dist/endpoints/verify-magic-link.d.ts +0 -4
  50. package/dist/endpoints/verify-magic-link.d.ts.map +0 -1
  51. package/dist/exports/client.d.ts +0 -6
  52. package/dist/exports/client.d.ts.map +0 -1
  53. package/dist/exports/components.d.ts +0 -2
  54. package/dist/exports/components.d.ts.map +0 -1
  55. package/dist/exports/types.d.ts +0 -2
  56. package/dist/exports/types.d.ts.map +0 -1
  57. package/dist/fields/newsletterScheduling.d.ts +0 -4
  58. package/dist/fields/newsletterScheduling.d.ts.map +0 -1
  59. package/dist/hooks/useNewsletterAuth.d.ts +0 -16
  60. package/dist/hooks/useNewsletterAuth.d.ts.map +0 -1
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/providers/broadcast.d.ts +0 -19
  63. package/dist/providers/broadcast.d.ts.map +0 -1
  64. package/dist/providers/index.d.ts +0 -23
  65. package/dist/providers/index.d.ts.map +0 -1
  66. package/dist/providers/resend.d.ts +0 -20
  67. package/dist/providers/resend.d.ts.map +0 -1
  68. package/dist/providers/types.d.ts +0 -46
  69. package/dist/providers/types.d.ts.map +0 -1
  70. package/dist/src/collections/NewsletterSettings.js +0 -390
  71. package/dist/src/collections/NewsletterSettings.js.map +0 -1
  72. package/dist/src/collections/Subscribers.js +0 -309
  73. package/dist/src/collections/Subscribers.js.map +0 -1
  74. package/dist/src/components/MagicLinkVerify.js +0 -180
  75. package/dist/src/components/MagicLinkVerify.js.map +0 -1
  76. package/dist/src/components/NewsletterForm.js +0 -326
  77. package/dist/src/components/NewsletterForm.js.map +0 -1
  78. package/dist/src/components/PreferencesForm.js +0 -524
  79. package/dist/src/components/PreferencesForm.js.map +0 -1
  80. package/dist/src/components/index.js +0 -5
  81. package/dist/src/components/index.js.map +0 -1
  82. package/dist/src/endpoints/index.js +0 -17
  83. package/dist/src/endpoints/index.js.map +0 -1
  84. package/dist/src/endpoints/preferences.js +0 -136
  85. package/dist/src/endpoints/preferences.js.map +0 -1
  86. package/dist/src/endpoints/subscribe.js +0 -162
  87. package/dist/src/endpoints/subscribe.js.map +0 -1
  88. package/dist/src/endpoints/unsubscribe.js +0 -105
  89. package/dist/src/endpoints/unsubscribe.js.map +0 -1
  90. package/dist/src/endpoints/verify-magic-link.js +0 -103
  91. package/dist/src/endpoints/verify-magic-link.js.map +0 -1
  92. package/dist/src/exports/client.js +0 -7
  93. package/dist/src/exports/client.js.map +0 -1
  94. package/dist/src/exports/components.js +0 -6
  95. package/dist/src/exports/components.js.map +0 -1
  96. package/dist/src/exports/types.js +0 -3
  97. package/dist/src/exports/types.js.map +0 -1
  98. package/dist/src/fields/newsletterScheduling.js +0 -194
  99. package/dist/src/fields/newsletterScheduling.js.map +0 -1
  100. package/dist/src/hooks/useNewsletterAuth.js +0 -112
  101. package/dist/src/hooks/useNewsletterAuth.js.map +0 -1
  102. package/dist/src/index.js +0 -130
  103. package/dist/src/index.js.map +0 -1
  104. package/dist/src/providers/broadcast.js +0 -158
  105. package/dist/src/providers/broadcast.js.map +0 -1
  106. package/dist/src/providers/index.js +0 -63
  107. package/dist/src/providers/index.js.map +0 -1
  108. package/dist/src/providers/resend.js +0 -122
  109. package/dist/src/providers/resend.js.map +0 -1
  110. package/dist/src/providers/types.js +0 -12
  111. package/dist/src/providers/types.js.map +0 -1
  112. package/dist/src/templates/BaseTemplate.js +0 -105
  113. package/dist/src/templates/BaseTemplate.js.map +0 -1
  114. package/dist/src/templates/MagicLinkTemplate.js +0 -178
  115. package/dist/src/templates/MagicLinkTemplate.js.map +0 -1
  116. package/dist/src/templates/NewsletterTemplate.js +0 -150
  117. package/dist/src/templates/NewsletterTemplate.js.map +0 -1
  118. package/dist/src/templates/WelcomeTemplate.js +0 -192
  119. package/dist/src/templates/WelcomeTemplate.js.map +0 -1
  120. package/dist/src/templates/index.js +0 -6
  121. package/dist/src/templates/index.js.map +0 -1
  122. package/dist/src/types/index.js +0 -3
  123. package/dist/src/types/index.js.map +0 -1
  124. package/dist/src/utils/access.js +0 -80
  125. package/dist/src/utils/access.js.map +0 -1
  126. package/dist/src/utils/jwt.js +0 -91
  127. package/dist/src/utils/jwt.js.map +0 -1
  128. package/dist/src/utils/rate-limiter.js +0 -43
  129. package/dist/src/utils/rate-limiter.js.map +0 -1
  130. package/dist/src/utils/validation.js +0 -148
  131. package/dist/src/utils/validation.js.map +0 -1
  132. package/dist/templates/BaseTemplate.d.ts +0 -45
  133. package/dist/templates/BaseTemplate.d.ts.map +0 -1
  134. package/dist/templates/MagicLinkTemplate.d.ts +0 -67
  135. package/dist/templates/MagicLinkTemplate.d.ts.map +0 -1
  136. package/dist/templates/NewsletterTemplate.d.ts +0 -112
  137. package/dist/templates/NewsletterTemplate.d.ts.map +0 -1
  138. package/dist/templates/WelcomeTemplate.d.ts +0 -55
  139. package/dist/templates/WelcomeTemplate.d.ts.map +0 -1
  140. package/dist/templates/index.d.ts +0 -7
  141. package/dist/templates/index.d.ts.map +0 -1
  142. package/dist/types/index.d.ts.map +0 -1
  143. package/dist/utils/access.d.ts +0 -15
  144. package/dist/utils/access.d.ts.map +0 -1
  145. package/dist/utils/jwt.d.ts +0 -32
  146. package/dist/utils/jwt.d.ts.map +0 -1
  147. package/dist/utils/rate-limiter.d.ts +0 -15
  148. package/dist/utils/rate-limiter.d.ts.map +0 -1
  149. package/dist/utils/validation.d.ts +0 -33
  150. package/dist/utils/validation.d.ts.map +0 -1
@@ -1,43 +0,0 @@
1
- export class RateLimiter {
2
- attempts = new Map();
3
- options;
4
- constructor(options){
5
- this.options = options;
6
- }
7
- async checkLimit(key) {
8
- const now = Date.now();
9
- const record = this.attempts.get(key);
10
- if (!record || record.resetTime < now) {
11
- this.attempts.set(key, {
12
- count: 1,
13
- resetTime: now + this.options.windowMs
14
- });
15
- return true;
16
- }
17
- if (record.count >= this.options.maxAttempts) {
18
- return false;
19
- }
20
- record.count++;
21
- return true;
22
- }
23
- async incrementAttempt(key) {
24
- const now = Date.now();
25
- const record = this.attempts.get(key);
26
- if (!record || record.resetTime < now) {
27
- this.attempts.set(key, {
28
- count: 1,
29
- resetTime: now + this.options.windowMs
30
- });
31
- } else {
32
- record.count++;
33
- }
34
- }
35
- async reset(key) {
36
- this.attempts.delete(key);
37
- }
38
- async resetAll() {
39
- this.attempts.clear();
40
- }
41
- }
42
-
43
- //# sourceMappingURL=rate-limiter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/rate-limiter.ts"],"sourcesContent":["export interface RateLimiterOptions {\n maxAttempts: number\n windowMs: number\n prefix?: string\n}\n\nexport class RateLimiter {\n private attempts: Map<string, { count: number; resetTime: number }> = new Map()\n private options: RateLimiterOptions\n\n constructor(options: RateLimiterOptions) {\n this.options = options\n }\n\n async checkLimit(key: string): Promise<boolean> {\n const now = Date.now()\n const record = this.attempts.get(key)\n\n if (!record || record.resetTime < now) {\n this.attempts.set(key, {\n count: 1,\n resetTime: now + this.options.windowMs\n })\n return true\n }\n\n if (record.count >= this.options.maxAttempts) {\n return false\n }\n\n record.count++\n return true\n }\n\n async incrementAttempt(key: string): Promise<void> {\n const now = Date.now()\n const record = this.attempts.get(key)\n\n if (!record || record.resetTime < now) {\n this.attempts.set(key, {\n count: 1,\n resetTime: now + this.options.windowMs\n })\n } else {\n record.count++\n }\n }\n\n async reset(key: string): Promise<void> {\n this.attempts.delete(key)\n }\n\n async resetAll(): Promise<void> {\n this.attempts.clear()\n }\n}"],"names":["RateLimiter","attempts","Map","options","checkLimit","key","now","Date","record","get","resetTime","set","count","windowMs","maxAttempts","incrementAttempt","reset","delete","resetAll","clear"],"mappings":"AAMA,OAAO,MAAMA;IACHC,WAA8D,IAAIC,MAAK;IACvEC,QAA2B;IAEnC,YAAYA,OAA2B,CAAE;QACvC,IAAI,CAACA,OAAO,GAAGA;IACjB;IAEA,MAAMC,WAAWC,GAAW,EAAoB;QAC9C,MAAMC,MAAMC,KAAKD,GAAG;QACpB,MAAME,SAAS,IAAI,CAACP,QAAQ,CAACQ,GAAG,CAACJ;QAEjC,IAAI,CAACG,UAAUA,OAAOE,SAAS,GAAGJ,KAAK;YACrC,IAAI,CAACL,QAAQ,CAACU,GAAG,CAACN,KAAK;gBACrBO,OAAO;gBACPF,WAAWJ,MAAM,IAAI,CAACH,OAAO,CAACU,QAAQ;YACxC;YACA,OAAO;QACT;QAEA,IAAIL,OAAOI,KAAK,IAAI,IAAI,CAACT,OAAO,CAACW,WAAW,EAAE;YAC5C,OAAO;QACT;QAEAN,OAAOI,KAAK;QACZ,OAAO;IACT;IAEA,MAAMG,iBAAiBV,GAAW,EAAiB;QACjD,MAAMC,MAAMC,KAAKD,GAAG;QACpB,MAAME,SAAS,IAAI,CAACP,QAAQ,CAACQ,GAAG,CAACJ;QAEjC,IAAI,CAACG,UAAUA,OAAOE,SAAS,GAAGJ,KAAK;YACrC,IAAI,CAACL,QAAQ,CAACU,GAAG,CAACN,KAAK;gBACrBO,OAAO;gBACPF,WAAWJ,MAAM,IAAI,CAACH,OAAO,CAACU,QAAQ;YACxC;QACF,OAAO;YACLL,OAAOI,KAAK;QACd;IACF;IAEA,MAAMI,MAAMX,GAAW,EAAiB;QACtC,IAAI,CAACJ,QAAQ,CAACgB,MAAM,CAACZ;IACvB;IAEA,MAAMa,WAA0B;QAC9B,IAAI,CAACjB,QAAQ,CAACkB,KAAK;IACrB;AACF"}
@@ -1,148 +0,0 @@
1
- import DOMPurify from 'isomorphic-dompurify';
2
- /**
3
- * Validate email address format
4
- */ export function isValidEmail(email) {
5
- if (!email || typeof email !== 'string') return false;
6
- // Trim whitespace
7
- const trimmed = email.trim();
8
- // Length limits
9
- if (trimmed.length > 255) return false;
10
- // Check for dangerous patterns
11
- if (trimmed.includes('<') || trimmed.includes('>')) return false;
12
- if (trimmed.includes('javascript:')) return false;
13
- if (trimmed.includes('data:')) return false;
14
- // Basic format validation with stricter regex
15
- const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
16
- if (!emailRegex.test(trimmed)) return false;
17
- // Additional validation rules
18
- const parts = trimmed.split('@');
19
- if (parts.length !== 2) return false;
20
- const [localPart, domain] = parts;
21
- // Check local part length
22
- if (localPart.length > 64 || localPart.length === 0) return false;
23
- // Check for invalid patterns
24
- if (localPart.startsWith('.') || localPart.endsWith('.')) return false;
25
- if (domain.startsWith('.') || domain.endsWith('.')) return false;
26
- if (domain.includes('..')) return false;
27
- if (localPart.includes('..')) return false;
28
- return true;
29
- }
30
- /**
31
- * Normalize email for rate limiting and deduplication
32
- */ export function normalizeEmail(email) {
33
- if (!email || typeof email !== 'string') return '';
34
- const parts = email.toLowerCase().trim().split('@');
35
- if (parts.length !== 2) return email.toLowerCase().trim();
36
- let [localPart] = parts;
37
- const [, domain] = parts;
38
- // Remove dots from local part (Gmail-style)
39
- localPart = localPart.replace(/\./g, '');
40
- // Remove everything after + (Gmail-style aliases)
41
- const plusIndex = localPart.indexOf('+');
42
- if (plusIndex > -1) {
43
- localPart = localPart.substring(0, plusIndex);
44
- }
45
- return `${localPart}@${domain}`;
46
- }
47
- /**
48
- * Check if email domain is allowed
49
- */ export function isDomainAllowed(email, allowedDomains) {
50
- // Validate email format first
51
- if (!isValidEmail(email)) {
52
- return false;
53
- }
54
- // If no domains specified, allow all valid emails
55
- if (!allowedDomains || allowedDomains.length === 0) {
56
- return true;
57
- }
58
- const domain = email.split('@')[1]?.toLowerCase();
59
- if (!domain) return false;
60
- return allowedDomains.some((allowedDomain)=>domain === allowedDomain.toLowerCase());
61
- }
62
- /**
63
- * Sanitize user input to prevent XSS
64
- */ export function sanitizeInput(input) {
65
- if (!input) return '';
66
- // First, remove all HTML tags and scripts
67
- let cleaned = DOMPurify.sanitize(input, {
68
- ALLOWED_TAGS: [],
69
- ALLOWED_ATTR: [],
70
- KEEP_CONTENT: true
71
- });
72
- // Additional security: remove dangerous patterns
73
- cleaned = cleaned.replace(/javascript:/gi, '').replace(/data:/gi, '').replace(/vbscript:/gi, '').replace(/file:\/\//gi, '').replace(/onload/gi, '').replace(/onerror/gi, '').replace(/onclick/gi, '').replace(/onmouseover/gi, '').replace(/alert\(/gi, '').replace(/prompt\(/gi, '').replace(/confirm\(/gi, '').replace(/\|/g, '') // Remove pipe character (command injection)
74
- .replace(/;/g, '') // Remove semicolon (command chaining)
75
- .replace(/`/g, '') // Remove backticks (command substitution)
76
- .replace(/&&/g, '') // Remove command chaining
77
- .replace(/\$\(/g, '') // Remove command substitution pattern $()
78
- .replace(/\.\./g, '') // Remove directory traversal
79
- .replace(/\/..\//g, '') // Remove path traversal
80
- .replace(/\0/g, ''); // Remove null bytes
81
- return cleaned.trim();
82
- }
83
- /**
84
- * Extract UTM parameters from URL search params
85
- */ export function extractUTMParams(searchParams) {
86
- const utmParams = {};
87
- const utmKeys = [
88
- 'utm_source',
89
- 'utm_medium',
90
- 'utm_campaign',
91
- 'utm_content',
92
- 'utm_term'
93
- ];
94
- utmKeys.forEach((key)=>{
95
- const value = searchParams.get(key);
96
- if (value) {
97
- // Remove 'utm_' prefix for storage
98
- const shortKey = key.replace('utm_', '');
99
- utmParams[shortKey] = value;
100
- }
101
- });
102
- return utmParams;
103
- }
104
- /**
105
- * Validate source field - only allow predefined values
106
- */ export function isValidSource(source) {
107
- if (!source || typeof source !== 'string') return false;
108
- const allowedSources = [
109
- 'website',
110
- 'api',
111
- 'import',
112
- 'admin',
113
- 'signup-form',
114
- 'magic-link',
115
- 'preferences',
116
- 'external'
117
- ];
118
- return allowedSources.includes(source);
119
- }
120
- export function validateSubscriberData(data) {
121
- const errors = [];
122
- // Email validation
123
- if (!data.email) {
124
- errors.push('Email is required');
125
- } else if (!isValidEmail(data.email)) {
126
- errors.push('Invalid email format');
127
- }
128
- // Name validation (optional but if provided, should be reasonable)
129
- if (data.name && data.name.length > 100) {
130
- errors.push('Name is too long (max 100 characters)');
131
- }
132
- // Source validation
133
- if (data.source !== undefined) {
134
- if (!data.source || data.source.length === 0) {
135
- errors.push('Source cannot be empty');
136
- } else if (data.source.length > 50) {
137
- errors.push('Source is too long (max 50 characters)');
138
- } else if (!isValidSource(data.source)) {
139
- errors.push('Invalid source value');
140
- }
141
- }
142
- return {
143
- valid: errors.length === 0,
144
- errors
145
- };
146
- }
147
-
148
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/validation.ts"],"sourcesContent":["import DOMPurify from 'isomorphic-dompurify'\n\n/**\n * Validate email address format\n */\nexport function isValidEmail(email: string): boolean {\n if (!email || typeof email !== 'string') return false\n \n // Trim whitespace\n const trimmed = email.trim()\n \n // Length limits\n if (trimmed.length > 255) return false\n \n // Check for dangerous patterns\n if (trimmed.includes('<') || trimmed.includes('>')) return false\n if (trimmed.includes('javascript:')) return false\n if (trimmed.includes('data:')) return false\n \n // Basic format validation with stricter regex\n const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n if (!emailRegex.test(trimmed)) return false\n \n // Additional validation rules\n const parts = trimmed.split('@')\n if (parts.length !== 2) return false\n \n const [localPart, domain] = parts\n \n // Check local part length\n if (localPart.length > 64 || localPart.length === 0) return false\n \n // Check for invalid patterns\n if (localPart.startsWith('.') || localPart.endsWith('.')) return false\n if (domain.startsWith('.') || domain.endsWith('.')) return false\n if (domain.includes('..')) return false\n if (localPart.includes('..')) return false\n \n return true\n}\n\n/**\n * Normalize email for rate limiting and deduplication\n */\nexport function normalizeEmail(email: string): string {\n if (!email || typeof email !== 'string') return ''\n \n const parts = email.toLowerCase().trim().split('@')\n if (parts.length !== 2) return email.toLowerCase().trim()\n \n let [localPart] = parts\n const [, domain] = parts\n \n // Remove dots from local part (Gmail-style)\n localPart = localPart.replace(/\\./g, '')\n \n // Remove everything after + (Gmail-style aliases)\n const plusIndex = localPart.indexOf('+')\n if (plusIndex > -1) {\n localPart = localPart.substring(0, plusIndex)\n }\n \n return `${localPart}@${domain}`\n}\n\n/**\n * Check if email domain is allowed\n */\nexport function isDomainAllowed(\n email: string,\n allowedDomains?: string[]\n): boolean {\n // Validate email format first\n if (!isValidEmail(email)) {\n return false\n }\n \n // If no domains specified, allow all valid emails\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n const domain = email.split('@')[1]?.toLowerCase()\n if (!domain) return false\n\n return allowedDomains.some(\n allowedDomain => domain === allowedDomain.toLowerCase()\n )\n}\n\n/**\n * Sanitize user input to prevent XSS\n */\nexport function sanitizeInput(input: string): string {\n if (!input) return ''\n \n // First, remove all HTML tags and scripts\n let cleaned = DOMPurify.sanitize(input, { \n ALLOWED_TAGS: [],\n ALLOWED_ATTR: [],\n KEEP_CONTENT: true\n })\n \n // Additional security: remove dangerous patterns\n cleaned = cleaned\n .replace(/javascript:/gi, '')\n .replace(/data:/gi, '')\n .replace(/vbscript:/gi, '')\n .replace(/file:\\/\\//gi, '')\n .replace(/onload/gi, '')\n .replace(/onerror/gi, '')\n .replace(/onclick/gi, '')\n .replace(/onmouseover/gi, '')\n .replace(/alert\\(/gi, '')\n .replace(/prompt\\(/gi, '')\n .replace(/confirm\\(/gi, '')\n .replace(/\\|/g, '') // Remove pipe character (command injection)\n .replace(/;/g, '') // Remove semicolon (command chaining)\n .replace(/`/g, '') // Remove backticks (command substitution)\n .replace(/&&/g, '') // Remove command chaining\n .replace(/\\$\\(/g, '') // Remove command substitution pattern $()\n .replace(/\\.\\./g, '') // Remove directory traversal\n .replace(/\\/..\\//g, '') // Remove path traversal\n .replace(/\\0/g, '') // Remove null bytes\n \n return cleaned.trim()\n}\n\n/**\n * Extract UTM parameters from URL search params\n */\nexport function extractUTMParams(searchParams: URLSearchParams): Record<string, string> {\n const utmParams: Record<string, string> = {}\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term']\n\n utmKeys.forEach(key => {\n const value = searchParams.get(key)\n if (value) {\n // Remove 'utm_' prefix for storage\n const shortKey = key.replace('utm_', '')\n utmParams[shortKey] = value\n }\n })\n\n return utmParams\n}\n\n/**\n * Validate source field - only allow predefined values\n */\nexport function isValidSource(source: string): boolean {\n if (!source || typeof source !== 'string') return false\n \n const allowedSources = [\n 'website',\n 'api',\n 'import',\n 'admin',\n 'signup-form',\n 'magic-link',\n 'preferences',\n 'external'\n ]\n \n return allowedSources.includes(source)\n}\n\n/**\n * Validate subscriber data before creation\n */\nexport interface ValidateSubscriberResult {\n valid: boolean\n errors: string[]\n}\n\nexport function validateSubscriberData(data: any): ValidateSubscriberResult {\n const errors: string[] = []\n\n // Email validation\n if (!data.email) {\n errors.push('Email is required')\n } else if (!isValidEmail(data.email)) {\n errors.push('Invalid email format')\n }\n\n // Name validation (optional but if provided, should be reasonable)\n if (data.name && data.name.length > 100) {\n errors.push('Name is too long (max 100 characters)')\n }\n\n // Source validation\n if (data.source !== undefined) {\n if (!data.source || data.source.length === 0) {\n errors.push('Source cannot be empty')\n } else if (data.source.length > 50) {\n errors.push('Source is too long (max 50 characters)')\n } else if (!isValidSource(data.source)) {\n errors.push('Invalid source value')\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n }\n}"],"names":["DOMPurify","isValidEmail","email","trimmed","trim","length","includes","emailRegex","test","parts","split","localPart","domain","startsWith","endsWith","normalizeEmail","toLowerCase","replace","plusIndex","indexOf","substring","isDomainAllowed","allowedDomains","some","allowedDomain","sanitizeInput","input","cleaned","sanitize","ALLOWED_TAGS","ALLOWED_ATTR","KEEP_CONTENT","extractUTMParams","searchParams","utmParams","utmKeys","forEach","key","value","get","shortKey","isValidSource","source","allowedSources","validateSubscriberData","data","errors","push","name","undefined","valid"],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import React from 'react';
2
- export interface BaseTemplateProps {
3
- preview?: string;
4
- children: React.ReactNode;
5
- footer?: {
6
- unsubscribeUrl?: string;
7
- preferencesUrl?: string;
8
- address?: string;
9
- copyright?: string;
10
- };
11
- }
12
- export declare const baseStyles: {
13
- main: {
14
- backgroundColor: string;
15
- fontFamily: string;
16
- };
17
- container: {
18
- margin: string;
19
- padding: string;
20
- maxWidth: string;
21
- };
22
- content: {
23
- padding: string;
24
- };
25
- footer: {
26
- padding: string;
27
- textAlign: "center";
28
- };
29
- footerText: {
30
- color: string;
31
- fontSize: string;
32
- lineHeight: string;
33
- margin: string;
34
- };
35
- footerLink: {
36
- color: string;
37
- textDecoration: string;
38
- };
39
- hr: {
40
- borderColor: string;
41
- margin: string;
42
- };
43
- };
44
- export declare const BaseTemplate: React.FC<BaseTemplateProps>;
45
- //# sourceMappingURL=BaseTemplate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseTemplate.d.ts","sourceRoot":"","sources":["../../src/templates/BaseTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCtB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6DpD,CAAA"}
@@ -1,67 +0,0 @@
1
- import React from 'react';
2
- import type { MagicLinkEmailProps } from '../types';
3
- declare const magicLinkStyles: {
4
- heading: {
5
- fontSize: string;
6
- fontWeight: string;
7
- color: string;
8
- margin: string;
9
- };
10
- text: {
11
- fontSize: string;
12
- lineHeight: string;
13
- color: string;
14
- margin: string;
15
- };
16
- button: {
17
- backgroundColor: string;
18
- borderRadius: string;
19
- color: string;
20
- fontSize: string;
21
- fontWeight: string;
22
- textDecoration: string;
23
- textAlign: "center";
24
- display: string;
25
- width: string;
26
- padding: string;
27
- margin: string;
28
- };
29
- codeSection: {
30
- backgroundColor: string;
31
- borderRadius: string;
32
- padding: string;
33
- margin: string;
34
- textAlign: "center";
35
- };
36
- code: {
37
- fontSize: string;
38
- fontWeight: string;
39
- color: string;
40
- letterSpacing: string;
41
- fontFamily: string;
42
- };
43
- warning: {
44
- fontSize: string;
45
- color: string;
46
- margin: string;
47
- padding: string;
48
- backgroundColor: string;
49
- borderRadius: string;
50
- };
51
- expire: {
52
- fontSize: string;
53
- color: string;
54
- fontStyle: string;
55
- };
56
- };
57
- export declare const MagicLinkTemplate: React.FC<MagicLinkEmailProps>;
58
- export declare function createMagicLinkTemplate(customContent?: {
59
- heading?: string;
60
- intro?: string;
61
- buttonText?: string;
62
- warning?: string;
63
- expireText?: string;
64
- includeCode?: boolean;
65
- }, customStyles?: Partial<typeof magicLinkStyles>): React.FC<MagicLinkEmailProps>;
66
- export {};
67
- //# sourceMappingURL=MagicLinkTemplate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MagicLinkTemplate.d.ts","sourceRoot":"","sources":["../../src/templates/MagicLinkTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDpB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkD3D,CAAA;AAGD,wBAAgB,uBAAuB,CACrC,aAAa,CAAC,EAAE;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,EACD,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,CAAC,GAC7C,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAuD/B"}
@@ -1,112 +0,0 @@
1
- import React from 'react';
2
- export interface NewsletterTemplateProps {
3
- subject: string;
4
- preheader?: string;
5
- title?: string;
6
- content: string;
7
- ctaButton?: {
8
- text: string;
9
- href: string;
10
- };
11
- footer?: {
12
- unsubscribeUrl?: string;
13
- preferencesUrl?: string;
14
- address?: string;
15
- copyright?: string;
16
- };
17
- }
18
- declare const newsletterStyles: {
19
- heading: {
20
- fontSize: string;
21
- fontWeight: string;
22
- color: string;
23
- margin: string;
24
- };
25
- markdown: {
26
- h1: {
27
- fontSize: string;
28
- fontWeight: string;
29
- color: string;
30
- margin: string;
31
- };
32
- h2: {
33
- fontSize: string;
34
- fontWeight: string;
35
- color: string;
36
- margin: string;
37
- };
38
- h3: {
39
- fontSize: string;
40
- fontWeight: string;
41
- color: string;
42
- margin: string;
43
- };
44
- p: {
45
- fontSize: string;
46
- lineHeight: string;
47
- color: string;
48
- margin: string;
49
- };
50
- a: {
51
- color: string;
52
- textDecoration: string;
53
- };
54
- ul: {
55
- paddingLeft: string;
56
- margin: string;
57
- };
58
- ol: {
59
- paddingLeft: string;
60
- margin: string;
61
- };
62
- li: {
63
- fontSize: string;
64
- lineHeight: string;
65
- color: string;
66
- marginBottom: string;
67
- };
68
- img: {
69
- maxWidth: string;
70
- height: string;
71
- margin: string;
72
- };
73
- blockquote: {
74
- borderLeft: string;
75
- paddingLeft: string;
76
- margin: string;
77
- fontStyle: string;
78
- color: string;
79
- };
80
- code: {
81
- backgroundColor: string;
82
- padding: string;
83
- borderRadius: string;
84
- fontFamily: string;
85
- fontSize: string;
86
- };
87
- pre: {
88
- backgroundColor: string;
89
- padding: string;
90
- borderRadius: string;
91
- overflow: string;
92
- margin: string;
93
- };
94
- };
95
- button: {
96
- backgroundColor: string;
97
- borderRadius: string;
98
- color: string;
99
- fontSize: string;
100
- fontWeight: string;
101
- textDecoration: string;
102
- textAlign: "center";
103
- display: string;
104
- width: string;
105
- padding: string;
106
- margin: string;
107
- };
108
- };
109
- export declare const NewsletterTemplate: React.FC<NewsletterTemplateProps>;
110
- export declare function createNewsletterTemplate(customStyles?: Partial<typeof newsletterStyles>): React.FC<NewsletterTemplateProps>;
111
- export {};
112
- //# sourceMappingURL=NewsletterTemplate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NewsletterTemplate.d.ts","sourceRoot":"","sources":["../../src/templates/NewsletterTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,CAAC,EAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0FrB,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAsChE,CAAA;AAGD,wBAAgB,wBAAwB,CACtC,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,gBAAgB,CAAC,GAC9C,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAoCnC"}
@@ -1,55 +0,0 @@
1
- import React from 'react';
2
- import type { WelcomeEmailProps } from '../types';
3
- declare const welcomeStyles: {
4
- heading: {
5
- fontSize: string;
6
- fontWeight: string;
7
- color: string;
8
- margin: string;
9
- };
10
- subheading: {
11
- fontSize: string;
12
- fontWeight: string;
13
- color: string;
14
- margin: string;
15
- };
16
- text: {
17
- fontSize: string;
18
- lineHeight: string;
19
- color: string;
20
- margin: string;
21
- };
22
- button: {
23
- backgroundColor: string;
24
- borderRadius: string;
25
- color: string;
26
- fontSize: string;
27
- fontWeight: string;
28
- textDecoration: string;
29
- textAlign: "center";
30
- display: string;
31
- width: string;
32
- padding: string;
33
- margin: string;
34
- };
35
- list: {
36
- paddingLeft: string;
37
- margin: string;
38
- };
39
- listItem: {
40
- fontSize: string;
41
- lineHeight: string;
42
- color: string;
43
- marginBottom: string;
44
- };
45
- };
46
- export declare const WelcomeTemplate: React.FC<WelcomeEmailProps>;
47
- export declare function createWelcomeTemplate(customContent?: {
48
- heading?: string;
49
- intro?: string;
50
- features?: string[];
51
- ctaText?: string;
52
- closing?: string;
53
- }, customStyles?: Partial<typeof welcomeStyles>): React.FC<WelcomeEmailProps>;
54
- export {};
55
- //# sourceMappingURL=WelcomeTemplate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WelcomeTemplate.d.ts","sourceRoot":"","sources":["../../src/templates/WelcomeTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEjD,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ClB,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkEvD,CAAA;AAGD,wBAAgB,qBAAqB,CACnC,aAAa,CAAC,EAAE;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,aAAa,CAAC,GAC3C,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAmE7B"}
@@ -1,7 +0,0 @@
1
- export { BaseTemplate, baseStyles } from './BaseTemplate';
2
- export type { BaseTemplateProps } from './BaseTemplate';
3
- export { NewsletterTemplate, createNewsletterTemplate } from './NewsletterTemplate';
4
- export type { NewsletterTemplateProps } from './NewsletterTemplate';
5
- export { WelcomeTemplate, createWelcomeTemplate } from './WelcomeTemplate';
6
- export { MagicLinkTemplate, createMagicLinkTemplate } from './MagicLinkTemplate';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AACnF,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAEnE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE1E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { Access } from 'payload';
2
- import type { NewsletterPluginConfig } from '../types';
3
- /**
4
- * Check if a user is an admin based on the plugin configuration
5
- */
6
- export declare const isAdmin: (user: any, config?: NewsletterPluginConfig) => boolean;
7
- /**
8
- * Create admin-only access control
9
- */
10
- export declare const adminOnly: (config?: NewsletterPluginConfig) => Access;
11
- /**
12
- * Create admin or owner access control
13
- */
14
- export declare const adminOrSelf: (config?: NewsletterPluginConfig) => Access;
15
- //# sourceMappingURL=access.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/utils/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,SAAS,CAAA;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,GAAG,EAAE,SAAS,sBAAsB,KAAG,OAgCpE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,sBAAsB,KAAG,MAIzD,CAAA;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,sBAAsB,KAAG,MA6C3D,CAAA"}
@@ -1,32 +0,0 @@
1
- import type { NewsletterPluginConfig } from '../types';
2
- export interface MagicLinkTokenPayload {
3
- subscriberId: string;
4
- email: string;
5
- type: 'magic-link';
6
- }
7
- export interface SessionTokenPayload {
8
- subscriberId: string;
9
- email: string;
10
- type: 'session';
11
- }
12
- /**
13
- * Generate a magic link token for email authentication
14
- */
15
- export declare function generateMagicLinkToken(subscriberId: string, email: string, config: NewsletterPluginConfig): string;
16
- /**
17
- * Verify a magic link token
18
- */
19
- export declare function verifyMagicLinkToken(token: string): MagicLinkTokenPayload;
20
- /**
21
- * Generate a session token after successful magic link verification
22
- */
23
- export declare function generateSessionToken(subscriberId: string, email: string): string;
24
- /**
25
- * Verify a session token
26
- */
27
- export declare function verifySessionToken(token: string): SessionTokenPayload;
28
- /**
29
- * Generate a magic link URL
30
- */
31
- export declare function generateMagicLinkURL(token: string, baseURL: string, config: NewsletterPluginConfig): string;
32
- //# sourceMappingURL=jwt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,YAAY,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,SAAS,CAAA;CAChB;AAqBD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,sBAAsB,GAC7B,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAoBzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAoBrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,sBAAsB,GAC7B,MAAM,CAKR"}
@@ -1,15 +0,0 @@
1
- export interface RateLimiterOptions {
2
- maxAttempts: number;
3
- windowMs: number;
4
- prefix?: string;
5
- }
6
- export declare class RateLimiter {
7
- private attempts;
8
- private options;
9
- constructor(options: RateLimiterOptions);
10
- checkLimit(key: string): Promise<boolean>;
11
- incrementAttempt(key: string): Promise<void>;
12
- reset(key: string): Promise<void>;
13
- resetAll(): Promise<void>;
14
- }
15
- //# sourceMappingURL=rate-limiter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAA+D;IAC/E,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,kBAAkB;IAIjC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBzC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}