react-native-ai-devtools 1.1.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 (147) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +1250 -0
  3. package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
  4. package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
  5. package/build/__tests__/helpers/fake-cdp-server.js +108 -0
  6. package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
  7. package/build/__tests__/integration/connection-health.test.d.ts +2 -0
  8. package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
  9. package/build/__tests__/integration/connection-health.test.js +151 -0
  10. package/build/__tests__/integration/connection-health.test.js.map +1 -0
  11. package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
  12. package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
  13. package/build/__tests__/integration/execute-in-app.test.js +115 -0
  14. package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
  15. package/build/__tests__/integration/tools.test.d.ts +2 -0
  16. package/build/__tests__/integration/tools.test.d.ts.map +1 -0
  17. package/build/__tests__/integration/tools.test.js +228 -0
  18. package/build/__tests__/integration/tools.test.js.map +1 -0
  19. package/build/__tests__/setup.d.ts +2 -0
  20. package/build/__tests__/setup.d.ts.map +1 -0
  21. package/build/__tests__/setup.js +11 -0
  22. package/build/__tests__/setup.js.map +1 -0
  23. package/build/__tests__/unit/bundle.test.d.ts +2 -0
  24. package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
  25. package/build/__tests__/unit/bundle.test.js +53 -0
  26. package/build/__tests__/unit/bundle.test.js.map +1 -0
  27. package/build/__tests__/unit/connection-health.test.d.ts +2 -0
  28. package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
  29. package/build/__tests__/unit/connection-health.test.js +28 -0
  30. package/build/__tests__/unit/connection-health.test.js.map +1 -0
  31. package/build/__tests__/unit/executor.test.d.ts +2 -0
  32. package/build/__tests__/unit/executor.test.d.ts.map +1 -0
  33. package/build/__tests__/unit/executor.test.js +79 -0
  34. package/build/__tests__/unit/executor.test.js.map +1 -0
  35. package/build/__tests__/unit/logs.test.d.ts +2 -0
  36. package/build/__tests__/unit/logs.test.d.ts.map +1 -0
  37. package/build/__tests__/unit/logs.test.js +81 -0
  38. package/build/__tests__/unit/logs.test.js.map +1 -0
  39. package/build/__tests__/unit/metro.test.d.ts +2 -0
  40. package/build/__tests__/unit/metro.test.d.ts.map +1 -0
  41. package/build/__tests__/unit/metro.test.js +61 -0
  42. package/build/__tests__/unit/metro.test.js.map +1 -0
  43. package/build/__tests__/unit/network.test.d.ts +2 -0
  44. package/build/__tests__/unit/network.test.d.ts.map +1 -0
  45. package/build/__tests__/unit/network.test.js +102 -0
  46. package/build/__tests__/unit/network.test.js.map +1 -0
  47. package/build/__tests__/unit/tap.test.d.ts +2 -0
  48. package/build/__tests__/unit/tap.test.d.ts.map +1 -0
  49. package/build/__tests__/unit/tap.test.js +157 -0
  50. package/build/__tests__/unit/tap.test.js.map +1 -0
  51. package/build/core/android.d.ts +265 -0
  52. package/build/core/android.d.ts.map +1 -0
  53. package/build/core/android.js +1413 -0
  54. package/build/core/android.js.map +1 -0
  55. package/build/core/bundle.d.ts +49 -0
  56. package/build/core/bundle.d.ts.map +1 -0
  57. package/build/core/bundle.js +368 -0
  58. package/build/core/bundle.js.map +1 -0
  59. package/build/core/connection.d.ts +43 -0
  60. package/build/core/connection.d.ts.map +1 -0
  61. package/build/core/connection.js +963 -0
  62. package/build/core/connection.js.map +1 -0
  63. package/build/core/connectionState.d.ts +108 -0
  64. package/build/core/connectionState.d.ts.map +1 -0
  65. package/build/core/connectionState.js +284 -0
  66. package/build/core/connectionState.js.map +1 -0
  67. package/build/core/errorScreenParser.d.ts +30 -0
  68. package/build/core/errorScreenParser.d.ts.map +1 -0
  69. package/build/core/errorScreenParser.js +198 -0
  70. package/build/core/errorScreenParser.js.map +1 -0
  71. package/build/core/executor.d.ts +113 -0
  72. package/build/core/executor.d.ts.map +1 -0
  73. package/build/core/executor.js +1877 -0
  74. package/build/core/executor.js.map +1 -0
  75. package/build/core/format.d.ts +8 -0
  76. package/build/core/format.d.ts.map +1 -0
  77. package/build/core/format.js +34 -0
  78. package/build/core/format.js.map +1 -0
  79. package/build/core/guides.d.ts +14 -0
  80. package/build/core/guides.d.ts.map +1 -0
  81. package/build/core/guides.js +261 -0
  82. package/build/core/guides.js.map +1 -0
  83. package/build/core/httpServer.d.ts +14 -0
  84. package/build/core/httpServer.d.ts.map +1 -0
  85. package/build/core/httpServer.js +2459 -0
  86. package/build/core/httpServer.js.map +1 -0
  87. package/build/core/httpServerProcess.d.ts +25 -0
  88. package/build/core/httpServerProcess.d.ts.map +1 -0
  89. package/build/core/httpServerProcess.js +153 -0
  90. package/build/core/httpServerProcess.js.map +1 -0
  91. package/build/core/index.d.ts +25 -0
  92. package/build/core/index.d.ts.map +1 -0
  93. package/build/core/index.js +53 -0
  94. package/build/core/index.js.map +1 -0
  95. package/build/core/ios.d.ts +214 -0
  96. package/build/core/ios.d.ts.map +1 -0
  97. package/build/core/ios.js +1232 -0
  98. package/build/core/ios.js.map +1 -0
  99. package/build/core/logs.d.ts +43 -0
  100. package/build/core/logs.d.ts.map +1 -0
  101. package/build/core/logs.js +144 -0
  102. package/build/core/logs.js.map +1 -0
  103. package/build/core/metro.d.ts +23 -0
  104. package/build/core/metro.d.ts.map +1 -0
  105. package/build/core/metro.js +96 -0
  106. package/build/core/metro.js.map +1 -0
  107. package/build/core/network.d.ts +43 -0
  108. package/build/core/network.d.ts.map +1 -0
  109. package/build/core/network.js +217 -0
  110. package/build/core/network.js.map +1 -0
  111. package/build/core/networkInterceptor.d.ts +3 -0
  112. package/build/core/networkInterceptor.d.ts.map +1 -0
  113. package/build/core/networkInterceptor.js +203 -0
  114. package/build/core/networkInterceptor.js.map +1 -0
  115. package/build/core/ocr.d.ts +69 -0
  116. package/build/core/ocr.d.ts.map +1 -0
  117. package/build/core/ocr.js +212 -0
  118. package/build/core/ocr.js.map +1 -0
  119. package/build/core/state.d.ts +17 -0
  120. package/build/core/state.d.ts.map +1 -0
  121. package/build/core/state.js +50 -0
  122. package/build/core/state.js.map +1 -0
  123. package/build/core/tap.d.ts +91 -0
  124. package/build/core/tap.d.ts.map +1 -0
  125. package/build/core/tap.js +542 -0
  126. package/build/core/tap.js.map +1 -0
  127. package/build/core/telemetry.d.ts +4 -0
  128. package/build/core/telemetry.d.ts.map +1 -0
  129. package/build/core/telemetry.js +289 -0
  130. package/build/core/telemetry.js.map +1 -0
  131. package/build/core/types.d.ts +134 -0
  132. package/build/core/types.d.ts.map +1 -0
  133. package/build/core/types.js +2 -0
  134. package/build/core/types.js.map +1 -0
  135. package/build/httpServerStandalone.d.ts +7 -0
  136. package/build/httpServerStandalone.d.ts.map +1 -0
  137. package/build/httpServerStandalone.js +31 -0
  138. package/build/httpServerStandalone.js.map +1 -0
  139. package/build/index.d.ts +3 -0
  140. package/build/index.d.ts.map +1 -0
  141. package/build/index.js +3012 -0
  142. package/build/index.js.map +1 -0
  143. package/build/pro/tap.d.ts +91 -0
  144. package/build/pro/tap.d.ts.map +1 -0
  145. package/build/pro/tap.js +542 -0
  146. package/build/pro/tap.js.map +1 -0
  147. package/package.json +63 -0
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { selectMainDevice } from "../../core/metro.js";
3
+ function makeDevice(overrides = {}) {
4
+ return {
5
+ id: "test-id",
6
+ title: "Test Device",
7
+ description: "Test Description",
8
+ appId: "com.test.app",
9
+ type: "node",
10
+ webSocketDebuggerUrl: "ws://localhost:8081/inspector/device?page=1",
11
+ deviceName: "Test",
12
+ ...overrides,
13
+ };
14
+ }
15
+ describe("selectMainDevice", () => {
16
+ it("returns null for empty list", () => {
17
+ expect(selectMainDevice([])).toBeNull();
18
+ });
19
+ it("prefers Bridgeless device (Expo SDK 54+)", () => {
20
+ const devices = [
21
+ makeDevice({ id: "hermes", title: "Hermes React Native" }),
22
+ makeDevice({ id: "bridgeless", description: "React Native Bridgeless [C++ (Hermes)]" }),
23
+ ];
24
+ expect(selectMainDevice(devices)?.id).toBe("bridgeless");
25
+ });
26
+ it("prefers Hermes when no Bridgeless available", () => {
27
+ const devices = [
28
+ makeDevice({ id: "generic", title: "React Native" }),
29
+ makeDevice({ id: "hermes", title: "Hermes React Native" }),
30
+ ];
31
+ expect(selectMainDevice(devices)?.id).toBe("hermes");
32
+ });
33
+ it("selects Hermes by title containing 'Hermes'", () => {
34
+ const devices = [
35
+ makeDevice({ id: "hermes", title: "Some Hermes Runtime" }),
36
+ ];
37
+ expect(selectMainDevice(devices)?.id).toBe("hermes");
38
+ });
39
+ it("falls back to React Native excluding Reanimated", () => {
40
+ const devices = [
41
+ makeDevice({ id: "reanimated", title: "Reanimated React Native" }),
42
+ makeDevice({ id: "rn", title: "React Native" }),
43
+ ];
44
+ expect(selectMainDevice(devices)?.id).toBe("rn");
45
+ });
46
+ it("excludes Experimental devices from React Native fallback", () => {
47
+ const devices = [
48
+ makeDevice({ id: "exp", title: "Experimental React Native" }),
49
+ makeDevice({ id: "rn", title: "React Native" }),
50
+ ];
51
+ expect(selectMainDevice(devices)?.id).toBe("rn");
52
+ });
53
+ it("falls back to first device when no RN match", () => {
54
+ const devices = [
55
+ makeDevice({ id: "first", title: "Unknown Device" }),
56
+ makeDevice({ id: "second", title: "Other Device" }),
57
+ ];
58
+ expect(selectMainDevice(devices)?.id).toBe("first");
59
+ });
60
+ });
61
+ //# sourceMappingURL=metro.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/metro.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=network.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/network.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { NetworkBuffer } from "../../core/network.js";
3
+ function makeRequest(id, overrides = {}) {
4
+ return {
5
+ requestId: id,
6
+ timestamp: new Date(),
7
+ method: "GET",
8
+ url: `https://api.example.com/${id}`,
9
+ headers: {},
10
+ completed: false,
11
+ ...overrides,
12
+ };
13
+ }
14
+ describe("NetworkBuffer", () => {
15
+ let buffer;
16
+ beforeEach(() => {
17
+ buffer = new NetworkBuffer(5);
18
+ });
19
+ it("starts empty", () => {
20
+ expect(buffer.size).toBe(0);
21
+ });
22
+ it("set and get a request", () => {
23
+ const req = makeRequest("1");
24
+ buffer.set("1", req);
25
+ expect(buffer.get("1")).toBe(req);
26
+ expect(buffer.size).toBe(1);
27
+ });
28
+ it("updates existing request without increasing size", () => {
29
+ buffer.set("1", makeRequest("1"));
30
+ buffer.set("1", makeRequest("1", { status: 200, completed: true }));
31
+ expect(buffer.size).toBe(1);
32
+ expect(buffer.get("1")?.status).toBe(200);
33
+ });
34
+ it("evicts oldest when exceeding maxSize", () => {
35
+ for (let i = 0; i < 7; i++) {
36
+ buffer.set(`${i}`, makeRequest(`${i}`));
37
+ }
38
+ expect(buffer.size).toBe(5);
39
+ expect(buffer.get("0")).toBeUndefined();
40
+ expect(buffer.get("1")).toBeUndefined();
41
+ expect(buffer.get("2")).toBeDefined();
42
+ });
43
+ it("getAll() filters by method", () => {
44
+ buffer.set("1", makeRequest("1", { method: "GET" }));
45
+ buffer.set("2", makeRequest("2", { method: "POST" }));
46
+ const posts = buffer.getAll({ method: "POST" });
47
+ expect(posts).toHaveLength(1);
48
+ expect(posts[0].method).toBe("POST");
49
+ });
50
+ it("getAll() filters by method case-insensitively", () => {
51
+ buffer.set("1", makeRequest("1", { method: "GET" }));
52
+ const results = buffer.getAll({ method: "get" });
53
+ expect(results).toHaveLength(1);
54
+ });
55
+ it("getAll() filters by urlPattern (case-insensitive substring)", () => {
56
+ buffer.set("1", makeRequest("1", { url: "https://api.example.com/users" }));
57
+ buffer.set("2", makeRequest("2", { url: "https://api.example.com/posts" }));
58
+ const results = buffer.getAll({ urlPattern: "users" });
59
+ expect(results).toHaveLength(1);
60
+ });
61
+ it("getAll() filters by status", () => {
62
+ buffer.set("1", makeRequest("1", { status: 200 }));
63
+ buffer.set("2", makeRequest("2", { status: 404 }));
64
+ const results = buffer.getAll({ status: 200 });
65
+ expect(results).toHaveLength(1);
66
+ });
67
+ it("getAll() filters completedOnly", () => {
68
+ buffer.set("1", makeRequest("1", { completed: true }));
69
+ buffer.set("2", makeRequest("2", { completed: false }));
70
+ const results = buffer.getAll({ completedOnly: true });
71
+ expect(results).toHaveLength(1);
72
+ });
73
+ it("getAll() limits count (takes last N)", () => {
74
+ for (let i = 0; i < 5; i++) {
75
+ buffer.set(`${i}`, makeRequest(`${i}`));
76
+ }
77
+ const results = buffer.getAll({ count: 2 });
78
+ expect(results).toHaveLength(2);
79
+ });
80
+ it("getAll() sorts by timestamp", () => {
81
+ const earlier = new Date("2024-01-01T00:00:00Z");
82
+ const later = new Date("2024-01-01T01:00:00Z");
83
+ buffer.set("late", makeRequest("late", { timestamp: later }));
84
+ buffer.set("early", makeRequest("early", { timestamp: earlier }));
85
+ const results = buffer.getAll({});
86
+ expect(results[0].requestId).toBe("early");
87
+ expect(results[1].requestId).toBe("late");
88
+ });
89
+ it("search() finds by URL pattern", () => {
90
+ buffer.set("1", makeRequest("1", { url: "https://api.example.com/users" }));
91
+ buffer.set("2", makeRequest("2", { url: "https://api.example.com/posts" }));
92
+ const results = buffer.search("users");
93
+ expect(results).toHaveLength(1);
94
+ });
95
+ it("clear() empties buffer and returns count", () => {
96
+ buffer.set("1", makeRequest("1"));
97
+ buffer.set("2", makeRequest("2"));
98
+ expect(buffer.clear()).toBe(2);
99
+ expect(buffer.size).toBe(0);
100
+ });
101
+ });
102
+ //# sourceMappingURL=network.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/network.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/tap.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ // src/__tests__/unit/tap.test.ts
2
+ import { describe, it, expect } from "@jest/globals";
3
+ import { buildQuery, getAvailableStrategies, isNonAscii, convertPixelsToPoints, formatTapSuccess, formatTapFailure, } from "../../pro/tap.js";
4
+ describe("ConnectedApp type", () => {
5
+ it("accepts platform and lastScreenshot fields", () => {
6
+ const app = {
7
+ ws: {},
8
+ deviceInfo: {
9
+ id: "test",
10
+ title: "Hermes React Native",
11
+ description: "",
12
+ appId: "com.test",
13
+ type: "node",
14
+ webSocketDebuggerUrl: "ws://localhost:8081",
15
+ deviceName: "iPhone 16",
16
+ },
17
+ port: 8081,
18
+ platform: "ios",
19
+ lastScreenshot: {
20
+ originalWidth: 1179,
21
+ originalHeight: 2556,
22
+ scaleFactor: 1,
23
+ },
24
+ };
25
+ expect(app.platform).toBe("ios");
26
+ expect(app.lastScreenshot?.originalWidth).toBe(1179);
27
+ });
28
+ it("allows lastScreenshot to be undefined", () => {
29
+ const app = {
30
+ ws: {},
31
+ deviceInfo: {
32
+ id: "test",
33
+ title: "Hermes React Native",
34
+ description: "",
35
+ appId: "com.test",
36
+ type: "node",
37
+ webSocketDebuggerUrl: "ws://localhost:8081",
38
+ deviceName: "iPhone 16",
39
+ },
40
+ port: 8081,
41
+ platform: "ios",
42
+ };
43
+ expect(app.lastScreenshot).toBeUndefined();
44
+ });
45
+ });
46
+ describe("buildQuery", () => {
47
+ it("builds query from text param", () => {
48
+ const q = buildQuery({ text: "Submit" });
49
+ expect(q).toEqual({ text: "Submit" });
50
+ });
51
+ it("builds query from coordinates", () => {
52
+ const q = buildQuery({ x: 300, y: 600 });
53
+ expect(q).toEqual({ x: 300, y: 600 });
54
+ });
55
+ it("builds query from multiple params", () => {
56
+ const q = buildQuery({ text: "Submit", testID: "btn" });
57
+ expect(q).toEqual({ text: "Submit", testID: "btn" });
58
+ });
59
+ });
60
+ describe("isNonAscii", () => {
61
+ it("returns false for ASCII text", () => {
62
+ expect(isNonAscii("Submit")).toBe(false);
63
+ });
64
+ it("returns true for Cyrillic", () => {
65
+ expect(isNonAscii("Отправить")).toBe(true);
66
+ });
67
+ it("returns true for emoji", () => {
68
+ expect(isNonAscii("🔥")).toBe(true);
69
+ });
70
+ });
71
+ describe("getAvailableStrategies", () => {
72
+ it("returns all strategies for text query", () => {
73
+ expect(getAvailableStrategies({ text: "Submit" }, "auto")).toEqual(["fiber", "accessibility", "ocr"]);
74
+ });
75
+ it("skips fiber for non-ASCII text", () => {
76
+ expect(getAvailableStrategies({ text: "Отправить" }, "auto")).toEqual(["accessibility", "ocr"]);
77
+ });
78
+ it("returns fiber+accessibility for testID", () => {
79
+ expect(getAvailableStrategies({ testID: "btn" }, "auto")).toEqual(["fiber", "accessibility"]);
80
+ });
81
+ it("returns only fiber for component", () => {
82
+ expect(getAvailableStrategies({ component: "Button" }, "auto")).toEqual(["fiber"]);
83
+ });
84
+ it("returns coordinate for x,y", () => {
85
+ expect(getAvailableStrategies({ x: 100, y: 200 }, "auto")).toEqual(["coordinate"]);
86
+ });
87
+ it("returns single strategy when explicitly set", () => {
88
+ expect(getAvailableStrategies({ text: "Submit" }, "ocr")).toEqual(["ocr"]);
89
+ });
90
+ });
91
+ describe("convertPixelsToPoints", () => {
92
+ it("divides by pixel ratio for iOS", () => {
93
+ expect(convertPixelsToPoints(300, 600, "ios", 3)).toEqual({ x: 100, y: 200 });
94
+ });
95
+ it("passes through for Android", () => {
96
+ expect(convertPixelsToPoints(300, 600, "android", 3)).toEqual({ x: 300, y: 600 });
97
+ });
98
+ it("applies scaleFactor before conversion", () => {
99
+ expect(convertPixelsToPoints(150, 300, "ios", 3, 2)).toEqual({ x: 100, y: 200 });
100
+ });
101
+ it("rounds to integers", () => {
102
+ expect(convertPixelsToPoints(301, 599, "ios", 3)).toEqual({ x: 100, y: 200 });
103
+ });
104
+ });
105
+ describe("formatTapSuccess", () => {
106
+ it("returns minimal success response", () => {
107
+ const result = formatTapSuccess({
108
+ method: "fiber",
109
+ query: { text: "Submit" },
110
+ pressed: "PrimaryButton",
111
+ text: "Submit",
112
+ screen: "LoginScreen",
113
+ path: "LoginScreen > Form > PrimaryButton",
114
+ });
115
+ expect(result.success).toBe(true);
116
+ expect(result.method).toBe("fiber");
117
+ expect(result.query).toEqual({ text: "Submit" });
118
+ });
119
+ });
120
+ describe("formatTapFailure", () => {
121
+ it("includes attempted strategies and suggestion", () => {
122
+ const result = formatTapFailure({
123
+ query: { text: "hamburger" },
124
+ screen: "HomeScreen",
125
+ attempted: [{ strategy: "fiber", reason: "No match" }],
126
+ suggestion: "Use screenshot",
127
+ });
128
+ expect(result.success).toBe(false);
129
+ expect(result.attempted).toHaveLength(1);
130
+ expect(result.suggestion).toBe("Use screenshot");
131
+ });
132
+ });
133
+ describe("tap orchestrator", () => {
134
+ it("returns error when no app is connected and auto-connect fails", async () => {
135
+ const { tap } = await import("../../pro/tap.js");
136
+ const { connectedApps } = await import("../../core/state.js");
137
+ connectedApps.clear();
138
+ const result = await tap({ text: "Submit" });
139
+ expect(result.success).toBe(false);
140
+ // Auto-connect will be attempted (scans ports) but may fail or succeed
141
+ // depending on whether Metro is running in the test environment
142
+ expect(result.error || result.method).toBeTruthy();
143
+ }, 15000);
144
+ it("validates that at least one search param is provided", async () => {
145
+ const { tap } = await import("../../pro/tap.js");
146
+ const result = await tap({});
147
+ expect(result.success).toBe(false);
148
+ expect(result.error).toContain("Must provide");
149
+ });
150
+ it("validates x and y are both provided for coordinate tap", async () => {
151
+ const { tap } = await import("../../pro/tap.js");
152
+ const result = await tap({ x: 100 });
153
+ expect(result.success).toBe(false);
154
+ expect(result.error).toContain("Both x and y");
155
+ });
156
+ });
157
+ //# sourceMappingURL=tap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/tap.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ export interface AndroidDevice {
2
+ id: string;
3
+ status: "device" | "offline" | "unauthorized" | "no permissions" | string;
4
+ product?: string;
5
+ model?: string;
6
+ device?: string;
7
+ transportId?: string;
8
+ }
9
+ export interface AdbResult {
10
+ success: boolean;
11
+ result?: string;
12
+ error?: string;
13
+ data?: Buffer;
14
+ scaleFactor?: number;
15
+ originalWidth?: number;
16
+ originalHeight?: number;
17
+ devices?: AndroidDevice[];
18
+ }
19
+ /**
20
+ * Check if ADB is available in PATH
21
+ */
22
+ export declare function isAdbAvailable(): Promise<boolean>;
23
+ /**
24
+ * List connected Android devices
25
+ */
26
+ export declare function listAndroidDevices(): Promise<AdbResult>;
27
+ /**
28
+ * Get the first connected Android device ID
29
+ */
30
+ export declare function getDefaultAndroidDevice(): Promise<string | null>;
31
+ /**
32
+ * Take a screenshot from an Android device
33
+ */
34
+ export declare function androidScreenshot(outputPath?: string, deviceId?: string): Promise<AdbResult>;
35
+ /**
36
+ * Install an APK on an Android device
37
+ */
38
+ export declare function androidInstallApp(apkPath: string, deviceId?: string, options?: {
39
+ replace?: boolean;
40
+ grantPermissions?: boolean;
41
+ }): Promise<AdbResult>;
42
+ /**
43
+ * Launch an app on an Android device
44
+ */
45
+ export declare function androidLaunchApp(packageName: string, activityName?: string, deviceId?: string): Promise<AdbResult>;
46
+ /**
47
+ * Get list of installed packages on the device
48
+ */
49
+ export declare function androidListPackages(deviceId?: string, filter?: string): Promise<AdbResult>;
50
+ /**
51
+ * Common key event codes for Android
52
+ */
53
+ export declare const ANDROID_KEY_EVENTS: {
54
+ readonly HOME: 3;
55
+ readonly BACK: 4;
56
+ readonly CALL: 5;
57
+ readonly END_CALL: 6;
58
+ readonly VOLUME_UP: 24;
59
+ readonly VOLUME_DOWN: 25;
60
+ readonly POWER: 26;
61
+ readonly CAMERA: 27;
62
+ readonly CLEAR: 28;
63
+ readonly TAB: 61;
64
+ readonly ENTER: 66;
65
+ readonly DEL: 67;
66
+ readonly MENU: 82;
67
+ readonly SEARCH: 84;
68
+ readonly MEDIA_PLAY_PAUSE: 85;
69
+ readonly MEDIA_STOP: 86;
70
+ readonly MEDIA_NEXT: 87;
71
+ readonly MEDIA_PREVIOUS: 88;
72
+ readonly MOVE_HOME: 122;
73
+ readonly MOVE_END: 123;
74
+ readonly APP_SWITCH: 187;
75
+ readonly ESCAPE: 111;
76
+ };
77
+ /**
78
+ * Tap at coordinates on an Android device
79
+ */
80
+ export declare function androidTap(x: number, y: number, deviceId?: string): Promise<AdbResult>;
81
+ /**
82
+ * Long press at coordinates on an Android device
83
+ */
84
+ export declare function androidLongPress(x: number, y: number, durationMs?: number, deviceId?: string): Promise<AdbResult>;
85
+ /**
86
+ * Swipe on an Android device
87
+ */
88
+ export declare function androidSwipe(startX: number, startY: number, endX: number, endY: number, durationMs?: number, deviceId?: string): Promise<AdbResult>;
89
+ /**
90
+ * Input text on an Android device
91
+ *
92
+ * ADB input text has limitations with special characters.
93
+ * This function handles escaping properly for URLs, emails, and special strings.
94
+ */
95
+ export declare function androidInputText(text: string, deviceId?: string): Promise<AdbResult>;
96
+ /**
97
+ * Send a key event to an Android device
98
+ */
99
+ export declare function androidKeyEvent(keyCode: number | keyof typeof ANDROID_KEY_EVENTS, deviceId?: string): Promise<AdbResult>;
100
+ /**
101
+ * UI Element from accessibility tree
102
+ */
103
+ export interface AndroidUIElement {
104
+ text: string;
105
+ contentDesc: string;
106
+ resourceId: string;
107
+ className: string;
108
+ bounds: {
109
+ left: number;
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
113
+ width: number;
114
+ height: number;
115
+ };
116
+ center: {
117
+ x: number;
118
+ y: number;
119
+ };
120
+ clickable: boolean;
121
+ enabled: boolean;
122
+ focused: boolean;
123
+ scrollable: boolean;
124
+ selected: boolean;
125
+ }
126
+ /**
127
+ * Result of element find operations
128
+ */
129
+ export interface FindElementResult {
130
+ success: boolean;
131
+ found: boolean;
132
+ element?: AndroidUIElement;
133
+ allMatches?: AndroidUIElement[];
134
+ matchCount?: number;
135
+ error?: string;
136
+ }
137
+ /**
138
+ * Result of wait for element operations
139
+ */
140
+ export interface WaitForElementResult extends FindElementResult {
141
+ elapsedMs?: number;
142
+ timedOut?: boolean;
143
+ }
144
+ /**
145
+ * Options for finding elements
146
+ */
147
+ export interface FindElementOptions {
148
+ text?: string;
149
+ textContains?: string;
150
+ contentDesc?: string;
151
+ contentDescContains?: string;
152
+ resourceId?: string;
153
+ index?: number;
154
+ }
155
+ /**
156
+ * Get UI accessibility tree from Android device using uiautomator
157
+ */
158
+ export declare function androidGetUITree(deviceId?: string): Promise<{
159
+ success: boolean;
160
+ elements?: AndroidUIElement[];
161
+ rawXml?: string;
162
+ error?: string;
163
+ }>;
164
+ /**
165
+ * Find element(s) in the UI tree matching the given criteria
166
+ */
167
+ export declare function androidFindElement(options: FindElementOptions, deviceId?: string): Promise<FindElementResult>;
168
+ /**
169
+ * Wait for element to appear on screen with polling
170
+ */
171
+ export declare function androidWaitForElement(options: FindElementOptions & {
172
+ timeoutMs?: number;
173
+ pollIntervalMs?: number;
174
+ }, deviceId?: string): Promise<WaitForElementResult>;
175
+ /**
176
+ * Get device screen size
177
+ */
178
+ export declare function androidGetScreenSize(deviceId?: string): Promise<{
179
+ success: boolean;
180
+ width?: number;
181
+ height?: number;
182
+ error?: string;
183
+ }>;
184
+ /**
185
+ * Get device display density (dpi)
186
+ */
187
+ export declare function androidGetDensity(deviceId?: string): Promise<{
188
+ success: boolean;
189
+ density?: number;
190
+ error?: string;
191
+ }>;
192
+ /**
193
+ * Get status bar height in pixels
194
+ * Android status bar is typically 24dp, but can vary by device/OS version
195
+ */
196
+ export declare function androidGetStatusBarHeight(deviceId?: string): Promise<{
197
+ success: boolean;
198
+ heightPixels?: number;
199
+ heightDp?: number;
200
+ error?: string;
201
+ }>;
202
+ /**
203
+ * Android UI element from uiautomator dump
204
+ */
205
+ export interface AndroidAccessibilityElement {
206
+ class: string;
207
+ text?: string;
208
+ contentDesc?: string;
209
+ resourceId?: string;
210
+ bounds: {
211
+ left: number;
212
+ top: number;
213
+ right: number;
214
+ bottom: number;
215
+ };
216
+ frame: {
217
+ x: number;
218
+ y: number;
219
+ width: number;
220
+ height: number;
221
+ };
222
+ tap: {
223
+ x: number;
224
+ y: number;
225
+ };
226
+ children: AndroidAccessibilityElement[];
227
+ checkable?: boolean;
228
+ checked?: boolean;
229
+ clickable?: boolean;
230
+ enabled?: boolean;
231
+ focusable?: boolean;
232
+ focused?: boolean;
233
+ scrollable?: boolean;
234
+ selected?: boolean;
235
+ }
236
+ /**
237
+ * Result type for accessibility operations
238
+ */
239
+ export interface AndroidDescribeResult {
240
+ success: boolean;
241
+ elements?: AndroidAccessibilityElement[];
242
+ formatted?: string;
243
+ error?: string;
244
+ }
245
+ /**
246
+ * Get the UI hierarchy from the connected Android device using uiautomator dump
247
+ */
248
+ export declare function androidDescribeAll(deviceId?: string): Promise<AndroidDescribeResult>;
249
+ /**
250
+ * Get accessibility info for the UI element at specific coordinates
251
+ */
252
+ export declare function androidDescribePoint(x: number, y: number, deviceId?: string): Promise<AndroidDescribeResult>;
253
+ /**
254
+ * Tap an element by its text, content-description, or resource-id
255
+ */
256
+ export declare function androidTapElement(options: {
257
+ text?: string;
258
+ textContains?: string;
259
+ contentDesc?: string;
260
+ contentDescContains?: string;
261
+ resourceId?: string;
262
+ index?: number;
263
+ deviceId?: string;
264
+ }): Promise<AdbResult>;
265
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/core/android.ts"],"names":[],"mappings":"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"}