react-native-debug-toolkit 3.2.1 → 3.2.3
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/README.md +13 -2
- package/README.zh-CN.md +13 -2
- package/android/build.gradle +34 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/reactnativedebugtoolkit/DebugToolkitDevConnectModule.java +154 -0
- package/android/src/main/java/com/reactnativedebugtoolkit/ReactNativeDebugToolkitPackage.java +25 -0
- package/ios/DebugToolkitDevConnect.mm +81 -0
- package/lib/commonjs/features/devConnect/DevConnectQrScanner.js +115 -70
- package/lib/commonjs/features/devConnect/DevConnectQrScanner.js.map +1 -1
- package/lib/commonjs/features/devConnect/DevConnectTab.js +232 -161
- package/lib/commonjs/features/devConnect/DevConnectTab.js.map +1 -1
- package/lib/commonjs/features/devConnect/devConnectPreferences.js +35 -5
- package/lib/commonjs/features/devConnect/devConnectPreferences.js.map +1 -1
- package/lib/commonjs/features/devConnect/devConnectUtils.js +99 -15
- package/lib/commonjs/features/devConnect/devConnectUtils.js.map +1 -1
- package/lib/commonjs/features/devConnect/index.js +39 -2
- package/lib/commonjs/features/devConnect/index.js.map +1 -1
- package/lib/commonjs/features/devConnect/nativeDevConnect.js +108 -0
- package/lib/commonjs/features/devConnect/nativeDevConnect.js.map +1 -0
- package/lib/commonjs/features/devConnect/platformDetect.js +7 -11
- package/lib/commonjs/features/devConnect/platformDetect.js.map +1 -1
- package/lib/commonjs/utils/debugPreferences.js +43 -6
- package/lib/commonjs/utils/debugPreferences.js.map +1 -1
- package/lib/module/features/devConnect/DevConnectQrScanner.js +116 -71
- package/lib/module/features/devConnect/DevConnectQrScanner.js.map +1 -1
- package/lib/module/features/devConnect/DevConnectTab.js +235 -164
- package/lib/module/features/devConnect/DevConnectTab.js.map +1 -1
- package/lib/module/features/devConnect/devConnectPreferences.js +33 -6
- package/lib/module/features/devConnect/devConnectPreferences.js.map +1 -1
- package/lib/module/features/devConnect/devConnectUtils.js +94 -15
- package/lib/module/features/devConnect/devConnectUtils.js.map +1 -1
- package/lib/module/features/devConnect/index.js +11 -3
- package/lib/module/features/devConnect/index.js.map +1 -1
- package/lib/module/features/devConnect/nativeDevConnect.js +102 -0
- package/lib/module/features/devConnect/nativeDevConnect.js.map +1 -0
- package/lib/module/features/devConnect/platformDetect.js +8 -12
- package/lib/module/features/devConnect/platformDetect.js.map +1 -1
- package/lib/module/utils/debugPreferences.js +43 -6
- package/lib/module/utils/debugPreferences.js.map +1 -1
- package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts +3 -2
- package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/DevConnectTab.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts +6 -0
- package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts +18 -1
- package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/index.d.ts +2 -2
- package/lib/typescript/src/features/devConnect/index.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts +17 -0
- package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts.map +1 -0
- package/lib/typescript/src/features/devConnect/platformDetect.d.ts.map +1 -1
- package/lib/typescript/src/features/devConnect/types.d.ts +3 -0
- package/lib/typescript/src/features/devConnect/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/debugPreferences.d.ts +2 -0
- package/lib/typescript/src/utils/debugPreferences.d.ts.map +1 -1
- package/package.json +4 -1
- package/react-native-debug-toolkit.podspec +18 -0
- package/src/features/devConnect/DevConnectQrScanner.tsx +101 -60
- package/src/features/devConnect/DevConnectTab.tsx +227 -105
- package/src/features/devConnect/devConnectPreferences.ts +50 -5
- package/src/features/devConnect/devConnectUtils.ts +122 -15
- package/src/features/devConnect/index.ts +13 -0
- package/src/features/devConnect/nativeDevConnect.ts +126 -0
- package/src/features/devConnect/platformDetect.ts +8 -13
- package/src/features/devConnect/types.ts +3 -0
- package/src/utils/debugPreferences.ts +49 -4
|
@@ -2,18 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
import { daemonClient } from '../../utils/DaemonClient';
|
|
4
4
|
import { getPreference, KEYS, setPreference } from '../../utils/debugPreferences';
|
|
5
|
-
import { normalizeComputerHost } from './devConnectUtils';
|
|
5
|
+
import { DEFAULT_DAEMON_PORT, DEFAULT_METRO_PORT, buildDaemonDeviceHost, normalizeComputerHost, normalizePort, parseComputerTarget } from './devConnectUtils';
|
|
6
6
|
import { isSimulator } from './platformDetect';
|
|
7
7
|
export async function loadDevConnectPreferences() {
|
|
8
8
|
const storedHost = await getPreference(KEYS.computerHost);
|
|
9
|
+
const storedMetroPort = await getPreference(KEYS.metroPort);
|
|
10
|
+
const storedDaemonPort = await getPreference(KEYS.daemonPort);
|
|
9
11
|
return {
|
|
10
|
-
computerHost: storedHost ? normalizeComputerHost(storedHost) ?? '' : ''
|
|
12
|
+
computerHost: storedHost ? normalizeComputerHost(storedHost) ?? '' : '',
|
|
13
|
+
metroPort: storedMetroPort ? normalizePort(storedMetroPort) ?? DEFAULT_METRO_PORT : DEFAULT_METRO_PORT,
|
|
14
|
+
daemonPort: storedDaemonPort ? normalizePort(storedDaemonPort) ?? DEFAULT_DAEMON_PORT : DEFAULT_DAEMON_PORT
|
|
11
15
|
};
|
|
12
16
|
}
|
|
17
|
+
export async function saveComputerTarget(value) {
|
|
18
|
+
const target = parseComputerTarget(value);
|
|
19
|
+
if (!target) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
await setPreference(KEYS.computerHost, target.computerHost);
|
|
23
|
+
await setPreference(KEYS.metroPort, target.metroPort);
|
|
24
|
+
return target;
|
|
25
|
+
}
|
|
13
26
|
export async function saveComputerHost(value) {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
const target = await saveComputerTarget(value);
|
|
28
|
+
return target?.computerHost ?? null;
|
|
29
|
+
}
|
|
30
|
+
export async function saveMetroPort(value) {
|
|
31
|
+
const normalized = normalizePort(value);
|
|
32
|
+
if (!normalized) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
await setPreference(KEYS.metroPort, normalized);
|
|
36
|
+
return normalized;
|
|
37
|
+
}
|
|
38
|
+
export async function saveDaemonPort(value) {
|
|
39
|
+
const normalized = normalizePort(value);
|
|
40
|
+
if (!normalized) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
await setPreference(KEYS.daemonPort, normalized);
|
|
17
44
|
return normalized;
|
|
18
45
|
}
|
|
19
46
|
export async function restoreDevConnectSettingsToDaemon() {
|
|
@@ -22,7 +49,7 @@ export async function restoreDevConnectSettingsToDaemon() {
|
|
|
22
49
|
daemonClient.configure({
|
|
23
50
|
mode,
|
|
24
51
|
endpoint: '',
|
|
25
|
-
deviceHost: mode === 'simulator' ? '' : preferences.computerHost,
|
|
52
|
+
deviceHost: mode === 'simulator' ? '' : buildDaemonDeviceHost(preferences.computerHost, preferences.daemonPort),
|
|
26
53
|
token: ''
|
|
27
54
|
});
|
|
28
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["daemonClient","getPreference","KEYS","setPreference","normalizeComputerHost","isSimulator","loadDevConnectPreferences","storedHost","computerHost","
|
|
1
|
+
{"version":3,"names":["daemonClient","getPreference","KEYS","setPreference","DEFAULT_DAEMON_PORT","DEFAULT_METRO_PORT","buildDaemonDeviceHost","normalizeComputerHost","normalizePort","parseComputerTarget","isSimulator","loadDevConnectPreferences","storedHost","computerHost","storedMetroPort","metroPort","storedDaemonPort","daemonPort","saveComputerTarget","value","target","saveComputerHost","saveMetroPort","normalized","saveDaemonPort","restoreDevConnectSettingsToDaemon","preferences","mode","configure","endpoint","deviceHost","token"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectPreferences.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,0BAA0B;AACvD,SAASC,aAAa,EAAEC,IAAI,EAAEC,aAAa,QAAQ,8BAA8B;AACjF,SACEC,mBAAmB,EACnBC,kBAAkB,EAClBC,qBAAqB,EACrBC,qBAAqB,EACrBC,aAAa,EACbC,mBAAmB,QAEd,mBAAmB;AAC1B,SAASC,WAAW,QAAQ,kBAAkB;AAQ9C,OAAO,eAAeC,yBAAyBA,CAAA,EAAmC;EAChF,MAAMC,UAAU,GAAG,MAAMX,aAAa,CAACC,IAAI,CAACW,YAAY,CAAC;EACzD,MAAMC,eAAe,GAAG,MAAMb,aAAa,CAACC,IAAI,CAACa,SAAS,CAAC;EAC3D,MAAMC,gBAAgB,GAAG,MAAMf,aAAa,CAACC,IAAI,CAACe,UAAU,CAAC;EAC7D,OAAO;IACLJ,YAAY,EAAED,UAAU,GAAGL,qBAAqB,CAACK,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;IACvEG,SAAS,EAAED,eAAe,GAAGN,aAAa,CAACM,eAAe,CAAC,IAAIT,kBAAkB,GAAGA,kBAAkB;IACtGY,UAAU,EAAED,gBAAgB,GAAGR,aAAa,CAACQ,gBAAgB,CAAC,IAAIZ,mBAAmB,GAAGA;EAC1F,CAAC;AACH;AAEA,OAAO,eAAec,kBAAkBA,CAACC,KAAa,EAAwC;EAC5F,MAAMC,MAAM,GAAGX,mBAAmB,CAACU,KAAK,CAAC;EACzC,IAAI,CAACC,MAAM,EAAE;IACX,OAAO,IAAI;EACb;EAEA,MAAMjB,aAAa,CAACD,IAAI,CAACW,YAAY,EAAEO,MAAM,CAACP,YAAY,CAAC;EAC3D,MAAMV,aAAa,CAACD,IAAI,CAACa,SAAS,EAAEK,MAAM,CAACL,SAAS,CAAC;EACrD,OAAOK,MAAM;AACf;AAEA,OAAO,eAAeC,gBAAgBA,CAACF,KAAa,EAA0B;EAC5E,MAAMC,MAAM,GAAG,MAAMF,kBAAkB,CAACC,KAAK,CAAC;EAC9C,OAAOC,MAAM,EAAEP,YAAY,IAAI,IAAI;AACrC;AAEA,OAAO,eAAeS,aAAaA,CAACH,KAAa,EAA0B;EACzE,MAAMI,UAAU,GAAGf,aAAa,CAACW,KAAK,CAAC;EACvC,IAAI,CAACI,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,MAAMpB,aAAa,CAACD,IAAI,CAACa,SAAS,EAAEQ,UAAU,CAAC;EAC/C,OAAOA,UAAU;AACnB;AAEA,OAAO,eAAeC,cAAcA,CAACL,KAAa,EAA0B;EAC1E,MAAMI,UAAU,GAAGf,aAAa,CAACW,KAAK,CAAC;EACvC,IAAI,CAACI,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,MAAMpB,aAAa,CAACD,IAAI,CAACe,UAAU,EAAEM,UAAU,CAAC;EAChD,OAAOA,UAAU;AACnB;AAEA,OAAO,eAAeE,iCAAiCA,CAAA,EAAkB;EACvE,MAAMC,WAAW,GAAG,MAAMf,yBAAyB,CAAC,CAAC;EACrD,MAAMgB,IAAI,GAAGjB,WAAW,CAAC,CAAC,GAAG,WAAW,GAAY,QAAiB;EACrEV,YAAY,CAAC4B,SAAS,CAAC;IACrBD,IAAI;IACJE,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAEH,IAAI,KAAK,WAAW,GAC5B,EAAE,GACFrB,qBAAqB,CAACoB,WAAW,CAACb,YAAY,EAAEa,WAAW,CAACT,UAAU,CAAC;IAC3Ec,KAAK,EAAE;EACT,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
export const DEFAULT_METRO_PORT = '8081';
|
|
4
|
+
export const DEFAULT_DAEMON_PORT = '3799';
|
|
4
5
|
function isValidIpv4(host) {
|
|
5
6
|
const parts = host.split('.');
|
|
6
|
-
if (parts.length !== 4)
|
|
7
|
+
if (parts.length !== 4) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
7
10
|
return parts.every(part => {
|
|
8
|
-
if (!/^\d{1,3}$/.test(part))
|
|
11
|
+
if (!/^\d{1,3}$/.test(part)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
9
14
|
const value = Number(part);
|
|
10
15
|
return value >= 0 && value <= 255 && String(value) === part;
|
|
11
16
|
});
|
|
@@ -17,31 +22,105 @@ function toUrlInput(raw) {
|
|
|
17
22
|
}
|
|
18
23
|
return `http://${trimmed}`;
|
|
19
24
|
}
|
|
20
|
-
|
|
25
|
+
function parseHostAndPort(raw) {
|
|
21
26
|
const trimmed = raw.trim();
|
|
22
|
-
if (!trimmed)
|
|
27
|
+
if (!trimmed) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
23
30
|
try {
|
|
24
31
|
const parsed = new URL(toUrlInput(trimmed));
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
return {
|
|
33
|
+
host: parsed.hostname.trim(),
|
|
34
|
+
port: parsed.port.trim()
|
|
35
|
+
};
|
|
27
36
|
} catch {
|
|
28
37
|
return null;
|
|
29
38
|
}
|
|
30
39
|
}
|
|
31
|
-
export function
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
40
|
+
export function normalizeComputerHost(raw) {
|
|
41
|
+
const parsed = parseHostAndPort(raw);
|
|
42
|
+
if (!parsed) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return isValidIpv4(parsed.host) ? parsed.host : null;
|
|
46
|
+
}
|
|
47
|
+
export function normalizePort(raw) {
|
|
48
|
+
const trimmed = raw.trim();
|
|
49
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const value = Number(trimmed);
|
|
53
|
+
if (!Number.isInteger(value) || value < 1 || value > 65535) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return String(value);
|
|
57
|
+
}
|
|
58
|
+
export function parseComputerTarget(raw) {
|
|
59
|
+
const parsed = parseHostAndPort(raw);
|
|
60
|
+
if (!parsed || !isValidIpv4(parsed.host)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const metroPort = parsed.port ? normalizePort(parsed.port) : DEFAULT_METRO_PORT;
|
|
64
|
+
if (!metroPort) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
computerHost: parsed.host,
|
|
69
|
+
metroPort
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function normalizeMetroHost(rawHost) {
|
|
73
|
+
const parsed = parseHostAndPort(rawHost);
|
|
74
|
+
if (!parsed) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
if (parsed.host === 'localhost') {
|
|
78
|
+
return parsed.host;
|
|
79
|
+
}
|
|
80
|
+
return isValidIpv4(parsed.host) ? parsed.host : null;
|
|
81
|
+
}
|
|
82
|
+
export function buildMetroTarget(rawHost, rawPort = DEFAULT_METRO_PORT) {
|
|
83
|
+
const host = normalizeMetroHost(rawHost);
|
|
84
|
+
if (!host) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const port = normalizePort(rawPort);
|
|
88
|
+
if (!port) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
34
91
|
return {
|
|
35
|
-
|
|
36
|
-
|
|
92
|
+
host,
|
|
93
|
+
port,
|
|
94
|
+
hostPort: `${host}:${port}`,
|
|
95
|
+
statusUrl: `http://${host}:${port}/status`
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function buildMetroUrls(rawHost, rawPort = DEFAULT_METRO_PORT) {
|
|
99
|
+
const target = buildMetroTarget(rawHost, rawPort);
|
|
100
|
+
if (!target) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
expUrl: `exp://${target.hostPort}`,
|
|
105
|
+
httpUrl: `http://${target.hostPort}`
|
|
37
106
|
};
|
|
38
107
|
}
|
|
39
108
|
export function parseMetroQrPayload(payload) {
|
|
40
|
-
const
|
|
41
|
-
if (!
|
|
109
|
+
const target = parseComputerTarget(payload);
|
|
110
|
+
if (!target) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
42
113
|
return {
|
|
43
|
-
|
|
114
|
+
...target,
|
|
44
115
|
source: payload
|
|
45
116
|
};
|
|
46
117
|
}
|
|
118
|
+
export function buildDaemonDeviceHost(computerHost, daemonPort) {
|
|
119
|
+
const host = normalizeComputerHost(computerHost);
|
|
120
|
+
if (!host) {
|
|
121
|
+
return '';
|
|
122
|
+
}
|
|
123
|
+
const port = normalizePort(daemonPort) ?? DEFAULT_DAEMON_PORT;
|
|
124
|
+
return port === DEFAULT_DAEMON_PORT ? host : `${host}:${port}`;
|
|
125
|
+
}
|
|
47
126
|
//# sourceMappingURL=devConnectUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["DEFAULT_METRO_PORT","DEFAULT_DAEMON_PORT","isValidIpv4","host","parts","split","length","every","part","test","value","Number","String","toUrlInput","raw","trimmed","trim","parseHostAndPort","parsed","URL","hostname","port","normalizeComputerHost","normalizePort","isInteger","parseComputerTarget","metroPort","computerHost","normalizeMetroHost","rawHost","buildMetroTarget","rawPort","hostPort","statusUrl","buildMetroUrls","target","expUrl","httpUrl","parseMetroQrPayload","payload","source","buildDaemonDeviceHost","daemonPort"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
import { DevConnectTab } from './DevConnectTab';
|
|
4
4
|
import { isCameraKitAvailable } from './cameraKit';
|
|
5
5
|
import { loadDevConnectPreferences } from './devConnectPreferences';
|
|
6
|
+
import { DEFAULT_DAEMON_PORT, DEFAULT_METRO_PORT } from './devConnectUtils';
|
|
7
|
+
import { isNativeDevConnectAvailable } from './nativeDevConnect';
|
|
6
8
|
import { isSimulator } from './platformDetect';
|
|
7
9
|
import { daemonClient } from '../../utils/DaemonClient';
|
|
8
|
-
export { buildMetroUrls, normalizeComputerHost, parseMetroQrPayload } from './devConnectUtils';
|
|
9
|
-
export { loadDevConnectPreferences, restoreDevConnectSettingsToDaemon, saveComputerHost } from './devConnectPreferences';
|
|
10
|
+
export { buildMetroUrls, normalizeComputerHost, normalizePort, parseComputerTarget, parseMetroQrPayload } from './devConnectUtils';
|
|
11
|
+
export { loadDevConnectPreferences, restoreDevConnectSettingsToDaemon, saveComputerHost, saveComputerTarget, saveDaemonPort, saveMetroPort } from './devConnectPreferences';
|
|
10
12
|
export const createDevConnectFeature = () => {
|
|
11
13
|
const listeners = new Set();
|
|
12
14
|
let state = {
|
|
13
15
|
isSimulator: isSimulator(),
|
|
14
16
|
computerHost: '',
|
|
17
|
+
metroPort: DEFAULT_METRO_PORT,
|
|
18
|
+
daemonPort: DEFAULT_DAEMON_PORT,
|
|
15
19
|
qrAvailable: isCameraKitAvailable(),
|
|
20
|
+
nativeMetroAvailable: isNativeDevConnectAvailable(),
|
|
16
21
|
streaming: daemonClient.isConnected()
|
|
17
22
|
};
|
|
18
23
|
const notify = () => {
|
|
@@ -30,7 +35,10 @@ export const createDevConnectFeature = () => {
|
|
|
30
35
|
loadDevConnectPreferences().then(preferences => {
|
|
31
36
|
state = {
|
|
32
37
|
...state,
|
|
33
|
-
computerHost: preferences.computerHost
|
|
38
|
+
computerHost: preferences.computerHost,
|
|
39
|
+
metroPort: preferences.metroPort,
|
|
40
|
+
daemonPort: preferences.daemonPort,
|
|
41
|
+
nativeMetroAvailable: isNativeDevConnectAvailable()
|
|
34
42
|
};
|
|
35
43
|
notify();
|
|
36
44
|
}).catch(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DevConnectTab","isCameraKitAvailable","loadDevConnectPreferences","isSimulator","daemonClient","buildMetroUrls","normalizeComputerHost","parseMetroQrPayload","restoreDevConnectSettingsToDaemon","saveComputerHost","createDevConnectFeature","listeners","Set","state","computerHost","qrAvailable","streaming","isConnected","notify","forEach","listener","name","label","renderContent","setup","then","preferences","catch","getSnapshot","cleanup","clear","subscribe","add","delete"],"sourceRoot":"../../../../src","sources":["features/devConnect/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,oBAAoB,QAAQ,aAAa;AAClD,SAASC,yBAAyB,QAAQ,yBAAyB;AACnE,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,YAAY,QAAQ,0BAA0B;AAKvD,SACEC,cAAc,EACdC,qBAAqB,EACrBC,mBAAmB,QACd,mBAAmB;AAC1B,
|
|
1
|
+
{"version":3,"names":["DevConnectTab","isCameraKitAvailable","loadDevConnectPreferences","DEFAULT_DAEMON_PORT","DEFAULT_METRO_PORT","isNativeDevConnectAvailable","isSimulator","daemonClient","buildMetroUrls","normalizeComputerHost","normalizePort","parseComputerTarget","parseMetroQrPayload","restoreDevConnectSettingsToDaemon","saveComputerHost","saveComputerTarget","saveDaemonPort","saveMetroPort","createDevConnectFeature","listeners","Set","state","computerHost","metroPort","daemonPort","qrAvailable","nativeMetroAvailable","streaming","isConnected","notify","forEach","listener","name","label","renderContent","setup","then","preferences","catch","getSnapshot","cleanup","clear","subscribe","add","delete"],"sourceRoot":"../../../../src","sources":["features/devConnect/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,oBAAoB,QAAQ,aAAa;AAClD,SAASC,yBAAyB,QAAQ,yBAAyB;AACnE,SAASC,mBAAmB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAC3E,SAASC,2BAA2B,QAAQ,oBAAoB;AAChE,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,YAAY,QAAQ,0BAA0B;AAKvD,SACEC,cAAc,EACdC,qBAAqB,EACrBC,aAAa,EACbC,mBAAmB,EACnBC,mBAAmB,QACd,mBAAmB;AAC1B,SACEV,yBAAyB,EACzBW,iCAAiC,EACjCC,gBAAgB,EAChBC,kBAAkB,EAClBC,cAAc,EACdC,aAAa,QACR,yBAAyB;AAEhC,OAAO,MAAMC,uBAAuB,GAAGA,CAAA,KAAqC;EAC1E,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAuB,CAAC;EACjD,IAAIC,KAAsB,GAAG;IAC3Bf,WAAW,EAAEA,WAAW,CAAC,CAAC;IAC1BgB,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAEnB,kBAAkB;IAC7BoB,UAAU,EAAErB,mBAAmB;IAC/BsB,WAAW,EAAExB,oBAAoB,CAAC,CAAC;IACnCyB,oBAAoB,EAAErB,2BAA2B,CAAC,CAAC;IACnDsB,SAAS,EAAEpB,YAAY,CAACqB,WAAW,CAAC;EACtC,CAAC;EAED,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnBR,KAAK,GAAG;MACN,GAAGA,KAAK;MACRM,SAAS,EAAEpB,YAAY,CAACqB,WAAW,CAAC;IACtC,CAAC;IACDT,SAAS,CAACW,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAAC,CAAC,CAAC;EAC7C,CAAC;EAED,OAAO;IACLC,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,YAAY;IACnBC,aAAa,EAAElC,aAAa;IAC5BmC,KAAKA,CAAA,EAAG;MACNjC,yBAAyB,CAAC,CAAC,CAACkC,IAAI,CAAEC,WAAW,IAAK;QAChDhB,KAAK,GAAG;UACN,GAAGA,KAAK;UACRC,YAAY,EAAEe,WAAW,CAACf,YAAY;UACtCC,SAAS,EAAEc,WAAW,CAACd,SAAS;UAChCC,UAAU,EAAEa,WAAW,CAACb,UAAU;UAClCE,oBAAoB,EAAErB,2BAA2B,CAAC;QACpD,CAAC;QACDwB,MAAM,CAAC,CAAC;MACV,CAAC,CAAC,CAACS,KAAK,CAAC,MAAM;QACbT,MAAM,CAAC,CAAC;MACV,CAAC,CAAC;IACJ,CAAC;IACDU,WAAW,EAAEA,CAAA,KAAMlB,KAAK;IACxBmB,OAAOA,CAAA,EAAG;MACRrB,SAAS,CAACsB,KAAK,CAAC,CAAC;IACnB,CAAC;IACDC,SAASA,CAACX,QAAQ,EAAE;MAClBZ,SAAS,CAACwB,GAAG,CAACZ,QAAQ,CAAC;MACvB,OAAO,MAAM;QACXZ,SAAS,CAACyB,MAAM,CAACb,QAAQ,CAAC;MAC5B,CAAC;IACH;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules } from 'react-native';
|
|
4
|
+
import { buildMetroTarget } from './devConnectUtils';
|
|
5
|
+
function getNativeModule() {
|
|
6
|
+
const nativeModule = NativeModules.DebugToolkitDevConnect;
|
|
7
|
+
if (nativeModule && typeof nativeModule.applyMetroHost === 'function' && typeof nativeModule.resetMetroHost === 'function') {
|
|
8
|
+
return nativeModule;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
export function isNativeDevConnectAvailable() {
|
|
13
|
+
return getNativeModule() !== null;
|
|
14
|
+
}
|
|
15
|
+
async function checkMetroStatus(statusUrl) {
|
|
16
|
+
const fetchImpl = globalThis.fetch;
|
|
17
|
+
if (!fetchImpl) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
reason: 'fetch_unavailable',
|
|
21
|
+
statusUrl,
|
|
22
|
+
error: 'global fetch is not available'
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const response = await fetchImpl(statusUrl, {
|
|
27
|
+
method: 'GET'
|
|
28
|
+
});
|
|
29
|
+
const body = typeof response.text === 'function' ? await response.text() : '';
|
|
30
|
+
if (response.ok === false || !body.includes('packager-status:running')) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
reason: 'metro_unreachable',
|
|
34
|
+
statusUrl,
|
|
35
|
+
error: body || 'Metro status endpoint did not report running'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
reason: 'metro_unreachable',
|
|
43
|
+
statusUrl,
|
|
44
|
+
error: error instanceof Error ? error.message : String(error)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function applyMetroBundle(host, port) {
|
|
49
|
+
const target = buildMetroTarget(host, port);
|
|
50
|
+
if (!target) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
reason: 'invalid_target'
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const nativeModule = getNativeModule();
|
|
57
|
+
if (!nativeModule) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
reason: 'native_unavailable'
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const statusError = await checkMetroStatus(target.statusUrl);
|
|
64
|
+
if (statusError) {
|
|
65
|
+
return statusError;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const result = await nativeModule.applyMetroHost(target.hostPort);
|
|
69
|
+
return {
|
|
70
|
+
ok: true,
|
|
71
|
+
hostPort: result && typeof result.hostPort === 'string' ? result.hostPort : target.hostPort
|
|
72
|
+
};
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
reason: 'native_error',
|
|
77
|
+
error: error instanceof Error ? error.message : String(error)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export async function resetMetroBundle() {
|
|
82
|
+
const nativeModule = getNativeModule();
|
|
83
|
+
if (!nativeModule) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
reason: 'native_unavailable'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
await nativeModule.resetMetroHost();
|
|
91
|
+
return {
|
|
92
|
+
ok: true
|
|
93
|
+
};
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
reason: 'native_error',
|
|
98
|
+
error: error instanceof Error ? error.message : String(error)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=nativeDevConnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","buildMetroTarget","getNativeModule","nativeModule","DebugToolkitDevConnect","applyMetroHost","resetMetroHost","isNativeDevConnectAvailable","checkMetroStatus","statusUrl","fetchImpl","globalThis","fetch","ok","reason","error","response","method","body","text","includes","Error","message","String","applyMetroBundle","host","port","target","statusError","result","hostPort","resetMetroBundle"],"sourceRoot":"../../../../src","sources":["features/devConnect/nativeDevConnect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,25 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
4
|
export function isSimulator() {
|
|
5
5
|
const {
|
|
6
6
|
OS
|
|
7
7
|
} = Platform;
|
|
8
|
+
const constants = Platform.constants ?? {};
|
|
8
9
|
if (OS === 'android') {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
if (constants.isEmulator === true) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
const model = String(constants.Model ?? constants.model ?? '').toLowerCase();
|
|
12
14
|
return model.includes('sdk') || model.includes('emulator') || model.includes('google_sdk');
|
|
13
15
|
}
|
|
14
16
|
if (OS === 'ios') {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const deviceInfo = NativeModules.DeviceInfo ?? NativeModules.PlatformConstants;
|
|
18
|
-
if (deviceInfo) {
|
|
19
|
-
const model = String(deviceInfo.model ?? '').toLowerCase();
|
|
20
|
-
if (model.includes('simulator')) return true;
|
|
21
|
-
}
|
|
22
|
-
return false;
|
|
17
|
+
const model = String(constants.model ?? '').toLowerCase();
|
|
18
|
+
return model.includes('simulator');
|
|
23
19
|
}
|
|
24
20
|
return false;
|
|
25
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Platform","isSimulator","OS","constants","isEmulator","model","String","Model","toLowerCase","includes"],"sourceRoot":"../../../../src","sources":["features/devConnect/platformDetect.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,OAAO,SAASC,WAAWA,CAAA,EAAY;EACrC,MAAM;IAAEC;EAAG,CAAC,GAAGF,QAAQ;EACvB,MAAMG,SAAS,GAAIH,QAAQ,CAACG,SAAS,IAAI,CAAC,CAA6B;EAEvE,IAAID,EAAE,KAAK,SAAS,EAAE;IACpB,IAAIC,SAAS,CAACC,UAAU,KAAK,IAAI,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMC,KAAK,GAAGC,MAAM,CAACH,SAAS,CAACI,KAAK,IAAIJ,SAAS,CAACE,KAAK,IAAI,EAAE,CAAC,CAACG,WAAW,CAAC,CAAC;IAC5E,OAAOH,KAAK,CAACI,QAAQ,CAAC,KAAK,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,UAAU,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,YAAY,CAAC;EAC5F;EAEA,IAAIP,EAAE,KAAK,KAAK,EAAE;IAChB,MAAMG,KAAK,GAAGC,MAAM,CAACH,SAAS,CAACE,KAAK,IAAI,EAAE,CAAC,CAACG,WAAW,CAAC,CAAC;IACzD,OAAOH,KAAK,CAACI,QAAQ,CAAC,WAAW,CAAC;EACpC;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
|
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
-
|
|
5
3
|
const memoryStore = new Map();
|
|
6
4
|
function loadAsyncStorage() {
|
|
7
5
|
try {
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
9
6
|
const mod = require('@react-native-async-storage/async-storage');
|
|
10
|
-
if (mod && typeof mod.getItem === 'function')
|
|
7
|
+
if (mod && typeof mod.getItem === 'function') {
|
|
8
|
+
return mod;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function loadNativePreferences() {
|
|
16
|
+
try {
|
|
17
|
+
const {
|
|
18
|
+
NativeModules
|
|
19
|
+
} = require('react-native');
|
|
20
|
+
const mod = NativeModules?.DebugToolkitDevConnect;
|
|
21
|
+
if (mod && typeof mod.getPreference === 'function' && typeof mod.setPreference === 'function') {
|
|
22
|
+
return mod;
|
|
23
|
+
}
|
|
11
24
|
return null;
|
|
12
25
|
} catch {
|
|
13
26
|
return null;
|
|
@@ -19,6 +32,15 @@ export async function setPreference(key, value) {
|
|
|
19
32
|
if (AsyncStorage) {
|
|
20
33
|
try {
|
|
21
34
|
await AsyncStorage.setItem(key, value);
|
|
35
|
+
return;
|
|
36
|
+
} catch {
|
|
37
|
+
// degrade to memory only
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const nativePreferences = loadNativePreferences();
|
|
41
|
+
if (nativePreferences) {
|
|
42
|
+
try {
|
|
43
|
+
await nativePreferences.setPreference(key, value);
|
|
22
44
|
} catch {
|
|
23
45
|
// degrade to memory only
|
|
24
46
|
}
|
|
@@ -29,7 +51,20 @@ export async function getPreference(key) {
|
|
|
29
51
|
if (AsyncStorage) {
|
|
30
52
|
try {
|
|
31
53
|
const val = await AsyncStorage.getItem(key);
|
|
32
|
-
if (val !== null)
|
|
54
|
+
if (val !== null) {
|
|
55
|
+
return val;
|
|
56
|
+
}
|
|
57
|
+
} catch {
|
|
58
|
+
// fall through to memory
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const nativePreferences = loadNativePreferences();
|
|
62
|
+
if (nativePreferences) {
|
|
63
|
+
try {
|
|
64
|
+
const val = await nativePreferences.getPreference(key);
|
|
65
|
+
if (val !== null) {
|
|
66
|
+
return val;
|
|
67
|
+
}
|
|
33
68
|
} catch {
|
|
34
69
|
// fall through to memory
|
|
35
70
|
}
|
|
@@ -42,6 +77,8 @@ export const KEYS = {
|
|
|
42
77
|
consoleLogs: '@react_native_debug_toolkit/console_logs',
|
|
43
78
|
networkLogs: '@react_native_debug_toolkit/network_logs',
|
|
44
79
|
trackLogs: '@react_native_debug_toolkit/track_logs',
|
|
45
|
-
computerHost: '@react_native_debug_toolkit/computer_host'
|
|
80
|
+
computerHost: '@react_native_debug_toolkit/computer_host',
|
|
81
|
+
metroPort: '@react_native_debug_toolkit/metro_port',
|
|
82
|
+
daemonPort: '@react_native_debug_toolkit/daemon_port'
|
|
46
83
|
};
|
|
47
84
|
//# sourceMappingURL=debugPreferences.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["memoryStore","Map","loadAsyncStorage","mod","require","getItem","setPreference","key","value","set","AsyncStorage","setItem","
|
|
1
|
+
{"version":3,"names":["memoryStore","Map","loadAsyncStorage","mod","require","getItem","loadNativePreferences","NativeModules","DebugToolkitDevConnect","getPreference","setPreference","key","value","set","AsyncStorage","setItem","nativePreferences","val","get","KEYS","fabPosition","lastTab","consoleLogs","networkLogs","trackLogs","computerHost","metroPort","daemonPort"],"sourceRoot":"../../../src","sources":["utils/debugPreferences.ts"],"mappings":";;AAGA,MAAMA,WAAW,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAE7C,SAASC,gBAAgBA,CAAA,EAA4B;EACnD,IAAI;IACF,MAAMC,GAAG,GAAGC,OAAO,CAAC,2CAA2C,CAAC;IAChE,IAAID,GAAG,IAAI,OAAOA,GAAG,CAACE,OAAO,KAAK,UAAU,EAAE;MAC5C,OAAOF,GAAG;IACZ;IACA,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,SAASG,qBAAqBA,CAAA,EAAiC;EAC7D,IAAI;IACF,MAAM;MAAEC;IAAc,CAAC,GAAGH,OAAO,CAAC,cAAc,CAAoF;IACpI,MAAMD,GAAG,GAAGI,aAAa,EAAEC,sBAAsB;IACjD,IACEL,GAAG,IACH,OAAOA,GAAG,CAACM,aAAa,KAAK,UAAU,IACvC,OAAON,GAAG,CAACO,aAAa,KAAK,UAAU,EACvC;MACA,OAAOP,GAAG;IACZ;IACA,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,OAAO,eAAeO,aAAaA,CAACC,GAAW,EAAEC,KAAa,EAAiB;EAC7EZ,WAAW,CAACa,GAAG,CAACF,GAAG,EAAEC,KAAK,CAAC;EAC3B,MAAME,YAAY,GAAGZ,gBAAgB,CAAC,CAAC;EACvC,IAAIY,YAAY,EAAE;IAChB,IAAI;MACF,MAAMA,YAAY,CAACC,OAAO,CAACJ,GAAG,EAAEC,KAAK,CAAC;MACtC;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,MAAMI,iBAAiB,GAAGV,qBAAqB,CAAC,CAAC;EACjD,IAAIU,iBAAiB,EAAE;IACrB,IAAI;MACF,MAAMA,iBAAiB,CAACN,aAAa,CAACC,GAAG,EAAEC,KAAK,CAAC;IACnD,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;AAEA,OAAO,eAAeH,aAAaA,CAACE,GAAW,EAA0B;EACvE,MAAMG,YAAY,GAAGZ,gBAAgB,CAAC,CAAC;EACvC,IAAIY,YAAY,EAAE;IAChB,IAAI;MACF,MAAMG,GAAG,GAAG,MAAMH,YAAY,CAACT,OAAO,CAACM,GAAG,CAAC;MAC3C,IAAIM,GAAG,KAAK,IAAI,EAAE;QAChB,OAAOA,GAAG;MACZ;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,MAAMD,iBAAiB,GAAGV,qBAAqB,CAAC,CAAC;EACjD,IAAIU,iBAAiB,EAAE;IACrB,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMD,iBAAiB,CAACP,aAAa,CAACE,GAAG,CAAC;MACtD,IAAIM,GAAG,KAAK,IAAI,EAAE;QAChB,OAAOA,GAAG;MACZ;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,OAAOjB,WAAW,CAACkB,GAAG,CAACP,GAAG,CAAC,IAAI,IAAI;AACrC;AAEA,OAAO,MAAMQ,IAAI,GAAG;EAClBC,WAAW,EAAE,0CAA0C;EACvDC,OAAO,EAAE,sCAAsC;EAC/CC,WAAW,EAAE,0CAA0C;EACvDC,WAAW,EAAE,0CAA0C;EACvDC,SAAS,EAAE,wCAAwC;EACnDC,YAAY,EAAE,2CAA2C;EACzDC,SAAS,EAAE,wCAAwC;EACnDC,UAAU,EAAE;AACd,CAAU","ignoreList":[]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { type ParsedComputerTarget } from './devConnectUtils';
|
|
2
3
|
interface DevConnectQrScannerProps {
|
|
3
4
|
visible: boolean;
|
|
4
5
|
onClose: () => void;
|
|
5
|
-
|
|
6
|
+
onScanTarget: (target: ParsedComputerTarget) => void;
|
|
6
7
|
}
|
|
7
|
-
export declare function DevConnectQrScanner({ visible, onClose,
|
|
8
|
+
export declare function DevConnectQrScanner({ visible, onClose, onScanTarget }: DevConnectQrScannerProps): React.JSX.Element | null;
|
|
8
9
|
export {};
|
|
9
10
|
//# sourceMappingURL=DevConnectQrScanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevConnectQrScanner.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/DevConnectQrScanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8D,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DevConnectQrScanner.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/DevConnectQrScanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8D,MAAM,OAAO,CAAC;AAenF,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAmCnF,UAAU,wBAAwB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACtD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,wBAAwB,4BAyG/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevConnectTab.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/DevConnectTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAYjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"DevConnectTab.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/DevConnectTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAYjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AA0B3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA2B/C,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,eAAe,CAAC,qBA8XnF"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { type ParsedComputerTarget } from './devConnectUtils';
|
|
1
2
|
export interface DevConnectPreferences {
|
|
2
3
|
computerHost: string;
|
|
4
|
+
metroPort: string;
|
|
5
|
+
daemonPort: string;
|
|
3
6
|
}
|
|
4
7
|
export declare function loadDevConnectPreferences(): Promise<DevConnectPreferences>;
|
|
8
|
+
export declare function saveComputerTarget(value: string): Promise<ParsedComputerTarget | null>;
|
|
5
9
|
export declare function saveComputerHost(value: string): Promise<string | null>;
|
|
10
|
+
export declare function saveMetroPort(value: string): Promise<string | null>;
|
|
11
|
+
export declare function saveDaemonPort(value: string): Promise<string | null>;
|
|
6
12
|
export declare function restoreDevConnectSettingsToDaemon(): Promise<void>;
|
|
7
13
|
//# sourceMappingURL=devConnectPreferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devConnectPreferences.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/devConnectPreferences.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devConnectPreferences.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/devConnectPreferences.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAShF;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAS5F;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG5E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ1E;AAED,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC,CAWvE"}
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
+
export declare const DEFAULT_METRO_PORT = "8081";
|
|
2
|
+
export declare const DEFAULT_DAEMON_PORT = "3799";
|
|
1
3
|
export interface MetroUrls {
|
|
2
4
|
expUrl: string;
|
|
3
5
|
httpUrl: string;
|
|
4
6
|
}
|
|
7
|
+
export interface MetroTarget {
|
|
8
|
+
host: string;
|
|
9
|
+
port: string;
|
|
10
|
+
hostPort: string;
|
|
11
|
+
statusUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedComputerTarget {
|
|
14
|
+
computerHost: string;
|
|
15
|
+
metroPort: string;
|
|
16
|
+
}
|
|
5
17
|
export interface ParsedMetroQrPayload {
|
|
6
18
|
computerHost: string;
|
|
19
|
+
metroPort: string;
|
|
7
20
|
source: string;
|
|
8
21
|
}
|
|
9
22
|
export declare function normalizeComputerHost(raw: string): string | null;
|
|
10
|
-
export declare function
|
|
23
|
+
export declare function normalizePort(raw: string): string | null;
|
|
24
|
+
export declare function parseComputerTarget(raw: string): ParsedComputerTarget | null;
|
|
25
|
+
export declare function buildMetroTarget(rawHost: string, rawPort?: string): MetroTarget | null;
|
|
26
|
+
export declare function buildMetroUrls(rawHost: string, rawPort?: string): MetroUrls | null;
|
|
11
27
|
export declare function parseMetroQrPayload(payload: string): ParsedMetroQrPayload | null;
|
|
28
|
+
export declare function buildDaemonDeviceHost(computerHost: string, daemonPort: string): string;
|
|
12
29
|
//# sourceMappingURL=devConnectUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devConnectUtils.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/devConnectUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devConnectUtils.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/devConnectUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AA0CD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOhE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAiB5E;AAaD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,SAAqB,GAAG,WAAW,GAAG,IAAI,CAiBlG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,SAAqB,GAAG,SAAS,GAAG,IAAI,CAU9F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAMhF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQtF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { DebugFeature } from '../../types';
|
|
2
2
|
import type { DevConnectState } from './types';
|
|
3
3
|
export type { DevConnectState } from './types';
|
|
4
|
-
export { buildMetroUrls, normalizeComputerHost, parseMetroQrPayload, } from './devConnectUtils';
|
|
5
|
-
export { loadDevConnectPreferences, restoreDevConnectSettingsToDaemon, saveComputerHost, } from './devConnectPreferences';
|
|
4
|
+
export { buildMetroUrls, normalizeComputerHost, normalizePort, parseComputerTarget, parseMetroQrPayload, } from './devConnectUtils';
|
|
5
|
+
export { loadDevConnectPreferences, restoreDevConnectSettingsToDaemon, saveComputerHost, saveComputerTarget, saveDaemonPort, saveMetroPort, } from './devConnectPreferences';
|
|
6
6
|
export declare const createDevConnectFeature: () => DebugFeature<DevConnectState>;
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/devConnect/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,iCAAiC,EACjC,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,uBAAuB,QAAO,YAAY,CAAC,eAAe,CAiDtE,CAAC"}
|