execbro 2.1.1 → 2.2.0

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 (98) hide show
  1. package/README.md +1 -1
  2. package/build/__tests__/integration/text-input.test.d.ts +2 -0
  3. package/build/__tests__/integration/text-input.test.d.ts.map +1 -0
  4. package/build/__tests__/integration/text-input.test.js +181 -0
  5. package/build/__tests__/integration/text-input.test.js.map +1 -0
  6. package/build/__tests__/unit/focusedInputTools.test.js +19 -6
  7. package/build/__tests__/unit/focusedInputTools.test.js.map +1 -1
  8. package/build/__tests__/unit/inputTarget.test.d.ts +2 -0
  9. package/build/__tests__/unit/inputTarget.test.d.ts.map +1 -0
  10. package/build/__tests__/unit/inputTarget.test.js +144 -0
  11. package/build/__tests__/unit/inputTarget.test.js.map +1 -0
  12. package/build/__tests__/unit/inputTargetTools.test.d.ts +2 -0
  13. package/build/__tests__/unit/inputTargetTools.test.d.ts.map +1 -0
  14. package/build/__tests__/unit/inputTargetTools.test.js +46 -0
  15. package/build/__tests__/unit/inputTargetTools.test.js.map +1 -0
  16. package/build/__tests__/unit/inputTextTool.test.d.ts +2 -0
  17. package/build/__tests__/unit/inputTextTool.test.d.ts.map +1 -0
  18. package/build/__tests__/unit/inputTextTool.test.js +120 -0
  19. package/build/__tests__/unit/inputTextTool.test.js.map +1 -0
  20. package/build/__tests__/unit/keyboardMetrics.test.d.ts +2 -0
  21. package/build/__tests__/unit/keyboardMetrics.test.d.ts.map +1 -0
  22. package/build/__tests__/unit/keyboardMetrics.test.js +58 -0
  23. package/build/__tests__/unit/keyboardMetrics.test.js.map +1 -0
  24. package/build/__tests__/unit/keyboardRaise.test.d.ts +2 -0
  25. package/build/__tests__/unit/keyboardRaise.test.d.ts.map +1 -0
  26. package/build/__tests__/unit/keyboardRaise.test.js +74 -0
  27. package/build/__tests__/unit/keyboardRaise.test.js.map +1 -0
  28. package/build/__tests__/unit/nativeInputValue.test.d.ts +2 -0
  29. package/build/__tests__/unit/nativeInputValue.test.d.ts.map +1 -0
  30. package/build/__tests__/unit/nativeInputValue.test.js +67 -0
  31. package/build/__tests__/unit/nativeInputValue.test.js.map +1 -0
  32. package/build/__tests__/unit/screenStateInputValue.test.d.ts +2 -0
  33. package/build/__tests__/unit/screenStateInputValue.test.d.ts.map +1 -0
  34. package/build/__tests__/unit/screenStateInputValue.test.js +49 -0
  35. package/build/__tests__/unit/screenStateInputValue.test.js.map +1 -0
  36. package/build/__tests__/unit/screenStateKeyboard.test.d.ts +2 -0
  37. package/build/__tests__/unit/screenStateKeyboard.test.d.ts.map +1 -0
  38. package/build/__tests__/unit/screenStateKeyboard.test.js +99 -0
  39. package/build/__tests__/unit/screenStateKeyboard.test.js.map +1 -0
  40. package/build/__tests__/unit/textEntry.test.d.ts +2 -0
  41. package/build/__tests__/unit/textEntry.test.d.ts.map +1 -0
  42. package/build/__tests__/unit/textEntry.test.js +291 -0
  43. package/build/__tests__/unit/textEntry.test.js.map +1 -0
  44. package/build/core/focusedInputTools.d.ts.map +1 -1
  45. package/build/core/focusedInputTools.js +13 -35
  46. package/build/core/focusedInputTools.js.map +1 -1
  47. package/build/core/injectedFilters.d.ts +23 -0
  48. package/build/core/injectedFilters.d.ts.map +1 -0
  49. package/build/core/injectedFilters.js +23 -0
  50. package/build/core/injectedFilters.js.map +1 -0
  51. package/build/core/inputTarget.d.ts +85 -0
  52. package/build/core/inputTarget.d.ts.map +1 -0
  53. package/build/core/inputTarget.js +364 -0
  54. package/build/core/inputTarget.js.map +1 -0
  55. package/build/core/inputTargetTools.d.ts +12 -0
  56. package/build/core/inputTargetTools.d.ts.map +1 -0
  57. package/build/core/inputTargetTools.js +26 -0
  58. package/build/core/inputTargetTools.js.map +1 -0
  59. package/build/core/ios.d.ts.map +1 -1
  60. package/build/core/ios.js +7 -1
  61. package/build/core/ios.js.map +1 -1
  62. package/build/core/keyboardMetrics.d.ts +11 -0
  63. package/build/core/keyboardMetrics.d.ts.map +1 -0
  64. package/build/core/keyboardMetrics.js +40 -0
  65. package/build/core/keyboardMetrics.js.map +1 -0
  66. package/build/core/keyboardRaise.d.ts +22 -0
  67. package/build/core/keyboardRaise.d.ts.map +1 -0
  68. package/build/core/keyboardRaise.js +74 -0
  69. package/build/core/keyboardRaise.js.map +1 -0
  70. package/build/core/nativeInputValue.d.ts +48 -0
  71. package/build/core/nativeInputValue.d.ts.map +1 -0
  72. package/build/core/nativeInputValue.js +113 -0
  73. package/build/core/nativeInputValue.js.map +1 -0
  74. package/build/core/screenState.d.ts +39 -0
  75. package/build/core/screenState.d.ts.map +1 -1
  76. package/build/core/screenState.js +93 -8
  77. package/build/core/screenState.js.map +1 -1
  78. package/build/core/textEntry.d.ts +75 -0
  79. package/build/core/textEntry.d.ts.map +1 -0
  80. package/build/core/textEntry.js +252 -0
  81. package/build/core/textEntry.js.map +1 -0
  82. package/build/tools/componentTools.d.ts.map +1 -1
  83. package/build/tools/componentTools.js +9 -2
  84. package/build/tools/componentTools.js.map +1 -1
  85. package/build/tools/interactionTools.d.ts +13 -0
  86. package/build/tools/interactionTools.d.ts.map +1 -1
  87. package/build/tools/interactionTools.js +112 -2
  88. package/build/tools/interactionTools.js.map +1 -1
  89. package/package.json +2 -2
  90. package/tools.json +11 -1
  91. package/build/__tests__/unit/focusedInput.test.d.ts +0 -2
  92. package/build/__tests__/unit/focusedInput.test.d.ts.map +0 -1
  93. package/build/__tests__/unit/focusedInput.test.js +0 -58
  94. package/build/__tests__/unit/focusedInput.test.js.map +0 -1
  95. package/build/core/focusedInput.d.ts +0 -27
  96. package/build/core/focusedInput.d.ts.map +0 -1
  97. package/build/core/focusedInput.js +0 -110
  98. package/build/core/focusedInput.js.map +0 -1
