@hualiglobal/kirimel-node-sdk 0.1.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.
- package/LICENSE +21 -0
- package/README.md +480 -0
- package/dist/client.d.ts +39 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +83 -0
- package/dist/client.js.map +1 -0
- package/dist/exceptions.d.ts +27 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +41 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/httpClient.d.ts +33 -0
- package/dist/httpClient.d.ts.map +1 -0
- package/dist/httpClient.js +131 -0
- package/dist/httpClient.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/Campaigns.d.ts +20 -0
- package/dist/resources/Campaigns.d.ts.map +1 -0
- package/dist/resources/Campaigns.js +43 -0
- package/dist/resources/Campaigns.js.map +1 -0
- package/dist/resources/Conversions.d.ts +18 -0
- package/dist/resources/Conversions.d.ts.map +1 -0
- package/dist/resources/Conversions.js +37 -0
- package/dist/resources/Conversions.js.map +1 -0
- package/dist/resources/Forms.d.ts +18 -0
- package/dist/resources/Forms.d.ts.map +1 -0
- package/dist/resources/Forms.js +37 -0
- package/dist/resources/Forms.js.map +1 -0
- package/dist/resources/LandingPages.d.ts +19 -0
- package/dist/resources/LandingPages.d.ts.map +1 -0
- package/dist/resources/LandingPages.js +40 -0
- package/dist/resources/LandingPages.js.map +1 -0
- package/dist/resources/Lists.d.ts +15 -0
- package/dist/resources/Lists.d.ts.map +1 -0
- package/dist/resources/Lists.js +28 -0
- package/dist/resources/Lists.js.map +1 -0
- package/dist/resources/Segments.d.ts +20 -0
- package/dist/resources/Segments.d.ts.map +1 -0
- package/dist/resources/Segments.js +43 -0
- package/dist/resources/Segments.js.map +1 -0
- package/dist/resources/Subscribers.d.ts +24 -0
- package/dist/resources/Subscribers.d.ts.map +1 -0
- package/dist/resources/Subscribers.js +55 -0
- package/dist/resources/Subscribers.js.map +1 -0
- package/dist/resources/Templates.d.ts +18 -0
- package/dist/resources/Templates.d.ts.map +1 -0
- package/dist/resources/Templates.js +37 -0
- package/dist/resources/Templates.js.map +1 -0
- package/dist/resources/Workflows.d.ts +23 -0
- package/dist/resources/Workflows.d.ts.map +1 -0
- package/dist/resources/Workflows.js +52 -0
- package/dist/resources/Workflows.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 KiriMel
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
# KiriMel Node.js SDK
|
|
2
|
+
|
|
3
|
+
Official Node.js SDK for KiriMel Email Marketing API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @kirimel/node-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Client } from '@kirimel/node-sdk';
|
|
15
|
+
|
|
16
|
+
// Initialize the client
|
|
17
|
+
const client = new Client({
|
|
18
|
+
apiKey: 'sk_test_xxx', // Or set KIRIMEL_API_KEY env variable
|
|
19
|
+
baseUrl: 'https://api.kirimel.com/v2',
|
|
20
|
+
timeout: 30000,
|
|
21
|
+
retries: 3
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// List campaigns
|
|
25
|
+
const campaigns = await client.campaigns.list({ status: 'sent', limit: 20 });
|
|
26
|
+
|
|
27
|
+
// Create a campaign
|
|
28
|
+
const campaign = await client.campaigns.create({
|
|
29
|
+
name: 'Welcome Email',
|
|
30
|
+
subject: 'Welcome to KiriMel!',
|
|
31
|
+
list_id: 123,
|
|
32
|
+
template_id: 456
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Get campaign statistics
|
|
36
|
+
const stats = await client.campaigns.stats(campaign.id);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Authentication
|
|
40
|
+
|
|
41
|
+
The SDK supports two authentication methods:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// Method 1: API Key (recommended)
|
|
45
|
+
const client = new Client({ apiKey: 'sk_test_xxx' });
|
|
46
|
+
|
|
47
|
+
// Method 2: Environment variable
|
|
48
|
+
// Set KIRIMEL_API_KEY=sk_test_xxx in your environment
|
|
49
|
+
const client = new Client();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Resources
|
|
53
|
+
|
|
54
|
+
### Campaigns
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// List campaigns
|
|
58
|
+
const campaigns = await client.campaigns.list({ limit: 20, status: 'sent' });
|
|
59
|
+
|
|
60
|
+
// Get recent campaigns
|
|
61
|
+
const recent = await client.campaigns.recent();
|
|
62
|
+
|
|
63
|
+
// Get single campaign
|
|
64
|
+
const campaign = await client.campaigns.get(id);
|
|
65
|
+
|
|
66
|
+
// Create campaign
|
|
67
|
+
const campaign = await client.campaigns.create({
|
|
68
|
+
name: 'Summer Sale',
|
|
69
|
+
subject: '50% Off Everything!',
|
|
70
|
+
list_id: 123,
|
|
71
|
+
template_id: 456
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Update campaign
|
|
75
|
+
await client.campaigns.update(id, { subject: 'New Subject' });
|
|
76
|
+
|
|
77
|
+
// Delete campaign
|
|
78
|
+
await client.campaigns.delete(id);
|
|
79
|
+
|
|
80
|
+
// Duplicate campaign
|
|
81
|
+
const duplicate = await client.campaigns.duplicate(id);
|
|
82
|
+
|
|
83
|
+
// Schedule campaign
|
|
84
|
+
await client.campaigns.schedule(id, '2024-06-01 10:00:00');
|
|
85
|
+
|
|
86
|
+
// Pause campaign
|
|
87
|
+
await client.campaigns.pause(id);
|
|
88
|
+
|
|
89
|
+
// Resume campaign
|
|
90
|
+
await client.campaigns.resume(id);
|
|
91
|
+
|
|
92
|
+
// Get campaign statistics
|
|
93
|
+
const stats = await client.campaigns.stats(id);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Subscribers
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// List subscribers for a list
|
|
100
|
+
const subscribers = await client.subscribers.list(listId, { limit: 50 });
|
|
101
|
+
|
|
102
|
+
// Get single subscriber
|
|
103
|
+
const subscriber = await client.subscribers.get(id);
|
|
104
|
+
|
|
105
|
+
// Add subscriber to a list
|
|
106
|
+
const subscriber = await client.subscribers.create(listId, {
|
|
107
|
+
email: 'user@example.com',
|
|
108
|
+
first_name: 'John',
|
|
109
|
+
last_name: 'Doe'
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Update subscriber
|
|
113
|
+
await client.subscribers.update(id, { first_name: 'Jane' });
|
|
114
|
+
|
|
115
|
+
// Delete subscriber
|
|
116
|
+
await client.subscribers.delete(id);
|
|
117
|
+
|
|
118
|
+
// Unsubscribe subscriber
|
|
119
|
+
await client.subscribers.unsubscribe(id);
|
|
120
|
+
|
|
121
|
+
// Bulk unsubscribe
|
|
122
|
+
await client.subscribers.bulkUnsubscribe([id1, id2, id3]);
|
|
123
|
+
|
|
124
|
+
// Bulk delete
|
|
125
|
+
await client.subscribers.bulkDelete([id1, id2, id3]);
|
|
126
|
+
|
|
127
|
+
// Get subscriber activity
|
|
128
|
+
const activity = await client.subscribers.activity(id);
|
|
129
|
+
|
|
130
|
+
// Get subscriber statistics
|
|
131
|
+
const stats = await client.subscribers.stats(id);
|
|
132
|
+
|
|
133
|
+
// Toggle VIP status
|
|
134
|
+
await client.subscribers.toggleVip(id);
|
|
135
|
+
|
|
136
|
+
// Search subscribers
|
|
137
|
+
const results = await client.subscribers.search('john@example.com');
|
|
138
|
+
|
|
139
|
+
// Add tag
|
|
140
|
+
await client.subscribers.addTag(id, 'premium-customer');
|
|
141
|
+
|
|
142
|
+
// Remove tag
|
|
143
|
+
await client.subscribers.removeTag(id, 'premium-customer');
|
|
144
|
+
|
|
145
|
+
// Import subscribers
|
|
146
|
+
const result = await client.subscribers.import(listId, {
|
|
147
|
+
subscribers: [
|
|
148
|
+
{ email: 'user1@example.com', first_name: 'User 1' },
|
|
149
|
+
{ email: 'user2@example.com', first_name: 'User 2' }
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Lists
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// List all lists
|
|
158
|
+
const lists = await client.lists.list();
|
|
159
|
+
|
|
160
|
+
// Get single list
|
|
161
|
+
const list = await client.lists.get(id);
|
|
162
|
+
|
|
163
|
+
// Create list
|
|
164
|
+
const list = await client.lists.create({
|
|
165
|
+
name: 'Newsletter Subscribers',
|
|
166
|
+
description: 'Monthly newsletter'
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Update list
|
|
170
|
+
await client.lists.update(id, { name: 'Updated Name' });
|
|
171
|
+
|
|
172
|
+
// Delete list
|
|
173
|
+
await client.lists.delete(id);
|
|
174
|
+
|
|
175
|
+
// Get list statistics
|
|
176
|
+
const stats = await client.lists.stats(id);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Segments
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// List segments for a list
|
|
183
|
+
const segments = await client.segments.list(listId);
|
|
184
|
+
|
|
185
|
+
// Get single segment
|
|
186
|
+
const segment = await client.segments.get(id);
|
|
187
|
+
|
|
188
|
+
// Create segment
|
|
189
|
+
const segment = await client.segments.create(listId, {
|
|
190
|
+
name: 'Active Subscribers',
|
|
191
|
+
conditions: [
|
|
192
|
+
{ field: 'status', operator: 'equals', value: 'active' }
|
|
193
|
+
]
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Update segment
|
|
197
|
+
await client.segments.update(id, { name: 'Updated Name' });
|
|
198
|
+
|
|
199
|
+
// Delete segment
|
|
200
|
+
await client.segments.delete(id);
|
|
201
|
+
|
|
202
|
+
// Preview segment (without saving)
|
|
203
|
+
const preview = await client.segments.preview(listId, [
|
|
204
|
+
{ field: 'status', operator: 'equals', value: 'active' }
|
|
205
|
+
]);
|
|
206
|
+
|
|
207
|
+
// Get segment subscribers
|
|
208
|
+
const subscribers = await client.segments.subscribers(id);
|
|
209
|
+
|
|
210
|
+
// Refresh segment count
|
|
211
|
+
await client.segments.refresh(id);
|
|
212
|
+
|
|
213
|
+
// Get segment build logs
|
|
214
|
+
const logs = await client.segments.logs(id);
|
|
215
|
+
|
|
216
|
+
// Get segment templates
|
|
217
|
+
const templates = await client.segments.templates();
|
|
218
|
+
|
|
219
|
+
// Get available fields
|
|
220
|
+
const fields = await client.segments.fields();
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Templates
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// List all templates
|
|
227
|
+
const templates = await client.templates.list({ limit: 20 });
|
|
228
|
+
|
|
229
|
+
// Get single template
|
|
230
|
+
const template = await client.templates.get(id);
|
|
231
|
+
|
|
232
|
+
// Create template
|
|
233
|
+
const template = await client.templates.create({
|
|
234
|
+
name: 'Welcome Email',
|
|
235
|
+
subject: 'Welcome!',
|
|
236
|
+
html_content: '<h1>Hello {{name}}</h1>',
|
|
237
|
+
category: 'transactional'
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Update template
|
|
241
|
+
await client.templates.update(id, { name: 'Updated Name' });
|
|
242
|
+
|
|
243
|
+
// Delete template
|
|
244
|
+
await client.templates.delete(id);
|
|
245
|
+
|
|
246
|
+
// Duplicate template
|
|
247
|
+
const duplicate = await client.templates.duplicate(id);
|
|
248
|
+
|
|
249
|
+
// Get templates by category
|
|
250
|
+
const templates = await client.templates.byCategory('newsletter');
|
|
251
|
+
|
|
252
|
+
// Search templates
|
|
253
|
+
const results = await client.templates.search('welcome');
|
|
254
|
+
|
|
255
|
+
// Get categories
|
|
256
|
+
const categories = await client.templates.categories();
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Forms
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
// List all forms
|
|
263
|
+
const forms = await client.forms.list();
|
|
264
|
+
|
|
265
|
+
// Get single form
|
|
266
|
+
const form = await client.forms.get(id);
|
|
267
|
+
|
|
268
|
+
// Create form
|
|
269
|
+
const form = await client.forms.create({
|
|
270
|
+
name: 'Newsletter Signup',
|
|
271
|
+
list_id: 123,
|
|
272
|
+
fields: [
|
|
273
|
+
{ name: 'email', type: 'email', required: true },
|
|
274
|
+
{ name: 'first_name', type: 'text', required: false }
|
|
275
|
+
]
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// Update form
|
|
279
|
+
await client.forms.update(id, { name: 'Updated Name' });
|
|
280
|
+
|
|
281
|
+
// Delete form
|
|
282
|
+
await client.forms.delete(id);
|
|
283
|
+
|
|
284
|
+
// Duplicate form
|
|
285
|
+
const duplicate = await client.forms.duplicate(id);
|
|
286
|
+
|
|
287
|
+
// Get form analytics
|
|
288
|
+
const analytics = await client.forms.analytics(id);
|
|
289
|
+
|
|
290
|
+
// Get form submissions
|
|
291
|
+
const submissions = await client.forms.submissions(id);
|
|
292
|
+
|
|
293
|
+
// Get embed code
|
|
294
|
+
const embed = await client.forms.embed(id);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Conversions
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
// List all conversion goals
|
|
301
|
+
const conversions = await client.conversions.list();
|
|
302
|
+
|
|
303
|
+
// Get single conversion goal
|
|
304
|
+
const goal = await client.conversions.get(id);
|
|
305
|
+
|
|
306
|
+
// Create conversion goal
|
|
307
|
+
const goal = await client.conversions.create({
|
|
308
|
+
name: 'Purchase',
|
|
309
|
+
event_type: 'purchase',
|
|
310
|
+
value: 100
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Update conversion goal
|
|
314
|
+
await client.conversions.update(id, { name: 'Updated Name' });
|
|
315
|
+
|
|
316
|
+
// Delete conversion goal
|
|
317
|
+
await client.conversions.delete(id);
|
|
318
|
+
|
|
319
|
+
// Track a conversion
|
|
320
|
+
await client.conversions.track({
|
|
321
|
+
goal_id: id,
|
|
322
|
+
subscriber_id: 123,
|
|
323
|
+
value: 50
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// Get conversions for a goal
|
|
327
|
+
const conversions = await client.conversions.conversions(id);
|
|
328
|
+
|
|
329
|
+
// Get ROI report
|
|
330
|
+
const roi = await client.conversions.roi();
|
|
331
|
+
|
|
332
|
+
// Get funnel analysis
|
|
333
|
+
const funnel = await client.conversions.funnel(id);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Landing Pages
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// List all landing pages
|
|
340
|
+
const pages = await client.landingPages.list();
|
|
341
|
+
|
|
342
|
+
// Get single landing page
|
|
343
|
+
const page = await client.landingPages.get(id);
|
|
344
|
+
|
|
345
|
+
// Create landing page
|
|
346
|
+
const page = await client.landingPages.create({
|
|
347
|
+
name: 'Thank You Page',
|
|
348
|
+
slug: 'thank-you',
|
|
349
|
+
html_content: '<h1>Thank you!</h1>'
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// Update landing page
|
|
353
|
+
await client.landingPages.update(id, { name: 'Updated Name' });
|
|
354
|
+
|
|
355
|
+
// Delete landing page
|
|
356
|
+
await client.landingPages.delete(id);
|
|
357
|
+
|
|
358
|
+
// Duplicate landing page
|
|
359
|
+
const duplicate = await client.landingPages.duplicate(id);
|
|
360
|
+
|
|
361
|
+
// Publish landing page
|
|
362
|
+
await client.landingPages.publish(id);
|
|
363
|
+
|
|
364
|
+
// Unpublish landing page
|
|
365
|
+
await client.landingPages.unpublish(id);
|
|
366
|
+
|
|
367
|
+
// Get landing page analytics
|
|
368
|
+
const analytics = await client.landingPages.analytics(id);
|
|
369
|
+
|
|
370
|
+
// Get templates
|
|
371
|
+
const templates = await client.landingPages.templates();
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Workflows
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
// List all workflows
|
|
378
|
+
const workflows = await client.workflows.list();
|
|
379
|
+
|
|
380
|
+
// Get single workflow
|
|
381
|
+
const workflow = await client.workflows.get(id);
|
|
382
|
+
|
|
383
|
+
// Create workflow
|
|
384
|
+
const workflow = await client.workflows.create({
|
|
385
|
+
name: 'Welcome Series',
|
|
386
|
+
nodes: [...],
|
|
387
|
+
edges: [...]
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Update workflow
|
|
391
|
+
await client.workflows.update(id, { name: 'Updated Name' });
|
|
392
|
+
|
|
393
|
+
// Delete workflow
|
|
394
|
+
await client.workflows.delete(id);
|
|
395
|
+
|
|
396
|
+
// Duplicate workflow
|
|
397
|
+
const duplicate = await client.workflows.duplicate(id);
|
|
398
|
+
|
|
399
|
+
// Activate workflow
|
|
400
|
+
await client.workflows.activate(id);
|
|
401
|
+
|
|
402
|
+
// Pause workflow
|
|
403
|
+
await client.workflows.pause(id);
|
|
404
|
+
|
|
405
|
+
// Validate workflow
|
|
406
|
+
const validation = await client.workflows.validate(id);
|
|
407
|
+
|
|
408
|
+
// Get workflow executions
|
|
409
|
+
const executions = await client.workflows.executions(id);
|
|
410
|
+
|
|
411
|
+
// Get workflow templates
|
|
412
|
+
const templates = await client.workflows.templates();
|
|
413
|
+
|
|
414
|
+
// Create workflow from template
|
|
415
|
+
const workflow = await client.workflows.fromTemplate(templateId);
|
|
416
|
+
|
|
417
|
+
// Get available node types
|
|
418
|
+
const nodeTypes = await client.workflows.nodeTypes();
|
|
419
|
+
|
|
420
|
+
// Get workflow data
|
|
421
|
+
const data = await client.workflows.getData(id);
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## Error Handling
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
import {
|
|
428
|
+
ApiException,
|
|
429
|
+
AuthenticationException,
|
|
430
|
+
RateLimitException,
|
|
431
|
+
ValidationException
|
|
432
|
+
} from '@kirimel/node-sdk';
|
|
433
|
+
|
|
434
|
+
try {
|
|
435
|
+
const campaign = await client.campaigns.create(data);
|
|
436
|
+
} catch (error) {
|
|
437
|
+
if (error instanceof AuthenticationException) {
|
|
438
|
+
// Invalid API key
|
|
439
|
+
console.error(`Authentication failed: ${error.message}`);
|
|
440
|
+
} else if (error instanceof RateLimitException) {
|
|
441
|
+
// Too many requests
|
|
442
|
+
console.error(`Rate limited. Retry after: ${error.retryAfter} seconds`);
|
|
443
|
+
} else if (error instanceof ValidationException) {
|
|
444
|
+
// Invalid data
|
|
445
|
+
console.error(`Validation errors:`, error.errors);
|
|
446
|
+
} else if (error instanceof ApiException) {
|
|
447
|
+
// General API error
|
|
448
|
+
console.error(`API error (${error.statusCode}): ${error.message}`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
## Logging
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
const client = new Client({
|
|
457
|
+
apiKey: 'sk_test_xxx',
|
|
458
|
+
logger: {
|
|
459
|
+
debug: (message, context) => console.log(`[DEBUG] ${message}`, context),
|
|
460
|
+
info: (message, context) => console.info(`[INFO] ${message}`, context),
|
|
461
|
+
warn: (message, context) => console.warn(`[WARN] ${message}`, context),
|
|
462
|
+
error: (message, context) => console.error(`[ERROR] ${message}`, context),
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
## Requirements
|
|
468
|
+
|
|
469
|
+
- Node.js 16.0.0 or higher
|
|
470
|
+
- TypeScript 4.5+ (for TypeScript projects)
|
|
471
|
+
|
|
472
|
+
## License
|
|
473
|
+
|
|
474
|
+
MIT License
|
|
475
|
+
|
|
476
|
+
## Support
|
|
477
|
+
|
|
478
|
+
- Documentation: https://docs.kirimel.com
|
|
479
|
+
- GitHub: https://github.com/hualiglobal/kirimel-node-sdk
|
|
480
|
+
- Issues: https://github.com/hualiglobal/kirimel-node-sdk/issues
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiriMel Node.js SDK Client
|
|
3
|
+
*/
|
|
4
|
+
import { HttpClientConfig } from './httpClient';
|
|
5
|
+
import { Campaigns } from './resources/Campaigns';
|
|
6
|
+
import { Subscribers } from './resources/Subscribers';
|
|
7
|
+
import { Lists } from './resources/Lists';
|
|
8
|
+
import { Segments } from './resources/Segments';
|
|
9
|
+
import { Templates } from './resources/Templates';
|
|
10
|
+
import { Forms } from './resources/Forms';
|
|
11
|
+
import { Conversions } from './resources/Conversions';
|
|
12
|
+
import { LandingPages } from './resources/LandingPages';
|
|
13
|
+
import { Workflows } from './resources/Workflows';
|
|
14
|
+
export interface ClientConfig extends Omit<HttpClientConfig, 'logger'> {
|
|
15
|
+
logger?: any;
|
|
16
|
+
}
|
|
17
|
+
export declare class Client {
|
|
18
|
+
private readonly httpClient;
|
|
19
|
+
private _campaigns?;
|
|
20
|
+
private _subscribers?;
|
|
21
|
+
private _lists?;
|
|
22
|
+
private _segments?;
|
|
23
|
+
private _templates?;
|
|
24
|
+
private _forms?;
|
|
25
|
+
private _conversions?;
|
|
26
|
+
private _landingPages?;
|
|
27
|
+
private _workflows?;
|
|
28
|
+
constructor(config?: ClientConfig);
|
|
29
|
+
get campaigns(): Campaigns;
|
|
30
|
+
get subscribers(): Subscribers;
|
|
31
|
+
get lists(): Lists;
|
|
32
|
+
get segments(): Segments;
|
|
33
|
+
get templates(): Templates;
|
|
34
|
+
get forms(): Forms;
|
|
35
|
+
get conversions(): Conversions;
|
|
36
|
+
get landingPages(): LandingPages;
|
|
37
|
+
get workflows(): Workflows;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAc,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IACpE,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,OAAO,CAAC,UAAU,CAAC,CAAY;gBAEnB,MAAM,GAAE,YAAiB;IAUrC,IAAW,SAAS,IAAI,SAAS,CAKhC;IAED,IAAW,WAAW,IAAI,WAAW,CAKpC;IAED,IAAW,KAAK,IAAI,KAAK,CAKxB;IAED,IAAW,QAAQ,IAAI,QAAQ,CAK9B;IAED,IAAW,SAAS,IAAI,SAAS,CAKhC;IAED,IAAW,KAAK,IAAI,KAAK,CAKxB;IAED,IAAW,WAAW,IAAI,WAAW,CAKpC;IAED,IAAW,YAAY,IAAI,YAAY,CAKtC;IAED,IAAW,SAAS,IAAI,SAAS,CAKhC;CACF"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Client = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* KiriMel Node.js SDK Client
|
|
6
|
+
*/
|
|
7
|
+
const httpClient_1 = require("./httpClient");
|
|
8
|
+
const Campaigns_1 = require("./resources/Campaigns");
|
|
9
|
+
const Subscribers_1 = require("./resources/Subscribers");
|
|
10
|
+
const Lists_1 = require("./resources/Lists");
|
|
11
|
+
const Segments_1 = require("./resources/Segments");
|
|
12
|
+
const Templates_1 = require("./resources/Templates");
|
|
13
|
+
const Forms_1 = require("./resources/Forms");
|
|
14
|
+
const Conversions_1 = require("./resources/Conversions");
|
|
15
|
+
const LandingPages_1 = require("./resources/LandingPages");
|
|
16
|
+
const Workflows_1 = require("./resources/Workflows");
|
|
17
|
+
class Client {
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.httpClient = new httpClient_1.HttpClient({
|
|
20
|
+
apiKey: config.apiKey,
|
|
21
|
+
baseUrl: config.baseUrl,
|
|
22
|
+
timeout: config.timeout,
|
|
23
|
+
retries: config.retries,
|
|
24
|
+
logger: config.logger,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
get campaigns() {
|
|
28
|
+
if (!this._campaigns) {
|
|
29
|
+
this._campaigns = new Campaigns_1.Campaigns(this.httpClient);
|
|
30
|
+
}
|
|
31
|
+
return this._campaigns;
|
|
32
|
+
}
|
|
33
|
+
get subscribers() {
|
|
34
|
+
if (!this._subscribers) {
|
|
35
|
+
this._subscribers = new Subscribers_1.Subscribers(this.httpClient);
|
|
36
|
+
}
|
|
37
|
+
return this._subscribers;
|
|
38
|
+
}
|
|
39
|
+
get lists() {
|
|
40
|
+
if (!this._lists) {
|
|
41
|
+
this._lists = new Lists_1.Lists(this.httpClient);
|
|
42
|
+
}
|
|
43
|
+
return this._lists;
|
|
44
|
+
}
|
|
45
|
+
get segments() {
|
|
46
|
+
if (!this._segments) {
|
|
47
|
+
this._segments = new Segments_1.Segments(this.httpClient);
|
|
48
|
+
}
|
|
49
|
+
return this._segments;
|
|
50
|
+
}
|
|
51
|
+
get templates() {
|
|
52
|
+
if (!this._templates) {
|
|
53
|
+
this._templates = new Templates_1.Templates(this.httpClient);
|
|
54
|
+
}
|
|
55
|
+
return this._templates;
|
|
56
|
+
}
|
|
57
|
+
get forms() {
|
|
58
|
+
if (!this._forms) {
|
|
59
|
+
this._forms = new Forms_1.Forms(this.httpClient);
|
|
60
|
+
}
|
|
61
|
+
return this._forms;
|
|
62
|
+
}
|
|
63
|
+
get conversions() {
|
|
64
|
+
if (!this._conversions) {
|
|
65
|
+
this._conversions = new Conversions_1.Conversions(this.httpClient);
|
|
66
|
+
}
|
|
67
|
+
return this._conversions;
|
|
68
|
+
}
|
|
69
|
+
get landingPages() {
|
|
70
|
+
if (!this._landingPages) {
|
|
71
|
+
this._landingPages = new LandingPages_1.LandingPages(this.httpClient);
|
|
72
|
+
}
|
|
73
|
+
return this._landingPages;
|
|
74
|
+
}
|
|
75
|
+
get workflows() {
|
|
76
|
+
if (!this._workflows) {
|
|
77
|
+
this._workflows = new Workflows_1.Workflows(this.httpClient);
|
|
78
|
+
}
|
|
79
|
+
return this._workflows;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.Client = Client;
|
|
83
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,6CAA4D;AAC5D,qDAAkD;AAClD,yDAAsD;AACtD,6CAA0C;AAC1C,mDAAgD;AAChD,qDAAkD;AAClD,6CAA0C;AAC1C,yDAAsD;AACtD,2DAAwD;AACxD,qDAAkD;AAMlD,MAAa,MAAM;IAYjB,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED,IAAW,SAAS;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,WAAW;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,KAAK;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,QAAQ;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAW,SAAS;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAW,KAAK;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAW,WAAW;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAW,YAAY;QACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,2BAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,SAAS;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AApFD,wBAoFC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiriMel SDK Exception Classes
|
|
3
|
+
*/
|
|
4
|
+
export interface ApiError {
|
|
5
|
+
message: string;
|
|
6
|
+
field?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ApiException extends Error {
|
|
9
|
+
readonly statusCode?: number;
|
|
10
|
+
readonly errors?: ApiError[];
|
|
11
|
+
readonly errorType?: string;
|
|
12
|
+
constructor(message: string, statusCode?: number, errors?: ApiError[]);
|
|
13
|
+
}
|
|
14
|
+
export declare class AuthenticationException extends ApiException {
|
|
15
|
+
readonly errorType = "authentication_error";
|
|
16
|
+
constructor(message: string, statusCode?: number, errors?: ApiError[]);
|
|
17
|
+
}
|
|
18
|
+
export declare class RateLimitException extends ApiException {
|
|
19
|
+
readonly errorType = "rate_limit_error";
|
|
20
|
+
readonly retryAfter?: number;
|
|
21
|
+
constructor(message: string, statusCode?: number, errors?: ApiError[], retryAfter?: number);
|
|
22
|
+
}
|
|
23
|
+
export declare class ValidationException extends ApiException {
|
|
24
|
+
readonly errorType = "validation_error";
|
|
25
|
+
constructor(message: string, statusCode?: number, errors?: ApiError[]);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../src/exceptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,QAAQ,EAAE;CAOtB;AAED,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,SAAgB,SAAS,0BAA0B;gBAEvC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE;CAItE;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,SAAgB,SAAS,sBAAsB;IAC/C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAGlC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,QAAQ,EAAE,EACnB,UAAU,CAAC,EAAE,MAAM;CAMtB;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,SAAgB,SAAS,sBAAsB;gBAEnC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE;CAItE"}
|