@astur-mobile/core 0.1.0-beta.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.
@@ -0,0 +1,310 @@
1
+ import { AsturError } from './errors.js';
2
+ import { by, findElements, matches, MobileLocator } from './locator.js';
3
+ import { delay } from './wait.js';
4
+ const knownRoles = [
5
+ 'button',
6
+ 'checkbox',
7
+ 'image',
8
+ 'img',
9
+ 'link',
10
+ 'menuitem',
11
+ 'radio',
12
+ 'slider',
13
+ 'switch',
14
+ 'tab',
15
+ 'text',
16
+ 'textbox'
17
+ ];
18
+ export function createInspectorSession(session, options = {}) {
19
+ return new RuntimeInspectorSession(session, options);
20
+ }
21
+ class RuntimeInspectorSession {
22
+ session;
23
+ defaultPollIntervalMs;
24
+ revision = 0;
25
+ constructor(session, options) {
26
+ this.session = session;
27
+ this.defaultPollIntervalMs = normalizePollInterval(options.pollIntervalMs);
28
+ }
29
+ async *subscribeTree(options = {}) {
30
+ const maxUpdates = options.maxUpdates ?? Number.POSITIVE_INFINITY;
31
+ if (maxUpdates <= 0) {
32
+ return;
33
+ }
34
+ if (this.session.subscribeTree) {
35
+ let emitted = 0;
36
+ for await (const update of this.session.subscribeTree(options)) {
37
+ yield update;
38
+ emitted += 1;
39
+ if (emitted >= maxUpdates) {
40
+ return;
41
+ }
42
+ }
43
+ return;
44
+ }
45
+ const pollIntervalMs = normalizePollInterval(options.pollIntervalMs ?? this.defaultPollIntervalMs);
46
+ let emitted = 0;
47
+ while (emitted < maxUpdates) {
48
+ emitted += 1;
49
+ this.revision += 1;
50
+ yield {
51
+ revision: this.revision,
52
+ timestamp: Date.now(),
53
+ reason: emitted === 1 ? 'initial' : 'poll',
54
+ root: await this.session.getTree()
55
+ };
56
+ if (emitted >= maxUpdates) {
57
+ return;
58
+ }
59
+ await delay(pollIntervalMs);
60
+ }
61
+ }
62
+ async hitTest(point) {
63
+ if (this.session.hitTest) {
64
+ return this.session.hitTest(point);
65
+ }
66
+ const root = await this.session.getTree();
67
+ const hit = findDeepestHit(root, point, true);
68
+ return hit === root ? undefined : hit;
69
+ }
70
+ async highlight(selector) {
71
+ await this.session.highlightElement?.(selector);
72
+ }
73
+ async clearHighlight() {
74
+ await this.session.clearHighlight?.();
75
+ }
76
+ async generateLocator(selector) {
77
+ const root = await this.session.getTree();
78
+ const target = findElements(root, selector)[0];
79
+ if (!target) {
80
+ throw new AsturError('INSPECTOR_TARGET_NOT_FOUND', `Inspector target ${selector.strategy}=${JSON.stringify(selector.value)} was not found in the current tree.`);
81
+ }
82
+ return rankLocatorSuggestions(target, root);
83
+ }
84
+ async executeAction(action) {
85
+ const locator = new MobileLocator(this.session, action.selector);
86
+ switch (action.kind) {
87
+ case 'wait': {
88
+ const state = action.options?.state ?? 'attached';
89
+ if (state === 'hidden') {
90
+ await locator.waitForHidden(action.options);
91
+ return;
92
+ }
93
+ if (state === 'visible') {
94
+ await locator.waitForVisible(action.options);
95
+ return;
96
+ }
97
+ await locator.waitForSnapshot(() => true, action.options);
98
+ return;
99
+ }
100
+ case 'tap':
101
+ await locator.tap(action.options);
102
+ return;
103
+ case 'doubleTap':
104
+ await locator.doubleTap(action.options);
105
+ return;
106
+ case 'longPress':
107
+ await locator.longPress(action.options);
108
+ return;
109
+ case 'fill':
110
+ await locator.fill(action.value, action.options);
111
+ return;
112
+ case 'drag':
113
+ if (isSelectorTarget(action.target)) {
114
+ await locator.dragTo(new MobileLocator(this.session, action.target.selector), action.options);
115
+ return;
116
+ }
117
+ await locator.dragTo(action.target, action.options);
118
+ return;
119
+ default:
120
+ return assertNever(action);
121
+ }
122
+ }
123
+ }
124
+ function rankLocatorSuggestions(target, root) {
125
+ const candidates = buildCandidates(target);
126
+ const suggestions = [];
127
+ const seen = new Set();
128
+ for (const candidate of candidates) {
129
+ if (seen.has(candidate.code)) {
130
+ continue;
131
+ }
132
+ seen.add(candidate.code);
133
+ const matched = findElements(root, candidate.selector);
134
+ const uniqueness = matched.length > 0 ? 1 / matched.length : 0;
135
+ const stability = clampScore(candidate.stabilityHint);
136
+ const readable = candidate.code.length <= 88;
137
+ const score = scoreCandidate(candidate.baseScore, uniqueness, stability, readable);
138
+ suggestions.push({
139
+ code: candidate.code,
140
+ selector: candidate.selector,
141
+ score,
142
+ uniqueness: round(uniqueness),
143
+ stability: round(stability),
144
+ readable,
145
+ crossPlatform: candidate.crossPlatform
146
+ });
147
+ }
148
+ return suggestions
149
+ .sort((left, right) => {
150
+ if (right.score !== left.score) {
151
+ return right.score - left.score;
152
+ }
153
+ return left.code.length - right.code.length;
154
+ })
155
+ .slice(0, 8);
156
+ }
157
+ function buildCandidates(target) {
158
+ const candidates = [];
159
+ const id = normalizeToken(target.id);
160
+ const label = normalizeToken(target.label);
161
+ const text = normalizeToken(target.text);
162
+ const name = label ?? text ?? normalizeToken(target.value);
163
+ const role = inferRole(target, name);
164
+ if (id) {
165
+ candidates.push({
166
+ selector: by.testId(id),
167
+ code: `device.getByTestId('${escapeSingleQuotes(id)}')`,
168
+ baseScore: 0.99,
169
+ crossPlatform: true,
170
+ stabilityHint: scoreStableToken(id, 'id')
171
+ });
172
+ candidates.push({
173
+ selector: by.id(id),
174
+ code: `device.getById('${escapeSingleQuotes(id)}')`,
175
+ baseScore: 0.96,
176
+ crossPlatform: true,
177
+ stabilityHint: scoreStableToken(id, 'id')
178
+ });
179
+ }
180
+ if (role && name) {
181
+ candidates.push({
182
+ selector: by.role(role, { name }),
183
+ code: `device.getByRole('${escapeSingleQuotes(role)}', { name: '${escapeSingleQuotes(name)}' })`,
184
+ baseScore: 0.92,
185
+ crossPlatform: true,
186
+ stabilityHint: scoreStableToken(name, 'text')
187
+ });
188
+ }
189
+ if (label) {
190
+ candidates.push({
191
+ selector: by.label(label),
192
+ code: `device.getByLabel('${escapeSingleQuotes(label)}')`,
193
+ baseScore: 0.89,
194
+ crossPlatform: true,
195
+ stabilityHint: scoreStableToken(label, 'accessibility')
196
+ });
197
+ }
198
+ if (text) {
199
+ candidates.push({
200
+ selector: by.text(text),
201
+ code: `device.getByText('${escapeSingleQuotes(text)}')`,
202
+ baseScore: 0.84,
203
+ crossPlatform: true,
204
+ stabilityHint: scoreStableToken(text, 'text')
205
+ });
206
+ }
207
+ const type = normalizeToken(target.type);
208
+ if (type) {
209
+ candidates.push({
210
+ selector: by.type(type),
211
+ code: `device.getByType('${escapeSingleQuotes(type)}')`,
212
+ baseScore: 0.58,
213
+ crossPlatform: false,
214
+ stabilityHint: 0.58
215
+ });
216
+ }
217
+ return candidates;
218
+ }
219
+ function inferRole(target, name) {
220
+ const roleOptions = knownRoles.filter((role) => {
221
+ const selector = name
222
+ ? by.role(role, { name })
223
+ : by.role(role);
224
+ return matches(target, selector);
225
+ });
226
+ return roleOptions[0];
227
+ }
228
+ function scoreCandidate(baseScore, uniqueness, stability, readable) {
229
+ const uniquenessWeight = 0.45 + clampScore(uniqueness) * 0.55;
230
+ const stabilityWeight = 0.6 + clampScore(stability) * 0.4;
231
+ const readabilityWeight = readable ? 1 : 0.92;
232
+ return round(clampScore(baseScore * uniquenessWeight * stabilityWeight * readabilityWeight));
233
+ }
234
+ function scoreStableToken(value, strategy) {
235
+ let score = 1;
236
+ if (value.length > 72) {
237
+ score -= 0.1;
238
+ }
239
+ if (/\b(tmp|temp|debug|sample|placeholder)\b/i.test(value)) {
240
+ score -= 0.25;
241
+ }
242
+ if (/\d{3,}/.test(value)) {
243
+ score -= strategy === 'id' ? 0.08 : 0.2;
244
+ }
245
+ if (/[a-f0-9]{8,}/i.test(value)) {
246
+ score -= 0.2;
247
+ }
248
+ if (strategy === 'text' && value.length <= 2) {
249
+ score -= 0.2;
250
+ }
251
+ if (strategy === 'type') {
252
+ score = Math.min(score, 0.58);
253
+ }
254
+ return clampScore(score);
255
+ }
256
+ function normalizeToken(value) {
257
+ const token = value?.trim();
258
+ return token ? token : undefined;
259
+ }
260
+ function findDeepestHit(node, point, ignoreBounds = false) {
261
+ if (!node.visible) {
262
+ return undefined;
263
+ }
264
+ const contains = ignoreBounds || containsPoint(node.bounds, point);
265
+ if (!contains) {
266
+ return undefined;
267
+ }
268
+ const children = [...node.children].reverse();
269
+ for (const child of children) {
270
+ const hit = findDeepestHit(child, point);
271
+ if (hit) {
272
+ return hit;
273
+ }
274
+ }
275
+ return node;
276
+ }
277
+ function containsPoint(bounds, point) {
278
+ if (bounds.width <= 0 || bounds.height <= 0) {
279
+ return false;
280
+ }
281
+ return point.x >= bounds.x
282
+ && point.y >= bounds.y
283
+ && point.x <= bounds.x + bounds.width
284
+ && point.y <= bounds.y + bounds.height;
285
+ }
286
+ function normalizePollInterval(value) {
287
+ if (!value || value < 40) {
288
+ return 250;
289
+ }
290
+ return value;
291
+ }
292
+ function isSelectorTarget(target) {
293
+ return 'selector' in target;
294
+ }
295
+ function escapeSingleQuotes(value) {
296
+ return value.replaceAll('\\', '\\\\').replaceAll("'", "\\'");
297
+ }
298
+ function clampScore(value) {
299
+ if (!Number.isFinite(value)) {
300
+ return 0;
301
+ }
302
+ return Math.max(0, Math.min(1, value));
303
+ }
304
+ function round(value) {
305
+ return Math.round(value * 100) / 100;
306
+ }
307
+ function assertNever(value) {
308
+ throw new AsturError('INSPECTOR_ACTION_UNSUPPORTED', `Unsupported inspector action: ${JSON.stringify(value)}`);
309
+ }
310
+ //# sourceMappingURL=inspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../src/inspector.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,GAAiB;IAC/B,QAAQ;IACR,UAAU;IACV,OAAO;IACP,KAAK;IACL,MAAM;IACN,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,SAAS;CACV,CAAC;AAcF,MAAM,UAAU,sBAAsB,CACpC,OAAwB,EACxB,UAA0C,EAAE;IAE5C,OAAO,IAAI,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,uBAAuB;IACV,OAAO,CAAkB;IACzB,qBAAqB,CAAS;IACvC,QAAQ,GAAG,CAAC,CAAC;IAErB,YAAY,OAAwB,EAAE,OAAuC;QAC3E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,CAAC,aAAa,CAAC,UAAkC,EAAE;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAClE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,MAAM,MAAM,CAAC;gBACb,OAAO,IAAI,CAAC,CAAC;gBACb,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;oBAC1B,OAAO;gBACT,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnG,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,OAAO,GAAG,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,CAAC;YACb,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YAEnB,MAAM;gBACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC1C,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;aACnC,CAAC;YAEF,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAkB;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAyB;QACvC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAyB;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,UAAU,CAClB,4BAA4B,EAC5B,oBAAoB,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAC7G,CAAC;QACJ,CAAC;QAED,OAAO,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAuB;QACzC,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC;gBAClD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvB,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC7C,OAAO;gBACT,CAAC;gBAED,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAED,KAAK,KAAK;gBACR,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClC,OAAO;YAET,KAAK,WAAW;gBACd,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO;YAET,KAAK,WAAW;gBACd,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO;YAET,KAAK,MAAM;gBACT,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACjD,OAAO;YAET,KAAK,MAAM;gBACT,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC9F,OAAO;gBACT,CAAC;gBAED,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACpD,OAAO;YAET;gBACE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AAED,SAAS,sBAAsB,CAAC,MAA6B,EAAE,IAA2B;IACxF,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEnF,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;YAC3B,QAAQ;YACR,aAAa,EAAE,SAAS,CAAC,aAAa;SACvC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW;SACf,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpB,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAClC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAA6B;IACpD,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAErC,IAAI,EAAE,EAAE,CAAC;QACP,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,EAAE,uBAAuB,kBAAkB,CAAC,EAAE,CAAC,IAAI;YACvD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC;SAC1C,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,mBAAmB,kBAAkB,CAAC,EAAE,CAAC,IAAI;YACnD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACjC,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,eAAe,kBAAkB,CAAC,IAAI,CAAC,MAAM;YAChG,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACzB,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,KAAK,CAAC,IAAI;YACzD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI;YACvD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,EAAE,CAAC;QACT,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI;YACvD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,MAA6B,EAAE,IAAa;IAC7D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI;YACnB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACzB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElB,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,UAAkB,EAAE,SAAiB,EAAE,QAAiB;IACjG,MAAM,gBAAgB,GAAG,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAC9D,MAAM,eAAe,GAAG,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;IAC1D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9C,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,GAAG,gBAAgB,GAAG,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,QAAqC;IAC5E,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1C,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CACrB,IAA2B,EAC3B,KAAkB,EAClB,YAAY,GAAG,KAAK;IAEpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAAuC,EAAE,KAAkB;IAChF,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;WACrB,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;WACnB,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK;WAClC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAmD;IAC3E,OAAO,UAAU,IAAI,MAAM,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,IAAI,UAAU,CAAC,8BAA8B,EAAE,iCAAiC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACjH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Coordinates, KeyboardDismissMode } from '@astur-mobile/protocol';
2
+ import type { PlatformSession } from './session.js';
3
+ export declare function preparePointerTargetForKeyboard(session: PlatformSession, point: Coordinates, mode?: KeyboardDismissMode): Promise<boolean>;
4
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,WAAW,EAClB,IAAI,CAAC,EAAE,mBAAmB,GACzB,OAAO,CAAC,OAAO,CAAC,CAclB"}
@@ -0,0 +1,31 @@
1
+ import { delay } from './wait.js';
2
+ export async function preparePointerTargetForKeyboard(session, point, mode) {
3
+ const dismissMode = mode ?? session.capabilities.keyboard?.dismiss ?? 'auto';
4
+ if (dismissMode === 'preserve' || !session.getKeyboardState || !session.dismissKeyboard) {
5
+ return false;
6
+ }
7
+ const state = await session.getKeyboardState().catch(() => ({ visible: false }));
8
+ if (!state.visible || !state.bounds || !containsPoint(state.bounds, point)) {
9
+ return false;
10
+ }
11
+ await session.dismissKeyboard();
12
+ await waitForKeyboardHidden(session);
13
+ return true;
14
+ }
15
+ function containsPoint(bounds, point) {
16
+ return point.x >= bounds.x
17
+ && point.x <= bounds.x + bounds.width
18
+ && point.y >= bounds.y
19
+ && point.y <= bounds.y + bounds.height;
20
+ }
21
+ async function waitForKeyboardHidden(session) {
22
+ const deadline = Date.now() + 1_500;
23
+ while (Date.now() <= deadline) {
24
+ const state = await session.getKeyboardState?.().catch(() => ({ visible: false }));
25
+ if (!state?.visible) {
26
+ return;
27
+ }
28
+ await delay(100);
29
+ }
30
+ }
31
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,OAAwB,EACxB,KAAkB,EAClB,IAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC;IAC7E,IAAI,WAAW,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;IAChC,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,KAAkB;IACvD,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;WACrB,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK;WAClC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;WACnB,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAAwB;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAEpC,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { Bounds, Coordinates, DoubleTapOptions, ElementFillOptions, ElementSelector, LongPressOptions, MobileElementSnapshot, MobileRole, RoleSelectorOptions, TapOptions } from '@astur-mobile/protocol';
2
+ import type { PlatformSession } from './session.js';
3
+ import { type WaitOptions } from './wait.js';
4
+ export declare const by: {
5
+ label(value: string, options?: {
6
+ exact?: boolean;
7
+ }): ElementSelector;
8
+ a11y(value: string, options?: {
9
+ exact?: boolean;
10
+ }): ElementSelector;
11
+ id(value: string, options?: {
12
+ exact?: boolean;
13
+ }): ElementSelector;
14
+ testId(value: string, options?: {
15
+ exact?: boolean;
16
+ }): ElementSelector;
17
+ role(value: MobileRole | string, options?: RoleSelectorOptions): ElementSelector;
18
+ text(value: string, options?: {
19
+ exact?: boolean;
20
+ }): ElementSelector;
21
+ type(value: string, options?: {
22
+ exact?: boolean;
23
+ }): ElementSelector;
24
+ xpath(value: string): ElementSelector;
25
+ coordinates(x: number, y: number): Coordinates;
26
+ };
27
+ export type ScrollDirection = 'up' | 'down' | 'left' | 'right';
28
+ export interface ScrollIntoViewOptions extends WaitOptions {
29
+ /** Direction to scroll the content toward the target. `'down'` (the default) reveals content further down the screen. */
30
+ direction?: ScrollDirection;
31
+ /** Maximum number of scroll gestures to attempt before giving up. Defaults to `10`. */
32
+ maxScrolls?: number;
33
+ /** Duration of each scroll gesture in milliseconds. Defaults to `400`. */
34
+ durationMs?: number;
35
+ /** Scrollable region to swipe within. Defaults to the device viewport. */
36
+ container?: MobileLocator;
37
+ }
38
+ export declare class MobileLocator {
39
+ readonly selector: ElementSelector;
40
+ private readonly session;
41
+ constructor(session: PlatformSession, selector: ElementSelector);
42
+ tap(options?: WaitOptions & TapOptions): Promise<void>;
43
+ doubleTap(options?: WaitOptions & DoubleTapOptions): Promise<void>;
44
+ longPress(options?: WaitOptions & LongPressOptions): Promise<void>;
45
+ pressAndHold(options?: WaitOptions & LongPressOptions): Promise<void>;
46
+ dragTo(target: MobileLocator | Coordinates, options?: WaitOptions & {
47
+ durationMs?: number;
48
+ }): Promise<void>;
49
+ /**
50
+ * Scrolls the surrounding scroll view until this element is visible, then
51
+ * resolves with its snapshot. Replaces the hand-written "swipe in a loop
52
+ * until visible" helpers that page objects otherwise have to craft, and
53
+ * hides the iOS-viewport / Android-tree platform difference for the scroll
54
+ * region. If the element is already visible no gesture is performed.
55
+ */
56
+ scrollIntoView(options?: ScrollIntoViewOptions): Promise<MobileElementSnapshot>;
57
+ private currentMatch;
58
+ private scrollRegion;
59
+ fill(value: string, options?: WaitOptions & ElementFillOptions): Promise<void>;
60
+ isVisible(options?: WaitOptions): Promise<boolean>;
61
+ isHidden(options?: WaitOptions): Promise<boolean>;
62
+ waitForVisible(options?: WaitOptions): Promise<MobileElementSnapshot>;
63
+ waitForHidden(options?: WaitOptions): Promise<void>;
64
+ waitForSnapshot(predicate?: (snapshot: MobileElementSnapshot) => boolean, options?: WaitOptions): Promise<MobileElementSnapshot>;
65
+ snapshot(options?: WaitOptions): Promise<MobileElementSnapshot>;
66
+ all(options?: WaitOptions): Promise<MobileElementSnapshot[]>;
67
+ queryAll(): Promise<MobileElementSnapshot[]>;
68
+ toString(): string;
69
+ }
70
+ export declare function findElement(root: MobileElementSnapshot, selector: ElementSelector): MobileElementSnapshot | undefined;
71
+ export declare function findElements(root: MobileElementSnapshot, selector: ElementSelector): MobileElementSnapshot[];
72
+ export declare function matches(element: MobileElementSnapshot, selector: ElementSelector): boolean;
73
+ export declare function flattenTree(root: MobileElementSnapshot): MobileElementSnapshot[];
74
+ export declare function centerOf(bounds: Bounds): Coordinates;
75
+ export declare function pointInBounds(bounds: Bounds, xRatio: number, yRatio: number): Coordinates;
76
+ export declare function formatSelector(selector: ElementSelector): string;
77
+ //# sourceMappingURL=locator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.d.ts","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"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"}