@djangocfg/ext-newsletter 1.0.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 (91) hide show
  1. package/README.md +140 -0
  2. package/dist/chunk-LQLPNWHR.js +2075 -0
  3. package/dist/hooks.cjs +2539 -0
  4. package/dist/hooks.d.cts +267 -0
  5. package/dist/hooks.d.ts +267 -0
  6. package/dist/hooks.js +370 -0
  7. package/dist/index.cjs +2153 -0
  8. package/dist/index.d.cts +2084 -0
  9. package/dist/index.d.ts +2084 -0
  10. package/dist/index.js +1 -0
  11. package/package.json +80 -0
  12. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter.ts +210 -0
  13. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__bulk_email.ts +93 -0
  14. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__campaigns.ts +338 -0
  15. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__logs.ts +92 -0
  16. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__newsletters.ts +150 -0
  17. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__subscriptions.ts +210 -0
  18. package/src/api/generated/ext_newsletter/_utils/fetchers/ext_newsletter__newsletter__testing.ts +93 -0
  19. package/src/api/generated/ext_newsletter/_utils/fetchers/index.ts +34 -0
  20. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter.ts +81 -0
  21. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__bulk_email.ts +42 -0
  22. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__campaigns.ts +130 -0
  23. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__logs.ts +37 -0
  24. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__newsletters.ts +52 -0
  25. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__subscriptions.ts +78 -0
  26. package/src/api/generated/ext_newsletter/_utils/hooks/ext_newsletter__newsletter__testing.ts +42 -0
  27. package/src/api/generated/ext_newsletter/_utils/hooks/index.ts +34 -0
  28. package/src/api/generated/ext_newsletter/_utils/schemas/BulkEmailRequest.schema.ts +26 -0
  29. package/src/api/generated/ext_newsletter/_utils/schemas/BulkEmailResponse.schema.ts +23 -0
  30. package/src/api/generated/ext_newsletter/_utils/schemas/EmailLog.schema.ts +31 -0
  31. package/src/api/generated/ext_newsletter/_utils/schemas/ErrorResponse.schema.ts +20 -0
  32. package/src/api/generated/ext_newsletter/_utils/schemas/Newsletter.schema.ts +26 -0
  33. package/src/api/generated/ext_newsletter/_utils/schemas/NewsletterCampaign.schema.ts +33 -0
  34. package/src/api/generated/ext_newsletter/_utils/schemas/NewsletterCampaignRequest.schema.ts +26 -0
  35. package/src/api/generated/ext_newsletter/_utils/schemas/NewsletterSubscription.schema.ts +27 -0
  36. package/src/api/generated/ext_newsletter/_utils/schemas/PaginatedEmailLogList.schema.ts +24 -0
  37. package/src/api/generated/ext_newsletter/_utils/schemas/PaginatedNewsletterCampaignList.schema.ts +24 -0
  38. package/src/api/generated/ext_newsletter/_utils/schemas/PaginatedNewsletterList.schema.ts +24 -0
  39. package/src/api/generated/ext_newsletter/_utils/schemas/PaginatedNewsletterSubscriptionList.schema.ts +24 -0
  40. package/src/api/generated/ext_newsletter/_utils/schemas/PatchedNewsletterCampaignRequest.schema.ts +26 -0
  41. package/src/api/generated/ext_newsletter/_utils/schemas/PatchedUnsubscribeRequest.schema.ts +19 -0
  42. package/src/api/generated/ext_newsletter/_utils/schemas/SendCampaignRequest.schema.ts +19 -0
  43. package/src/api/generated/ext_newsletter/_utils/schemas/SendCampaignResponse.schema.ts +22 -0
  44. package/src/api/generated/ext_newsletter/_utils/schemas/SubscribeRequest.schema.ts +20 -0
  45. package/src/api/generated/ext_newsletter/_utils/schemas/SubscribeResponse.schema.ts +21 -0
  46. package/src/api/generated/ext_newsletter/_utils/schemas/SuccessResponse.schema.ts +20 -0
  47. package/src/api/generated/ext_newsletter/_utils/schemas/TestEmailRequest.schema.ts +21 -0
  48. package/src/api/generated/ext_newsletter/_utils/schemas/Unsubscribe.schema.ts +19 -0
  49. package/src/api/generated/ext_newsletter/_utils/schemas/UnsubscribeRequest.schema.ts +19 -0
  50. package/src/api/generated/ext_newsletter/_utils/schemas/index.ts +40 -0
  51. package/src/api/generated/ext_newsletter/api-instance.ts +131 -0
  52. package/src/api/generated/ext_newsletter/client.ts +319 -0
  53. package/src/api/generated/ext_newsletter/enums.ts +24 -0
  54. package/src/api/generated/ext_newsletter/errors.ts +116 -0
  55. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter/client.ts +38 -0
  56. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter/index.ts +2 -0
  57. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter/models.ts +71 -0
  58. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__bulk_email/client.ts +24 -0
  59. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__bulk_email/index.ts +2 -0
  60. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__bulk_email/models.ts +29 -0
  61. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__campaigns/client.ts +85 -0
  62. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__campaigns/index.ts +2 -0
  63. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__campaigns/models.ts +100 -0
  64. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__logs/client.ts +35 -0
  65. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__logs/index.ts +2 -0
  66. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__logs/models.ts +51 -0
  67. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__newsletters/client.ts +45 -0
  68. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__newsletters/index.ts +2 -0
  69. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__newsletters/models.ts +42 -0
  70. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__subscriptions/client.ts +55 -0
  71. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__subscriptions/index.ts +2 -0
  72. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__subscriptions/models.ts +92 -0
  73. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__testing/client.ts +24 -0
  74. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__testing/index.ts +2 -0
  75. package/src/api/generated/ext_newsletter/ext_newsletter__newsletter__testing/models.ts +24 -0
  76. package/src/api/generated/ext_newsletter/http.ts +103 -0
  77. package/src/api/generated/ext_newsletter/index.ts +315 -0
  78. package/src/api/generated/ext_newsletter/logger.ts +259 -0
  79. package/src/api/generated/ext_newsletter/retry.ts +175 -0
  80. package/src/api/generated/ext_newsletter/schema.json +1739 -0
  81. package/src/api/generated/ext_newsletter/storage.ts +161 -0
  82. package/src/api/generated/ext_newsletter/validation-events.ts +133 -0
  83. package/src/api/index.ts +9 -0
  84. package/src/components/Hero/index.tsx +160 -0
  85. package/src/components/Hero/types.ts +37 -0
  86. package/src/config.ts +20 -0
  87. package/src/contexts/newsletter/NewsletterContext.tsx +264 -0
  88. package/src/contexts/newsletter/types.ts +32 -0
  89. package/src/hooks/index.ts +21 -0
  90. package/src/index.ts +14 -0
  91. package/src/utils/logger.ts +9 -0
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export { API, APIClient, APIError, APILogger, BulkEmailRequestSchema, BulkEmailResponseSchema, CookieStorageAdapter, DEFAULT_RETRY_CONFIG, EmailLogSchema, enums_exports as Enums, ErrorResponseSchema, models_exports as ExtNewsletterBulkEmailTypes, models_exports2 as ExtNewsletterCampaignsTypes, models_exports3 as ExtNewsletterLogsTypes, models_exports7 as ExtNewsletterNewsletterTypes, models_exports4 as ExtNewsletterNewslettersTypes, models_exports5 as ExtNewsletterSubscriptionsTypes, models_exports6 as ExtNewsletterTestingTypes, FetchAdapter, fetchers_exports as Fetchers, LocalStorageAdapter, MemoryStorageAdapter, NetworkError, NewsletterCampaignRequestSchema, NewsletterCampaignSchema, NewsletterSchema, NewsletterSubscriptionSchema, PaginatedEmailLogListSchema, PaginatedNewsletterCampaignListSchema, PaginatedNewsletterListSchema, PaginatedNewsletterSubscriptionListSchema, PatchedNewsletterCampaignRequestSchema, PatchedUnsubscribeRequestSchema, REFRESH_TOKEN_KEY, schemas_exports as Schemas, SendCampaignRequestSchema, SendCampaignResponseSchema, SubscribeRequestSchema, SubscribeResponseSchema, SuccessResponseSchema, TOKEN_KEY, TestEmailRequestSchema, UnsubscribeRequestSchema, UnsubscribeSchema, apiNewsletter, clearAPITokens, configureAPI, createNewsletterBulkCreate, createNewsletterCampaignsCreate, createNewsletterCampaignsSendCreate, createNewsletterSubscribeCreate, createNewsletterTestCreate, createNewsletterUnsubscribeCreate, deleteNewsletterCampaignsDestroy, dispatchValidationError, formatZodError, getAPIInstance, getNewsletterCampaignsList, getNewsletterCampaignsRetrieve, getNewsletterLogsList, getNewsletterNewslettersList, getNewsletterNewslettersRetrieve, getNewsletterSubscriptionsList, isAPIConfigured, onValidationError, partialUpdateNewsletterCampaignsPartialUpdate, partialUpdateNewsletterUnsubscribePartialUpdate, reconfigureAPI, resetAPI, shouldRetry, updateNewsletterCampaignsUpdate, updateNewsletterUnsubscribeUpdate, withRetry } from './chunk-LQLPNWHR.js';
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@djangocfg/ext-newsletter",
3
+ "version": "1.0.0",
4
+ "description": "Newsletter and subscription management extension for DjangoCFG",
5
+ "keywords": [
6
+ "django",
7
+ "djangocfg",
8
+ "extension",
9
+ "newsletter",
10
+ "subscription",
11
+ "email",
12
+ "marketing",
13
+ "typescript",
14
+ "react"
15
+ ],
16
+ "author": {
17
+ "name": "DjangoCFG",
18
+ "url": "https://djangocfg.com"
19
+ },
20
+ "homepage": "https://djangocfg.com",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/markolofsen/django-cfg.git",
24
+ "directory": "extensions/newsletter"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/markolofsen/django-cfg/issues"
28
+ },
29
+ "license": "MIT",
30
+ "type": "module",
31
+ "main": "./dist/index.cjs",
32
+ "module": "./dist/index.mjs",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.mjs",
38
+ "require": "./dist/index.cjs"
39
+ },
40
+ "./hooks": {
41
+ "types": "./dist/hooks.d.ts",
42
+ "import": "./dist/hooks.mjs",
43
+ "require": "./dist/hooks.cjs"
44
+ }
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "src"
49
+ ],
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "dev": "tsup --watch",
53
+ "check": "tsc --noEmit"
54
+ },
55
+ "peerDependencies": {
56
+ "@djangocfg/api": "^2.1.14",
57
+ "@djangocfg/ext-base": "^1.0.0",
58
+ "@djangocfg/ui-nextjs": "^2.1.14",
59
+ "consola": "^3.4.2",
60
+ "lucide-react": "^0.545.0",
61
+ "next": "^15.5.7",
62
+ "p-retry": "^7.0.0",
63
+ "react": "^18 || ^19",
64
+ "react-dom": "^18 || ^19",
65
+ "swr": "^2.3.7",
66
+ "zod": "^4.1.13"
67
+ },
68
+ "devDependencies": {
69
+ "@djangocfg/api": "^2.1.14",
70
+ "@djangocfg/ext-base": "^1.0.0",
71
+ "@djangocfg/typescript-config": "^2.1.14",
72
+ "@types/node": "^24.7.2",
73
+ "@types/react": "^19.0.0",
74
+ "consola": "^3.4.2",
75
+ "p-retry": "^7.0.0",
76
+ "swr": "^2.3.7",
77
+ "tsup": "^8.5.0",
78
+ "typescript": "^5.9.3"
79
+ }
80
+ }
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Typed fetchers for Newsletter
3
+ *
4
+ * Universal functions that work in any environment:
5
+ * - Next.js (App Router / Pages Router / Server Components)
6
+ * - React Native
7
+ * - Node.js backend
8
+ *
9
+ * These fetchers use Zod schemas for runtime validation.
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * // Configure API once (in your app entry point)
14
+ * import { configureAPI } from '../../api-instance'
15
+ * configureAPI({ baseUrl: 'https://api.example.com' })
16
+ *
17
+ * // Then use fetchers anywhere
18
+ * const users = await getUsers({ page: 1 })
19
+ *
20
+ * // With SWR
21
+ * const { data } = useSWR(['users', params], () => getUsers(params))
22
+ *
23
+ * // With React Query
24
+ * const { data } = useQuery(['users', params], () => getUsers(params))
25
+ *
26
+ * // In Server Component or SSR (pass custom client)
27
+ * import { API } from '../../index'
28
+ * const api = new API('https://api.example.com')
29
+ * const users = await getUsers({ page: 1 }, api)
30
+ * ```
31
+ */
32
+ import { consola } from 'consola'
33
+ import { NewsletterCampaignSchema, type NewsletterCampaign } from '../schemas/NewsletterCampaign.schema'
34
+ import { PatchedNewsletterCampaignRequestSchema, type PatchedNewsletterCampaignRequest } from '../schemas/PatchedNewsletterCampaignRequest.schema'
35
+ import { PatchedUnsubscribeRequestSchema, type PatchedUnsubscribeRequest } from '../schemas/PatchedUnsubscribeRequest.schema'
36
+ import { UnsubscribeSchema, type Unsubscribe } from '../schemas/Unsubscribe.schema'
37
+ import { UnsubscribeRequestSchema, type UnsubscribeRequest } from '../schemas/UnsubscribeRequest.schema'
38
+ import { getAPIInstance } from '../../api-instance'
39
+
40
+ /**
41
+ * API operation
42
+ *
43
+ * @method PATCH
44
+ * @path /cfg/newsletter/campaigns/{id}/
45
+ */
46
+ export async function partialUpdateNewsletterCampaignsPartialUpdate( id: number, data?: PatchedNewsletterCampaignRequest, client?: any
47
+ ): Promise<NewsletterCampaign> {
48
+ const api = client || getAPIInstance()
49
+ const response = await api.ext_newsletter_newsletter.campaignsPartialUpdate(id, data)
50
+ try {
51
+ return NewsletterCampaignSchema.parse(response)
52
+ } catch (error) {
53
+ // Zod validation error - log detailed information
54
+ consola.error('❌ Zod Validation Failed');
55
+ consola.box(`partialUpdateNewsletterCampaignsPartialUpdate\nPath: /cfg/newsletter/campaigns/{id}/\nMethod: PATCH`);
56
+
57
+ if (error instanceof Error && 'issues' in error && Array.isArray((error as any).issues)) {
58
+ consola.error('Validation Issues:');
59
+ (error as any).issues.forEach((issue: any, index: number) => {
60
+ consola.error(` ${index + 1}. ${issue.path.join('.') || 'root'}`);
61
+ consola.error(` ├─ Message: ${issue.message}`);
62
+ if (issue.expected) consola.error(` ├─ Expected: ${issue.expected}`);
63
+ if (issue.received) consola.error(` └─ Received: ${issue.received}`);
64
+ });
65
+ }
66
+
67
+ consola.error('Response data:', response);
68
+
69
+ // Dispatch browser CustomEvent (only if window is defined)
70
+ if (typeof window !== 'undefined' && error instanceof Error && 'issues' in error) {
71
+ try {
72
+ const event = new CustomEvent('zod-validation-error', {
73
+ detail: {
74
+ operation: 'partialUpdateNewsletterCampaignsPartialUpdate',
75
+ path: '/cfg/newsletter/campaigns/{id}/',
76
+ method: 'PATCH',
77
+ error: error,
78
+ response: response,
79
+ timestamp: new Date(),
80
+ },
81
+ bubbles: true,
82
+ cancelable: false,
83
+ });
84
+ window.dispatchEvent(event);
85
+ } catch (eventError) {
86
+ // Silently fail - event dispatch should never crash the app
87
+ consola.warn('Failed to dispatch validation error event:', eventError);
88
+ }
89
+ }
90
+
91
+ // Re-throw the error
92
+ throw error;
93
+ }
94
+ }
95
+
96
+
97
+ /**
98
+ * API operation
99
+ *
100
+ * @method PUT
101
+ * @path /cfg/newsletter/unsubscribe/
102
+ */
103
+ export async function updateNewsletterUnsubscribeUpdate( data: UnsubscribeRequest, client?: any
104
+ ): Promise<Unsubscribe> {
105
+ const api = client || getAPIInstance()
106
+ const response = await api.ext_newsletter_newsletter.unsubscribeUpdate(data)
107
+ try {
108
+ return UnsubscribeSchema.parse(response)
109
+ } catch (error) {
110
+ // Zod validation error - log detailed information
111
+ consola.error('❌ Zod Validation Failed');
112
+ consola.box(`updateNewsletterUnsubscribeUpdate\nPath: /cfg/newsletter/unsubscribe/\nMethod: PUT`);
113
+
114
+ if (error instanceof Error && 'issues' in error && Array.isArray((error as any).issues)) {
115
+ consola.error('Validation Issues:');
116
+ (error as any).issues.forEach((issue: any, index: number) => {
117
+ consola.error(` ${index + 1}. ${issue.path.join('.') || 'root'}`);
118
+ consola.error(` ├─ Message: ${issue.message}`);
119
+ if (issue.expected) consola.error(` ├─ Expected: ${issue.expected}`);
120
+ if (issue.received) consola.error(` └─ Received: ${issue.received}`);
121
+ });
122
+ }
123
+
124
+ consola.error('Response data:', response);
125
+
126
+ // Dispatch browser CustomEvent (only if window is defined)
127
+ if (typeof window !== 'undefined' && error instanceof Error && 'issues' in error) {
128
+ try {
129
+ const event = new CustomEvent('zod-validation-error', {
130
+ detail: {
131
+ operation: 'updateNewsletterUnsubscribeUpdate',
132
+ path: '/cfg/newsletter/unsubscribe/',
133
+ method: 'PUT',
134
+ error: error,
135
+ response: response,
136
+ timestamp: new Date(),
137
+ },
138
+ bubbles: true,
139
+ cancelable: false,
140
+ });
141
+ window.dispatchEvent(event);
142
+ } catch (eventError) {
143
+ // Silently fail - event dispatch should never crash the app
144
+ consola.warn('Failed to dispatch validation error event:', eventError);
145
+ }
146
+ }
147
+
148
+ // Re-throw the error
149
+ throw error;
150
+ }
151
+ }
152
+
153
+
154
+ /**
155
+ * API operation
156
+ *
157
+ * @method PATCH
158
+ * @path /cfg/newsletter/unsubscribe/
159
+ */
160
+ export async function partialUpdateNewsletterUnsubscribePartialUpdate( data?: PatchedUnsubscribeRequest, client?: any
161
+ ): Promise<Unsubscribe> {
162
+ const api = client || getAPIInstance()
163
+ const response = await api.ext_newsletter_newsletter.unsubscribePartialUpdate(data)
164
+ try {
165
+ return UnsubscribeSchema.parse(response)
166
+ } catch (error) {
167
+ // Zod validation error - log detailed information
168
+ consola.error('❌ Zod Validation Failed');
169
+ consola.box(`partialUpdateNewsletterUnsubscribePartialUpdate\nPath: /cfg/newsletter/unsubscribe/\nMethod: PATCH`);
170
+
171
+ if (error instanceof Error && 'issues' in error && Array.isArray((error as any).issues)) {
172
+ consola.error('Validation Issues:');
173
+ (error as any).issues.forEach((issue: any, index: number) => {
174
+ consola.error(` ${index + 1}. ${issue.path.join('.') || 'root'}`);
175
+ consola.error(` ├─ Message: ${issue.message}`);
176
+ if (issue.expected) consola.error(` ├─ Expected: ${issue.expected}`);
177
+ if (issue.received) consola.error(` └─ Received: ${issue.received}`);
178
+ });
179
+ }
180
+
181
+ consola.error('Response data:', response);
182
+
183
+ // Dispatch browser CustomEvent (only if window is defined)
184
+ if (typeof window !== 'undefined' && error instanceof Error && 'issues' in error) {
185
+ try {
186
+ const event = new CustomEvent('zod-validation-error', {
187
+ detail: {
188
+ operation: 'partialUpdateNewsletterUnsubscribePartialUpdate',
189
+ path: '/cfg/newsletter/unsubscribe/',
190
+ method: 'PATCH',
191
+ error: error,
192
+ response: response,
193
+ timestamp: new Date(),
194
+ },
195
+ bubbles: true,
196
+ cancelable: false,
197
+ });
198
+ window.dispatchEvent(event);
199
+ } catch (eventError) {
200
+ // Silently fail - event dispatch should never crash the app
201
+ consola.warn('Failed to dispatch validation error event:', eventError);
202
+ }
203
+ }
204
+
205
+ // Re-throw the error
206
+ throw error;
207
+ }
208
+ }
209
+
210
+
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Typed fetchers for Bulk Email
3
+ *
4
+ * Universal functions that work in any environment:
5
+ * - Next.js (App Router / Pages Router / Server Components)
6
+ * - React Native
7
+ * - Node.js backend
8
+ *
9
+ * These fetchers use Zod schemas for runtime validation.
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * // Configure API once (in your app entry point)
14
+ * import { configureAPI } from '../../api-instance'
15
+ * configureAPI({ baseUrl: 'https://api.example.com' })
16
+ *
17
+ * // Then use fetchers anywhere
18
+ * const users = await getUsers({ page: 1 })
19
+ *
20
+ * // With SWR
21
+ * const { data } = useSWR(['users', params], () => getUsers(params))
22
+ *
23
+ * // With React Query
24
+ * const { data } = useQuery(['users', params], () => getUsers(params))
25
+ *
26
+ * // In Server Component or SSR (pass custom client)
27
+ * import { API } from '../../index'
28
+ * const api = new API('https://api.example.com')
29
+ * const users = await getUsers({ page: 1 }, api)
30
+ * ```
31
+ */
32
+ import { consola } from 'consola'
33
+ import { BulkEmailRequestSchema, type BulkEmailRequest } from '../schemas/BulkEmailRequest.schema'
34
+ import { BulkEmailResponseSchema, type BulkEmailResponse } from '../schemas/BulkEmailResponse.schema'
35
+ import { getAPIInstance } from '../../api-instance'
36
+
37
+ /**
38
+ * Send Bulk Email
39
+ *
40
+ * @method POST
41
+ * @path /cfg/newsletter/bulk/
42
+ */
43
+ export async function createNewsletterBulkCreate( data: BulkEmailRequest, client?: any
44
+ ): Promise<BulkEmailResponse> {
45
+ const api = client || getAPIInstance()
46
+ const response = await api.ext_newsletter_bulk_email.newsletterBulkCreate(data)
47
+ try {
48
+ return BulkEmailResponseSchema.parse(response)
49
+ } catch (error) {
50
+ // Zod validation error - log detailed information
51
+ consola.error('❌ Zod Validation Failed');
52
+ consola.box(`createNewsletterBulkCreate\nPath: /cfg/newsletter/bulk/\nMethod: POST`);
53
+
54
+ if (error instanceof Error && 'issues' in error && Array.isArray((error as any).issues)) {
55
+ consola.error('Validation Issues:');
56
+ (error as any).issues.forEach((issue: any, index: number) => {
57
+ consola.error(` ${index + 1}. ${issue.path.join('.') || 'root'}`);
58
+ consola.error(` ├─ Message: ${issue.message}`);
59
+ if (issue.expected) consola.error(` ├─ Expected: ${issue.expected}`);
60
+ if (issue.received) consola.error(` └─ Received: ${issue.received}`);
61
+ });
62
+ }
63
+
64
+ consola.error('Response data:', response);
65
+
66
+ // Dispatch browser CustomEvent (only if window is defined)
67
+ if (typeof window !== 'undefined' && error instanceof Error && 'issues' in error) {
68
+ try {
69
+ const event = new CustomEvent('zod-validation-error', {
70
+ detail: {
71
+ operation: 'createNewsletterBulkCreate',
72
+ path: '/cfg/newsletter/bulk/',
73
+ method: 'POST',
74
+ error: error,
75
+ response: response,
76
+ timestamp: new Date(),
77
+ },
78
+ bubbles: true,
79
+ cancelable: false,
80
+ });
81
+ window.dispatchEvent(event);
82
+ } catch (eventError) {
83
+ // Silently fail - event dispatch should never crash the app
84
+ consola.warn('Failed to dispatch validation error event:', eventError);
85
+ }
86
+ }
87
+
88
+ // Re-throw the error
89
+ throw error;
90
+ }
91
+ }
92
+
93
+