react-native-insider 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,569 @@
1
+ # App Cards
2
+
3
+ > SDK Version: 8.0.0 | Generated: 2026-04-16
4
+
5
+ The App Cards module provides a complete API for accessing and managing the Insider platform's app cards campaigns. It allows you to fetch marketing messages and notifications, track read/unread status, handle interactive buttons within messages, and observe app cards events in real time.
6
+
7
+ Messages can contain rich content including text, images, and interactive buttons with deeplink actions.
8
+
9
+ > This documentation covers the App Cards API (`RNInsider.appCards`), the current architecture. The legacy `RNInsider.getMessageCenterData(...)` method is a separate, older interface for retrieving push notification payloads as a notification center. If you are building a new integration, use the App Cards API.
10
+
11
+ > **Note:** The `InsiderAppCards` instance cannot be constructed directly. Access it through the main Insider SDK: `RNInsider.appCards`.
12
+
13
+ ## Contents
14
+
15
+ - [Prerequisites](#prerequisites)
16
+ - [Access](#access)
17
+ - [Error Handling](#error-handling)
18
+ - [InsiderAppCardsError](#insiderappcardserror)
19
+ - [InsiderAppCardsErrorCode](#insiderappcardserrorcode)
20
+ - [Core Types](#core-types)
21
+ - [InsiderAppCardsCampaignResponse](#insiderappcardscampaignresponse)
22
+ - [InsiderAppCard](#insiderappcard)
23
+ - [InsiderAppCardContent](#insiderappcardcontent)
24
+ - [InsiderAppCardImage](#insiderappcardimage)
25
+ - [InsiderAppCardButton](#insiderappcardbutton)
26
+ - [InsiderAppCardAction (Abstract)](#insiderappcardaction-abstract)
27
+ - [InsiderAppCardDeeplinkAction](#insiderappcarddeeplinkaction)
28
+ - [InsiderAppCardFeedbackAction](#insiderappcardfeedbackaction)
29
+ - [InsiderAppCardOpenSettingsAction](#insiderappcardopensettingsaction)
30
+ - [Available Methods](#available-methods)
31
+ - [getCampaigns](#getcampaigns)
32
+ - [markAsRead](#markasread)
33
+ - [markAsUnread](#markasunread)
34
+ - [delete](#delete)
35
+ - [click](#click)
36
+ - [view](#view)
37
+ - [clickButton](#clickbutton)
38
+ - [Full Integration Example](#full-integration-example)
39
+
40
+ ## Prerequisites
41
+
42
+ - `react-native-insider` **8.0.0** or later
43
+ - SDK must be initialized via `RNInsider.init(...)` before accessing App Cards
44
+
45
+ ## Access
46
+
47
+ Obtain the `InsiderAppCards` instance from the main Insider SDK:
48
+
49
+ ```js
50
+ const appCards = RNInsider.appCards;
51
+ ```
52
+
53
+ > **Note:** `RNInsider.appCards` never returns null. If the SDK is not initialized or is frozen (e.g., after GDPR consent is revoked), a no-op instance is returned. In that state every async call reports an `InsiderAppCardsError` with code `SDK_NOT_INITIALIZED`, and every void method (`view`, `click`, `clickButton`) silently returns — so it is always safe to reference `RNInsider.appCards`.
54
+
55
+ ## Error Handling
56
+
57
+ App Cards operations can fail with a typed `InsiderAppCardsError`. In callback form the error is delivered as the first argument; in Promise form it is thrown by `await`.
58
+
59
+ ### InsiderAppCardsError
60
+
61
+ Extends the standard `Error` class with a structured `code` that maps to native SDK error codes on both Android and iOS.
62
+
63
+ | Name | Type | Required | Description |
64
+ | ---- | ---- | -------- | ----------- |
65
+ | `name` | `'InsiderAppCardsError'` | ✅ | Always `'InsiderAppCardsError'` |
66
+ | `code` | `InsiderAppCardsErrorCodeType` | ✅ | Error code identifying the type of error |
67
+ | `message` | `string` | ✅ | A human-readable error description |
68
+
69
+ **Static methods:**
70
+
71
+ | Name | Signature | Description |
72
+ | ---- | --------- | ----------- |
73
+ | `from` | `(error: { code: string; message: string } \| string \| unknown) => InsiderAppCardsError` | Normalizes a native bridge error into a typed `InsiderAppCardsError` |
74
+
75
+ ### InsiderAppCardsErrorCode
76
+
77
+ | Constant | Value | Description |
78
+ | -------- | ----- | ----------- |
79
+ | `UNKNOWN` | `"unknown"` | An unknown or unexpected error occurred |
80
+ | `SDK_NOT_INITIALIZED` | `"sdkNotInitialized"` | The Insider SDK is not initialized, frozen, or not GDPR compliant |
81
+ | `INVALID_PARAMETER` | `"invalidParameter"` | An invalid parameter was provided (e.g., empty or non-string IDs) |
82
+ | `NETWORK_ERROR` | `"networkError"` | A network error occurred during the request |
83
+ | `SERVER_ERROR` | `"serverError"` | The server returned an error response |
84
+ | `PARSE_ERROR` | `"parseError"` | The server response could not be parsed |
85
+
86
+ **Examples:**
87
+
88
+ *Callback style:*
89
+
90
+ ```js
91
+ RNInsider.appCards.getCampaigns((error, campaignResponse) => {
92
+ if (error) {
93
+ if (error instanceof RNInsider.AppCardsError) {
94
+ switch (error.code) {
95
+ case RNInsider.AppCardsErrorCode.NETWORK_ERROR:
96
+ console.warn('Network issue, please try again');
97
+ break;
98
+ case RNInsider.AppCardsErrorCode.SDK_NOT_INITIALIZED:
99
+ console.warn('SDK not ready');
100
+ break;
101
+ default:
102
+ console.warn('App Cards error:', error.code, error.message);
103
+ }
104
+ }
105
+ return;
106
+ }
107
+ console.log('Campaigns:', campaignResponse.appCards.length);
108
+ });
109
+ ```
110
+
111
+ *Promise style:*
112
+
113
+ ```js
114
+ try {
115
+ const campaignResponse = await RNInsider.appCards.getCampaigns();
116
+ console.log('Campaigns:', campaignResponse.appCards.length);
117
+ } catch (error) {
118
+ if (error instanceof RNInsider.AppCardsError) {
119
+ switch (error.code) {
120
+ case RNInsider.AppCardsErrorCode.NETWORK_ERROR:
121
+ console.warn('Network issue, please try again');
122
+ break;
123
+ case RNInsider.AppCardsErrorCode.SDK_NOT_INITIALIZED:
124
+ console.warn('SDK not ready');
125
+ break;
126
+ default:
127
+ console.warn('App Cards error:', error.code, error.message);
128
+ }
129
+ }
130
+ }
131
+ ```
132
+
133
+ ## Core Types
134
+
135
+ ### InsiderAppCardsCampaignResponse
136
+
137
+ Root container returned from `getCampaigns`. Holds the full list of app cards retrieved for the current user.
138
+
139
+ | Name | Type | Required | Description |
140
+ | ---- | ---- | -------- | ----------- |
141
+ | `appCards` | `InsiderAppCard[]` | ✅ | Array of all app cards in the campaigns |
142
+
143
+ ### InsiderAppCard
144
+
145
+ Represents a single app card. Contains all data for the card — content, images, buttons, and associated action.
146
+
147
+ | Name | Type | Required | Description |
148
+ | ---- | ---- | -------- | ----------- |
149
+ | `id` | `string` | ✅ | Unique identifier for the app card |
150
+ | `type` | `InsiderAppCardType` | ✅ | Type of the app card (`"message"` or `"image"`) |
151
+ | `isRead` | `boolean` | ✅ | Whether the app card has been read by the user |
152
+ | `content` | `InsiderAppCardContent` | ⛔ | Text content (title and description) |
153
+ | `images` | `InsiderAppCardImage[]` | ⛔ | Array of images associated with the app card |
154
+ | `buttons` | `InsiderAppCardButton[]` | ⛔ | Array of action buttons that can be displayed with the app card |
155
+ | `action` | `InsiderAppCardAction` | ⛔ | Action to be executed when the app card is tapped |
156
+
157
+ **App Card Types:**
158
+
159
+ | Constant | Description |
160
+ | -------- | ----------- |
161
+ | `"message"` | Text-based app card |
162
+ | `"image"` | Image-based app card |
163
+
164
+ **Convenience methods:**
165
+
166
+ | Method | Description |
167
+ | ------ | ----------- |
168
+ | `markAsRead(completion)` | Marks this single card as read. Also available as a Promise (omit `completion`) |
169
+ | `markAsUnread(completion)` | Marks this single card as unread. Also available as a Promise |
170
+ | `delete(completion)` | Deletes this card permanently. Also available as a Promise |
171
+ | `click()` | Handles a click event (executes action + logs click conversion) |
172
+ | `view()` | Handles a view event (logs view conversion) |
173
+
174
+ ### InsiderAppCardContent
175
+
176
+ Textual content of an app card.
177
+
178
+ | Name | Type | Required | Description |
179
+ | ---- | ---- | -------- | ----------- |
180
+ | `title` | `string` | ✅ | Main title text of the app card |
181
+ | `description` | `string` | ✅ | Description text of the app card |
182
+
183
+ ### InsiderAppCardImage
184
+
185
+ Image associated with an app card.
186
+
187
+ | Name | Type | Required | Description |
188
+ | ---- | ---- | -------- | ----------- |
189
+ | `url` | `string` | ✅ | URL of the image to be displayed |
190
+
191
+ ### InsiderAppCardButton
192
+
193
+ An interactive button within an app card.
194
+
195
+ | Name | Type | Required | Description |
196
+ | ---- | ---- | -------- | ----------- |
197
+ | `id` | `string` | ✅ | Unique identifier for the button |
198
+ | `appCardId` | `string` | ✅ | Unique identifier of the parent app card |
199
+ | `text` | `string` | ✅ | Display text shown on the button |
200
+ | `action` | `InsiderAppCardAction` | ⛔ | Action executed when the button is tapped |
201
+
202
+ **Convenience methods:**
203
+
204
+ | Method | Description |
205
+ | ------ | ----------- |
206
+ | `click()` | Handles a click event (executes action + logs button click event) |
207
+
208
+ ### InsiderAppCardAction (Abstract)
209
+
210
+ Base type for app card actions. Subtypes represent different actions executed when a user interacts with an app card or a button — such as opening a deeplink, showing feedback, or navigating to system settings.
211
+
212
+ | Name | Type | Required | Description |
213
+ | ---- | ---- | -------- | ----------- |
214
+ | `type` | `InsiderAppCardActionType` | ✅ | Type of the action |
215
+
216
+ **Action Types:**
217
+
218
+ | Constant | Description |
219
+ | -------- | ----------- |
220
+ | `"deep_link"` | Deeplink navigation |
221
+ | `"feedback"` | Feedback action |
222
+ | `"open_settings"` | Open system app settings |
223
+
224
+ > **Tip:** The concrete runtime type is one of `InsiderAppCardDeeplinkAction | InsiderAppCardFeedbackAction | InsiderAppCardOpenSettingsAction`. Check `action.type` before narrowing to a subtype.
225
+
226
+ ### InsiderAppCardDeeplinkAction
227
+
228
+ Deeplink action that navigates to a specific location in the app or to an external URL. Extends `InsiderAppCardAction` with `type === 'deep_link'`.
229
+
230
+ | Name | Type | Required | Description |
231
+ | ---- | ---- | -------- | ----------- |
232
+ | `url` | `string \| null` | ⛔ | The resolved deeplink URL (URL scheme > internal browser > external browser). Returns `null` when none is configured |
233
+ | `deeplinkType` | `InsiderAppCardDeeplinkType` | ✅ | Identifies which URL family was resolved |
234
+ | `json` | `any \| null` | ⛔ | Parsed JSON payload attached to the deeplink, or `null` if no JSON was supplied |
235
+ | `keysAndValues` | `{ key: string; value: string }[]` | ⛔ | Array of key-value pairs defining additional deeplink parameters |
236
+
237
+ **Deeplink Types:**
238
+
239
+ | Constant | Description |
240
+ | -------- | ----------- |
241
+ | `"url_scheme"` | Custom URL scheme (e.g., `myapp://...`) |
242
+ | `"internal"` | Internal webview URL |
243
+ | `"external"` | External browser URL |
244
+ | `"unknown"` | Unknown or missing URL |
245
+
246
+ ### InsiderAppCardFeedbackAction
247
+
248
+ Marker type for a feedback action. Extends `InsiderAppCardAction` with no additional fields; `type` is always `"feedback"`.
249
+
250
+ ### InsiderAppCardOpenSettingsAction
251
+
252
+ Marker type for opening the app's system settings. Extends `InsiderAppCardAction` with no additional fields; `type` is always `"open_settings"`.
253
+
254
+ ## Available Methods
255
+
256
+ ### getCampaigns
257
+
258
+ **Method Signatures:**
259
+
260
+ ```js
261
+ RNInsider.appCards.getCampaigns(completion)
262
+ RNInsider.appCards.getCampaigns() // returns a Promise
263
+ ```
264
+
265
+ Retrieves the user's app card campaigns. Fetches all available app cards from the Insider platform for the current user. Pending campaign requests are cancelled before initiating a new one.
266
+
267
+ | Name | Type | Required | Description |
268
+ | ---- | ---- | -------- | ----------- |
269
+ | `completion` | `(error?: Error, campaignResponse?: InsiderAppCardsCampaignResponse) => void` | ⛔ | Called with the campaign response or an error. Omit to use the Promise form |
270
+
271
+ > **Tip:** The method supports both completion-callback and Promise forms. Pass a callback to receive `(error, campaignResponse)`, or omit it and `await` the returned Promise.
272
+
273
+ **Examples:**
274
+
275
+ *Callback style:*
276
+
277
+ ```js
278
+ RNInsider.appCards.getCampaigns((error, campaignResponse) => {
279
+ if (error) {
280
+ console.warn('Failed to fetch campaigns:', error.code, error.message);
281
+ return;
282
+ }
283
+ campaignResponse.appCards.forEach((appCard) => {
284
+ console.log('App Card Id:', appCard.id, 'Read:', appCard.isRead);
285
+ });
286
+ });
287
+ ```
288
+
289
+ *Promise style:*
290
+
291
+ ```js
292
+ try {
293
+ const campaignResponse = await RNInsider.appCards.getCampaigns();
294
+ campaignResponse.appCards.forEach((appCard) => {
295
+ console.log('App Card Id:', appCard.id, 'Read:', appCard.isRead);
296
+ });
297
+ } catch (error) {
298
+ if (error instanceof RNInsider.AppCardsError) {
299
+ console.warn(error.code, error.message);
300
+ }
301
+ }
302
+ ```
303
+
304
+ ### markAsRead
305
+
306
+ **Method Signatures:**
307
+
308
+ ```js
309
+ RNInsider.appCards.markAsRead(appCardIds, completion)
310
+ RNInsider.appCards.markAsRead(appCardIds) // returns a Promise
311
+ ```
312
+
313
+ Marks specified app cards as read. Updates the read status of one or more app cards to indicate they have been viewed by the user. The operation synchronizes with the Insider backend to persist state across devices.
314
+
315
+ | Name | Type | Required | Description |
316
+ | ---- | ---- | -------- | ----------- |
317
+ | `appCardIds` | `string[]` | ✅ | A non-empty array of app card identifiers to mark as read |
318
+ | `completion` | `(error?: Error) => void` | ⛔ | Called with an error if the request fails, otherwise called with no arguments on success. Omit for the Promise form |
319
+
320
+ > **Tip:** App card IDs that don't exist on the backend are silently ignored. You can also call `appCard.markAsRead(completion)` directly on an `InsiderAppCard` instance to mark a single card.
321
+
322
+ **Examples:**
323
+
324
+ *Callback style:*
325
+
326
+ ```js
327
+ RNInsider.appCards.markAsRead(['card_123', 'card_456'], (error) => {
328
+ if (error) {
329
+ console.warn('Failed to mark app cards as read:', error.code, error.message);
330
+ return;
331
+ }
332
+ console.log('App cards marked as read successfully');
333
+ });
334
+ ```
335
+
336
+ *Promise style:*
337
+
338
+ ```js
339
+ try {
340
+ await RNInsider.appCards.markAsRead(['card_123', 'card_456']);
341
+ console.log('App cards marked as read successfully');
342
+ } catch (error) {
343
+ if (error instanceof RNInsider.AppCardsError) {
344
+ console.warn(error.code, error.message);
345
+ }
346
+ }
347
+ ```
348
+
349
+ ### markAsUnread
350
+
351
+ **Method Signatures:**
352
+
353
+ ```js
354
+ RNInsider.appCards.markAsUnread(appCardIds, completion)
355
+ RNInsider.appCards.markAsUnread(appCardIds) // returns a Promise
356
+ ```
357
+
358
+ Marks specified app cards as unread. Updates the read status of one or more app cards to indicate they are unread. The operation synchronizes with the Insider backend to persist state across devices.
359
+
360
+ | Name | Type | Required | Description |
361
+ | ---- | ---- | -------- | ----------- |
362
+ | `appCardIds` | `string[]` | ✅ | A non-empty array of app card identifiers to mark as unread |
363
+ | `completion` | `(error?: Error) => void` | ⛔ | Called with an error if the request fails, otherwise called with no arguments on success. Omit for the Promise form |
364
+
365
+ > **Tip:** You can also call `appCard.markAsUnread(completion)` directly on an `InsiderAppCard` instance to unmark a single card.
366
+
367
+ **Examples:**
368
+
369
+ *Callback style:*
370
+
371
+ ```js
372
+ RNInsider.appCards.markAsUnread(['card_123', 'card_456'], (error) => {
373
+ if (error) {
374
+ console.warn('Failed to mark app cards as unread:', error.code, error.message);
375
+ return;
376
+ }
377
+ console.log('App cards marked as unread successfully');
378
+ });
379
+ ```
380
+
381
+ *Promise style:*
382
+
383
+ ```js
384
+ try {
385
+ await RNInsider.appCards.markAsUnread(['card_123', 'card_456']);
386
+ console.log('App cards marked as unread successfully');
387
+ } catch (error) {
388
+ if (error instanceof RNInsider.AppCardsError) {
389
+ console.warn(error.code, error.message);
390
+ }
391
+ }
392
+ ```
393
+
394
+ ### delete
395
+
396
+ **Method Signatures:**
397
+
398
+ ```js
399
+ RNInsider.appCards.delete(appCardIds, completion)
400
+ RNInsider.appCards.delete(appCardIds) // returns a Promise
401
+ ```
402
+
403
+ Permanently removes one or more app cards from the user's campaigns. The operation synchronizes with the Insider backend.
404
+
405
+ | Name | Type | Required | Description |
406
+ | ---- | ---- | -------- | ----------- |
407
+ | `appCardIds` | `string[]` | ✅ | A non-empty array of app card identifiers to delete |
408
+ | `completion` | `(error?: Error) => void` | ⛔ | Called with an error if the request fails, otherwise called with no arguments on success. Omit for the Promise form |
409
+
410
+ > **Tip:** You can also call `appCard.delete(completion)` directly on an `InsiderAppCard` instance to delete a single card.
411
+
412
+ **Examples:**
413
+
414
+ *Callback style:*
415
+
416
+ ```js
417
+ RNInsider.appCards.delete(['card_123', 'card_456'], (error) => {
418
+ if (error) {
419
+ console.warn('Failed to delete app cards:', error.code, error.message);
420
+ return;
421
+ }
422
+ console.log('App cards deleted successfully');
423
+ });
424
+ ```
425
+
426
+ *Promise style:*
427
+
428
+ ```js
429
+ try {
430
+ await RNInsider.appCards.delete(['card_123', 'card_456']);
431
+ console.log('App cards deleted successfully');
432
+ } catch (error) {
433
+ if (error instanceof RNInsider.AppCardsError) {
434
+ console.warn(error.code, error.message);
435
+ }
436
+ }
437
+ ```
438
+
439
+ ### click
440
+
441
+ **Method Signature:**
442
+
443
+ ```js
444
+ RNInsider.appCards.click(appCard)
445
+ ```
446
+
447
+ Records a click event for an app card. Call this method when a user clicks or taps on an app card. This executes the app card's deeplink action (if present) and notifies observers.
448
+
449
+ | Name | Type | Required | Description |
450
+ | ---- | ---- | -------- | ----------- |
451
+ | `appCard` | `InsiderAppCard` | ✅ | The app card that was clicked. Must be an instance returned from `getCampaigns` |
452
+
453
+ > **Tip:** You can also call `appCard.click()` directly on the card instance.
454
+
455
+ **Example:**
456
+
457
+ ```js
458
+ RNInsider.appCards.click(appCard);
459
+ ```
460
+
461
+ ### view
462
+
463
+ **Method Signature:**
464
+
465
+ ```js
466
+ RNInsider.appCards.view(appCard)
467
+ ```
468
+
469
+ Records a view event for an app card. Call this method when an app card becomes visible to the user. This notifies observers and can be used for analytics tracking.
470
+
471
+ | Name | Type | Required | Description |
472
+ | ---- | ---- | -------- | ----------- |
473
+ | `appCard` | `InsiderAppCard` | ✅ | The app card that was viewed. Must be an instance returned from `getCampaigns` |
474
+
475
+ > **Tip:** You can also call `appCard.view()` directly on the card instance.
476
+
477
+ **Example:**
478
+
479
+ ```js
480
+ RNInsider.appCards.view(appCard);
481
+ ```
482
+
483
+ ### clickButton
484
+
485
+ **Method Signature:**
486
+
487
+ ```js
488
+ RNInsider.appCards.clickButton(button)
489
+ ```
490
+
491
+ Records a click event for a button within an app card. Call this method when a user clicks or taps on a button in an app card. This executes the button's action (if present) and notifies observers.
492
+
493
+ | Name | Type | Required | Description |
494
+ | ---- | ---- | -------- | ----------- |
495
+ | `button` | `InsiderAppCardButton` | ✅ | The button that was clicked. Must be an instance obtained from `appCard.buttons` |
496
+
497
+ > **Tip:** You can also call `button.click()` directly on the button instance.
498
+
499
+ **Example:**
500
+
501
+ ```js
502
+ RNInsider.appCards.clickButton(button);
503
+ ```
504
+
505
+ ## Full Integration Example
506
+
507
+ End-to-end flow: initialize the SDK, fetch campaigns, view a card, click a button, branch on action type, and mark unread cards as read — with proper error handling.
508
+
509
+ ```js
510
+ import { Linking } from 'react-native';
511
+
512
+ RNInsider.init('your_partner_name', 'group.com.example.app', (type, data) => {
513
+ // handle SDK callbacks here
514
+ });
515
+
516
+ async function loadAppCards() {
517
+ try {
518
+ const campaignResponse = await RNInsider.appCards.getCampaigns();
519
+ const cards = campaignResponse.appCards ?? [];
520
+ if (cards.length === 0) return;
521
+
522
+ const firstCard = cards[0];
523
+ RNInsider.appCards.view(firstCard);
524
+
525
+ const firstButton = firstCard.buttons?.[0];
526
+ if (firstButton) {
527
+ RNInsider.appCards.clickButton(firstButton);
528
+ handleAction(firstButton.action);
529
+ }
530
+
531
+ const unreadIds = cards.filter((card) => !card.isRead).map((card) => card.id);
532
+ if (unreadIds.length > 0) {
533
+ await RNInsider.appCards.markAsRead(unreadIds);
534
+ }
535
+ } catch (error) {
536
+ if (error instanceof RNInsider.AppCardsError) {
537
+ switch (error.code) {
538
+ case RNInsider.AppCardsErrorCode.NETWORK_ERROR:
539
+ console.warn('Network issue, please try again');
540
+ break;
541
+ case RNInsider.AppCardsErrorCode.SDK_NOT_INITIALIZED:
542
+ console.warn('SDK not ready');
543
+ break;
544
+ default:
545
+ console.warn('App Cards error:', error.code, error.message);
546
+ }
547
+ }
548
+ }
549
+ }
550
+
551
+ function handleAction(action) {
552
+ if (!action) return;
553
+ switch (action.type) {
554
+ case 'deep_link':
555
+ if (action.url) {
556
+ Linking.openURL(action.url);
557
+ }
558
+ break;
559
+ case 'feedback':
560
+ // present your feedback UI
561
+ break;
562
+ case 'open_settings':
563
+ Linking.openSettings();
564
+ break;
565
+ }
566
+ }
567
+
568
+ loadAppCards();
569
+ ```
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "react-native-insider",
3
- "version": "8.0.1",
3
+ "version": "8.0.2",
4
4
  "description": "React Native Insider SDK",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "scripts": {
8
- "test": "jest"
8
+ "test": "jest",
9
+ "test:coverage": "jest --coverage --coverageReporters=text --coverageReporters=lcov --coverageReporters=json-summary"
9
10
  },
10
11
  "keywords": [
11
12
  "react-native",