react-native-web-serial-api 0.0.1

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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/android/build.gradle +62 -0
  4. package/android/gradle.properties +6 -0
  5. package/android/src/main/AndroidManifest.xml +21 -0
  6. package/android/src/main/java/dev/webserialapi/NativeUsbSerialModule.java +704 -0
  7. package/android/src/main/java/dev/webserialapi/NativeUsbSerialPackage.java +46 -0
  8. package/android/src/main/java/dev/webserialapi/PortPickerActivity.java +235 -0
  9. package/android/src/main/java/dev/webserialapi/UsbDetachReceiver.java +37 -0
  10. package/android/src/main/res/xml/device_filter.xml +13 -0
  11. package/babel.config.js +3 -0
  12. package/biome.json +35 -0
  13. package/example/.watchmanconfig +1 -0
  14. package/example/App.tsx +71 -0
  15. package/example/__tests__/App.test.tsx +16 -0
  16. package/example/android/app/build.gradle +120 -0
  17. package/example/android/app/debug.keystore +0 -0
  18. package/example/android/app/proguard-rules.pro +10 -0
  19. package/example/android/app/src/debug/AndroidManifest.xml +9 -0
  20. package/example/android/app/src/main/AndroidManifest.xml +38 -0
  21. package/example/android/app/src/main/java/dev/uzlopak/MainActivity.kt +22 -0
  22. package/example/android/app/src/main/java/dev/uzlopak/MainApplication.kt +41 -0
  23. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  24. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  25. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  26. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  27. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  28. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  29. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  30. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  31. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  32. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  33. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  34. package/example/android/app/src/main/res/values/strings.xml +3 -0
  35. package/example/android/app/src/main/res/values/styles.xml +9 -0
  36. package/example/android/build.gradle +22 -0
  37. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  38. package/example/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  39. package/example/android/gradle.properties +47 -0
  40. package/example/android/gradlew +252 -0
  41. package/example/android/gradlew.bat +94 -0
  42. package/example/android/settings.gradle +6 -0
  43. package/example/app.json +4 -0
  44. package/example/babel.config.js +21 -0
  45. package/example/biome.json +47 -0
  46. package/example/deploy.sh +11 -0
  47. package/example/index.html +26 -0
  48. package/example/index.js +9 -0
  49. package/example/index.web.js +8 -0
  50. package/example/jest.config.js +12 -0
  51. package/example/metro.config.js +58 -0
  52. package/example/package-lock.json +14510 -0
  53. package/example/package.json +48 -0
  54. package/example/react-native.config.js +17 -0
  55. package/example/src/components/AppBar.tsx +73 -0
  56. package/example/src/components/Menu.tsx +90 -0
  57. package/example/src/components/SingleChoiceDialog.tsx +120 -0
  58. package/example/src/screens/ConnectScreen.tsx +195 -0
  59. package/example/src/screens/DevicesScreen.tsx +141 -0
  60. package/example/src/screens/TerminalScreen.tsx +564 -0
  61. package/example/src/settings.ts +43 -0
  62. package/example/src/theme.ts +19 -0
  63. package/example/src/util/TextUtil.ts +129 -0
  64. package/example/tsconfig.json +10 -0
  65. package/example/vite.config.mjs +55 -0
  66. package/lib/commonjs/NativeUsbSerial.js +11 -0
  67. package/lib/commonjs/NativeUsbSerial.js.map +1 -0
  68. package/lib/commonjs/NativeUsbSerial.web.js +12 -0
  69. package/lib/commonjs/NativeUsbSerial.web.js.map +1 -0
  70. package/lib/commonjs/UsbSerial.js +149 -0
  71. package/lib/commonjs/UsbSerial.js.map +1 -0
  72. package/lib/commonjs/WebSerial.js +852 -0
  73. package/lib/commonjs/WebSerial.js.map +1 -0
  74. package/lib/commonjs/index.js +44 -0
  75. package/lib/commonjs/index.js.map +1 -0
  76. package/lib/commonjs/package.json +1 -0
  77. package/lib/commonjs/serial.android.js +13 -0
  78. package/lib/commonjs/serial.android.js.map +1 -0
  79. package/lib/commonjs/serial.js +13 -0
  80. package/lib/commonjs/serial.js.map +1 -0
  81. package/lib/commonjs/serial.web.js +11 -0
  82. package/lib/commonjs/serial.web.js.map +1 -0
  83. package/lib/typescript/src/NativeUsbSerial.d.ts +51 -0
  84. package/lib/typescript/src/NativeUsbSerial.d.ts.map +1 -0
  85. package/lib/typescript/src/NativeUsbSerial.web.d.ts +3 -0
  86. package/lib/typescript/src/NativeUsbSerial.web.d.ts.map +1 -0
  87. package/lib/typescript/src/UsbSerial.d.ts +97 -0
  88. package/lib/typescript/src/UsbSerial.d.ts.map +1 -0
  89. package/lib/typescript/src/WebSerial.d.ts +236 -0
  90. package/lib/typescript/src/WebSerial.d.ts.map +1 -0
  91. package/lib/typescript/src/index.d.ts +7 -0
  92. package/lib/typescript/src/index.d.ts.map +1 -0
  93. package/lib/typescript/src/serial.android.d.ts +2 -0
  94. package/lib/typescript/src/serial.android.d.ts.map +1 -0
  95. package/lib/typescript/src/serial.d.ts +2 -0
  96. package/lib/typescript/src/serial.d.ts.map +1 -0
  97. package/lib/typescript/src/serial.web.d.ts +4 -0
  98. package/lib/typescript/src/serial.web.d.ts.map +1 -0
  99. package/package.json +78 -0
  100. package/react-native.config.js +9 -0
  101. package/scripts/deploy-release.sh +127 -0
  102. package/src/NativeUsbSerial.ts +124 -0
  103. package/src/NativeUsbSerial.web.ts +5 -0
  104. package/src/UsbSerial.ts +305 -0
  105. package/src/WebSerial.ts +1084 -0
  106. package/src/index.ts +23 -0
  107. package/src/lib/dom-exception.ts +161 -0
  108. package/src/lib/event-target.ts +170 -0
  109. package/src/lib/promise.ts +19 -0
  110. package/src/serial.android.ts +1 -0
  111. package/src/serial.ts +1 -0
  112. package/src/serial.web.ts +6 -0
  113. package/tsconfig.build.json +7 -0
  114. package/tsconfig.json +20 -0
