serve-emul 0.0.4

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 (42) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/LICENSE +201 -0
  3. package/README.md +196 -0
  4. package/dist/ui/assets/index-Cm5-Tjhs.css +1 -0
  5. package/dist/ui/assets/index-CyUIa9dV.js +42 -0
  6. package/dist/ui/index.html +13 -0
  7. package/package.json +67 -0
  8. package/scripts/fetch-scrcpy.ts +28 -0
  9. package/scripts/release.ts +136 -0
  10. package/src/accessibility.ts +88 -0
  11. package/src/adb.ts +209 -0
  12. package/src/app-info.ts +114 -0
  13. package/src/app-management.ts +150 -0
  14. package/src/cli.ts +149 -0
  15. package/src/emulator.ts +229 -0
  16. package/src/input.ts +258 -0
  17. package/src/location.ts +135 -0
  18. package/src/route-playback.ts +359 -0
  19. package/src/scrcpy.ts +466 -0
  20. package/src/server.ts +1260 -0
  21. package/src/session-recorder.ts +149 -0
  22. package/src/ui/app.tsx +111 -0
  23. package/src/ui/components/accessibility-panel.tsx +113 -0
  24. package/src/ui/components/app-management-panel.tsx +256 -0
  25. package/src/ui/components/control-bar.tsx +24 -0
  26. package/src/ui/components/device-panel.tsx +532 -0
  27. package/src/ui/components/device-stream.tsx +142 -0
  28. package/src/ui/components/location-panel.tsx +584 -0
  29. package/src/ui/components/logcat-panel.tsx +100 -0
  30. package/src/ui/components/session-panel.tsx +127 -0
  31. package/src/ui/components/status-bar.tsx +19 -0
  32. package/src/ui/index.html +12 -0
  33. package/src/ui/lib/h264.ts +35 -0
  34. package/src/ui/lib/use-stream.ts +368 -0
  35. package/src/ui/main.tsx +7 -0
  36. package/src/ui/styles.css +708 -0
  37. package/src/ui/tsconfig.json +17 -0
  38. package/src/update-check.ts +93 -0
  39. package/vendor/scrcpy-server-v2.7 +0 -0
  40. package/vendor/scrcpy-server-v3.1 +0 -0
  41. package/vendor/scrcpy-server-v3.3.4 +0 -0
  42. package/vendor/scrcpy-server-v4.0 +0 -0
