@warriorteam/redai-zalo-sdk 1.11.0 → 1.12.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.
@@ -0,0 +1,230 @@
1
+ # Webhook Message Helper Functions
2
+
3
+ Tài liệu này mô tả các hàm helper để phân biệt các loại sự kiện tin nhắn trong Zalo webhook.
4
+
5
+ ## Tổng quan
6
+
7
+ RedAI Zalo SDK cung cấp các hàm helper để dễ dàng phân biệt các loại sự kiện tin nhắn:
8
+
9
+ 1. **Tin nhắn từ người dùng cá nhân** - `isUserMessageEvent()`
10
+ 2. **Tin nhắn từ group** - `isGroupMessageEvent()`
11
+ 3. **Tin nhắn OA gửi cho cá nhân** - `isOAToUserMessageEvent()`
12
+ 4. **Tin nhắn OA gửi tới group** - `isOAToGroupMessageEvent()`
13
+ 5. **Xác định hướng và đích của tin nhắn** - `getMessageDirection()`
14
+
15
+ ## Import
16
+
17
+ ```typescript
18
+ import {
19
+ isUserMessageEvent,
20
+ isGroupMessageEvent,
21
+ isOAToUserMessageEvent,
22
+ isOAToGroupMessageEvent,
23
+ getMessageDirection,
24
+ WebhookEvent,
25
+ } from '@warriorteam/redai-zalo-sdk';
26
+ ```
27
+
28
+ ## Sử dụng
29
+
30
+ ### 1. Phân biệt tin nhắn từ người dùng cá nhân
31
+
32
+ ```typescript
33
+ function handleWebhook(event: WebhookEvent) {
34
+ if (isUserMessageEvent(event)) {
35
+ console.log('Nhận được tin nhắn từ người dùng cá nhân');
36
+ console.log('Sender:', event.sender.id);
37
+ console.log('Content:', event.message.text);
38
+
39
+ // Xử lý tin nhắn từ user cá nhân
40
+ handleUserMessage(event);
41
+ }
42
+ }
43
+ ```
44
+
45
+ ### 2. Phân biệt tin nhắn từ group
46
+
47
+ ```typescript
48
+ function handleWebhook(event: WebhookEvent) {
49
+ if (isGroupMessageEvent(event)) {
50
+ console.log('Nhận được tin nhắn từ group');
51
+ console.log('Group ID:', event.recipient.id);
52
+ console.log('Sender:', event.sender.id);
53
+ console.log('Content:', event.message.text);
54
+
55
+ // Xử lý tin nhắn từ group
56
+ handleGroupMessage(event);
57
+ }
58
+ }
59
+ ```
60
+
61
+ ### 3. Phân biệt tin nhắn OA gửi cho cá nhân
62
+
63
+ ```typescript
64
+ function handleWebhook(event: WebhookEvent) {
65
+ if (isOAToUserMessageEvent(event)) {
66
+ console.log('OA đã gửi tin nhắn cho người dùng cá nhân');
67
+ console.log('Recipient:', event.recipient.id);
68
+ console.log('Content:', event.message.text);
69
+
70
+ // Xử lý tin nhắn OA gửi cho user
71
+ handleOAToUserMessage(event);
72
+ }
73
+ }
74
+ ```
75
+
76
+ ### 4. Phân biệt tin nhắn OA gửi tới group
77
+
78
+ ```typescript
79
+ function handleWebhook(event: WebhookEvent) {
80
+ if (isOAToGroupMessageEvent(event)) {
81
+ console.log('OA đã gửi tin nhắn tới group');
82
+ console.log('Group ID:', event.recipient.id);
83
+ console.log('Content:', event.message.text);
84
+
85
+ // Xử lý tin nhắn OA gửi tới group
86
+ handleOAToGroupMessage(event);
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### 5. Xác định hướng và đích của tin nhắn
92
+
93
+ ```typescript
94
+ function handleWebhook(event: WebhookEvent) {
95
+ const messageInfo = getMessageDirection(event);
96
+
97
+ console.log('Direction:', messageInfo.direction); // 'incoming' | 'outgoing' | 'unknown'
98
+ console.log('Target:', messageInfo.target); // 'user' | 'group' | 'unknown'
99
+ console.log('Description:', messageInfo.description);
100
+
101
+ // Xử lý dựa trên hướng và đích
102
+ switch (`${messageInfo.direction}-${messageInfo.target}`) {
103
+ case 'incoming-user':
104
+ handleIncomingUserMessage(event);
105
+ break;
106
+ case 'incoming-group':
107
+ handleIncomingGroupMessage(event);
108
+ break;
109
+ case 'outgoing-user':
110
+ handleOutgoingUserMessage(event);
111
+ break;
112
+ case 'outgoing-group':
113
+ handleOutgoingGroupMessage(event);
114
+ break;
115
+ default:
116
+ console.log('Unknown message type');
117
+ }
118
+ }
119
+ ```
120
+
121
+ ## Ví dụ tổng hợp
122
+
123
+ ```typescript
124
+ import {
125
+ isUserMessageEvent,
126
+ isGroupMessageEvent,
127
+ isOAToUserMessageEvent,
128
+ isOAToGroupMessageEvent,
129
+ getMessageDirection,
130
+ WebhookEvent,
131
+ } from '@warriorteam/redai-zalo-sdk';
132
+
133
+ class ZaloWebhookHandler {
134
+ handleWebhook(event: WebhookEvent) {
135
+ // Cách 1: Sử dụng các hàm kiểm tra riêng lẻ
136
+ if (isUserMessageEvent(event)) {
137
+ this.handleUserMessage(event);
138
+ } else if (isGroupMessageEvent(event)) {
139
+ this.handleGroupMessage(event);
140
+ } else if (isOAToUserMessageEvent(event)) {
141
+ this.handleOAToUserMessage(event);
142
+ } else if (isOAToGroupMessageEvent(event)) {
143
+ this.handleOAToGroupMessage(event);
144
+ }
145
+
146
+ // Cách 2: Sử dụng getMessageDirection
147
+ const messageInfo = getMessageDirection(event);
148
+ this.logMessageInfo(messageInfo);
149
+ }
150
+
151
+ private handleUserMessage(event: UserMessageWebhookEvent) {
152
+ console.log('Processing user message:', event.message.text);
153
+ // Logic xử lý tin nhắn từ user cá nhân
154
+ }
155
+
156
+ private handleGroupMessage(event: GroupWebhookEvent) {
157
+ console.log('Processing group message:', event.message.text);
158
+ // Logic xử lý tin nhắn từ group
159
+ }
160
+
161
+ private handleOAToUserMessage(event: OAMessageWebhookEvent) {
162
+ console.log('Processing OA to user message:', event.message.text);
163
+ // Logic xử lý tin nhắn OA gửi cho user
164
+ }
165
+
166
+ private handleOAToGroupMessage(event: GroupWebhookEvent) {
167
+ console.log('Processing OA to group message:', event.message.text);
168
+ // Logic xử lý tin nhắn OA gửi tới group
169
+ }
170
+
171
+ private logMessageInfo(messageInfo: ReturnType<typeof getMessageDirection>) {
172
+ console.log(`Message: ${messageInfo.direction} -> ${messageInfo.target}`);
173
+ console.log(`Description: ${messageInfo.description}`);
174
+ }
175
+ }
176
+ ```
177
+
178
+ ## Các loại sự kiện được hỗ trợ
179
+
180
+ ### User Message Events (Tin nhắn từ người dùng cá nhân)
181
+ - `user_send_text`
182
+ - `user_send_image`
183
+ - `user_send_location`
184
+ - `user_send_link`
185
+ - `user_send_sticker`
186
+ - `user_send_gif`
187
+ - `user_send_audio`
188
+ - `user_send_video`
189
+ - `user_send_file`
190
+ - `user_received_message`
191
+ - `user_seen_message`
192
+ - `user_send_business_card`
193
+
194
+ ### Group Message Events (Tin nhắn từ group)
195
+ - `user_send_group_text`
196
+ - `user_send_group_link`
197
+ - `user_send_group_audio`
198
+ - `user_send_group_location`
199
+ - `user_send_group_video`
200
+ - `user_send_group_business_card`
201
+ - `user_send_group_sticker`
202
+ - `user_send_group_gif`
203
+ - `user_send_group_file`
204
+
205
+ ### OA to User Events (OA gửi cho cá nhân)
206
+ - `oa_send_text`
207
+ - `oa_send_image`
208
+ - `oa_send_gif`
209
+ - `oa_send_list`
210
+ - `oa_send_file`
211
+ - `oa_send_sticker`
212
+ - `oa_send_template`
213
+
214
+ ### OA to Group Events (OA gửi tới group)
215
+ - `oa_send_group_text`
216
+ - `oa_send_group_image`
217
+ - `oa_send_group_link`
218
+ - `oa_send_group_audio`
219
+ - `oa_send_group_location`
220
+ - `oa_send_group_video`
221
+ - `oa_send_group_business_card`
222
+ - `oa_send_group_sticker`
223
+ - `oa_send_group_gif`
224
+ - `oa_send_group_file`
225
+
226
+ ## Lưu ý
227
+
228
+ 1. Các hàm helper này chỉ hoạt động với các sự kiện tin nhắn, không áp dụng cho các sự kiện khác như follow/unfollow.
229
+ 2. Sử dụng TypeScript để có type safety tốt nhất.
230
+ 3. Các hàm này đã được test kỹ lưỡng và an toàn để sử dụng trong production.
@@ -29,34 +29,56 @@ async function basicOAAuth() {
29
29
  console.log('Custom State:', customAuthResult.state);
30
30
  }
31
31
 
32
- // Example 2: OA Auth with PKCE for enhanced security
32
+ // Example 2: OA Auth with PKCE for enhanced security (Manual PKCE)
33
33
  async function oaAuthWithPKCE() {
34
- console.log('\n=== OA Auth with PKCE ===');
35
-
34
+ console.log('\n=== OA Auth with Manual PKCE ===');
35
+
36
36
  const redirectUri = 'https://your-app.com/callback';
37
-
37
+
38
38
  // Step 1: Generate PKCE configuration
39
39
  const pkce = sdk.auth.generatePKCE();
40
40
  console.log('Generated PKCE:');
41
41
  console.log('- Code Verifier:', pkce.code_verifier);
42
42
  console.log('- Code Challenge:', pkce.code_challenge);
43
43
  console.log('- Challenge Method:', pkce.code_challenge_method);
44
-
45
- // Step 2: Create auth URL with PKCE
46
- const authResult = sdk.auth.createOAAuthUrl(redirectUri, undefined, pkce);
47
-
44
+
45
+ // Step 2: Create auth URL with manual PKCE
46
+ const authResult = sdk.auth.createOAAuthUrl(redirectUri, undefined, pkce, true);
47
+
48
48
  console.log('\nAuthorization URL with PKCE:', authResult.url);
49
49
  console.log('Generated State:', authResult.state);
50
-
50
+ console.log('Used PKCE:', authResult.pkce);
51
+
51
52
  // IMPORTANT: Store the code_verifier and state for later use
52
53
  // You'll need these when exchanging the authorization code for access token
53
54
  console.log('\n⚠️ IMPORTANT: Store these values for token exchange:');
54
55
  console.log('- Code Verifier:', pkce.code_verifier);
55
56
  console.log('- State:', authResult.state);
56
-
57
+
57
58
  return { pkce, state: authResult.state };
58
59
  }
59
60
 
61
+ // Example 2b: OA Auth with Auto-Generated PKCE
62
+ async function oaAuthWithAutoPKCE() {
63
+ console.log('\n=== OA Auth with Auto-Generated PKCE ===');
64
+
65
+ const redirectUri = 'https://your-app.com/callback';
66
+
67
+ // Create auth URL with auto-generated PKCE (pkce=undefined, usePkce=true)
68
+ const authResult = sdk.auth.createOAAuthUrl(redirectUri, undefined, undefined, true);
69
+
70
+ console.log('Authorization URL with Auto PKCE:', authResult.url);
71
+ console.log('Generated State:', authResult.state);
72
+ console.log('Auto-Generated PKCE:', authResult.pkce);
73
+
74
+ // IMPORTANT: Store the auto-generated PKCE and state
75
+ console.log('\n⚠️ IMPORTANT: Store these auto-generated values:');
76
+ console.log('- Code Verifier:', authResult.pkce?.code_verifier);
77
+ console.log('- State:', authResult.state);
78
+
79
+ return authResult;
80
+ }
81
+
60
82
  // Example 3: Complete flow - Authorization + Token Exchange
61
83
  async function completeOAFlow() {
62
84
  console.log('\n=== Complete OA Flow with PKCE ===');
@@ -133,6 +155,7 @@ async function runExamples() {
133
155
  try {
134
156
  await basicOAAuth();
135
157
  await oaAuthWithPKCE();
158
+ await oaAuthWithAutoPKCE();
136
159
  await completeOAFlow();
137
160
  await getAuthUrlsExample();
138
161
  } catch (error) {
@@ -144,6 +167,7 @@ async function runExamples() {
144
167
  export {
145
168
  basicOAAuth,
146
169
  oaAuthWithPKCE,
170
+ oaAuthWithAutoPKCE,
147
171
  completeOAFlow,
148
172
  getAuthUrlsExample,
149
173
  runExamples
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Ví dụ sử dụng các hàm helper để phân loại tin nhắn webhook
3
+ */
4
+
5
+ import {
6
+ isUserMessageEvent,
7
+ isGroupMessageEvent,
8
+ isOAToUserMessageEvent,
9
+ isOAToGroupMessageEvent,
10
+ getMessageDirection,
11
+ WebhookEvent,
12
+ UserMessageWebhookEvent,
13
+ GroupWebhookEvent,
14
+ OAMessageWebhookEvent,
15
+ } from '@warriorteam/redai-zalo-sdk';
16
+
17
+ /**
18
+ * Service xử lý webhook với phân loại tin nhắn
19
+ */
20
+ export class ZaloWebhookMessageHandler {
21
+ /**
22
+ * Xử lý webhook event chính
23
+ */
24
+ public handleWebhook(event: WebhookEvent): void {
25
+ console.log('=== Webhook Event Received ===');
26
+ console.log('Event Name:', event.event_name);
27
+ console.log('Timestamp:', event.timestamp);
28
+
29
+ // Phương pháp 1: Sử dụng các hàm kiểm tra riêng lẻ
30
+ this.classifyBySpecificChecks(event);
31
+
32
+ // Phương pháp 2: Sử dụng getMessageDirection
33
+ this.classifyByDirection(event);
34
+
35
+ // Xử lý tin nhắn dựa trên loại
36
+ this.processMessage(event);
37
+ }
38
+
39
+ /**
40
+ * Phân loại bằng các hàm kiểm tra riêng lẻ
41
+ */
42
+ private classifyBySpecificChecks(event: WebhookEvent): void {
43
+ console.log('\n--- Classification by Specific Checks ---');
44
+
45
+ if (isUserMessageEvent(event)) {
46
+ console.log('✅ Tin nhắn từ người dùng cá nhân');
47
+ this.logUserMessageDetails(event);
48
+ } else if (isGroupMessageEvent(event)) {
49
+ console.log('✅ Tin nhắn từ group');
50
+ this.logGroupMessageDetails(event);
51
+ } else if (isOAToUserMessageEvent(event)) {
52
+ console.log('✅ OA gửi tin nhắn cho người dùng cá nhân');
53
+ this.logOAToUserDetails(event);
54
+ } else if (isOAToGroupMessageEvent(event)) {
55
+ console.log('✅ OA gửi tin nhắn tới group');
56
+ this.logOAToGroupDetails(event);
57
+ } else {
58
+ console.log('❓ Sự kiện không phải tin nhắn hoặc không xác định');
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Phân loại bằng getMessageDirection
64
+ */
65
+ private classifyByDirection(event: WebhookEvent): void {
66
+ console.log('\n--- Classification by Direction ---');
67
+
68
+ const messageInfo = getMessageDirection(event);
69
+ console.log(`Direction: ${messageInfo.direction}`);
70
+ console.log(`Target: ${messageInfo.target}`);
71
+ console.log(`Description: ${messageInfo.description}`);
72
+
73
+ // Xử lý dựa trên direction và target
74
+ const key = `${messageInfo.direction}-${messageInfo.target}`;
75
+ switch (key) {
76
+ case 'incoming-user':
77
+ console.log('🔵 Xử lý tin nhắn đến từ user cá nhân');
78
+ break;
79
+ case 'incoming-group':
80
+ console.log('🟢 Xử lý tin nhắn đến từ group');
81
+ break;
82
+ case 'outgoing-user':
83
+ console.log('🟡 Xử lý tin nhắn OA gửi cho user');
84
+ break;
85
+ case 'outgoing-group':
86
+ console.log('🟠 Xử lý tin nhắn OA gửi tới group');
87
+ break;
88
+ default:
89
+ console.log('⚪ Sự kiện không xác định');
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Xử lý tin nhắn dựa trên loại
95
+ */
96
+ private processMessage(event: WebhookEvent): void {
97
+ console.log('\n--- Message Processing ---');
98
+
99
+ if (isUserMessageEvent(event)) {
100
+ this.processUserMessage(event);
101
+ } else if (isGroupMessageEvent(event)) {
102
+ this.processGroupMessage(event);
103
+ } else if (isOAToUserMessageEvent(event)) {
104
+ this.processOAToUserMessage(event);
105
+ } else if (isOAToGroupMessageEvent(event)) {
106
+ this.processOAToGroupMessage(event);
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Xử lý tin nhắn từ user cá nhân
112
+ */
113
+ private processUserMessage(event: UserMessageWebhookEvent): void {
114
+ console.log('Processing user message...');
115
+
116
+ // Logic xử lý tin nhắn từ user cá nhân
117
+ // - Lưu vào database
118
+ // - Trigger AI response
119
+ // - Update conversation state
120
+
121
+ console.log('✅ User message processed');
122
+ }
123
+
124
+ /**
125
+ * Xử lý tin nhắn từ group
126
+ */
127
+ private processGroupMessage(event: GroupWebhookEvent): void {
128
+ console.log('Processing group message...');
129
+
130
+ // Logic xử lý tin nhắn từ group
131
+ // - Check if OA is mentioned
132
+ // - Apply group-specific rules
133
+ // - Handle group moderation
134
+
135
+ console.log('✅ Group message processed');
136
+ }
137
+
138
+ /**
139
+ * Xử lý tin nhắn OA gửi cho user
140
+ */
141
+ private processOAToUserMessage(event: OAMessageWebhookEvent): void {
142
+ console.log('Processing OA to user message...');
143
+
144
+ // Logic xử lý tin nhắn OA gửi
145
+ // - Log outbound message
146
+ // - Update delivery status
147
+ // - Track engagement metrics
148
+
149
+ console.log('✅ OA to user message processed');
150
+ }
151
+
152
+ /**
153
+ * Xử lý tin nhắn OA gửi tới group
154
+ */
155
+ private processOAToGroupMessage(event: GroupWebhookEvent): void {
156
+ console.log('Processing OA to group message...');
157
+
158
+ // Logic xử lý tin nhắn OA gửi tới group
159
+ // - Log group broadcast
160
+ // - Track group engagement
161
+ // - Update group statistics
162
+
163
+ console.log('✅ OA to group message processed');
164
+ }
165
+
166
+ /**
167
+ * Log chi tiết tin nhắn user
168
+ */
169
+ private logUserMessageDetails(event: UserMessageWebhookEvent): void {
170
+ console.log(` - Sender ID: ${event.sender.id}`);
171
+ console.log(` - Recipient ID: ${event.recipient.id}`);
172
+ if ('message' in event && event.message.text) {
173
+ console.log(` - Text: ${event.message.text}`);
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Log chi tiết tin nhắn group
179
+ */
180
+ private logGroupMessageDetails(event: GroupWebhookEvent): void {
181
+ console.log(` - Sender ID: ${event.sender.id}`);
182
+ console.log(` - Group ID: ${event.recipient.id}`);
183
+ if ('oa_id' in event) {
184
+ console.log(` - OA ID: ${event.oa_id}`);
185
+ }
186
+ if ('message' in event && event.message.text) {
187
+ console.log(` - Text: ${event.message.text}`);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Log chi tiết OA to user
193
+ */
194
+ private logOAToUserDetails(event: OAMessageWebhookEvent): void {
195
+ console.log(` - OA ID: ${event.sender.id}`);
196
+ console.log(` - User ID: ${event.recipient.id}`);
197
+ if ('message' in event && event.message.text) {
198
+ console.log(` - Text: ${event.message.text}`);
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Log chi tiết OA to group
204
+ */
205
+ private logOAToGroupDetails(event: GroupWebhookEvent): void {
206
+ console.log(` - OA ID: ${event.sender.id}`);
207
+ console.log(` - Group ID: ${event.recipient.id}`);
208
+ if ('oa_id' in event) {
209
+ console.log(` - OA ID: ${event.oa_id}`);
210
+ }
211
+ if ('message' in event && event.message.text) {
212
+ console.log(` - Text: ${event.message.text}`);
213
+ }
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Ví dụ sử dụng
219
+ */
220
+ export function exampleUsage(): void {
221
+ const handler = new ZaloWebhookMessageHandler();
222
+
223
+ // Ví dụ 1: Tin nhắn từ user cá nhân
224
+ const userMessage = {
225
+ app_id: 'test-app',
226
+ user_id_by_app: 'test-user',
227
+ event_name: 'user_send_text',
228
+ timestamp: '1234567890',
229
+ sender: { id: 'user123' },
230
+ recipient: { id: 'oa123' },
231
+ message: { msg_id: 'msg123', text: 'Xin chào!' }
232
+ };
233
+
234
+ console.log('=== Example 1: User Message ===');
235
+ handler.handleWebhook(userMessage as any);
236
+
237
+ // Ví dụ 2: Tin nhắn từ group
238
+ const groupMessage = {
239
+ app_id: 'test-app',
240
+ user_id_by_app: 'test-user',
241
+ event_name: 'user_send_group_text',
242
+ timestamp: '1234567890',
243
+ oa_id: 'oa123',
244
+ sender: { id: 'user456' },
245
+ recipient: { id: 'group789' },
246
+ message: { msg_id: 'msg456', text: 'Hello group!' }
247
+ };
248
+
249
+ console.log('\n=== Example 2: Group Message ===');
250
+ handler.handleWebhook(groupMessage as any);
251
+
252
+ // Ví dụ 3: OA gửi cho user
253
+ const oaToUserMessage = {
254
+ app_id: 'test-app',
255
+ user_id_by_app: 'test-user',
256
+ event_name: 'oa_send_text',
257
+ timestamp: '1234567890',
258
+ sender: { id: 'oa123' },
259
+ recipient: { id: 'user789' },
260
+ message: { msg_id: 'msg789', text: 'Cảm ơn bạn đã liên hệ!' }
261
+ };
262
+
263
+ console.log('\n=== Example 3: OA to User Message ===');
264
+ handler.handleWebhook(oaToUserMessage as any);
265
+
266
+ // Ví dụ 4: OA gửi tới group
267
+ const oaToGroupMessage = {
268
+ app_id: 'test-app',
269
+ user_id_by_app: 'test-user',
270
+ event_name: 'oa_send_group_text',
271
+ timestamp: '1234567890',
272
+ oa_id: 'oa123',
273
+ sender: { id: 'oa123' },
274
+ recipient: { id: 'group456' },
275
+ message: { msg_id: 'msg101', text: 'Thông báo từ OA!' }
276
+ };
277
+
278
+ console.log('\n=== Example 4: OA to Group Message ===');
279
+ handler.handleWebhook(oaToGroupMessage as any);
280
+ }
281
+
282
+ // Chạy ví dụ nếu file được execute trực tiếp
283
+ if (require.main === module) {
284
+ exampleUsage();
285
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warriorteam/redai-zalo-sdk",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Comprehensive TypeScript/JavaScript SDK for Zalo APIs - Official Account, ZNS, Consultation Service, Group Messaging, and Social APIs",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",