swipium 1.1.0 → 1.3.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.
- package/README.md +14 -9
- package/THREAT_MODEL.md +59 -0
- package/dist/appMap/diff.js +60 -0
- package/dist/appMap/diff.js.map +1 -0
- package/dist/appMap/featureIndex.js +183 -0
- package/dist/appMap/featureIndex.js.map +1 -0
- package/dist/automation/capabilities.js +167 -0
- package/dist/automation/capabilities.js.map +1 -0
- package/dist/automation/gestures.js +94 -0
- package/dist/automation/gestures.js.map +1 -0
- package/dist/automation/maestroIr.js +282 -0
- package/dist/automation/maestroIr.js.map +1 -0
- package/dist/automation/plan.js +268 -0
- package/dist/automation/plan.js.map +1 -0
- package/dist/automation/report.js +83 -0
- package/dist/automation/report.js.map +1 -0
- package/dist/automation/selectors.js +201 -0
- package/dist/automation/selectors.js.map +1 -0
- package/dist/automation/types.js +13 -0
- package/dist/automation/types.js.map +1 -0
- package/dist/automation/waits.js +91 -0
- package/dist/automation/waits.js.map +1 -0
- package/dist/automation/webview.js +81 -0
- package/dist/automation/webview.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +14 -10
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +53 -0
- package/dist/featureTesting/featureMap.js.map +1 -0
- package/dist/featureTesting/featureScope.js +354 -0
- package/dist/featureTesting/featureScope.js.map +1 -0
- package/dist/featureTesting/mapFeatureScope.js +143 -0
- package/dist/featureTesting/mapFeatureScope.js.map +1 -0
- package/dist/featureTesting/objectiveModel.js +129 -0
- package/dist/featureTesting/objectiveModel.js.map +1 -0
- package/dist/featureTesting/resultMerge.js +112 -0
- package/dist/featureTesting/resultMerge.js.map +1 -0
- package/dist/featureTesting/sources.js +96 -0
- package/dist/featureTesting/sources.js.map +1 -0
- package/dist/featureTesting/suiteBridge.js +51 -0
- package/dist/featureTesting/suiteBridge.js.map +1 -0
- package/dist/featureTesting/synonyms.js +73 -0
- package/dist/featureTesting/synonyms.js.map +1 -0
- package/dist/featureTesting/testCaseFactory.js +107 -0
- package/dist/featureTesting/testCaseFactory.js.map +1 -0
- package/dist/featureTesting/testPlan.js +50 -0
- package/dist/featureTesting/testPlan.js.map +1 -0
- package/dist/flows/repair.js +363 -0
- package/dist/flows/repair.js.map +1 -0
- package/dist/interop/maestro.js +151 -0
- package/dist/interop/maestro.js.map +1 -0
- package/dist/mobileAudit/checks.js +251 -0
- package/dist/mobileAudit/checks.js.map +1 -0
- package/dist/mobileAudit/evidence.js +49 -0
- package/dist/mobileAudit/evidence.js.map +1 -0
- package/dist/mobileAudit/profiles.js +73 -0
- package/dist/mobileAudit/profiles.js.map +1 -0
- package/dist/mobileAudit/results.js +41 -0
- package/dist/mobileAudit/results.js.map +1 -0
- package/dist/mobileAudit/runner.js +229 -0
- package/dist/mobileAudit/runner.js.map +1 -0
- package/dist/oracle/locator.js +177 -0
- package/dist/oracle/locator.js.map +1 -0
- package/dist/server.js +31 -0
- package/dist/server.js.map +1 -1
- package/dist/testSuite/exporter.js +70 -0
- package/dist/testSuite/exporter.js.map +1 -0
- package/dist/testSuite/lint.js +53 -0
- package/dist/testSuite/lint.js.map +1 -0
- package/dist/tools/build.js +172 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/bundletool.js +145 -0
- package/dist/tools/bundletool.js.map +1 -0
- package/dist/tools/capabilities.js +66 -4
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/featureTesting.js +344 -0
- package/dist/tools/featureTesting.js.map +1 -0
- package/dist/tools/flow.js +67 -1
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +66 -0
- package/dist/tools/flowRepair.js.map +1 -0
- package/dist/tools/idling.js +104 -0
- package/dist/tools/idling.js.map +1 -0
- package/dist/tools/inputCapabilities.js +30 -0
- package/dist/tools/inputCapabilities.js.map +1 -0
- package/dist/tools/issues.js +218 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/jobs.js +12 -1
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/locator.js +57 -0
- package/dist/tools/locator.js.map +1 -0
- package/dist/tools/maestro.js +78 -0
- package/dist/tools/maestro.js.map +1 -0
- package/dist/tools/mobileAudit.js +115 -0
- package/dist/tools/mobileAudit.js.map +1 -0
- package/dist/tools/resolveArtifact.js +80 -0
- package/dist/tools/resolveArtifact.js.map +1 -0
- package/dist/tools/resolveTarget.js +67 -0
- package/dist/tools/resolveTarget.js.map +1 -0
- package/dist/tools/suite.js +49 -1
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +233 -0
- package/dist/tools/testSuite.js.map +1 -0
- package/dist/tools/wait.js +58 -0
- package/dist/tools/wait.js.map +1 -0
- package/dist/version.js +41 -2
- package/dist/version.js.map +1 -1
- package/docs/mcp-server.md +1 -1
- package/docs/tools.md +86 -3
- package/package.json +3 -2
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Automation Kernel V2 — Workstream 5: Gesture Engine V2. First-class mobile gestures (longPress,
|
|
2
|
+
// doubleTap, scrollUntilVisible, drag, pinch) modeled as backend-checked operations. Pinch is
|
|
3
|
+
// capability-gated and is NEVER silently converted to a swipe. The scrollUntilVisible loop is a pure,
|
|
4
|
+
// driver-agnostic executor so it can be unit-tested without a device and reused by the runner.
|
|
5
|
+
function capabilityForGesture(kind) {
|
|
6
|
+
switch (kind) {
|
|
7
|
+
case 'longPress':
|
|
8
|
+
return 'longPress';
|
|
9
|
+
case 'doubleTap':
|
|
10
|
+
return 'doubleTap';
|
|
11
|
+
case 'scroll':
|
|
12
|
+
return 'scrollUntilVisible';
|
|
13
|
+
case 'pinch':
|
|
14
|
+
return 'pinch';
|
|
15
|
+
case 'drag':
|
|
16
|
+
return 'drag';
|
|
17
|
+
case 'tap':
|
|
18
|
+
case 'swipe':
|
|
19
|
+
return null; // available on any backend that can tap/swipe by coordinate
|
|
20
|
+
default:
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function gestureSupport(gesture, caps) {
|
|
25
|
+
const capKey = capabilityForGesture(gesture.kind);
|
|
26
|
+
if (gesture.kind === 'pinch') {
|
|
27
|
+
if (caps.pinch)
|
|
28
|
+
return { supported: true, reason: `pinch is supported on ${caps.backend}.` };
|
|
29
|
+
return {
|
|
30
|
+
supported: false,
|
|
31
|
+
requiredCapability: 'pinch',
|
|
32
|
+
reason: `pinch is not supported on ${caps.backend}; attach Appium UiAutomator2/XCUITest or replace it with a swipe/scroll. It will not be silently converted to a swipe.`,
|
|
33
|
+
noSilentFallback: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (capKey && !caps[capKey]) {
|
|
37
|
+
return { supported: false, requiredCapability: String(capKey), reason: `${gesture.kind} is not supported on ${caps.backend}.` };
|
|
38
|
+
}
|
|
39
|
+
if ((gesture.kind === 'tap' || gesture.kind === 'swipe') && !caps.screenshot && !caps.structuredTree) {
|
|
40
|
+
return { supported: false, requiredCapability: 'screenshot', reason: `${gesture.kind} needs at least coordinate/screenshot support on ${caps.backend}.` };
|
|
41
|
+
}
|
|
42
|
+
return { supported: true, reason: `${gesture.kind} is supported on ${caps.backend}.` };
|
|
43
|
+
}
|
|
44
|
+
/** Build a longPress gesture: a same-point press for `durationMs`. */
|
|
45
|
+
export function longPressGesture(target, durationMs = 800) {
|
|
46
|
+
return { kind: 'longPress', target, durationMs };
|
|
47
|
+
}
|
|
48
|
+
export function doubleTapGesture(target) {
|
|
49
|
+
return { kind: 'doubleTap', target };
|
|
50
|
+
}
|
|
51
|
+
/** Build a scrollUntilVisible gesture with Maestro-parity options. */
|
|
52
|
+
export function scrollUntilVisibleGesture(target, opts = {}) {
|
|
53
|
+
return {
|
|
54
|
+
kind: 'scroll',
|
|
55
|
+
target,
|
|
56
|
+
direction: opts.direction ?? 'down',
|
|
57
|
+
speed: opts.speed,
|
|
58
|
+
visibilityPercentage: opts.visibilityPercentage ?? 100,
|
|
59
|
+
centerElement: opts.centerElement ?? false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Pure scrollUntilVisible executor. Checks visibility BEFORE scrolling (so it exits immediately if
|
|
64
|
+
* already visible) and stops the moment the target appears. On timeout it returns the direction,
|
|
65
|
+
* attempt count, and last screen signature so callers can build a diagnosable failure.
|
|
66
|
+
*/
|
|
67
|
+
export async function runScrollUntilVisible(opts) {
|
|
68
|
+
const max = Math.max(0, opts.maxScrolls ?? 20);
|
|
69
|
+
let attempts = 0;
|
|
70
|
+
const sig = async () => (opts.screenSignature ? await opts.screenSignature() : undefined);
|
|
71
|
+
if (await opts.isVisible()) {
|
|
72
|
+
return { visible: true, attempts: 0, direction: opts.direction, lastScreenSignature: await sig() };
|
|
73
|
+
}
|
|
74
|
+
while (attempts < max) {
|
|
75
|
+
await opts.scrollOnce();
|
|
76
|
+
attempts += 1;
|
|
77
|
+
if (await opts.isVisible()) {
|
|
78
|
+
return { visible: true, attempts, direction: opts.direction, lastScreenSignature: await sig() };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { visible: false, attempts, direction: opts.direction, lastScreenSignature: await sig() };
|
|
82
|
+
}
|
|
83
|
+
/** Build a human/diagnostic failure detail for an exhausted scrollUntilVisible. */
|
|
84
|
+
export function scrollFailureDetail(result, selector) {
|
|
85
|
+
const target = selector ?? result.selector;
|
|
86
|
+
const parts = [
|
|
87
|
+
`scrollUntilVisible exhausted after ${result.attempts} scroll(s) ${result.direction}`,
|
|
88
|
+
target ? `looking for ${target.strategy}=${target.value}` : undefined,
|
|
89
|
+
result.lastScreenSignature ? `last screen signature ${result.lastScreenSignature}` : undefined,
|
|
90
|
+
target?.hints?.screenSignature ? `selector was recorded on screen ${target.hints.screenSignature}` : undefined,
|
|
91
|
+
].filter(Boolean);
|
|
92
|
+
return parts.join('; ') + '.';
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=gestures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestures.js","sourceRoot":"","sources":["../../src/automation/gestures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// Automation Kernel V2 — Workstream 8: Maestro Interop V2 at the Action IR level. The existing
|
|
2
|
+
// src/interop/maestro.ts maps a shallow subset to Flow V2 YAML; this module imports/exports the
|
|
3
|
+
// richer Maestro automation semantics (tapOn repeat/delay/retryTapIfNoChange/settle timeout,
|
|
4
|
+
// longPressOn, scrollUntilVisible full options, waitForAnimationToEnd, assertNotVisible, eraseText)
|
|
5
|
+
// into Action IR WITHOUT semantic loss, grading every command with an exact reason and the suggested
|
|
6
|
+
// Swipium equivalent. Pure: parse in, IR out.
|
|
7
|
+
import { parse as parseYaml, stringify } from 'yaml';
|
|
8
|
+
import { selectorFromMaestro, selectorToAppium } from './selectors.js';
|
|
9
|
+
function num(v) {
|
|
10
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
11
|
+
}
|
|
12
|
+
function obj(v) {
|
|
13
|
+
return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
|
|
14
|
+
}
|
|
15
|
+
/** Import a Maestro flow into Action IR, preserving retry/repeat/settle/scroll semantics. */
|
|
16
|
+
export function importMaestroActions(maestroYaml) {
|
|
17
|
+
const doc = parseYaml(maestroYaml);
|
|
18
|
+
const raw = Array.isArray(doc) ? doc : Array.isArray(doc?.commands) ? doc.commands : [];
|
|
19
|
+
const actions = [];
|
|
20
|
+
const grades = [];
|
|
21
|
+
const unsupported = [];
|
|
22
|
+
const grade = (index, command, g, reason, swipiumEquivalent) => grades.push({ index, command, grade: g, reason, swipiumEquivalent });
|
|
23
|
+
const unsupp = (index, command, reason, swipiumEquivalent) => {
|
|
24
|
+
unsupported.push({ command, reason });
|
|
25
|
+
grade(index, command, 'manual_review_required', reason, swipiumEquivalent);
|
|
26
|
+
};
|
|
27
|
+
raw.forEach((entry, index) => {
|
|
28
|
+
const o = obj(entry);
|
|
29
|
+
if (!o) {
|
|
30
|
+
unsupp(index, String(entry), 'Maestro command must be a single-key object.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const [cmd, value] = Object.entries(o)[0] ?? [];
|
|
34
|
+
const v = obj(value);
|
|
35
|
+
switch (cmd) {
|
|
36
|
+
case 'tapOn': {
|
|
37
|
+
const sel = selectorFromMaestro(v?.selector ?? value);
|
|
38
|
+
const action = { kind: 'tap', expectedChange: 'unknown', note: 'tapOn' };
|
|
39
|
+
if (sel)
|
|
40
|
+
action.selector = sel;
|
|
41
|
+
// Explicit automation semantics — never hidden.
|
|
42
|
+
if (v) {
|
|
43
|
+
if (v.retryTapIfNoChange === true)
|
|
44
|
+
action.retryIfNoChange = true;
|
|
45
|
+
const repeat = num(v.repeat);
|
|
46
|
+
if (repeat != null)
|
|
47
|
+
action.repeat = repeat;
|
|
48
|
+
const settle = num(v.waitToSettleTimeoutMs);
|
|
49
|
+
if (settle != null)
|
|
50
|
+
action.timeoutMs = settle;
|
|
51
|
+
if (v.point != null && !sel)
|
|
52
|
+
action.selector = { strategy: 'coordinate', value: String(v.point), source: 'maestro_import', risk: 'high', portable: false };
|
|
53
|
+
}
|
|
54
|
+
actions.push(action);
|
|
55
|
+
const carried = [action.retryIfNoChange ? 'retryTapIfNoChange' : null, action.repeat != null ? `repeat=${action.repeat}` : null, action.timeoutMs != null ? `settle=${action.timeoutMs}ms` : null].filter(Boolean);
|
|
56
|
+
grade(index, cmd, sel ? 'portable' : 'manual_review_required', sel ? `tapOn → tap${carried.length ? ` (${carried.join(', ')})` : ''}` : 'tapOn point/selector not in supported subset; review.', 'tap');
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case 'longPressOn': {
|
|
60
|
+
const sel = selectorFromMaestro(v?.selector ?? value);
|
|
61
|
+
const gesture = { kind: 'longPress', target: sel ?? undefined, durationMs: num(v?.duration) ?? 800 };
|
|
62
|
+
actions.push({ kind: 'longPress', selector: sel ?? undefined, gesture, note: 'longPressOn' });
|
|
63
|
+
grade(index, cmd, sel ? 'maestro_supported' : 'manual_review_required', 'longPressOn → longPress gesture', 'longPress');
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case 'scrollUntilVisible': {
|
|
67
|
+
const inner = v?.element ?? v?.visible ?? value;
|
|
68
|
+
const sel = selectorFromMaestro(inner);
|
|
69
|
+
if (!sel) {
|
|
70
|
+
unsupp(index, cmd, 'scrollUntilVisible needs a text/id/accessibility element selector.', 'scrollUntilVisible');
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const direction = (typeof v?.direction === 'string' ? v.direction.toLowerCase() : 'down');
|
|
74
|
+
const gesture = {
|
|
75
|
+
kind: 'scroll',
|
|
76
|
+
target: sel,
|
|
77
|
+
direction,
|
|
78
|
+
speed: num(v?.speed),
|
|
79
|
+
visibilityPercentage: num(v?.visibilityPercentage) ?? 100,
|
|
80
|
+
centerElement: v?.centerElement === true,
|
|
81
|
+
};
|
|
82
|
+
actions.push({ kind: 'scrollUntilVisible', selector: sel, gesture, timeoutMs: num(v?.timeout), note: 'scrollUntilVisible' });
|
|
83
|
+
grade(index, cmd, 'maestro_supported', `scrollUntilVisible → scrollUntilVisible (direction=${direction}, visibility=${gesture.visibilityPercentage}%${gesture.centerElement ? ', center' : ''})`, 'scrollUntilVisible');
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'waitForAnimationToEnd':
|
|
87
|
+
actions.push({ kind: 'waitForAnimationToEnd', timeoutMs: num(v?.timeout), note: 'waitForAnimationToEnd' });
|
|
88
|
+
grade(index, cmd, 'maestro_supported', 'waitForAnimationToEnd → animation wait (pass-with-warning on timeout)', 'waitForAnimationToEnd');
|
|
89
|
+
break;
|
|
90
|
+
case 'assertVisible': {
|
|
91
|
+
const sel = selectorFromMaestro(value);
|
|
92
|
+
if (!sel) {
|
|
93
|
+
unsupp(index, cmd, 'assertVisible selector not in supported subset.', 'assertVisible');
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
actions.push({ kind: 'assertVisible', selector: sel, note: 'assertVisible' });
|
|
97
|
+
grade(index, cmd, 'portable', 'assertVisible → assertVisible (acts as a condition wait)', 'assertVisible');
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'assertNotVisible': {
|
|
101
|
+
const sel = selectorFromMaestro(value);
|
|
102
|
+
if (!sel) {
|
|
103
|
+
unsupp(index, cmd, 'assertNotVisible selector not in supported subset.', 'assertNotVisible');
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
actions.push({ kind: 'waitForNotVisible', selector: sel, note: 'assertNotVisible' });
|
|
107
|
+
grade(index, cmd, 'portable', 'assertNotVisible → waitForNotVisible', 'assertNotVisible');
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'inputText': {
|
|
111
|
+
const text = typeof value === 'string' ? value : typeof v?.text === 'string' ? v.text : undefined;
|
|
112
|
+
if (text == null) {
|
|
113
|
+
unsupp(index, cmd, 'inputText needs a string (object-form variables need a Swipium fixture).', 'inputText');
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
actions.push({ kind: 'inputText', text, note: 'inputText' });
|
|
117
|
+
grade(index, cmd, 'portable', 'inputText → inputText', 'inputText');
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case 'eraseText':
|
|
121
|
+
actions.push({ kind: 'clearText', note: 'eraseText' });
|
|
122
|
+
grade(index, cmd, 'maestro_supported', 'eraseText → clearText', 'clearText (inputText into a cleared field)');
|
|
123
|
+
break;
|
|
124
|
+
case 'launchApp':
|
|
125
|
+
if (v && Object.keys(v).length) {
|
|
126
|
+
unsupp(index, cmd, 'launchApp options (clearState/permissions/arguments) need a Swipium state profile.', 'state profile + prepareTarget');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
actions.push({ kind: 'lifecycle', note: 'launchApp' });
|
|
130
|
+
grade(index, cmd, 'maestro_supported', 'launchApp (no options) → prepareTarget', 'prepareTarget');
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 'openLink':
|
|
134
|
+
actions.push({ kind: 'openUrl', text: typeof value === 'string' ? value : String(v?.link ?? ''), note: 'openLink' });
|
|
135
|
+
grade(index, cmd, 'portable', 'openLink → openUrl', 'openUrl');
|
|
136
|
+
break;
|
|
137
|
+
case 'clearState':
|
|
138
|
+
unsupp(index, cmd, 'clearState is semantic-lossy; model it as a Swipium state profile with reset policy and consent.', 'state profile');
|
|
139
|
+
break;
|
|
140
|
+
case 'repeat':
|
|
141
|
+
unsupp(index, cmd, 'Maestro repeat loops must be bounded, deterministic, and non-mutating in Swipium; review and unroll explicitly.', 'explicit repeated steps');
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
unsupp(index, cmd ?? 'unknown', 'command not supported by the Swipium Maestro import subset.');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return { actions, grades, unsupported };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Export Action IR back to Maestro YAML. Native selectors map to Maestro selector blocks (never
|
|
151
|
+
* XPath); Appium/WDA/WebView/visual-only steps that have no portable Maestro form are emitted as an
|
|
152
|
+
* explicit `manualReview` entry and graded manual_review_required — not a silent comment.
|
|
153
|
+
*/
|
|
154
|
+
export function exportMaestroActions(actions) {
|
|
155
|
+
const commands = [];
|
|
156
|
+
const grades = [];
|
|
157
|
+
const unsupported = [];
|
|
158
|
+
const pushManual = (index, command, reason) => {
|
|
159
|
+
commands.push({ manualReview: reason });
|
|
160
|
+
unsupported.push({ command, reason });
|
|
161
|
+
grades.push({ index, command, grade: 'manual_review_required', reason });
|
|
162
|
+
};
|
|
163
|
+
// Resolve a selector to a Maestro selector block (or plain text). iOS predicate/class-chain and
|
|
164
|
+
// visual/coordinate selectors have NO portable Maestro form — they are flagged for manual review,
|
|
165
|
+
// never silently downgraded to a text matcher (which would be semantic loss graded "portable").
|
|
166
|
+
const exportSelector = (action) => {
|
|
167
|
+
const sel = action.selector;
|
|
168
|
+
if (!sel)
|
|
169
|
+
return {};
|
|
170
|
+
if (sel.strategy === 'ios_predicate' || sel.strategy === 'ios_class_chain') {
|
|
171
|
+
return { manualReason: `${sel.strategy} ("${sel.value}") has no portable Maestro selector; export needs manual review (use an accessibility id, or keep the native Appium/WDA selector).` };
|
|
172
|
+
}
|
|
173
|
+
const loc = selectorToAppium(sel);
|
|
174
|
+
if (!loc) {
|
|
175
|
+
return { manualReason: `${sel.strategy} ("${sel.value}") is visual/coordinate-only and has no portable Maestro selector; export needs manual review.` };
|
|
176
|
+
}
|
|
177
|
+
if (loc.using === 'id')
|
|
178
|
+
return { value: { id: loc.value } };
|
|
179
|
+
if (loc.using === 'accessibility id')
|
|
180
|
+
return { value: { label: loc.value } };
|
|
181
|
+
return { value: sel.value }; // text → Maestro text matcher (a genuine, portable Maestro form)
|
|
182
|
+
};
|
|
183
|
+
actions.forEach((action, index) => {
|
|
184
|
+
switch (action.kind) {
|
|
185
|
+
case 'tap': {
|
|
186
|
+
const { value, manualReason } = exportSelector(action);
|
|
187
|
+
if (manualReason) {
|
|
188
|
+
pushManual(index, 'tap', manualReason);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
const tapOn = value ? (typeof value === 'string' ? { text: value } : value) : {};
|
|
192
|
+
if (action.retryIfNoChange)
|
|
193
|
+
tapOn.retryTapIfNoChange = true;
|
|
194
|
+
if (action.repeat != null)
|
|
195
|
+
tapOn.repeat = action.repeat;
|
|
196
|
+
if (action.timeoutMs != null)
|
|
197
|
+
tapOn.waitToSettleTimeoutMs = action.timeoutMs;
|
|
198
|
+
commands.push({ tapOn });
|
|
199
|
+
grades.push({ index, command: 'tap', grade: 'portable', reason: 'tap → tapOn' });
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case 'longPress': {
|
|
203
|
+
const { value, manualReason } = exportSelector(action);
|
|
204
|
+
if (manualReason) {
|
|
205
|
+
pushManual(index, 'longPress', manualReason);
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
commands.push({ longPressOn: value ?? {} });
|
|
209
|
+
grades.push({ index, command: 'longPress', grade: 'maestro_supported', reason: 'longPress → longPressOn' });
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case 'scrollUntilVisible': {
|
|
213
|
+
const { value, manualReason } = exportSelector(action);
|
|
214
|
+
if (manualReason) {
|
|
215
|
+
pushManual(index, 'scrollUntilVisible', manualReason);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
const g = action.gesture;
|
|
219
|
+
commands.push({
|
|
220
|
+
scrollUntilVisible: {
|
|
221
|
+
element: value ?? action.selector?.value,
|
|
222
|
+
direction: (g?.direction ?? 'down').toUpperCase(),
|
|
223
|
+
...(g?.visibilityPercentage != null ? { visibilityPercentage: g.visibilityPercentage } : {}),
|
|
224
|
+
...(g?.centerElement ? { centerElement: true } : {}),
|
|
225
|
+
...(action.timeoutMs != null ? { timeout: action.timeoutMs } : {}),
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
grades.push({ index, command: 'scrollUntilVisible', grade: 'maestro_supported', reason: 'scrollUntilVisible → scrollUntilVisible (fields preserved)' });
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
case 'waitForNotVisible': {
|
|
232
|
+
const { value, manualReason } = exportSelector(action);
|
|
233
|
+
if (manualReason) {
|
|
234
|
+
pushManual(index, 'waitForNotVisible', manualReason);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
commands.push({ assertNotVisible: value ?? action.selector?.value });
|
|
238
|
+
grades.push({ index, command: 'waitForNotVisible', grade: 'portable', reason: 'waitForNotVisible → assertNotVisible' });
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'assertVisible': {
|
|
242
|
+
const { value, manualReason } = exportSelector(action);
|
|
243
|
+
if (manualReason) {
|
|
244
|
+
pushManual(index, 'assertVisible', manualReason);
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
commands.push({ assertVisible: value ?? action.selector?.value });
|
|
248
|
+
grades.push({ index, command: 'assertVisible', grade: 'portable', reason: 'assertVisible → assertVisible' });
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
case 'inputText':
|
|
252
|
+
commands.push({ inputText: action.text ?? '' });
|
|
253
|
+
grades.push({ index, command: 'inputText', grade: 'portable', reason: 'inputText → inputText' });
|
|
254
|
+
break;
|
|
255
|
+
case 'clearText':
|
|
256
|
+
commands.push({ eraseText: true });
|
|
257
|
+
grades.push({ index, command: 'clearText', grade: 'maestro_supported', reason: 'clearText → eraseText' });
|
|
258
|
+
break;
|
|
259
|
+
case 'waitForAnimationToEnd':
|
|
260
|
+
commands.push({ waitForAnimationToEnd: action.timeoutMs != null ? { timeout: action.timeoutMs } : {} });
|
|
261
|
+
grades.push({ index, command: 'waitForAnimationToEnd', grade: 'maestro_supported', reason: 'waitForAnimationToEnd → waitForAnimationToEnd' });
|
|
262
|
+
break;
|
|
263
|
+
case 'openUrl':
|
|
264
|
+
commands.push({ openLink: action.text ?? '' });
|
|
265
|
+
grades.push({ index, command: 'openUrl', grade: 'portable', reason: 'openUrl → openLink' });
|
|
266
|
+
break;
|
|
267
|
+
case 'lifecycle':
|
|
268
|
+
if (action.note === 'launchApp' || action.note === 'prepareTarget') {
|
|
269
|
+
commands.push({ launchApp: {} });
|
|
270
|
+
grades.push({ index, command: 'lifecycle', grade: 'maestro_supported', reason: `${action.note} → launchApp` });
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
pushManual(index, action.note ?? 'lifecycle', `${action.note ?? 'lifecycle'} has no portable Maestro form; review manually.`);
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
default:
|
|
277
|
+
pushManual(index, action.kind, `${action.note ?? action.kind} requires Swipium/Appium/WDA and has no portable Maestro form; review manually.`);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return { maestroYaml: stringify(commands), commands, grades, unsupported };
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=maestroIr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maestroIr.js","sourceRoot":"","sources":["../../src/automation/maestroIr.ts"],"names":[],"mappings":"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"}
|