@@ -0,0 +1,291 @@
1
+ import { describe, expect, it, jest } from "@jest/globals";
2
+ import { enterText, isHidTypeable } from "../../core/textEntry.js";
3
+ const found = (over = {}) => ({
4
+ found: true,
5
+ focused: true,
6
+ nativeTag: 1,
7
+ value: null,
8
+ testID: null,
9
+ controlled: true,
10
+ hasOnChangeText: true,
11
+ ok: true,
12
+ ...over
13
+ });
14
+ function deps(results, over = {}) {
15
+ const queue = [...results];
16
+ return {
17
+ runOp: jest.fn(async () => queue.shift() ?? found()),
18
+ typeHid: jest.fn(async () => ({ success: true })),
19
+ raise: jest.fn(async () => ({ raised: true, changed: false })),
20
+ ...over
21
+ };
22
+ }
23
+ const opsOf = (d) => d.runOp.mock.calls.map((c) => c[0].kind);
24
+ describe("enterText", () => {
25
+ it("writes through onChangeText and verifies the exact string", async () => {
26
+ const d = deps([found(), found({ value: "hello" }), found({ value: "hello" })]);
27
+ const r = await enterText({ text: "hello" }, d);
28
+ expect(r).toMatchObject({ success: true, value: "hello", path: "react", verified: true });
29
+ expect(r.retried).toBeFalsy();
30
+ });
31
+ it("retries once on a mismatch and succeeds", async () => {
32
+ // The reproduced corruption is a reorder: CASEB landed as CSEBA.
33
+ // No clear between attempts: setValue sets the whole value, so clearing
34
+ // first is redundant (and on the native path, harmful).
35
+ const d = deps([
36
+ found(),
37
+ found({ value: "CASEB" }),
38
+ found({ value: "CSEBA" }),
39
+ found({ value: "CASEB" }),
40
+ found({ value: "CASEB" })
41
+ ]);
42
+ const r = await enterText({ text: "CASEB" }, d);
43
+ expect(r).toMatchObject({ success: true, value: "CASEB", retried: true, verified: true });
44
+ expect(opsOf(d)).not.toContain("clear");
45
+ });
46
+ it("fails hard when the mismatch survives the retry", async () => {
47
+ const d = deps([
48
+ found(),
49
+ found({ value: "CASEB" }),
50
+ found({ value: "CSEBA" }),
51
+ found({ value: "CASEB" }),
52
+ found({ value: "CSEBA" })
53
+ ]);
54
+ const r = await enterText({ text: "CASEB" }, d);
55
+ expect(r.success).toBe(false);
56
+ expect(r.sent).toBe("CASEB");
57
+ expect(r.landed).toBe("CSEBA");
58
+ expect(r.verified).toBe(false);
59
+ });
60
+ it("never accepts a reorder as success", async () => {
61
+ const d = deps([found(), found({ value: "CSEBA" }), found({ value: "CSEBA" })]);
62
+ const r = await enterText({ text: "CASEB" }, d);
63
+ // Same length, same characters, non-empty — every loose check passes it.
64
+ expect(r.success).toBe(false);
65
+ });
66
+ it("refuses when nothing is focused and no target was given", async () => {
67
+ const d = deps([{ found: false, reason: "no focused TextInput", candidates: [] }]);
68
+ const r = await enterText({ text: "x" }, d);
69
+ expect(r.success).toBe(false);
70
+ expect(r.error).toContain("no focused TextInput");
71
+ });
72
+ it("passes ambiguity and candidates straight through", async () => {
73
+ const candidates = [
74
+ { index: 0, component: "FormInput", label: "Title *", placeholder: "Type here", value: "", testID: "t" },
75
+ { index: 1, component: "FormInput", label: "Goal", placeholder: "Type here", value: "", testID: "g" }
76
+ ];
77
+ const d = deps([{ found: false, ambiguous: true, reason: "2 inputs match", candidates }]);
78
+ const r = await enterText({ text: "x", textMatch: "Type here" }, d);
79
+ expect(r.success).toBe(false);
80
+ expect(r.ambiguous).toBe(true);
81
+ expect(r.candidates).toEqual(candidates);
82
+ });
83
+ it("focuses the target itself when it is not already focused", async () => {
84
+ const d = deps([
85
+ found({ focused: false }),
86
+ found({ focused: true }),
87
+ found({ value: "a@b" }),
88
+ found({ value: "a@b" })
89
+ ]);
90
+ await enterText({ text: "a@b", testID: "email" }, d);
91
+ expect(opsOf(d)).toContain("focus");
92
+ });
93
+ it("does not re-focus a field that already has focus", async () => {
94
+ const d = deps([found({ focused: true }), found({ value: "x" }), found({ value: "x" })]);
95
+ await enterText({ text: "x" }, d);
96
+ expect(opsOf(d)).not.toContain("focus");
97
+ });
98
+ it("appends by default", async () => {
99
+ const d = deps([found({ value: "ab" }), found({ value: "abcd" }), found({ value: "abcd" })]);
100
+ await enterText({ text: "cd" }, d);
101
+ const setCall = d.runOp.mock.calls.find((c) => c[0].kind === "setValue");
102
+ expect(setCall[0].value).toBe("abcd");
103
+ });
104
+ it("replaces when asked", async () => {
105
+ const d = deps([found({ value: "ab" }), found({ value: "cd" }), found({ value: "cd" })]);
106
+ await enterText({ text: "cd", replace: true }, d);
107
+ const setCall = d.runOp.mock.calls.find((c) => c[0].kind === "setValue");
108
+ expect(setCall[0].value).toBe("cd");
109
+ });
110
+ it("restores the previous value when a replace write fails", async () => {
111
+ const d = deps([
112
+ found({ value: "original" }),
113
+ found({ ok: false, via: "no onChangeText (uncontrolled input)" }),
114
+ found({ value: "original" })
115
+ ]);
116
+ const r = await enterText({ text: "new", replace: true }, d);
117
+ expect(r.success).toBe(false);
118
+ expect(r.error).toContain("restored");
119
+ const written = d.runOp.mock.calls
120
+ .filter((c) => c[0].kind === "setValue")
121
+ .map((c) => c[0].value);
122
+ expect(written).toContain("original");
123
+ });
124
+ it("says so when the previous value could not be restored", async () => {
125
+ const d = deps([
126
+ found({ value: "original" }),
127
+ found({ ok: false, via: "write failed" }),
128
+ { found: false, reason: "gone" }
129
+ ]);
130
+ const r = await enterText({ text: "new", replace: true }, d);
131
+ expect(r.error).toContain("COULD NOT be restored");
132
+ });
133
+ it("never lets a keyboard-raise failure fail the call", async () => {
134
+ const d = deps([found(), found({ value: "hi" }), found({ value: "hi" })], {
135
+ raise: jest.fn(async () => ({ raised: false, changed: false, reason: "osascript error 1002" }))
136
+ });
137
+ const r = await enterText({ text: "hi" }, d);
138
+ expect(r.success).toBe(true);
139
+ expect(r.keyboard).toMatchObject({ raised: false, reason: "osascript error 1002" });
140
+ });
141
+ it("raises the keyboard only after the text is in", async () => {
142
+ const d = deps([found(), found({ value: "hi" }), found({ value: "hi" })]);
143
+ await enterText({ text: "hi" }, d);
144
+ expect(d.raise).toHaveBeenCalled();
145
+ // Ordering matters: the raise is a convenience, never a precondition.
146
+ const raiseOrder = d.raise.mock.invocationCallOrder[0];
147
+ const lastOp = d.runOp.mock.invocationCallOrder.slice(-1)[0];
148
+ expect(raiseOrder).toBeGreaterThan(lastOp);
149
+ });
150
+ it("reports verified:false for an uncontrolled field with no accessibility read-back", async () => {
151
+ // Without readNativeFields there is no way to see what landed, so the
152
+ // write must be reported as unconfirmed rather than as a success.
153
+ const d = deps([found({ controlled: false, hasOnChangeText: false, value: null })]);
154
+ const r = await enterText({ text: "hi" }, d);
155
+ expect(r.success).toBe(true);
156
+ expect(r.verified).toBe(false);
157
+ expect(r.error).toContain("uncontrolled");
158
+ });
159
+ it("uses setNativeProps for an uncontrolled field with NO handler", async () => {
160
+ // Nothing to fire, so writing the native text directly is exact,
161
+ // instant and Unicode-safe where HID is none of those.
162
+ const d = deps([found({ controlled: false, hasOnChangeText: false, value: null })]);
163
+ const r = await enterText({ text: "Привіт світ 世界" }, d);
164
+ expect(r.path).toBe("native");
165
+ expect(d.typeHid).not.toHaveBeenCalled();
166
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
167
+ expect(ops).toContain("setNative");
168
+ });
169
+ it("switches an uncontrolled+handler field to setNativeProps for non-ASCII", async () => {
170
+ // HID has no keycode for these, so faithfulness is not on offer; the
171
+ // resolver's setNative also fires onChangeText, so the app still gets it.
172
+ for (const text of ["Привіт", "世界", "Señor", "aeñ"]) {
173
+ const d = deps([found({ controlled: false, hasOnChangeText: true, value: null })]);
174
+ const r = await enterText({ text }, d);
175
+ expect(r.path).toBe("native");
176
+ expect(d.typeHid).not.toHaveBeenCalled();
177
+ }
178
+ });
179
+ it("keeps HID for plain ASCII, including symbols", async () => {
180
+ const d = deps([found({ controlled: false, hasOnChangeText: true, value: null })]);
181
+ const r = await enterText({ text: "a@b.com #1 {ok}" }, d);
182
+ expect(r.path).toBe("hid");
183
+ });
184
+ it("keeps HID when an uncontrolled field HAS a handler", async () => {
185
+ // setNativeProps would set the text without firing onChangeText, so the
186
+ // field would show text the app never received.
187
+ const d = deps([found({ controlled: false, hasOnChangeText: true, value: null })]);
188
+ const r = await enterText({ text: "Alice" }, d);
189
+ expect(r.path).toBe("hid");
190
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
191
+ expect(ops).not.toContain("setNative");
192
+ });
193
+ it("uses HID even when an uncontrolled field carries an onChangeText", async () => {
194
+ // The test app's uncontrolled inputs pass `onChangeText={() => {}}`.
195
+ // Branching on the handler would take the React path, call the no-op,
196
+ // read back null, and report the text "landed differently than sent" —
197
+ // reproduced on device before this branch keyed on `controlled`.
198
+ const d = deps([found({ controlled: false, hasOnChangeText: true, value: null })]);
199
+ const r = await enterText({ text: "Alice", testID: "name-input" }, d);
200
+ expect(r.path).toBe("hid");
201
+ expect(r.success).toBe(true);
202
+ expect(r.verified).toBe(false);
203
+ expect(d.typeHid).toHaveBeenCalledWith("Alice");
204
+ });
205
+ it("never reports an uncontrolled write as a mismatch", async () => {
206
+ const d = deps([found({ controlled: false, hasOnChangeText: true, value: null })]);
207
+ const r = await enterText({ text: "Alice" }, d);
208
+ expect(r.sent).toBeUndefined();
209
+ expect(r.landed).toBeUndefined();
210
+ });
211
+ });
212
+ describe("isHidTypeable", () => {
213
+ it("accepts printable ASCII", () => {
214
+ expect(isHidTypeable("Alice in Wonderland")).toBe(true);
215
+ expect(isHidTypeable("a@b.com !#$%^&*()_+-={}[]|\\:\";'<>?,./`~")).toBe(true);
216
+ expect(isHidTypeable("")).toBe(true);
217
+ });
218
+ it("rejects Cyrillic, CJK and emoji", () => {
219
+ expect(isHidTypeable("Привіт")).toBe(false);
220
+ expect(isHidTypeable("世界")).toBe(false);
221
+ expect(isHidTypeable("🎉")).toBe(false);
222
+ });
223
+ it("rejects Spanish accents, which look Latin but have no keycode", () => {
224
+ // The easy one to miss: the text is otherwise ASCII.
225
+ expect(isHidTypeable("Señor")).toBe(false);
226
+ expect(isHidTypeable("á")).toBe(false);
227
+ expect(isHidTypeable("über")).toBe(false);
228
+ });
229
+ });
230
+ describe("append and replace on an uncontrolled field", () => {
231
+ const nativeDeps = (fields) => ({
232
+ readNativeFields: jest.fn(async () => ({ fields }))
233
+ });
234
+ it("reads the prior text from accessibility so append does not behave as replace", async () => {
235
+ // target.value is always null for an uncontrolled field, so treating it
236
+ // as "" made append overwrite — and the retry then cleared the field,
237
+ // making the wrong answer verify clean.
238
+ const d = deps([found({ controlled: false, hasOnChangeText: true, testID: "f", value: null })], {
239
+ ...nativeDeps([{ id: "f", text: "abc", focused: true }])
240
+ });
241
+ await enterText({ text: "de", testID: "f" }, d);
242
+ expect(d.typeHid).toHaveBeenCalledWith("de");
243
+ });
244
+ it("clears before an HID replace, since typing appends at the caret", async () => {
245
+ const d = deps([found({ controlled: false, hasOnChangeText: true, testID: "f", value: null })], {
246
+ ...nativeDeps([{ id: "f", text: "old", focused: true }])
247
+ });
248
+ await enterText({ text: "new", testID: "f", replace: true }, d);
249
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
250
+ expect(ops).toContain("clear");
251
+ // After a clear the caret is at the start, so the full value is typed.
252
+ expect(d.typeHid).toHaveBeenCalledWith("new");
253
+ });
254
+ it("does not clear when the field is already empty", async () => {
255
+ // The read must reflect the write, or verification mismatches and the
256
+ // retry clears — which would mask what this test is checking.
257
+ let call = 0;
258
+ const d = deps([found({ controlled: false, hasOnChangeText: true, testID: "f", value: null })], {
259
+ readNativeFields: jest.fn(async () => ({
260
+ fields: [{ id: "f", text: call++ === 0 ? "" : "new", focused: true }]
261
+ }))
262
+ });
263
+ const r = await enterText({ text: "new", testID: "f", replace: true }, d);
264
+ expect(r.verified).toBe(true);
265
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
266
+ expect(ops).not.toContain("clear");
267
+ });
268
+ });
269
+ describe("retry clearing", () => {
270
+ it("does not clear before retrying a native write", async () => {
271
+ // publicInstance.clear() races the setNativeProps that follows it, which
272
+ // made every non-ASCII retry land empty on a real device. The native
273
+ // path sets the whole value, so the clear was redundant anyway.
274
+ const d = deps([found({ controlled: false, hasOnChangeText: false, testID: "f", value: null })], {
275
+ readNativeFields: jest.fn(async () => ({ fields: [{ id: "f", text: "stale", focused: true }] }))
276
+ });
277
+ await enterText({ text: "Привіт", testID: "f", replace: true }, d);
278
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
279
+ expect(ops).toContain("setNative");
280
+ expect(ops).not.toContain("clear");
281
+ });
282
+ it("still clears before retrying an HID write, which appends", async () => {
283
+ const d = deps([found({ controlled: false, hasOnChangeText: true, testID: "f", value: null })], {
284
+ readNativeFields: jest.fn(async () => ({ fields: [{ id: "f", text: "stale", focused: true }] }))
285
+ });
286
+ await enterText({ text: "abc", testID: "f", replace: true }, d);
287
+ const ops = d.runOp.mock.calls.map((c) => c[0].kind);
288
+ expect(ops).toContain("clear");
289
+ });
290
+ });
291
+ //# sourceMappingURL=textEntry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textEntry.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/textEntry.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"focusedInputTools.d.ts","sourceRoot":"","sources":["../../src/core/focusedInputTools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAa1F,wBAAsB,iBAAiB,CACnC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,SAA0B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAatC;AAED,wBAAsB,eAAe,CACjC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,SAA0B,GACpC,OAAO,CAAC,yBAAyB,CAAC,CAapC;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,EAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,GACpD,OAAO,CAAC,UAAU,CAAC,CAQrB"}
1
+ {"version":3,"file":"focusedInputTools.d.ts","sourceRoot":"","sources":["../../src/core/focusedInputTools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAI1F,wBAAsB,iBAAiB,CACnC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,SAA0B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAKtC;AAED,wBAAsB,eAAe,CACjC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE,SAA0B,GACpC,OAAO,CAAC,yBAAyB,CAAC,CAKpC;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,EAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,GACpD,OAAO,CAAC,UAAU,CAAC,CAQrB"}
@@ -1,43 +1,21 @@
1
1
  import { executeInApp } from "./executor.js";
2
- import { buildClearFocusedInputExpression, buildDismissKeyboardExpression } from "./focusedInput.js";
2
+ import { runInputOp } from "./inputTargetTools.js";
3
3
  const defaultExecute = (expression, device) => executeInApp(expression, true, { originatingToolName: "focused_input" }, device);
4
- function parseExecutorResult(raw) {
5
- if (!raw)
6
- return null;
7
- try {
8
- return JSON.parse(raw);
9
- }
10
- catch {
11
- return null;
12
- }
13
- }
14
4
  export async function clearFocusedInput(device, execute = defaultExecute) {
15
- const exec = await execute(buildClearFocusedInputExpression(), device);
16
- if (!exec.success) {
17
- return { success: false, error: exec.error ?? "executor failed" };
18
- }
19
- const r = parseExecutorResult(exec.result);
20
- if (!r) {
21
- return { success: false, error: "could not parse executor result" };
22
- }
23
- if (r.cleared) {
24
- return { success: true, via: r.via };
25
- }
26
- return { success: false, error: r.reason };
5
+ const r = await runInputOp({ kind: "clear" }, undefined, device, execute);
6
+ if (!r.found)
7
+ return { success: false, error: r.reason };
8
+ if (!r.ok)
9
+ return { success: false, error: r.via ?? "clear failed" };
10
+ return { success: true, via: r.via === "publicInstance.clear" ? "publicInstance" : "onChangeText" };
27
11
  }
28
12
  export async function dismissKeyboard(device, execute = defaultExecute) {
29
- const exec = await execute(buildDismissKeyboardExpression(), device);
30
- if (!exec.success) {
31
- return { success: false, error: exec.error ?? "executor failed" };
32
- }
33
- const r = parseExecutorResult(exec.result);
34
- if (!r) {
35
- return { success: false, error: "could not parse executor result" };
36
- }
37
- if (r.dismissed) {
38
- return { success: true, nativeTag: r.nativeTag };
39
- }
40
- return { success: false, error: r.reason };
13
+ const r = await runInputOp({ kind: "blur" }, undefined, device, execute);
14
+ if (!r.found)
15
+ return { success: false, error: r.reason };
16
+ if (!r.ok)
17
+ return { success: false, error: r.via ?? "blur failed" };
18
+ return { success: true, nativeTag: r.nativeTag ?? undefined };
41
19
  }
42
20
  export async function inputTextWithReplace(text, replace, typeFn, clearFn) {
43
21
  if (replace) {
@@ -1 +1 @@
1
- {"version":3,"file":"focusedInputTools.js","sourceRoot":"","sources":["../../src/core/focusedInputTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACH,gCAAgC,EAChC,8BAA8B,EAGjC,MAAM,mBAAmB,CAAC;AAgB3B,MAAM,cAAc,GAAc,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC;AAE3I,SAAS,mBAAmB,CAAI,GAAuB;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAAe,EACf,UAAqB,cAAc;IAEnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,gCAAgC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,iBAAiB,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,CAAC,GAAG,mBAAmB,CAA0B,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAAe,EACf,UAAqB,cAAc;IAEnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,8BAA8B,EAAE,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,iBAAiB,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,CAAC,GAAG,mBAAmB,CAAwB,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAY,EACZ,OAAgB,EAChB,MAA6C,EAC7C,OAAmD;IAEnD,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QACxD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"focusedInputTools.js","sourceRoot":"","sources":["../../src/core/focusedInputTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAgBnD,MAAM,cAAc,GAAc,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC;AAE3I,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAAe,EACf,UAAqB,cAAc;IAEnC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1E,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACzD,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,cAAc,EAAE,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;AACxG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAAe,EACf,UAAqB,cAAc;IAEnC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACzD,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AAClE,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAY,EACZ,OAAgB,EAChB,MAA6C,EAC7C,OAAmD;IAEnD,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QACxD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Component-name filters shared by every injected fiber walker.
3
+ *
4
+ * These decide which fiber gets to name an element. They MUST be identical
5
+ * across walkers: an agent reads a component name out of get_screen_state and
6
+ * then passes it straight back as an input_text/tap target. If screenState
7
+ * filtered `TextAncestorContext` but the input resolver did not, screenState
8
+ * would print `<InputField />` while the resolver answered to
9
+ * `TextAncestorContext` — and the name the agent could see would be the one
10
+ * name that did not work.
11
+ *
12
+ * Exported as SOURCE STRINGS because they are interpolated into template
13
+ * literals that Hermes compiles, not used as TS RegExp objects. These are
14
+ * ordinary TS strings, so `\\(` here is the value `\(` — which is what must
15
+ * reach the device. (Inside screenState's template literal the same character
16
+ * has to be written `\\(`; the doubling there is template escaping, not part
17
+ * of the pattern.)
18
+ */
19
+ /** Internal/framework wrappers that must never be reported as an element's name. */
20
+ export declare const RN_PRIMITIVES_SRC = "/^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|ScrollViewContext(Base)?|VirtualizedListContext(Resetter)?|TextInputContext|KeyboardAvoidingViewContext|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/";
21
+ /** Names too generic to identify anything — keep climbing past these. */
22
+ export declare const GENERIC_COMPONENT_SRC = "/^(View|TouchableOpacity|TouchableHighlight|TouchableWithoutFeedback|Pressable|TouchableNativeFeedback|Text|RCTView|RCTText|Unknown)$/";
23
+ //# sourceMappingURL=injectedFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectedFilters.d.ts","sourceRoot":"","sources":["../../src/core/injectedFilters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,4xCAC+vC,CAAC;AAE9xC,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,2IAC0G,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Component-name filters shared by every injected fiber walker.
3
+ *
4
+ * These decide which fiber gets to name an element. They MUST be identical
5
+ * across walkers: an agent reads a component name out of get_screen_state and
6
+ * then passes it straight back as an input_text/tap target. If screenState
7
+ * filtered `TextAncestorContext` but the input resolver did not, screenState
8
+ * would print `<InputField />` while the resolver answered to
9
+ * `TextAncestorContext` — and the name the agent could see would be the one
10
+ * name that did not work.
11
+ *
12
+ * Exported as SOURCE STRINGS because they are interpolated into template
13
+ * literals that Hermes compiles, not used as TS RegExp objects. These are
14
+ * ordinary TS strings, so `\\(` here is the value `\(` — which is what must
15
+ * reach the device. (Inside screenState's template literal the same character
16
+ * has to be written `\\(`; the doubling there is template escaping, not part
17
+ * of the pattern.)
18
+ */
19
+ /** Internal/framework wrappers that must never be reported as an element's name. */
20
+ export const RN_PRIMITIVES_SRC = "/^(Animated\\(.*|withAnimated.*|AnimatedComponent.*|ForwardRef.*|memo\\(.*|Context\\.Consumer|Context\\.Provider|ScrollViewContext(Base)?|VirtualizedListContext(Resetter)?|TextInputContext|KeyboardAvoidingViewContext|RCT.*|RNS.*|RNC.*|ViewManagerAdapter_.*|VirtualizedList.*|CellRenderer.*|FrameSizeProvider.*|MaybeScreenContainer|MaybeScreen|Navigation.*|Screen$|ScreenStack|ScreenContainer|ScreenContentWrapper|SceneView|DelayedFreeze|Freeze|Suspender|DebugContainer|StaticContainer|SafeAreaProvider.*|SafeAreaFrameContext|SafeAreaInsetsContext|ExpoRoot|ExpoRootComponent|GestureHandler.*|NativeViewGestureHandler|GestureDetector|PanGestureHandler|Reanimated.*|BottomTabNavigator|TabLayout|RouteNode|Route$|KeyboardProvider|PortalProviderComponent|BottomSheetModalProviderWrapper|ThemeContext|ThemeProvider|TextAncestorContext|PressabilityDebugView|TouchableHighlightImpl|StatusBarOverlay|BottomSheetHostingContainerComponent|BottomSheetGestureHandlersProvider|BottomSheetBackdropContainerComponent|BottomSheetContainerComponent|BottomSheetDraggableViewComponent|BottomSheetHandleContainerComponent|BottomSheetBackgroundContainerComponent|DebuggingOverlay|InspectorDeferred|Inspector|InspectorOverlay|InspectorPanel|StyleInspector|BoxInspector|BoxContainer|ElementBox|BorderBox|InspectorPanelButton)$/";
21
+ /** Names too generic to identify anything — keep climbing past these. */
22
+ export const GENERIC_COMPONENT_SRC = "/^(View|TouchableOpacity|TouchableHighlight|TouchableWithoutFeedback|Pressable|TouchableNativeFeedback|Text|RCTView|RCTText|Unknown)$/";
23
+ //# sourceMappingURL=injectedFilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectedFilters.js","sourceRoot":"","sources":["../../src/core/injectedFilters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAC1B,yxCAAyxC,CAAC;AAE9xC,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAC9B,wIAAwI,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The single fiber resolver for text inputs.
3
+ *
4
+ * Replaces the three copy-pasted walkers that lived in focusedInput.ts and
5
+ * fixes both of their blind spots — each of which made the tools report
6
+ * "no focused TextInput" while a field WAS focused:
7
+ *
8
+ * 1. They took roots[0] and stopped, hiding inputs mounted under a second
9
+ * fiber root (modal and portal roots).
10
+ * 2. They read stateNode.canonical.publicInstance unconditionally, which is
11
+ * Fabric-only. Paper exposes the instance as stateNode itself.
12
+ *
13
+ * The emitted source is compiled by Hermes, not tsc: no async/await, and no
14
+ * require() beyond the injected __eb_require. Non-ASCII in embedded literals is
15
+ * escaped server-side by executeInApp, so values go in via JSON.stringify.
16
+ */
17
+ export type InputQuery = {
18
+ testID?: string;
19
+ component?: string;
20
+ /** Matches the input's value, placeholder, accessibilityLabel or visible field label. */
21
+ textMatch?: string;
22
+ /** Zero-based choice among matches. Required when a target matches more than one input. */
23
+ index?: number;
24
+ };
25
+ /** What an agent needs to tell two inputs apart and target the right one. */
26
+ export type InputCandidate = {
27
+ index: number;
28
+ component: string | null;
29
+ label: string | null;
30
+ placeholder: string | null;
31
+ value: string | null;
32
+ testID: string | null;
33
+ };
34
+ export type InputOp = {
35
+ kind: "find";
36
+ } | {
37
+ kind: "focus";
38
+ } | {
39
+ kind: "read";
40
+ } | {
41
+ kind: "setValue";
42
+ value: string;
43
+ }
44
+ /** Writes native text directly, for a field with no handler to drive. */
45
+ | {
46
+ kind: "setNative";
47
+ value: string;
48
+ } | {
49
+ kind: "clear";
50
+ } | {
51
+ kind: "blur";
52
+ };
53
+ export type InputFound = {
54
+ found: true;
55
+ focused: boolean;
56
+ nativeTag: number | null;
57
+ value: string | null;
58
+ /** The resolved field's testID, so a native read-back can find the same one. */
59
+ testID: string | null;
60
+ /**
61
+ * True when the field's value prop mirrors its text — the only way to read
62
+ * it back from JS, and therefore the only way a write can be verified.
63
+ */
64
+ controlled: boolean;
65
+ hasOnChangeText: boolean;
66
+ ok: boolean;
67
+ via?: string;
68
+ };
69
+ export type InputMissing = {
70
+ found: false;
71
+ reason: string;
72
+ /** True when the target matched several inputs and none was chosen. */
73
+ ambiguous?: boolean;
74
+ candidates?: InputCandidate[];
75
+ /**
76
+ * How many inputs exist in total. The candidate list is capped, and a cap
77
+ * that is not reported reads as "this is everything" — which is how a
78
+ * caller concludes the field it wants is absent when it is simply beyond
79
+ * the cut.
80
+ */
81
+ totalInputs?: number;
82
+ };
83
+ export type InputResult = InputFound | InputMissing;
84
+ export declare function buildInputExpression(op: InputOp, query?: InputQuery): string;
85
+ //# sourceMappingURL=inputTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputTarget.d.ts","sourceRoot":"","sources":["../../src/core/inputTarget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,UAAU,GAAG;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAIF,MAAM,MAAM,OAAO,GACb;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrC,yEAAyE;GACvE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gFAAgF;IAChF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;AA4RpD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CA4E5E"}