package/src/index.ts ADDED
@@ -0,0 +1,23 @@
1
+ // Platform-resolved Web Serial API instance.
2
+ // On React Native (Android) this is the USB-serial-backed polyfill; on web it
3
+ // is the browser's native navigator.serial. (See serial.android.ts / serial.web.ts)
4
+ export {default as serial} from './serial';
5
+ export type {
6
+ SerialInputSignals,
7
+ SerialOptions,
8
+ SerialOutputSignals,
9
+ SerialPortFilter,
10
+ SerialPortInfo,
11
+ SerialPortRequestOptions,
12
+ } from './WebSerial';
13
+ // W3C Web Serial API classes
14
+ export {Serial, SerialPort} from './WebSerial';
15
+
16
+ // Lower-level access to the raw USB-serial TurboModule (Android only).
17
+ // (Imported + re-exported rather than `export * as` so older Babel presets
18
+ // without @babel/plugin-transform-export-namespace-from can consume the source.)
19
+ import * as UsbSerial from './UsbSerial';
20
+
21
+ // Web Serial API event/exception primitives used by the polyfill
22
+ export {Event, EventTarget} from './lib/event-target';
23
+ export {UsbSerial};
@@ -0,0 +1,161 @@
1
+ /**
2
+ * DOMException Polyfill
3
+ *
4
+ * Provides a spec-compliant DOMException implementation for environments
5
+ * where it is missing or incomplete (e.g. Node.js < 17, some older browsers).
6
+ *
7
+ * Spec: https://webidl.spec.whatwg.org/#idl-DOMException
8
+ */
9
+
10
+ const DOM_EXCEPTION_CODES: Record<string, number> = {
11
+ IndexSizeError: 1,
12
+ HierarchyRequestError: 3,
13
+ WrongDocumentError: 4,
14
+ InvalidCharacterError: 5,
15
+ NoModificationAllowedError: 7,
16
+ NotFoundError: 8,
17
+ NotSupportedError: 9,
18
+ InUseAttributeError: 10,
19
+ InvalidStateError: 11,
20
+ SyntaxError: 12,
21
+ InvalidModificationError: 13,
22
+ NamespaceError: 14,
23
+ InvalidAccessError: 15,
24
+ TypeMismatchError: 17,
25
+ SecurityError: 18,
26
+ NetworkError: 19,
27
+ AbortError: 20,
28
+ URLMismatchError: 21,
29
+ QuotaExceededError: 22,
30
+ TimeoutError: 23,
31
+ InvalidNodeTypeError: 24,
32
+ DataCloneError: 25,
33
+ };
34
+
35
+ const DOM_EXCEPTION_NAMES: Record<number, string> = Object.fromEntries(
36
+ Object.entries(DOM_EXCEPTION_CODES).map(([name, code]) => [code, name])
37
+ );
38
+
39
+ export interface DOMExceptionConstructor {
40
+ new (message?: string, name?: string): DOMException;
41
+ readonly prototype: DOMException;
42
+
43
+ readonly INDEX_SIZE_ERR: 1;
44
+ readonly DOMSTRING_SIZE_ERR: 2;
45
+ readonly HIERARCHY_REQUEST_ERR: 3;
46
+ readonly WRONG_DOCUMENT_ERR: 4;
47
+ readonly INVALID_CHARACTER_ERR: 5;
48
+ readonly NO_DATA_ALLOWED_ERR: 6;
49
+ readonly NO_MODIFICATION_ALLOWED_ERR: 7;
50
+ readonly NOT_FOUND_ERR: 8;
51
+ readonly NOT_SUPPORTED_ERR: 9;
52
+ readonly INUSE_ATTRIBUTE_ERR: 10;
53
+ readonly INVALID_STATE_ERR: 11;
54
+ readonly SYNTAX_ERR: 12;
55
+ readonly INVALID_MODIFICATION_ERR: 13;
56
+ readonly NAMESPACE_ERR: 14;
57
+ readonly INVALID_ACCESS_ERR: 15;
58
+ readonly VALIDATION_ERR: 16;
59
+ readonly TYPE_MISMATCH_ERR: 17;
60
+ readonly SECURITY_ERR: 18;
61
+ readonly NETWORK_ERR: 19;
62
+ readonly ABORT_ERR: 20;
63
+ readonly URL_MISMATCH_ERR: 21;
64
+ readonly QUOTA_EXCEEDED_ERR: 22;
65
+ readonly TIMEOUT_ERR: 23;
66
+ readonly INVALID_NODE_TYPE_ERR: 24;
67
+ readonly DATA_CLONE_ERR: 25;
68
+ }
69
+
70
+ // ---------------------------------------------------------------------------
71
+ // Polyfill class
72
+ // ---------------------------------------------------------------------------
73
+
74
+ class DOMExceptionPolyfill extends Error {
75
+ // Instance numeric legacy code (0 when name has no legacy code)
76
+ readonly code: number;
77
+ // Error name (defaults to "Error" per spec)
78
+ readonly name: string;
79
+
80
+ // --- Static legacy-code constants ---
81
+ static readonly INDEX_SIZE_ERR = 1 as const;
82
+ static readonly DOMSTRING_SIZE_ERR = 2 as const;
83
+ static readonly HIERARCHY_REQUEST_ERR = 3 as const;
84
+ static readonly WRONG_DOCUMENT_ERR = 4 as const;
85
+ static readonly INVALID_CHARACTER_ERR = 5 as const;
86
+ static readonly NO_DATA_ALLOWED_ERR = 6 as const;
87
+ static readonly NO_MODIFICATION_ALLOWED_ERR = 7 as const;
88
+ static readonly NOT_FOUND_ERR = 8 as const;
89
+ static readonly NOT_SUPPORTED_ERR = 9 as const;
90
+ static readonly INUSE_ATTRIBUTE_ERR = 10 as const;
91
+ static readonly INVALID_STATE_ERR = 11 as const;
92
+ static readonly SYNTAX_ERR = 12 as const;
93
+ static readonly INVALID_MODIFICATION_ERR = 13 as const;
94
+ static readonly NAMESPACE_ERR = 14 as const;
95
+ static readonly INVALID_ACCESS_ERR = 15 as const;
96
+ static readonly VALIDATION_ERR = 16 as const;
97
+ static readonly TYPE_MISMATCH_ERR = 17 as const;
98
+ static readonly SECURITY_ERR = 18 as const;
99
+ static readonly NETWORK_ERR = 19 as const;
100
+ static readonly ABORT_ERR = 20 as const;
101
+ static readonly URL_MISMATCH_ERR = 21 as const;
102
+ static readonly QUOTA_EXCEEDED_ERR = 22 as const;
103
+ static readonly TIMEOUT_ERR = 23 as const;
104
+ static readonly INVALID_NODE_TYPE_ERR = 24 as const;
105
+ static readonly DATA_CLONE_ERR = 25 as const;
106
+
107
+ constructor(message = "", name = "Error") {
108
+ super(message);
109
+
110
+ // Restore the correct prototype chain when transpiled to ES5
111
+ Object.setPrototypeOf(this, new.target.prototype);
112
+
113
+ this.name = name;
114
+ this.message = message;
115
+ this.code = DOM_EXCEPTION_CODES[name] ?? 0;
116
+
117
+ // Provide a useful stack trace in V8 / SpiderMonkey
118
+ if (typeof (Error as any).captureStackTrace === "function") {
119
+ (Error as any).captureStackTrace(this, new.target);
120
+ }
121
+ }
122
+
123
+ /** Mirror static constants on the prototype (spec §3.1.2) */
124
+ get INDEX_SIZE_ERR() { return 1; }
125
+ get DOMSTRING_SIZE_ERR() { return 2; }
126
+ get HIERARCHY_REQUEST_ERR() { return 3; }
127
+ get WRONG_DOCUMENT_ERR() { return 4; }
128
+ get INVALID_CHARACTER_ERR() { return 5; }
129
+ get NO_DATA_ALLOWED_ERR() { return 6; }
130
+ get NO_MODIFICATION_ALLOWED_ERR() { return 7; }
131
+ get NOT_FOUND_ERR() { return 8; }
132
+ get NOT_SUPPORTED_ERR() { return 9; }
133
+ get INUSE_ATTRIBUTE_ERR() { return 10; }
134
+ get INVALID_STATE_ERR() { return 11; }
135
+ get SYNTAX_ERR() { return 12; }
136
+ get INVALID_MODIFICATION_ERR() { return 13; }
137
+ get NAMESPACE_ERR() { return 14; }
138
+ get INVALID_ACCESS_ERR() { return 15; }
139
+ get VALIDATION_ERR() { return 16; }
140
+ get TYPE_MISMATCH_ERR() { return 17; }
141
+ get SECURITY_ERR() { return 18; }
142
+ get NETWORK_ERR() { return 19; }
143
+ get ABORT_ERR() { return 20; }
144
+ get URL_MISMATCH_ERR() { return 21; }
145
+ get QUOTA_EXCEEDED_ERR() { return 22; }
146
+ get TIMEOUT_ERR() { return 23; }
147
+ get INVALID_NODE_TYPE_ERR() { return 24; }
148
+ get DATA_CLONE_ERR() { return 25; }
149
+
150
+ /** Canonical string representation */
151
+ toString(): string {
152
+ return `${this.name}: ${this.message}`;
153
+ }
154
+ }
155
+
156
+ export const DOMExceptionImpl = (globalThis as any).DOMException
157
+ ? (globalThis as any).DOMException as DOMExceptionConstructor
158
+ : DOMExceptionPolyfill as DOMExceptionConstructor;
159
+
160
+ export { DOM_EXCEPTION_CODES, DOM_EXCEPTION_NAMES };
161
+ export { DOMExceptionImpl as DOMException };
@@ -0,0 +1,170 @@
1
+
2
+ export interface EventInit {
3
+ bubbles?: boolean;
4
+ cancelable?: boolean;
5
+ composed?: boolean;
6
+ }
7
+
8
+ export class Event {
9
+ readonly type: string;
10
+ readonly bubbles: boolean;
11
+ readonly cancelable: boolean;
12
+ readonly composed: boolean;
13
+
14
+ target: EventTarget | null = null;
15
+ currentTarget: EventTarget | null = null;
16
+
17
+ defaultPrevented: boolean = false;
18
+ cancelBubble: boolean = false;
19
+ _stopImmediatePropagationFlag: boolean = false;
20
+
21
+ readonly timeStamp: number = Date.now();
22
+ readonly isTrusted: boolean = false;
23
+
24
+ static readonly NONE = 0;
25
+ static readonly CAPTURING_PHASE = 1;
26
+ static readonly AT_TARGET = 2;
27
+ static readonly BUBBLING_PHASE = 3;
28
+
29
+ readonly NONE = 0;
30
+ readonly CAPTURING_PHASE = 1;
31
+ readonly AT_TARGET = 2;
32
+ readonly BUBBLING_PHASE = 3;
33
+
34
+ eventPhase: number = Event.NONE;
35
+
36
+ constructor(type: string, options?: EventInit) {
37
+ this.type = type;
38
+ this.bubbles = options?.bubbles ?? false;
39
+ this.cancelable = options?.cancelable ?? false;
40
+ this.composed = options?.composed ?? false;
41
+ }
42
+
43
+ preventDefault(): void {
44
+ if (this.cancelable) {
45
+ this.defaultPrevented = true;
46
+ }
47
+ }
48
+
49
+ stopPropagation(): void {
50
+ this.cancelBubble = true;
51
+ }
52
+
53
+ stopImmediatePropagation(): void {
54
+ this.cancelBubble = true;
55
+ this._stopImmediatePropagationFlag = true;
56
+ }
57
+
58
+ composedPath(): EventTarget[] {
59
+ return this.currentTarget ? [this.currentTarget] : [];
60
+ }
61
+
62
+ initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void {
63
+ (this as Mutable<Event>).type = type;
64
+ (this as Mutable<Event>).bubbles = bubbles ?? false;
65
+ (this as Mutable<Event>).cancelable = cancelable ?? false;
66
+ }
67
+ }
68
+
69
+ type Mutable<T> = { -readonly [P in keyof T]: T[P] };
70
+
71
+ type EventListener = (event: Event) => void;
72
+
73
+ interface EventListenerObject {
74
+ handleEvent(event: Event): void;
75
+ }
76
+
77
+ type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
78
+
79
+ type ListenerOptions =
80
+ | { once?: boolean; capture?: boolean; passive?: boolean }
81
+ | boolean
82
+ | undefined;
83
+
84
+ interface ListenerInfo {
85
+ target: EventTarget;
86
+ listener: EventListenerOrEventListenerObject;
87
+ options: ListenerOptions;
88
+ }
89
+
90
+ type SecretMap = Record<string, ListenerInfo[]>;
91
+
92
+ const wm = new WeakMap<object, SecretMap>();
93
+
94
+ function define<T extends object>(target: T, name: string, value: unknown): void {
95
+ Object.defineProperty(target, name, {
96
+ configurable: true,
97
+ writable: true,
98
+ value,
99
+ });
100
+ }
101
+
102
+ function dispatch(this: Event, info: ListenerInfo): boolean {
103
+ const options = info.options;
104
+ const once =
105
+ typeof options === "object" && options !== null ? options.once : false;
106
+
107
+ if (once) {
108
+ info.target.removeEventListener(this.type, info.listener);
109
+ }
110
+
111
+ if (typeof info.listener === "function") {
112
+ info.listener.call(info.target, this);
113
+ } else {
114
+ info.listener.handleEvent(this);
115
+ }
116
+
117
+ return this._stopImmediatePropagationFlag;
118
+ }
119
+
120
+ export class EventTarget {
121
+ constructor() {
122
+ wm.set(this, Object.create(null) as SecretMap);
123
+ }
124
+
125
+ addEventListener(
126
+ type: string,
127
+ listener: EventListenerOrEventListenerObject,
128
+ options?: ListenerOptions
129
+ ): void {
130
+ const secret = wm.get(this)!;
131
+ const listeners: ListenerInfo[] = secret[type] ?? (secret[type] = []);
132
+
133
+ for (let i = 0; i < listeners.length; i++) {
134
+ if (listeners[i].listener === listener) return;
135
+ }
136
+
137
+ listeners.push({ target: this, listener, options });
138
+ }
139
+
140
+ dispatchEvent(event: Event): boolean {
141
+ const secret = wm.get(this)!;
142
+ const listeners = secret[event.type];
143
+
144
+ if (listeners) {
145
+ define(event, "target", this);
146
+ define(event, "currentTarget", this);
147
+ listeners.slice(0).some(dispatch, event);
148
+ define(event, "target", null);
149
+ define(event, "currentTarget", null);
150
+ }
151
+
152
+ return true;
153
+ }
154
+
155
+ removeEventListener(
156
+ type: string,
157
+ listener: EventListenerOrEventListenerObject,
158
+ _options?: ListenerOptions
159
+ ): void {
160
+ const secret = wm.get(this)!;
161
+ const listeners: ListenerInfo[] = secret[type] ?? (secret[type] = []);
162
+
163
+ for (let i = 0; i < listeners.length; i++) {
164
+ if (listeners[i].listener === listener) {
165
+ listeners.splice(i, 1);
166
+ return;
167
+ }
168
+ }
169
+ }
170
+ }
@@ -0,0 +1,19 @@
1
+ type DeferredPromise<T> = {
2
+ promise: Promise<T>;
3
+ resolve: (value?: T) => void;
4
+ reject: (reason?: any) => void;
5
+ };
6
+
7
+ /**
8
+ * @returns An object containing a promise and its resolve/reject methods.
9
+ */
10
+ export function createDeferredPromise<T>(): DeferredPromise<T> {
11
+ let res: any;
12
+ let rej: any;
13
+ const promise = new Promise<T>((resolve, reject) => {
14
+ res = resolve
15
+ rej = reject
16
+ })
17
+
18
+ return { promise, resolve: res, reject: rej } as DeferredPromise<T>;
19
+ }
@@ -0,0 +1 @@
1
+ export {serial as default} from './WebSerial';
package/src/serial.ts ADDED
@@ -0,0 +1 @@
1
+ export {serial as default} from './WebSerial';
@@ -0,0 +1,6 @@
1
+ import type {Serial} from './WebSerial';
2
+
3
+ // On web, delegate to the browser's native Web Serial API implementation.
4
+ // (navigator.serial is not part of TypeScript's standard DOM lib types, so we
5
+ // cast through our own structurally-compatible Serial type.)
6
+ export default (navigator as unknown as {serial: Serial}).serial;
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig",
3
+ "compilerOptions": {
4
+ "noEmit": false
5
+ },
6
+ "exclude": ["example", "lib", "node_modules"]
7
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": ".",
4
+ "esModuleInterop": true,
5
+ "forceConsistentCasingInFileNames": true,
6
+ "jsx": "react-jsx",
7
+ "lib": ["ESNext", "DOM"],
8
+ "module": "ESNext",
9
+ "moduleResolution": "bundler",
10
+ "noFallthroughCasesInSwitch": true,
11
+ "noImplicitReturns": true,
12
+ "resolveJsonModule": true,
13
+ "skipLibCheck": true,
14
+ "strict": true,
15
+ "target": "ESNext",
16
+ "noEmit": true
17
+ },
18
+ "include": ["src"],
19
+ "exclude": ["example", "lib", "node_modules"]
20
+ }