@@ -0,0 +1,708 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
4
+ }
5
+ body {
6
+ margin: 0;
7
+ min-height: 100vh;
8
+ background: #0b0b0e;
9
+ color: #e5e5ea;
10
+ display: grid;
11
+ grid-template-rows: auto 1fr auto;
12
+ }
13
+ header {
14
+ padding: 12px 16px;
15
+ border-bottom: 1px solid #1f1f24;
16
+ display: flex;
17
+ gap: 12px;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ }
21
+ header h1 {
22
+ font-size: 14px;
23
+ font-weight: 600;
24
+ margin: 0;
25
+ letter-spacing: 0.02em;
26
+ }
27
+ header .meta {
28
+ font-size: 12px;
29
+ color: #8a8a93;
30
+ font-variant-numeric: tabular-nums;
31
+ }
32
+ main {
33
+ display: grid;
34
+ grid-template-columns: minmax(0, 1fr) 380px;
35
+ align-items: center;
36
+ gap: 20px;
37
+ padding: 24px;
38
+ }
39
+ .app-layout {
40
+ min-height: 0;
41
+ align-items: stretch;
42
+ transition: grid-template-columns 0.18s ease;
43
+ }
44
+ .app-layout.devices-open {
45
+ grid-template-columns: 300px minmax(0, 1fr) 380px;
46
+ }
47
+ .app-layout.devices-collapsed {
48
+ grid-template-columns: 46px minmax(0, 1fr) 380px;
49
+ }
50
+ .device-sidebar {
51
+ align-self: stretch;
52
+ min-height: 0;
53
+ max-height: calc(100vh - 140px);
54
+ overflow: hidden;
55
+ border-right: 1px solid #1f1f24;
56
+ padding-right: 16px;
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 12px;
60
+ }
61
+ .device-sidebar-header {
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 8px;
65
+ min-height: 34px;
66
+ color: #b8b8c0;
67
+ font-size: 13px;
68
+ font-weight: 700;
69
+ }
70
+ .sidebar-toggle {
71
+ display: grid;
72
+ place-items: center;
73
+ width: 32px;
74
+ height: 32px;
75
+ padding: 0;
76
+ border-radius: 8px;
77
+ line-height: 1;
78
+ }
79
+ .sidebar-icon {
80
+ width: 18px;
81
+ height: 18px;
82
+ color: #b8b8c0;
83
+ }
84
+ .sidebar-icon.collapsed {
85
+ transform: scaleX(-1);
86
+ }
87
+ .devices-collapsed .device-sidebar {
88
+ align-items: center;
89
+ padding-right: 0;
90
+ }
91
+ .devices-collapsed .device-sidebar-header {
92
+ justify-content: center;
93
+ }
94
+ .device {
95
+ justify-self: center;
96
+ align-self: center;
97
+ position: relative;
98
+ max-width: 100%;
99
+ background: #000;
100
+ border-radius: 24px;
101
+ overflow: hidden;
102
+ box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6);
103
+ }
104
+ canvas {
105
+ display: block;
106
+ max-height: 80vh;
107
+ max-width: 100%;
108
+ height: auto;
109
+ cursor: default;
110
+ user-select: none;
111
+ touch-action: none;
112
+ }
113
+ .stream-surface {
114
+ position: relative;
115
+ }
116
+ .ax-overlay {
117
+ position: absolute;
118
+ inset: 0;
119
+ pointer-events: none;
120
+ }
121
+ .ax-box {
122
+ position: absolute;
123
+ box-sizing: border-box;
124
+ border: 1px solid rgba(92, 200, 255, 0.58);
125
+ background: rgba(92, 200, 255, 0.08);
126
+ }
127
+ .ax-box.active {
128
+ border-color: #ffcc66;
129
+ background: rgba(255, 204, 102, 0.18);
130
+ box-shadow: 0 0 0 1px rgba(255, 204, 102, 0.35);
131
+ }
132
+ footer {
133
+ display: flex;
134
+ gap: 8px;
135
+ padding: 12px 16px;
136
+ border-top: 1px solid #1f1f24;
137
+ justify-content: center;
138
+ }
139
+ button {
140
+ background: #1c1c22;
141
+ color: #e5e5ea;
142
+ border: 1px solid #2a2a32;
143
+ border-radius: 8px;
144
+ padding: 8px 14px;
145
+ font-size: 13px;
146
+ cursor: pointer;
147
+ }
148
+ button:hover {
149
+ background: #25252d;
150
+ }
151
+ button:disabled {
152
+ cursor: not-allowed;
153
+ opacity: 0.55;
154
+ }
155
+ input {
156
+ box-sizing: border-box;
157
+ width: 100%;
158
+ background: #111116;
159
+ color: #f2f2f7;
160
+ border: 1px solid #2a2a32;
161
+ border-radius: 8px;
162
+ padding: 8px 10px;
163
+ font-size: 13px;
164
+ font-variant-numeric: tabular-nums;
165
+ }
166
+ input[type="file"] {
167
+ color: #b8b8c0;
168
+ padding: 7px;
169
+ }
170
+ input[type="checkbox"] {
171
+ width: 16px;
172
+ height: 16px;
173
+ accent-color: #f2f2f7;
174
+ }
175
+ .side-panel {
176
+ align-self: stretch;
177
+ min-height: 0;
178
+ max-height: calc(100vh - 140px);
179
+ overflow: auto;
180
+ border-left: 1px solid #1f1f24;
181
+ padding-left: 20px;
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 16px;
185
+ }
186
+ .device-panel {
187
+ min-height: 0;
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 12px;
191
+ }
192
+ .device-sidebar .device-panel {
193
+ flex: 1;
194
+ }
195
+ .location-panel,
196
+ .tool-panel {
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: 12px;
200
+ }
201
+ .panel-heading {
202
+ display: flex;
203
+ justify-content: space-between;
204
+ gap: 12px;
205
+ align-items: baseline;
206
+ }
207
+ .panel-heading h2 {
208
+ margin: 0;
209
+ font-size: 14px;
210
+ font-weight: 600;
211
+ }
212
+ .location-status {
213
+ min-width: 0;
214
+ color: #9a9aa3;
215
+ font-size: 12px;
216
+ line-height: 1.35;
217
+ text-align: right;
218
+ overflow-wrap: anywhere;
219
+ }
220
+ .map {
221
+ position: relative;
222
+ height: 220px;
223
+ overflow: hidden;
224
+ border: 1px solid #25252d;
225
+ border-radius: 8px;
226
+ background: #15151a;
227
+ cursor: crosshair;
228
+ user-select: none;
229
+ touch-action: none;
230
+ }
231
+ .map-tile {
232
+ position: absolute;
233
+ width: 256px;
234
+ height: 256px;
235
+ user-select: none;
236
+ pointer-events: none;
237
+ }
238
+ .map-marker {
239
+ position: absolute;
240
+ left: 0;
241
+ top: 0;
242
+ width: 18px;
243
+ height: 18px;
244
+ margin: -18px 0 0 -9px;
245
+ pointer-events: none;
246
+ }
247
+ .map-marker::before {
248
+ content: "";
249
+ position: absolute;
250
+ left: 4px;
251
+ top: 1px;
252
+ width: 10px;
253
+ height: 10px;
254
+ background: #ff4d5e;
255
+ border: 2px solid #ffffff;
256
+ border-radius: 50%;
257
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
258
+ }
259
+ .map-marker::after {
260
+ content: "";
261
+ position: absolute;
262
+ left: 8px;
263
+ top: 12px;
264
+ width: 2px;
265
+ height: 9px;
266
+ background: #ffffff;
267
+ border-radius: 2px;
268
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
269
+ }
270
+ .route-overlay {
271
+ position: absolute;
272
+ inset: 0;
273
+ width: 100%;
274
+ height: 100%;
275
+ pointer-events: none;
276
+ }
277
+ .route-overlay polyline {
278
+ fill: none;
279
+ stroke: #1f8bff;
280
+ stroke-width: 4;
281
+ stroke-linecap: round;
282
+ stroke-linejoin: round;
283
+ paint-order: stroke;
284
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.7));
285
+ }
286
+ .map-attribution {
287
+ position: absolute;
288
+ right: 6px;
289
+ bottom: 5px;
290
+ padding: 2px 5px;
291
+ border-radius: 4px;
292
+ background: rgba(11, 11, 14, 0.7);
293
+ color: #d8d8de;
294
+ font-size: 10px;
295
+ pointer-events: none;
296
+ }
297
+ .map-controls,
298
+ .preset-row {
299
+ display: grid;
300
+ grid-template-columns: repeat(3, minmax(0, 1fr));
301
+ gap: 8px;
302
+ }
303
+ .coordinate-grid {
304
+ display: grid;
305
+ grid-template-columns: repeat(2, minmax(0, 1fr));
306
+ gap: 8px;
307
+ }
308
+ .coordinate-grid label {
309
+ display: grid;
310
+ gap: 5px;
311
+ color: #9a9aa3;
312
+ font-size: 11px;
313
+ }
314
+ .stacked-field {
315
+ display: grid;
316
+ gap: 5px;
317
+ color: #9a9aa3;
318
+ font-size: 11px;
319
+ }
320
+ .primary-action {
321
+ width: 100%;
322
+ background: #f2f2f7;
323
+ color: #0b0b0e;
324
+ border-color: #f2f2f7;
325
+ font-weight: 600;
326
+ }
327
+ .primary-action:hover {
328
+ background: #ffffff;
329
+ }
330
+ .route-panel {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 10px;
334
+ border-top: 1px solid #1f1f24;
335
+ padding-top: 12px;
336
+ }
337
+ .route-meta {
338
+ color: #9a9aa3;
339
+ font-size: 12px;
340
+ font-variant-numeric: tabular-nums;
341
+ }
342
+ .toggle-row {
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 8px;
346
+ color: #d8d8de;
347
+ font-size: 13px;
348
+ }
349
+ .route-actions {
350
+ display: grid;
351
+ grid-template-columns: repeat(3, minmax(0, 1fr));
352
+ gap: 8px;
353
+ }
354
+ .panel-actions {
355
+ display: grid;
356
+ grid-template-columns: repeat(4, minmax(0, 1fr));
357
+ gap: 8px;
358
+ }
359
+ .app-actions {
360
+ grid-template-columns: repeat(3, minmax(0, 1fr));
361
+ }
362
+ .ax-actions {
363
+ grid-template-columns: repeat(2, minmax(0, 1fr));
364
+ }
365
+ .ax-list {
366
+ display: grid;
367
+ gap: 6px;
368
+ max-height: 220px;
369
+ overflow: auto;
370
+ padding-right: 2px;
371
+ }
372
+ .ax-node {
373
+ display: grid;
374
+ grid-template-columns: minmax(0, 1fr) auto;
375
+ gap: 8px;
376
+ align-items: center;
377
+ min-width: 0;
378
+ padding: 7px 8px;
379
+ text-align: left;
380
+ }
381
+ .ax-node.active {
382
+ border-color: #5cc8ff;
383
+ background: #18303d;
384
+ }
385
+ .ax-node span {
386
+ min-width: 0;
387
+ overflow: hidden;
388
+ text-overflow: ellipsis;
389
+ white-space: nowrap;
390
+ }
391
+ .ax-node code {
392
+ color: #9a9aa3;
393
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
394
+ font-size: 10px;
395
+ }
396
+ .ax-empty {
397
+ padding: 12px;
398
+ border: 1px dashed #2a2a32;
399
+ border-radius: 8px;
400
+ color: #8a8a93;
401
+ font-size: 12px;
402
+ text-align: center;
403
+ }
404
+ .device-list {
405
+ display: grid;
406
+ gap: 6px;
407
+ }
408
+ .device-search {
409
+ display: grid;
410
+ grid-template-columns: minmax(0, 1fr) auto;
411
+ gap: 8px;
412
+ }
413
+ .device-search button {
414
+ padding-inline: 10px;
415
+ }
416
+ .android-grid-list {
417
+ flex: 1;
418
+ min-height: 0;
419
+ max-height: none;
420
+ overflow: auto;
421
+ padding-right: 2px;
422
+ align-content: start;
423
+ align-items: start;
424
+ }
425
+ .device-row {
426
+ display: grid;
427
+ grid-template-columns: minmax(0, 1fr) auto;
428
+ gap: 8px;
429
+ align-items: center;
430
+ padding: 8px 10px;
431
+ border: 1px solid #25252d;
432
+ border-radius: 8px;
433
+ background: #111116;
434
+ }
435
+ .device-row.current {
436
+ border-color: #3f7d5c;
437
+ background: #132219;
438
+ }
439
+ .grid-device-row {
440
+ grid-template-columns: minmax(0, 1fr) auto;
441
+ align-items: center;
442
+ min-height: 58px;
443
+ padding: 8px;
444
+ }
445
+ .device-row-main {
446
+ display: grid;
447
+ grid-template-columns: 34px minmax(0, 1fr);
448
+ grid-template-rows: auto auto;
449
+ column-gap: 10px;
450
+ align-items: center;
451
+ min-width: 0;
452
+ padding: 0;
453
+ border: 0;
454
+ background: transparent;
455
+ text-align: left;
456
+ }
457
+ .device-row-main:hover {
458
+ background: transparent;
459
+ }
460
+ .device-kind {
461
+ grid-row: 1 / 3;
462
+ display: grid;
463
+ place-items: center;
464
+ width: 34px;
465
+ height: 34px;
466
+ border-radius: 8px;
467
+ background: #1c1c22;
468
+ color: #8a8a93;
469
+ font-size: 11px;
470
+ font-weight: 700;
471
+ letter-spacing: 0;
472
+ text-transform: none;
473
+ }
474
+ .device-kind::first-letter {
475
+ text-transform: uppercase;
476
+ }
477
+ .device-row .device-name {
478
+ color: #f2f2f7;
479
+ font-size: 12px;
480
+ font-weight: 600;
481
+ }
482
+ .device-subtitle {
483
+ color: #9a9aa3;
484
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
485
+ font-size: 10px;
486
+ }
487
+ .device-row-actions {
488
+ display: flex;
489
+ flex-direction: row;
490
+ gap: 8px;
491
+ align-items: flex-end;
492
+ justify-content: center;
493
+ }
494
+ .device-row-actions button {
495
+ min-width: 52px;
496
+ padding: 5px 8px;
497
+ font-size: 11px;
498
+ }
499
+ .device-row span {
500
+ min-width: 0;
501
+ overflow: hidden;
502
+ color: #f2f2f7;
503
+ font-size: 12px;
504
+ text-overflow: ellipsis;
505
+ white-space: nowrap;
506
+ }
507
+ .device-row code {
508
+ color: #9a9aa3;
509
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
510
+ font-size: 10px;
511
+ }
512
+ .device-empty {
513
+ padding: 12px;
514
+ border: 1px dashed #2a2a32;
515
+ border-radius: 8px;
516
+ color: #8a8a93;
517
+ font-size: 12px;
518
+ text-align: center;
519
+ }
520
+ .segmented-row {
521
+ display: grid;
522
+ grid-template-columns: repeat(3, minmax(0, 1fr));
523
+ gap: 6px;
524
+ }
525
+ .segmented-row button {
526
+ min-width: 0;
527
+ padding: 8px 6px;
528
+ }
529
+ .segmented-row button.selected {
530
+ border-color: #3f7d5c;
531
+ background: #173522;
532
+ color: #f2f2f7;
533
+ }
534
+ .network-row {
535
+ grid-template-columns: repeat(2, minmax(0, 1fr));
536
+ }
537
+ .font-scale-row {
538
+ display: grid;
539
+ grid-template-columns: repeat(5, minmax(0, 1fr));
540
+ gap: 6px;
541
+ }
542
+ .font-scale-row button {
543
+ min-width: 0;
544
+ padding: 8px 4px;
545
+ font-size: 12px;
546
+ }
547
+ .font-scale-row button.selected {
548
+ border-color: #3f7d5c;
549
+ background: #173522;
550
+ color: #f2f2f7;
551
+ }
552
+ .foreground-card {
553
+ display: grid;
554
+ gap: 8px;
555
+ padding: 10px;
556
+ border: 1px solid #25252d;
557
+ border-radius: 8px;
558
+ background: #111116;
559
+ }
560
+ .foreground-title {
561
+ display: flex;
562
+ align-items: center;
563
+ justify-content: space-between;
564
+ gap: 8px;
565
+ min-width: 0;
566
+ }
567
+ .foreground-title span {
568
+ min-width: 0;
569
+ overflow: hidden;
570
+ color: #f2f2f7;
571
+ font-size: 13px;
572
+ font-weight: 600;
573
+ text-overflow: ellipsis;
574
+ white-space: nowrap;
575
+ }
576
+ .foreground-title button {
577
+ flex: 0 0 auto;
578
+ padding: 5px 9px;
579
+ font-size: 11px;
580
+ }
581
+ .foreground-card dl {
582
+ display: grid;
583
+ gap: 5px;
584
+ margin: 0;
585
+ }
586
+ .foreground-card dl div {
587
+ display: grid;
588
+ grid-template-columns: 72px minmax(0, 1fr);
589
+ gap: 8px;
590
+ }
591
+ .foreground-card dt {
592
+ color: #8a8a93;
593
+ font-size: 11px;
594
+ }
595
+ .foreground-card dd {
596
+ min-width: 0;
597
+ margin: 0;
598
+ overflow: hidden;
599
+ color: #d8d8de;
600
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
601
+ font-size: 11px;
602
+ text-overflow: ellipsis;
603
+ white-space: nowrap;
604
+ }
605
+ .foreground-empty {
606
+ color: #8a8a93;
607
+ font-size: 12px;
608
+ overflow-wrap: anywhere;
609
+ }
610
+ .file-drop {
611
+ display: grid;
612
+ gap: 4px;
613
+ padding: 14px;
614
+ border: 1px dashed #34343d;
615
+ border-radius: 8px;
616
+ background: #111116;
617
+ color: #d8d8de;
618
+ text-align: center;
619
+ }
620
+ .file-drop.active {
621
+ border-color: #5cc8ff;
622
+ background: #13242d;
623
+ }
624
+ .file-drop span {
625
+ font-size: 13px;
626
+ font-weight: 600;
627
+ }
628
+ .file-drop small {
629
+ color: #8a8a93;
630
+ font-size: 11px;
631
+ }
632
+ .logcat-output {
633
+ box-sizing: border-box;
634
+ height: 220px;
635
+ width: 100%;
636
+ margin: 0;
637
+ padding: 10px;
638
+ overflow: auto;
639
+ border: 1px solid #25252d;
640
+ border-radius: 8px;
641
+ background: #070709;
642
+ color: #d8d8de;
643
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
644
+ font-size: 11px;
645
+ line-height: 1.45;
646
+ white-space: pre-wrap;
647
+ overflow-wrap: anywhere;
648
+ }
649
+ .session-list {
650
+ display: grid;
651
+ gap: 6px;
652
+ color: #d8d8de;
653
+ font-size: 12px;
654
+ }
655
+ .session-list div {
656
+ display: grid;
657
+ grid-template-columns: 72px minmax(0, 1fr);
658
+ gap: 8px;
659
+ min-width: 0;
660
+ overflow-wrap: anywhere;
661
+ }
662
+ .session-list span {
663
+ color: #9a9aa3;
664
+ font-variant-numeric: tabular-nums;
665
+ }
666
+ @media (max-width: 920px) {
667
+ body {
668
+ min-height: 100dvh;
669
+ }
670
+ main {
671
+ grid-template-columns: 1fr;
672
+ align-items: start;
673
+ padding: 16px;
674
+ }
675
+ .app-layout.devices-open,
676
+ .app-layout.devices-collapsed {
677
+ grid-template-columns: 1fr;
678
+ }
679
+ .device-sidebar {
680
+ border-right: 0;
681
+ border-bottom: 1px solid #1f1f24;
682
+ padding-right: 0;
683
+ padding-bottom: 16px;
684
+ width: min(100%, 520px);
685
+ max-height: 360px;
686
+ justify-self: center;
687
+ }
688
+ .devices-collapsed .device-sidebar {
689
+ max-height: none;
690
+ padding-bottom: 8px;
691
+ }
692
+ .devices-collapsed .device-sidebar-header {
693
+ flex-direction: row;
694
+ }
695
+ .side-panel {
696
+ border-left: 0;
697
+ border-top: 1px solid #1f1f24;
698
+ padding-left: 0;
699
+ padding-top: 16px;
700
+ width: min(100%, 520px);
701
+ max-height: none;
702
+ justify-self: center;
703
+ }
704
+ canvas {
705
+ max-width: 100%;
706
+ max-height: 60vh;
707
+ }
708
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "jsx": "react-jsx",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "resolveJsonModule": true,
12
+ "isolatedModules": true,
13
+ "noEmit": true,
14
+ "types": []
15
+ },
16
+ "include": ["**/*.ts", "**/*.tsx"]
17
+ }